rk3368 lcdc: update gather config
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / lcdc / rk3368_lcdc.c
index 6e44a653cb1f4382af2572925b202fdf9935805c..d021252ee35c260bee8d4f2138a62163fd49a455 100755 (executable)
@@ -463,6 +463,9 @@ static int rk3368_lcdc_pre_init(struct rk_lcdc_driver *dev_drv)
        mask = m_AUTO_GATING_EN;
        val = v_AUTO_GATING_EN(0);
        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
+       mask = m_DITHER_UP_EN;
+       val = v_DITHER_UP_EN(1);
+       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
        lcdc_cfg_done(lcdc_dev);
        /*disable win0 to workaround iommu pagefault */
        /*if (dev_drv->iommu_enabled) */
@@ -476,25 +479,26 @@ static void rk3368_lcdc_deint(struct lcdc_device *lcdc_dev)
 {
        u32 mask, val;
 
-       rk3368_lcdc_disable_irq(lcdc_dev);
-       spin_lock(&lcdc_dev->reg_lock);
-       mask = m_WIN0_EN;
-       val = v_WIN0_EN(0);
-       lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask, val);
-       lcdc_msk_reg(lcdc_dev, WIN1_CTRL0, mask, val);
-
-       mask = m_WIN2_EN | m_WIN2_MST0_EN |
-               m_WIN2_MST1_EN |
-               m_WIN2_MST2_EN | m_WIN2_MST3_EN;
-       val = v_WIN2_EN(0) | v_WIN2_MST0_EN(0) |
-               v_WIN2_MST1_EN(0) |
-               v_WIN2_MST2_EN(0) | v_WIN2_MST3_EN(0);
-       lcdc_msk_reg(lcdc_dev, WIN2_CTRL0, mask, val);
-       lcdc_msk_reg(lcdc_dev, WIN3_CTRL0, mask, val);
-       lcdc_cfg_done(lcdc_dev);
-       spin_unlock(&lcdc_dev->reg_lock);
-       mdelay(50);
+       if (lcdc_dev->clk_on) {
+               rk3368_lcdc_disable_irq(lcdc_dev);
+               spin_lock(&lcdc_dev->reg_lock);
+               mask = m_WIN0_EN;
+               val = v_WIN0_EN(0);
+               lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask, val);
+               lcdc_msk_reg(lcdc_dev, WIN1_CTRL0, mask, val);
 
+               mask = m_WIN2_EN | m_WIN2_MST0_EN |
+                       m_WIN2_MST1_EN |
+                       m_WIN2_MST2_EN | m_WIN2_MST3_EN;
+               val = v_WIN2_EN(0) | v_WIN2_MST0_EN(0) |
+                       v_WIN2_MST1_EN(0) |
+                       v_WIN2_MST2_EN(0) | v_WIN2_MST3_EN(0);
+               lcdc_msk_reg(lcdc_dev, WIN2_CTRL0, mask, val);
+               lcdc_msk_reg(lcdc_dev, WIN3_CTRL0, mask, val);
+               lcdc_cfg_done(lcdc_dev);
+               spin_unlock(&lcdc_dev->reg_lock);
+               mdelay(50);
+       }
 }
 
 static int rk3368_lcdc_post_cfg(struct rk_lcdc_driver *dev_drv)
