aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/omap2/omapfb/omapfb-main.c30
1 files changed, 7 insertions, 23 deletions
diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
index ca585ef37f25..717f13a93351 100644
--- a/drivers/video/omap2/omapfb/omapfb-main.c
+++ b/drivers/video/omap2/omapfb/omapfb-main.c
@@ -1101,41 +1101,25 @@ static int omapfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
1101 struct omapfb_info *ofbi = FB2OFB(fbi); 1101 struct omapfb_info *ofbi = FB2OFB(fbi);
1102 struct fb_fix_screeninfo *fix = &fbi->fix; 1102 struct fb_fix_screeninfo *fix = &fbi->fix;
1103 struct omapfb2_mem_region *rg; 1103 struct omapfb2_mem_region *rg;
1104 unsigned long off;
1105 unsigned long start; 1104 unsigned long start;
1106 u32 len; 1105 u32 len;
1107 int r = -EINVAL; 1106 int r;
1108
1109 if (vma->vm_end - vma->vm_start == 0)
1110 return 0;
1111 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
1112 return -EINVAL;
1113 off = vma->vm_pgoff << PAGE_SHIFT;
1114 1107
1115 rg = omapfb_get_mem_region(ofbi->region); 1108 rg = omapfb_get_mem_region(ofbi->region);
1116 1109
1117 start = omapfb_get_region_paddr(ofbi); 1110 start = omapfb_get_region_paddr(ofbi);
1118 len = fix->smem_len; 1111 len = fix->smem_len;
1119 if (off >= len)
1120 goto error;
1121 if ((vma->vm_end - vma->vm_start + off) > len)
1122 goto error;
1123
1124 off += start;
1125 1112
1126 DBG("user mmap region start %lx, len %d, off %lx\n", start, len, off); 1113 DBG("user mmap region start %lx, len %d, off %lx\n", start, len,
1114 vma->vm_pgoff << PAGE_SHIFT);
1127 1115
1128 vma->vm_pgoff = off >> PAGE_SHIFT;
1129 /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */
1130 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); 1116 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
1131 vma->vm_ops = &mmap_user_ops; 1117 vma->vm_ops = &mmap_user_ops;
1132 vma->vm_private_data = rg; 1118 vma->vm_private_data = rg;
1133 if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, 1119
1134 vma->vm_end - vma->vm_start, 1120 r = vm_iomap_memory(vma, start, len);
1135 vma->vm_page_prot)) { 1121 if (r)
1136 r = -EAGAIN;
1137 goto error; 1122 goto error;
1138 }
1139 1123
1140 /* vm_ops.open won't be called for mmap itself. */ 1124 /* vm_ops.open won't be called for mmap itself. */
1141 atomic_inc(&rg->map_count); 1125 atomic_inc(&rg->map_count);
@@ -1144,7 +1128,7 @@ static int omapfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
1144 1128
1145 return 0; 1129 return 0;
1146 1130
1147 error: 1131error:
1148 omapfb_put_mem_region(ofbi->region); 1132 omapfb_put_mem_region(ofbi->region);
1149 1133
1150 return r; 1134 return r;