@@ -36,7 +36,6 @@ struct uio_dmem_genirq_platdata {
36
36
struct platform_device * pdev ;
37
37
unsigned int dmem_region_start ;
38
38
unsigned int num_dmem_regions ;
39
- void * dmem_region_vaddr [MAX_UIO_MAPS ];
40
39
struct mutex alloc_lock ;
41
40
unsigned int refcnt ;
42
41
};
@@ -50,7 +49,6 @@ static int uio_dmem_genirq_open(struct uio_info *info, struct inode *inode)
50
49
{
51
50
struct uio_dmem_genirq_platdata * priv = info -> priv ;
52
51
struct uio_mem * uiomem ;
53
- int dmem_region = priv -> dmem_region_start ;
54
52
55
53
uiomem = & priv -> uioinfo -> mem [priv -> dmem_region_start ];
56
54
@@ -61,11 +59,8 @@ static int uio_dmem_genirq_open(struct uio_info *info, struct inode *inode)
61
59
break ;
62
60
63
61
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 ;
69
64
++ uiomem ;
70
65
}
71
66
priv -> refcnt ++ ;
@@ -80,7 +75,6 @@ static int uio_dmem_genirq_release(struct uio_info *info, struct inode *inode)
80
75
{
81
76
struct uio_dmem_genirq_platdata * priv = info -> priv ;
82
77
struct uio_mem * uiomem ;
83
- int dmem_region = priv -> dmem_region_start ;
84
78
85
79
/* Tell the Runtime PM code that the device has become idle */
86
80
pm_runtime_put_sync (& priv -> pdev -> dev );
@@ -93,13 +87,12 @@ static int uio_dmem_genirq_release(struct uio_info *info, struct inode *inode)
93
87
while (!priv -> refcnt && uiomem < & priv -> uioinfo -> mem [MAX_UIO_MAPS ]) {
94
88
if (!uiomem -> size )
95
89
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 );
100
94
}
101
95
uiomem -> addr = DMEM_MAP_ERROR ;
102
- ++ dmem_region ;
103
96
++ uiomem ;
104
97
}
105
98
@@ -264,7 +257,8 @@ static int uio_dmem_genirq_probe(struct platform_device *pdev)
264
257
" dynamic and fixed memory regions.\n" );
265
258
break ;
266
259
}
267
- uiomem -> memtype = UIO_MEM_PHYS ;
260
+ uiomem -> memtype = UIO_MEM_DMA_COHERENT ;
261
+ uiomem -> dma_device = & pdev -> dev ;
268
262
uiomem -> addr = DMEM_MAP_ERROR ;
269
263
uiomem -> size = pdata -> dynamic_region_sizes [i ];
270
264
++ uiomem ;
0 commit comments