rk312x lcdc:
authorhjc <hjc@rock-chips.com>
Thu, 11 Sep 2014 03:31:04 +0000 (11:31 +0800)
committerhjc <hjc@rock-chips.com>
Thu, 11 Sep 2014 03:36:57 +0000 (11:36 +0800)
VOP not support pre-alpha when overlay at YUV domain,
so we set VOP overlay at RGB domain.
If open BCSH and output_color is RGB,must open R2Y&Y2R,
if output_color is YUV,must open R2Y.

drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/rk_fb.c
include/dt-bindings/rkfb/rk_fb.h

index 9c54a5e455779917f8f7ec024284e4d2d33bde9c..fa2cca963e1f0bd17b884558341240987957607b 100755 (executable)
@@ -861,13 +861,13 @@ static int rk312x_lcdc_set_scaler(struct rk_lcdc_driver *dev_drv,
 
         spin_lock(&lcdc_dev->reg_lock);
        if (dst->color_mode != src->color_mode) {
-               dev_drv->output_color = dst->color_mode;
+               /*dev_drv->output_color = dst->color_mode;
                if (dev_drv->output_color == COLOR_YCBCR)
                        dev_drv->overlay_mode = VOP_YUV_DOMAIN;
                else
                        dev_drv->overlay_mode = VOP_RGB_DOMAIN;
                lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_SW_OVERLAY_MODE,
-                            v_SW_OVERLAY_MODE(dev_drv->overlay_mode));
+                            v_SW_OVERLAY_MODE(dev_drv->overlay_mode));*/
        }
 
        lcdc_writel(lcdc_dev, SCALER_FACTOR,
@@ -922,7 +922,7 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
        spin_lock(&lcdc_dev->reg_lock);
        if (likely(lcdc_dev->clk_on)) {
                /* Select output color domain */
-               dev_drv->output_color = screen->color_mode;
+               /*dev_drv->output_color = screen->color_mode;
                if (lcdc_dev->soc_type == VOP_RK312X) {
                        if (dev_drv->output_color == COLOR_YCBCR)
                                dev_drv->overlay_mode = VOP_YUV_DOMAIN;
@@ -931,7 +931,8 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                } else {
                        dev_drv->output_color = COLOR_RGB;
                        dev_drv->overlay_mode = VOP_RGB_DOMAIN;
-               }
+               }*/
+               dev_drv->overlay_mode = VOP_RGB_DOMAIN;/*something wrong at yuv domain*/
 
                switch (screen->type) {
                 case SCREEN_RGB:
@@ -985,6 +986,7 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                        }
                        break;
                case SCREEN_TVOUT:
+               case SCREEN_TVOUT_TEST:
                        mask = m_TVE_DAC_DCLK_EN;
                        val = v_TVE_DAC_DCLK_EN(1);
                        if (screen->pixelrepeat) {
@@ -1004,7 +1006,8 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                                return -1;
                        }
                         if (lcdc_dev->soc_type == VOP_RK312X) {
-                               dev_drv->overlay_mode = VOP_YUV_DOMAIN;
+                               if (screen->type == SCREEN_TVOUT_TEST)/*for TVE index test,vop must ovarlay at yuv domain*/
+                                       dev_drv->overlay_mode = VOP_YUV_DOMAIN;
                                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0,
                                              m_SW_UV_OFFSET_EN,
                                              v_SW_UV_OFFSET_EN(1));
@@ -1739,8 +1742,25 @@ static int rk312x_lcdc_open_bcsh(struct rk_lcdc_driver *dev_drv, bool open)
 
        spin_lock(&lcdc_dev->reg_lock);
        if (lcdc_dev->clk_on) {
+               if (dev_drv->overlay_mode == VOP_YUV_DOMAIN) {
+                       if (dev_drv->output_color == COLOR_YCBCR)       /* bypass */
+                               lcdc_msk_reg(lcdc_dev, BCSH_CTRL, m_BCSH_Y2R_EN,
+                                               v_BCSH_Y2R_EN(0));
+                       else    /* YUV2RGB */
+                               lcdc_msk_reg(lcdc_dev, BCSH_CTRL,
+                                               m_BCSH_Y2R_EN | m_BCSH_Y2R_CSC_MODE,
+                                               v_BCSH_Y2R_EN(1) | v_BCSH_Y2R_CSC_MODE(VOP_Y2R_CSC_MPEG));
+               } else {        /* overlay_mode=VOP_RGB_DOMAIN */
+                       if (dev_drv->output_color == COLOR_RGB) /* bypass */
+                               lcdc_msk_reg(lcdc_dev, BCSH_CTRL, m_BCSH_R2Y_EN | m_BCSH_Y2R_EN,
+                                               v_BCSH_R2Y_EN(1) | v_BCSH_Y2R_EN(1));
+                       else    /* RGB2YUV */
+                               lcdc_msk_reg(lcdc_dev, BCSH_CTRL,
+                                               m_BCSH_R2Y_EN | m_BCSH_R2Y_CSC_MODE,
+                                               v_BCSH_R2Y_EN(1) | v_BCSH_R2Y_CSC_MODE(VOP_Y2R_CSC_MPEG));
+               }
                if (open) {
-                       lcdc_writel(lcdc_dev, BCSH_CTRL,
+                       lcdc_msk_reg(lcdc_dev, BCSH_CTRL,m_BCSH_EN | m_BCSH_OUT_MODE,
                                    v_BCSH_EN(1) | v_BCSH_OUT_MODE(3));
                        lcdc_writel(lcdc_dev, BCSH_BCS,
                                    v_BCSH_BRIGHTNESS(0x00) |
@@ -1753,24 +1773,7 @@ static int rk312x_lcdc_open_bcsh(struct rk_lcdc_driver *dev_drv, bool open)
                        lcdc_msk_reg(lcdc_dev, BCSH_CTRL, mask, val);
                }
                lcdc_cfg_done(lcdc_dev);
-       }
 
-       if (dev_drv->overlay_mode == VOP_YUV_DOMAIN) {
-               if (dev_drv->output_color == COLOR_YCBCR)       /* bypass */
-                       lcdc_msk_reg(lcdc_dev, BCSH_CTRL, m_BCSH_Y2R_EN,
-                                       v_BCSH_Y2R_EN(0));
-               else    /* YUV2RGB */
-                       lcdc_msk_reg(lcdc_dev, BCSH_CTRL,
-                                       m_BCSH_Y2R_EN | m_BCSH_Y2R_CSC_MODE,
-                                       v_BCSH_Y2R_EN(1) | v_BCSH_Y2R_CSC_MODE(VOP_Y2R_CSC_MPEG));
-       } else {        /* overlay_mode=VOP_RGB_DOMAIN */
-               if (dev_drv->output_color == COLOR_RGB) /* bypass */
-                       lcdc_msk_reg(lcdc_dev, BCSH_CTRL, m_BCSH_R2Y_EN,
-                                       v_BCSH_R2Y_EN(0));
-               else    /* RGB2YUV */
-                       lcdc_msk_reg(lcdc_dev, BCSH_CTRL,
-                                       m_BCSH_R2Y_EN | m_BCSH_R2Y_CSC_MODE,
-                                       v_BCSH_R2Y_EN(1) | v_BCSH_R2Y_CSC_MODE(VOP_Y2R_CSC_MPEG));
        }
 
        spin_unlock(&lcdc_dev->reg_lock);
index c77094faa762fce975f4a6cfd85cc656540bb3cd..3cbe44505371c9146e71696f49dd419c83ef8653 100755 (executable)
@@ -3731,6 +3731,7 @@ static int init_lcdc_device_driver(struct rk_fb *rk_fb,
        dev_drv->trsm_ops = rk_fb_trsm_ops_get(screen->type);
        if (dev_drv->prop != PRMRY)
                rk_fb_get_prmry_screen(screen);
+       dev_drv->output_color = screen->color_mode;
 
        return 0;
 }
index 03e4016772cf25b447560f57087199110ff2c137..f05d165e873d976ba2789f27b508711264537ae2 100755 (executable)
@@ -31,6 +31,7 @@
 #define SCREEN_MIPI       7
 #define SCREEN_DUAL_MIPI   8
 #define SCREEN_EDP         9
+#define SCREEN_TVOUT_TEST  10
 
 #define LVDS_8BIT_1     0
 #define LVDS_8BIT_2     1