From: hjc Date: Wed, 11 Feb 2015 03:54:29 +0000 (+0800) Subject: rk fb: fix fence time out for dual display mode X-Git-Tag: firefly_0821_release~4263^2~51 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=44c63d9ee6dc13e182728c20aade81786b5999d2;p=firefly-linux-kernel-4.4.55.git rk fb: fix fence time out for dual display mode Signed-off-by: hjc --- diff --git a/drivers/video/rockchip/lcdc/rk3288_lcdc.c b/drivers/video/rockchip/lcdc/rk3288_lcdc.c index 51b4eaa8cec0..cee1e693b4ca 100755 --- a/drivers/video/rockchip/lcdc/rk3288_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3288_lcdc.c @@ -1408,6 +1408,7 @@ static int rk3288_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, rockchip_set_system_status(sys_status); rk3288_lcdc_pre_init(dev_drv); rk3288_lcdc_clk_enable(lcdc_dev); + rk3288_lcdc_enable_irq(dev_drv); #if defined(CONFIG_ROCKCHIP_IOMMU) if (dev_drv->iommu_enabled) { if (!dev_drv->mmu_dev) { diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 31f6835dbcf7..837e2c34dfa6 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -2040,6 +2040,12 @@ static int rk_fb_set_win_config(struct fb_info *info, int ret = 0, i, j = 0; int list_is_empty = 0; + if (dev_drv->suspend_flag) { + dev_drv->timeline_max++; + sw_sync_timeline_inc(dev_drv->timeline, 1); + return 0; + } + regs = kzalloc(sizeof(struct rk_fb_reg_data), GFP_KERNEL); if (!regs) { printk(KERN_INFO "could not allocate rk_fb_reg_data\n"); @@ -2073,11 +2079,6 @@ static int rk_fb_set_win_config(struct fb_info *info, } mutex_lock(&dev_drv->output_lock); - if (!(dev_drv->suspend_flag == 0)) { - rk_fb_update_reg(dev_drv, regs); - printk(KERN_INFO "suspend_flag = 1\n"); - goto err; - } dev_drv->timeline_max++; #ifdef H_USE_FENCE @@ -2106,6 +2107,7 @@ 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; } @@ -3102,9 +3104,11 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) if (dev_drv->ops->dsp_black) dev_drv->ops->dsp_black(dev_drv, 0); - } else if (rk_fb->num_lcdc > 1 && rk_fb->disp_policy == DISPLAY_POLICY_BOX) { + } else if (rk_fb->num_lcdc > 1) { /* If there is more than one lcdc device, we disable the layer which attached to this device */ + dev_drv->suspend_flag = 1; + flush_kthread_worker(&dev_drv->update_regs_worker); for (i = 0; i < dev_drv->lcdc_win_num; i++) { if (dev_drv->win[i] && dev_drv->win[i]->state) dev_drv->ops->open(dev_drv, i, 0); @@ -3130,8 +3134,10 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id) win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id); if (dev_drv->win[win_id]) { if (fb_par->state) { - if (!dev_drv->win[win_id]->state) + if (!dev_drv->win[win_id]->state) { dev_drv->ops->open(dev_drv, win_id, 1); + dev_drv->suspend_flag = 0; + } if (!load_screen) { dev_drv->ops->load_screen(dev_drv, 1); load_screen = 1;