From: hjc Date: Sat, 18 Apr 2015 06:01:06 +0000 (+0800) Subject: rk fb: extend output mutex lock in win config X-Git-Tag: firefly_0821_release~4158^2~181 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3648385d251f6c5110bf175e3faeaddd1a257da0;p=firefly-linux-kernel-4.4.55.git rk fb: extend output mutex lock in win config Signed-off-by: hjc --- diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 9aa52ca8cfe2..40782386d699 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -2179,6 +2179,16 @@ static int rk_fb_set_win_config(struct fb_info *info, int list_is_empty = 0; struct rk_screen *screen = dev_drv->cur_screen; + win_data->ret_fence_fd = get_unused_fd(); + if (win_data->ret_fence_fd < 0) { + pr_err("ret_fence_fd=%d\n", win_data->ret_fence_fd); + win_data->ret_fence_fd = -1; + ret = -EFAULT; + return ret; + } + + mutex_lock(&dev_drv->output_lock); + for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (win_data->win_par[i].area_par[j].ion_fd > 0) @@ -2199,21 +2209,23 @@ static int rk_fb_set_win_config(struct fb_info *info, for (j = 0; j < RK_MAX_BUF_NUM; j++) win_data->rel_fence_fd[j] = -1; win_data->ret_fence_fd = -1; - return 0; + goto err; } regs = kzalloc(sizeof(struct rk_fb_reg_data), GFP_KERNEL); if (!regs) { printk(KERN_INFO "could not allocate rk_fb_reg_data\n"); ret = -ENOMEM; - return ret; + goto err; } for (i = 0,j = 0; i < dev_drv->lcdc_win_num; i++) { if (win_data->win_par[i].win_id < dev_drv->lcdc_win_num) { if (rk_fb_set_win_buffer(info, &win_data->win_par[i], - ®s->reg_win_data[j])) - return -ENOMEM; + ®s->reg_win_data[j])) { + ret = -ENOMEM; + goto err; + } if (regs->reg_win_data[j].area_num > 0) { regs->win_num++; regs->buf_num += @@ -2230,8 +2242,6 @@ static int rk_fb_set_win_config(struct fb_info *info, if (regs->win_num <= 0) goto err_null_frame; - mutex_lock(&dev_drv->output_lock); - dev_drv->timeline_max++; #ifdef H_USE_FENCE for (i = 0; i < RK_MAX_BUF_NUM; i++) { @@ -2256,13 +2266,6 @@ static int rk_fb_set_win_config(struct fb_info *info, } } - win_data->ret_fence_fd = get_unused_fd(); - if (win_data->ret_fence_fd < 0) { - printk("ret_fence_fd=%d\n", win_data->ret_fence_fd); - win_data->ret_fence_fd = -1; - ret = -EFAULT; - goto err; - } retire_sync_pt = sw_sync_pt_create(dev_drv->timeline, dev_drv->timeline_max); retire_fence = sync_fence_create("ret_fence", retire_sync_pt); @@ -2305,6 +2308,7 @@ err_null_frame: for (j = 0; j < RK_MAX_BUF_NUM; j++) win_data->rel_fence_fd[j] = -1; win_data->ret_fence_fd = -1; + mutex_unlock(&dev_drv->output_lock); pr_info("win num = %d,null frame\n", regs->win_num); return 0; }