From: hjc Date: Mon, 9 Mar 2015 02:38:07 +0000 (+0800) Subject: rk fb: make sure win close state take effect when update regs X-Git-Tag: firefly_0821_release~4158^2~382 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=789a229b3383904e056a684db7e1e02d956aee13;p=firefly-linux-kernel-4.4.55.git rk fb: make sure win close state take effect when update regs Signed-off-by: hjc --- diff --git a/drivers/video/rockchip/lcdc/rk312x_lcdc.c b/drivers/video/rockchip/lcdc/rk312x_lcdc.c index 38c29f883fec..c6662d009cb6 100755 --- a/drivers/video/rockchip/lcdc/rk312x_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk312x_lcdc.c @@ -1702,7 +1702,18 @@ static int rk312x_lcdc_get_win_id(struct rk_lcdc_driver *dev_drv, static int rk312x_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv, int win_id) { - return 0; + struct lcdc_device *lcdc_dev = + container_of(dev_drv, struct lcdc_device, driver); + int win_status = 0; + + if (win_id == 0) + win_status = lcdc_read_bit(lcdc_dev, SYS_CTRL, m_WIN0_EN); + else if (win_id == 1) + win_status = lcdc_read_bit(lcdc_dev, SYS_CTRL, m_WIN1_EN); + else + pr_err("!!!%s,win_id :%d,unsupport!!!\n",__func__,win_id); + + return win_status; } static int rk312x_lcdc_ovl_mgr(struct rk_lcdc_driver *dev_drv, int swap, diff --git a/drivers/video/rockchip/lcdc/rk3288_lcdc.c b/drivers/video/rockchip/lcdc/rk3288_lcdc.c index cee1e693b4ca..3b0bf195959c 100755 --- a/drivers/video/rockchip/lcdc/rk3288_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3288_lcdc.c @@ -2522,7 +2522,23 @@ static int rk3288_lcdc_blank(struct rk_lcdc_driver *dev_drv, static int rk3288_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv, int win_id) { - return 0; + struct lcdc_device *lcdc_dev = + container_of(dev_drv, struct lcdc_device, driver); + int win_status = 0; + if (win_id == 0) + win_status = lcdc_read_bit(lcdc_dev, WIN0_CTRL0, m_WIN0_EN); + else if (win_id == 1) + win_status = lcdc_read_bit(lcdc_dev, WIN1_CTRL0, m_WIN1_EN); + else if (win_id == 2) + win_status = lcdc_read_bit(lcdc_dev, WIN2_CTRL0, m_WIN2_EN); + else if (win_id == 3) + win_status = lcdc_read_bit(lcdc_dev, WIN3_CTRL0, m_WIN3_EN); + else if (win_id == 4) + win_status = lcdc_read_bit(lcdc_dev, HWC_CTRL0, m_HWC_EN); + else + pr_err("!!!%s,win_id :%d,unsupport!!!\n",__func__,win_id); + + return win_status; } /*overlay will be do at regupdate*/ diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index bc8877d83f3e..6ea6f846a214 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1646,6 +1646,7 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv, int count = 100; unsigned int dsp_addr[4]; long timeout; + int win_status = 0; /* acq_fence wait */ for (i = 0; i < regs->win_num; i++) { @@ -1695,28 +1696,36 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv, dev_drv->ops->get_dsp_addr(dev_drv, dsp_addr); wait_for_vsync = false; for (i = 0; i < dev_drv->lcdc_win_num; i++) { + if (rk_fb->disp_policy == DISPLAY_POLICY_BOX && + (!strcmp(dev_drv->win[i]->name, "hwc"))) + continue; if (dev_drv->win[i]->state == 1) { - if (rk_fb->disp_policy == DISPLAY_POLICY_BOX && - (!strcmp(dev_drv->win[i]->name, "hwc"))) { + u32 new_start = + dev_drv->win[i]->area[0].smem_start + + dev_drv->win[i]->area[0].y_offset; + u32 reg_start = dsp_addr[i]; + + if ((rk_fb->disp_policy == + DISPLAY_POLICY_BOX) && + (dev_drv->suspend_flag)) continue; - } else { - u32 new_start = - dev_drv->win[i]->area[0].smem_start + - dev_drv->win[i]->area[0].y_offset; - u32 reg_start = dsp_addr[i]; - - if ((rk_fb->disp_policy == - DISPLAY_POLICY_BOX) && - (dev_drv->suspend_flag)) - continue; - if (unlikely(new_start != reg_start)) { - wait_for_vsync = true; - dev_info(dev_drv->dev, - "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n", - i, new_start, reg_start, 101 - count); - break; - } + if (unlikely(new_start != reg_start)) { + wait_for_vsync = true; + dev_info(dev_drv->dev, + "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n", + i, new_start, reg_start, 101 - count); + break; } + } else if (dev_drv->win[i]->state == 0) { + if (dev_drv->ops->get_win_state) { + win_status = + dev_drv->ops->get_win_state(dev_drv, i); + if (win_status) + wait_for_vsync = true; + } + } else { + pr_err("!!!win[%d]state:%d,error!!!\n", + i, dev_drv->win[i]->state); } } } while (wait_for_vsync && count--);