diff options
author | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2015-12-06 19:50:09 +0100 |
---|---|---|
committer | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2015-12-06 19:50:09 +0100 |
commit | 3fe26611bb4999c3717d3aface0bac722b9d2653 (patch) | |
tree | 4e2f65865f3096180b28c6bd8a366155a9d9a326 /drivers/staging | |
parent | fc480b9ec980f6751698db56922ef46d05436bd7 (diff) | |
parent | 10a8113dfbfaf19d69eca171b96e451f5221cc2b (diff) | |
download | kernel_samsung_smdk4412-3fe26611bb4999c3717d3aface0bac722b9d2653.zip kernel_samsung_smdk4412-3fe26611bb4999c3717d3aface0bac722b9d2653.tar.gz kernel_samsung_smdk4412-3fe26611bb4999c3717d3aface0bac722b9d2653.tar.bz2 |
Merge branch 'upstreaming' of fossencdi.org:kernel_samsung_smdk4412 into upstreaming
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv_interface.c | 32 |
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; } |