rk_fb: sysfs: make use vmap/vunmap in pairs.
authorMark Yao <mark.yao@rock-chips.com>
Wed, 3 Dec 2014 07:05:15 +0000 (15:05 +0800)
committerMark Yao <mark.yao@rock-chips.com>
Wed, 3 Dec 2014 07:10:19 +0000 (15:10 +0800)
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/video/rockchip/rkfb_sysfs.c

index ee4f557d746e9d616114f84819dcf5adc282f932..07d8ab6d6b53a415ad6130af1ce435163293073b 100755 (executable)
@@ -115,7 +115,7 @@ static void fill_buffer(void *handle, void *vaddr, int size)
 static int dump_win(struct rk_fb *rk_fb, struct rk_fb_reg_area_data *area_data,
                    u8 data_format, int win_id, int area_id, bool is_bmp)
 {
-       void __iomem *vaddr;
+       void __iomem *vaddr = NULL;
        struct file *filp;
        mm_segment_t old_fs;
        char name[100];
@@ -139,7 +139,13 @@ static int dump_win(struct rk_fb *rk_fb, struct rk_fb_reg_area_data *area_data,
                        start += PAGE_SIZE;
                        i++;
                }
-               vaddr = vmap(pages, nr_pages, VM_MAP, pgprot_writecombine(PAGE_KERNEL));
+               vaddr = vmap(pages, nr_pages, VM_MAP,
+                            pgprot_writecombine(PAGE_KERNEL));
+               if (!vaddr) {
+                       pr_err("failed to vmap phy addr %lx\n",
+                              area_data->smem_start);
+                       return -1;
+               }
        } else {
                return -1;
        }
@@ -170,6 +176,8 @@ static int dump_win(struct rk_fb *rk_fb, struct rk_fb_reg_area_data *area_data,
                ion_unmap_kernel(rk_fb->ion_client, ion_handle);
 
                ion_handle_put(ion_handle);
+       } else if (vaddr) {
+               vunmap(vaddr);
        }
 
        filp_close(filp, NULL);