@@ -1064,25 +1068,25 @@ static int rk3368_lcdc_axi_gather_cfg(struct lcdc_device *lcdc_dev,
                                            struct rk_lcdc_win *win)
 {
        u32 mask, val;
-       u16 yrgb_gather_num = 8;
-       u16 cbcr_gather_num = 2;
+       u16 yrgb_gather_num = 3;
+       u16 cbcr_gather_num = 1;
 
        switch (win->area[0].format) {
        case ARGB888:
        case XBGR888:
        case ABGR888:
-               yrgb_gather_num = 8;
+               yrgb_gather_num = 3;
                break;
        case RGB888:
        case RGB565:
-               yrgb_gather_num = 4;
+               yrgb_gather_num = 2;
                break;
        case YUV444:
        case YUV422:
        case YUV420:
        case YUV420_NV21:
-               yrgb_gather_num = 2;
-               cbcr_gather_num = 4;
+               yrgb_gather_num = 1;
+               cbcr_gather_num = 2;
                break;
        default:
                dev_err(lcdc_dev->driver.dev, "%s:un supported format!\n",
@@ -1098,9 +1102,9 @@ static int rk3368_lcdc_axi_gather_cfg(struct lcdc_device *lcdc_dev,
                        v_WIN0_CBR_AXI_GATHER_NUM(cbcr_gather_num);
                lcdc_msk_reg(lcdc_dev, WIN0_CTRL1 + (win->id * 0x40), mask, val);
        } else if ((win->id == 2) || (win->id == 3)) {
-               mask = m_WIN0_YRGB_AXI_GATHER_EN | m_WIN0_YRGB_AXI_GATHER_NUM;
-               val = v_WIN0_YRGB_AXI_GATHER_EN(1) |
-                       v_WIN0_YRGB_AXI_GATHER_NUM(yrgb_gather_num);
+               mask = m_WIN2_AXI_GATHER_EN | m_WIN2_AXI_GATHER_NUM;
+               val = v_WIN2_AXI_GATHER_EN(1) |
+                       v_WIN2_AXI_GATHER_NUM(yrgb_gather_num);
                lcdc_msk_reg(lcdc_dev, WIN2_CTRL1 + ((win->id - 2) * 0x50), mask, val);
        } else if (win->id == 4) {
                mask = m_HWC_AXI_GATHER_EN | m_HWC_AXI_GATHER_NUM;
@@ -1911,16 +1915,28 @@ static int rk3368_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                        break;
                case OUT_P888:
                        face = OUT_P888;
-                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
-                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+                       mask = m_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                case OUT_YUV_420:
                        /*yuv420 output prefer yuv domain overlay */
                        face = OUT_YUV_420;
                        dclk_ddr = 1;
-                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
-                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+                       mask = m_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0);
+                       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
+                       break;
+               case OUT_S888:
+                       face = OUT_S888;
+                       mask = m_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0);
+                       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
+                       break;
+               case OUT_S888DUMY:
+                       face = OUT_S888DUMY;
+                       mask = m_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                default:
@@ -2000,8 +2016,8 @@ static int rk3368_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                        val = v_EDP_OUT_EN(1) | v_RGB_OUT_EN(0);
                        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
                        /*because edp have to sent aaa fmt */
-                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
-                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+                       mask = m_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0);
 
                        mask |= m_EDP_HSYNC_POL | m_EDP_VSYNC_POL |
                            m_EDP_DEN_POL | m_EDP_DCLK_POL;
@@ -3297,7 +3313,7 @@ static int rk3368_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv,
        struct lcdc_device *lcdc_dev =
            container_of(dev_drv, struct lcdc_device, driver);
         u32 win_ctrl = 0;
-        u32 area_status = 0;
+        u32 area_status = 0, state = 0;
 
         switch (win_id) {
         case 0:
@@ -3311,7 +3327,7 @@ static int rk3368_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv,
         case 2:
                 win_ctrl = lcdc_readl(lcdc_dev, WIN2_CTRL0);
                 if (area_id == 0)
-                        area_status = win_ctrl & m_WIN2_MST0_EN;
+                        area_status = win_ctrl & (m_WIN2_MST0_EN | m_WIN2_EN);
                 if (area_id == 1)
                         area_status = win_ctrl & m_WIN2_MST1_EN;
                 if (area_id == 2)
@@ -3322,7 +3338,7 @@ static int rk3368_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv,
         case 3:
                 win_ctrl = lcdc_readl(lcdc_dev, WIN3_CTRL0);
                 if (area_id == 0)
-                        area_status = win_ctrl & m_WIN3_MST0_EN;
+                        area_status = win_ctrl & (m_WIN3_MST0_EN | m_WIN3_EN);
                 if (area_id == 1)
                         area_status = win_ctrl & m_WIN3_MST1_EN;
                 if (area_id == 2)
@@ -3338,7 +3354,9 @@ static int rk3368_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv,
                 pr_err("!!!%s,win[%d]area[%d],unsupport!!!\n",__func__,win_id,area_id);
                 break;
         }
-       return area_status;
+
+       state = (area_status > 0) ? 1 : 0;
+       return state;
 }
 
 static int rk3368_lcdc_get_area_num(struct rk_lcdc_driver *dev_drv,
@@ -4830,8 +4848,8 @@ static void rk3368_lcdc_shutdown(struct platform_device *pdev)
        flush_kthread_worker(&dev_drv->update_regs_worker);
        kthread_stop(dev_drv->update_regs_thread);
        rk3368_lcdc_deint(lcdc_dev);
-       if (dev_drv->trsm_ops && dev_drv->trsm_ops->disable)
-               dev_drv->trsm_ops->disable();
+       /*if (dev_drv->trsm_ops && dev_drv->trsm_ops->disable)
+               dev_drv->trsm_ops->disable();*/
 
        rk3368_lcdc_clk_disable(lcdc_dev);
        rk_disp_pwr_disable(dev_drv);