diff options
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb-main.c | 30 |
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: | 1131 | error: |
1148 | omapfb_put_mem_region(ofbi->region); | 1132 | omapfb_put_mem_region(ofbi->region); |
1149 | 1133 | ||
1150 | return r; | 1134 | return r; |