aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/uio
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/uio')
-rw-r--r--drivers/uio/uio_dmem_genirq.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/uio/uio_dmem_genirq.c b/drivers/uio/uio_dmem_genirq.c
index 4d4dd008c8b9..d8bbe0783cdc 100644
--- a/drivers/uio/uio_dmem_genirq.c
+++ b/drivers/uio/uio_dmem_genirq.c
@@ -37,6 +37,7 @@ struct uio_dmem_genirq_platdata {
37 struct platform_device *pdev; 37 struct platform_device *pdev;
38 unsigned int dmem_region_start; 38 unsigned int dmem_region_start;
39 unsigned int num_dmem_regions; 39 unsigned int num_dmem_regions;
40 void *dmem_region_vaddr[MAX_UIO_MAPS];
40 struct mutex alloc_lock; 41 struct mutex alloc_lock;
41 unsigned int refcnt; 42 unsigned int refcnt;
42}; 43};
@@ -46,6 +47,7 @@ static int uio_dmem_genirq_open(struct uio_info *info, struct inode *inode)
46 struct uio_dmem_genirq_platdata *priv = info->priv; 47 struct uio_dmem_genirq_platdata *priv = info->priv;
47 struct uio_mem *uiomem; 48 struct uio_mem *uiomem;
48 int ret = 0; 49 int ret = 0;
50 int dmem_region = priv->dmem_region_start;
49 51
50 uiomem = &priv->uioinfo->mem[priv->dmem_region_start]; 52 uiomem = &priv->uioinfo->mem[priv->dmem_region_start];
51 53
@@ -61,8 +63,7 @@ static int uio_dmem_genirq_open(struct uio_info *info, struct inode *inode)
61 ret = -ENOMEM; 63 ret = -ENOMEM;
62 break; 64 break;
63 } 65 }
64 66 priv->dmem_region_vaddr[dmem_region++] = addr;
65 uiomem->internal_addr = addr;
66 ++uiomem; 67 ++uiomem;
67 } 68 }
68 priv->refcnt++; 69 priv->refcnt++;
@@ -77,6 +78,7 @@ static int uio_dmem_genirq_release(struct uio_info *info, struct inode *inode)
77{ 78{
78 struct uio_dmem_genirq_platdata *priv = info->priv; 79 struct uio_dmem_genirq_platdata *priv = info->priv;
79 struct uio_mem *uiomem; 80 struct uio_mem *uiomem;
81 int dmem_region = priv->dmem_region_start;
80 82
81 /* Tell the Runtime PM code that the device has become idle */ 83 /* Tell the Runtime PM code that the device has become idle */
82 pm_runtime_put_sync(&priv->pdev->dev); 84 pm_runtime_put_sync(&priv->pdev->dev);
@@ -91,7 +93,8 @@ static int uio_dmem_genirq_release(struct uio_info *info, struct inode *inode)
91 break; 93 break;
92 94
93 dma_free_coherent(&priv->pdev->dev, uiomem->size, 95 dma_free_coherent(&priv->pdev->dev, uiomem->size,
94 uiomem->internal_addr, uiomem->addr); 96 priv->dmem_region_vaddr[dmem_region++],
97 uiomem->addr);
95 uiomem->addr = DMA_ERROR_CODE; 98 uiomem->addr = DMA_ERROR_CODE;
96 ++uiomem; 99 ++uiomem;
97 } 100 }