aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2015-12-06 18:40:28 +0100
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2015-12-06 18:40:28 +0100
commit10a8113dfbfaf19d69eca171b96e451f5221cc2b (patch)
tree0ce8d433d5ef608526edf0ab0d7cedb68d68d460 /drivers/staging
parent5e64624059d6f984f4304abf336cce05cdb0212f (diff)
parente34b930b3ae085850e7d04e6f6f9c5578c0caf9d (diff)
downloadkernel_samsung_smdk4412-10a8113dfbfaf19d69eca171b96e451f5221cc2b.zip
kernel_samsung_smdk4412-10a8113dfbfaf19d69eca171b96e451f5221cc2b.tar.gz
kernel_samsung_smdk4412-10a8113dfbfaf19d69eca171b96e451f5221cc2b.tar.bz2
Merge branch 'master' into upstreaming
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/tidspbridge/rmgr/drv_interface.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c
index c43c7e3..80c2ee5 100644
--- a/drivers/staging/tidspbridge/rmgr/drv_interface.c
+++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c
@@ -617,7 +617,11 @@ err:
static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)
{
u32 offset = vma->vm_pgoff << PAGE_SHIFT;
- u32 status;
+ unsigned long base_pgoff;
+ int status;
+
+ struct omap_dsp_platform_data *pdata =
+ omap_dspbridge_dev->dev.platform_data;
DBC_ASSERT(vma->vm_start < vma->vm_end);
@@ -628,11 +632,27 @@ static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)
"%lx flags %lx\n", __func__, filp, offset,
vma->vm_start, vma->vm_end, vma->vm_page_prot, vma->vm_flags);
- status = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
- vma->vm_end - vma->vm_start,
- vma->vm_page_prot);
- if (status != 0)
- status = -EAGAIN;
+ /*
+ * vm_iomap_memory() expects vma->vm_pgoff to be expressed as an offset
+ * from the start of the physical memory pool, but we're called with
+ * a pfn (physical page number) stored there instead.
+ *
+ * To avoid duplicating lots of tricky overflow checking logic,
+ * temporarily convert vma->vm_pgoff to the offset vm_iomap_memory()
+ * expects, but restore the original value once the mapping has been
+ * created.
+ */
+ base_pgoff = pdata->phys_mempool_base >> PAGE_SHIFT;
+ if (vma->vm_pgoff < base_pgoff)
+ return -EINVAL;
+ vma->vm_pgoff -= base_pgoff;
+
+ status = vm_iomap_memory(vma,
+ pdata->phys_mempool_base,
+ pdata->phys_mempool_size);
+
+ /* Restore the original value of vma->vm_pgoff */
+ vma->vm_pgoff += base_pgoff;
return status;
}