@@ -471,6 +471,8 @@ struct cdns_nand_ctrl {
471471 struct {
472472 void __iomem * virt ;
473473 dma_addr_t dma ;
474+ dma_addr_t iova_dma ;
475+ u32 size ;
474476 } io ;
475477
476478 int irq ;
@@ -1835,11 +1837,11 @@ static int cadence_nand_slave_dma_transfer(struct cdns_nand_ctrl *cdns_ctrl,
18351837 }
18361838
18371839 if (dir == DMA_FROM_DEVICE ) {
1838- src_dma = cdns_ctrl -> io .dma ;
1840+ src_dma = cdns_ctrl -> io .iova_dma ;
18391841 dst_dma = buf_dma ;
18401842 } else {
18411843 src_dma = buf_dma ;
1842- dst_dma = cdns_ctrl -> io .dma ;
1844+ dst_dma = cdns_ctrl -> io .iova_dma ;
18431845 }
18441846
18451847 tx = dmaengine_prep_dma_memcpy (cdns_ctrl -> dmac , dst_dma , src_dma , len ,
@@ -2869,6 +2871,7 @@ cadence_nand_irq_cleanup(int irqnum, struct cdns_nand_ctrl *cdns_ctrl)
28692871static int cadence_nand_init (struct cdns_nand_ctrl * cdns_ctrl )
28702872{
28712873 dma_cap_mask_t mask ;
2874+ struct dma_device * dma_dev = cdns_ctrl -> dmac -> device ;
28722875 int ret ;
28732876
28742877 cdns_ctrl -> cdma_desc = dma_alloc_coherent (cdns_ctrl -> dev ,
@@ -2912,6 +2915,16 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl)
29122915 }
29132916 }
29142917
2918+ cdns_ctrl -> io .iova_dma = dma_map_resource (dma_dev -> dev , cdns_ctrl -> io .dma ,
2919+ cdns_ctrl -> io .size ,
2920+ DMA_BIDIRECTIONAL , 0 );
2921+
2922+ ret = dma_mapping_error (dma_dev -> dev , cdns_ctrl -> io .iova_dma );
2923+ if (ret ) {
2924+ dev_err (cdns_ctrl -> dev , "Failed to map I/O resource to DMA\n" );
2925+ goto dma_release_chnl ;
2926+ }
2927+
29152928 nand_controller_init (& cdns_ctrl -> controller );
29162929 INIT_LIST_HEAD (& cdns_ctrl -> chips );
29172930
@@ -2922,18 +2935,22 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl)
29222935 if (ret ) {
29232936 dev_err (cdns_ctrl -> dev , "Failed to register MTD: %d\n" ,
29242937 ret );
2925- goto dma_release_chnl ;
2938+ goto unmap_dma_resource ;
29262939 }
29272940
29282941 kfree (cdns_ctrl -> buf );
29292942 cdns_ctrl -> buf = kzalloc (cdns_ctrl -> buf_size , GFP_KERNEL );
29302943 if (!cdns_ctrl -> buf ) {
29312944 ret = - ENOMEM ;
2932- goto dma_release_chnl ;
2945+ goto unmap_dma_resource ;
29332946 }
29342947
29352948 return 0 ;
29362949
2950+ unmap_dma_resource :
2951+ dma_unmap_resource (dma_dev -> dev , cdns_ctrl -> io .iova_dma ,
2952+ cdns_ctrl -> io .size , DMA_BIDIRECTIONAL , 0 );
2953+
29372954dma_release_chnl :
29382955 if (cdns_ctrl -> dmac )
29392956 dma_release_channel (cdns_ctrl -> dmac );
@@ -2955,6 +2972,8 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl)
29552972static void cadence_nand_remove (struct cdns_nand_ctrl * cdns_ctrl )
29562973{
29572974 cadence_nand_chips_cleanup (cdns_ctrl );
2975+ dma_unmap_resource (cdns_ctrl -> dmac -> device -> dev , cdns_ctrl -> io .iova_dma ,
2976+ cdns_ctrl -> io .size , DMA_BIDIRECTIONAL , 0 );
29582977 cadence_nand_irq_cleanup (cdns_ctrl -> irq , cdns_ctrl );
29592978 kfree (cdns_ctrl -> buf );
29602979 dma_free_coherent (cdns_ctrl -> dev , sizeof (struct cadence_nand_cdma_desc ),
@@ -3019,7 +3038,9 @@ static int cadence_nand_dt_probe(struct platform_device *ofdev)
30193038 cdns_ctrl -> io .virt = devm_platform_get_and_ioremap_resource (ofdev , 1 , & res );
30203039 if (IS_ERR (cdns_ctrl -> io .virt ))
30213040 return PTR_ERR (cdns_ctrl -> io .virt );
3041+
30223042 cdns_ctrl -> io .dma = res -> start ;
3043+ cdns_ctrl -> io .size = resource_size (res );
30233044
30243045 dt -> clk = devm_clk_get (cdns_ctrl -> dev , "nf_clk" );
30253046 if (IS_ERR (dt -> clk ))
0 commit comments