@@ -471,6 +471,8 @@ struct cdns_nand_ctrl {
471
471
struct {
472
472
void __iomem * virt ;
473
473
dma_addr_t dma ;
474
+ dma_addr_t iova_dma ;
475
+ u32 size ;
474
476
} io ;
475
477
476
478
int irq ;
@@ -1835,11 +1837,11 @@ static int cadence_nand_slave_dma_transfer(struct cdns_nand_ctrl *cdns_ctrl,
1835
1837
}
1836
1838
1837
1839
if (dir == DMA_FROM_DEVICE ) {
1838
- src_dma = cdns_ctrl -> io .dma ;
1840
+ src_dma = cdns_ctrl -> io .iova_dma ;
1839
1841
dst_dma = buf_dma ;
1840
1842
} else {
1841
1843
src_dma = buf_dma ;
1842
- dst_dma = cdns_ctrl -> io .dma ;
1844
+ dst_dma = cdns_ctrl -> io .iova_dma ;
1843
1845
}
1844
1846
1845
1847
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)
2869
2871
static int cadence_nand_init (struct cdns_nand_ctrl * cdns_ctrl )
2870
2872
{
2871
2873
dma_cap_mask_t mask ;
2874
+ struct dma_device * dma_dev = cdns_ctrl -> dmac -> device ;
2872
2875
int ret ;
2873
2876
2874
2877
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)
2912
2915
}
2913
2916
}
2914
2917
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
+
2915
2928
nand_controller_init (& cdns_ctrl -> controller );
2916
2929
INIT_LIST_HEAD (& cdns_ctrl -> chips );
2917
2930
@@ -2922,18 +2935,22 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl)
2922
2935
if (ret ) {
2923
2936
dev_err (cdns_ctrl -> dev , "Failed to register MTD: %d\n" ,
2924
2937
ret );
2925
- goto dma_release_chnl ;
2938
+ goto unmap_dma_resource ;
2926
2939
}
2927
2940
2928
2941
kfree (cdns_ctrl -> buf );
2929
2942
cdns_ctrl -> buf = kzalloc (cdns_ctrl -> buf_size , GFP_KERNEL );
2930
2943
if (!cdns_ctrl -> buf ) {
2931
2944
ret = - ENOMEM ;
2932
- goto dma_release_chnl ;
2945
+ goto unmap_dma_resource ;
2933
2946
}
2934
2947
2935
2948
return 0 ;
2936
2949
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
+
2937
2954
dma_release_chnl :
2938
2955
if (cdns_ctrl -> dmac )
2939
2956
dma_release_channel (cdns_ctrl -> dmac );
@@ -2955,6 +2972,8 @@ static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl)
2955
2972
static void cadence_nand_remove (struct cdns_nand_ctrl * cdns_ctrl )
2956
2973
{
2957
2974
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 );
2958
2977
cadence_nand_irq_cleanup (cdns_ctrl -> irq , cdns_ctrl );
2959
2978
kfree (cdns_ctrl -> buf );
2960
2979
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)
3019
3038
cdns_ctrl -> io .virt = devm_platform_get_and_ioremap_resource (ofdev , 1 , & res );
3020
3039
if (IS_ERR (cdns_ctrl -> io .virt ))
3021
3040
return PTR_ERR (cdns_ctrl -> io .virt );
3041
+
3022
3042
cdns_ctrl -> io .dma = res -> start ;
3043
+ cdns_ctrl -> io .size = resource_size (res );
3023
3044
3024
3045
dt -> clk = devm_clk_get (cdns_ctrl -> dev , "nf_clk" );
3025
3046
if (IS_ERR (dt -> clk ))
0 commit comments