@@ -36,7 +36,6 @@ struct uio_dmem_genirq_platdata {
3636 struct platform_device * pdev ;
3737 unsigned int dmem_region_start ;
3838 unsigned int num_dmem_regions ;
39- void * dmem_region_vaddr [MAX_UIO_MAPS ];
4039 struct mutex alloc_lock ;
4140 unsigned int refcnt ;
4241};
@@ -50,7 +49,6 @@ static int uio_dmem_genirq_open(struct uio_info *info, struct inode *inode)
5049{
5150 struct uio_dmem_genirq_platdata * priv = info -> priv ;
5251 struct uio_mem * uiomem ;
53- int dmem_region = priv -> dmem_region_start ;
5452
5553 uiomem = & priv -> uioinfo -> mem [priv -> dmem_region_start ];
5654
@@ -61,11 +59,8 @@ static int uio_dmem_genirq_open(struct uio_info *info, struct inode *inode)
6159 break ;
6260
6361 addr = dma_alloc_coherent (& priv -> pdev -> dev , uiomem -> size ,
64- (dma_addr_t * )& uiomem -> addr , GFP_KERNEL );
65- if (!addr ) {
66- uiomem -> addr = DMEM_MAP_ERROR ;
67- }
68- priv -> dmem_region_vaddr [dmem_region ++ ] = addr ;
62+ & uiomem -> dma_addr , GFP_KERNEL );
63+ uiomem -> addr = addr ? (phys_addr_t ) addr : DMEM_MAP_ERROR ;
6964 ++ uiomem ;
7065 }
7166 priv -> refcnt ++ ;
@@ -80,7 +75,6 @@ static int uio_dmem_genirq_release(struct uio_info *info, struct inode *inode)
8075{
8176 struct uio_dmem_genirq_platdata * priv = info -> priv ;
8277 struct uio_mem * uiomem ;
83- int dmem_region = priv -> dmem_region_start ;
8478
8579 /* Tell the Runtime PM code that the device has become idle */
8680 pm_runtime_put_sync (& priv -> pdev -> dev );
@@ -93,13 +87,12 @@ static int uio_dmem_genirq_release(struct uio_info *info, struct inode *inode)
9387 while (!priv -> refcnt && uiomem < & priv -> uioinfo -> mem [MAX_UIO_MAPS ]) {
9488 if (!uiomem -> size )
9589 break ;
96- if (priv -> dmem_region_vaddr [ dmem_region ] ) {
97- dma_free_coherent (& priv -> pdev -> dev , uiomem -> size ,
98- priv -> dmem_region_vaddr [ dmem_region ] ,
99- uiomem -> addr );
90+ if (uiomem -> addr ) {
91+ dma_free_coherent (uiomem -> dma_device , uiomem -> size ,
92+ ( void * ) uiomem -> addr ,
93+ uiomem -> dma_addr );
10094 }
10195 uiomem -> addr = DMEM_MAP_ERROR ;
102- ++ dmem_region ;
10396 ++ uiomem ;
10497 }
10598
@@ -264,7 +257,8 @@ static int uio_dmem_genirq_probe(struct platform_device *pdev)
264257 " dynamic and fixed memory regions.\n" );
265258 break ;
266259 }
267- uiomem -> memtype = UIO_MEM_PHYS ;
260+ uiomem -> memtype = UIO_MEM_DMA_COHERENT ;
261+ uiomem -> dma_device = & pdev -> dev ;
268262 uiomem -> addr = DMEM_MAP_ERROR ;
269263 uiomem -> size = pdata -> dynamic_region_sizes [i ];
270264 ++ uiomem ;
0 commit comments