rk fb: make sure win close state take effect when update regs
authorhjc <hjc@rock-chips.com>
Mon, 9 Mar 2015 02:38:07 +0000 (10:38 +0800)
committerhjc <hjc@rock-chips.com>
Mon, 9 Mar 2015 06:54:05 +0000 (14:54 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/lcdc/rk3288_lcdc.c
drivers/video/rockchip/rk_fb.c

index 38c29f883fec97505088bfa29e1adc20f0a4db77..c6662d009cb6cf7ddb94e99a636b4a71fcac282a 100755 (executable)
@@ -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,
index cee1e693b4ca8808f290788a2fa8fdc78d0f7814..3b0bf195959c82b3b278f7b440c4685fca1ba7eb 100755 (executable)
@@ -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*/
index bc8877d83f3ee74a7925d27c7811afa0820939b9..6ea6f846a214976ff37334b63d2437d45635dda9 100755 (executable)
@@ -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--);