rk3368 lcdc: enable dither up default
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / lcdc / rk3368_lcdc.c
index c8345e701315027b72398dfa8414fbe7d7c13f26..7a509cd6d5d3b8c11c6b714abed9948be420789b 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) */
@@ -474,6 +477,27 @@ static int rk3368_lcdc_pre_init(struct rk_lcdc_driver *dev_drv)
 
 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);
+
 }
 
 static int rk3368_lcdc_post_cfg(struct rk_lcdc_driver *dev_drv)
@@ -1890,16 +1914,16 @@ 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;
                default:
@@ -1979,8 +2003,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;
@@ -3215,7 +3239,6 @@ static int rk3368_lcdc_early_resume(struct rk_lcdc_driver *dev_drv)
        if (!dev_drv->suspend_flag)
                return 0;
        rk_disp_pwr_enable(dev_drv);
-       dev_drv->suspend_flag = 0;
 
        if (1/*lcdc_dev->atv_layer_cnt*/) {
                rk3368_lcdc_clk_enable(lcdc_dev);
@@ -3243,9 +3266,11 @@ static int rk3368_lcdc_early_resume(struct rk_lcdc_driver *dev_drv)
 
                spin_unlock(&lcdc_dev->reg_lock);
        }
+       dev_drv->suspend_flag = 0;
 
        if (dev_drv->trsm_ops && dev_drv->trsm_ops->enable)
                dev_drv->trsm_ops->enable();
+       mdelay(100);
        return 0;
 }
 
@@ -4801,9 +4826,23 @@ static int rk3368_lcdc_remove(struct platform_device *pdev)
 static void rk3368_lcdc_shutdown(struct platform_device *pdev)
 {
        struct lcdc_device *lcdc_dev = platform_get_drvdata(pdev);
+       struct rk_lcdc_driver *dev_drv = &lcdc_dev->driver;
+#if 1
+       dev_drv->suspend_flag = 1;
+       mdelay(100);
+       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();
 
+       rk3368_lcdc_clk_disable(lcdc_dev);
+       rk_disp_pwr_disable(dev_drv);
+#else
        rk3368_lcdc_early_suspend(&lcdc_dev->driver);
        rk3368_lcdc_deint(lcdc_dev);
+#endif
+
 }
 
 #if defined(CONFIG_OF)