rk3368 lcdc: add yuv overlay and close lut when switch hdmi
authorhjc <hjc@rock-chips.com>
Thu, 18 Dec 2014 03:08:29 +0000 (11:08 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Thu, 25 Dec 2014 06:26:21 +0000 (14:26 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk3368_lcdc.c
drivers/video/rockchip/rk_fb.c

index 5fe31f42dd63a54eeb8d971ea142c5fdc4a67b65..c80b5f3e0b04be3866ba2578efc0de48f625bc3b 100644 (file)
@@ -499,15 +499,6 @@ static int rk3368_lcdc_post_cfg(struct rk_lcdc_driver *dev_drv)
                screen->post_dsp_sty = y_res - screen->post_ysize;
        }
 
-       if (screen->y_mirror == 0) {
-               post_dsp_vact_st = screen->post_dsp_sty +
-                   screen->mode.vsync_len + screen->mode.upper_margin;
-               post_dsp_vact_end = post_dsp_vact_st + screen->post_ysize;
-       } else {
-               post_dsp_vact_end = v_total - screen->mode.lower_margin -
-                   screen->post_dsp_sty;
-               post_dsp_vact_st = post_dsp_vact_end - screen->post_ysize;
-       }
        if ((screen->post_ysize < y_res) && (screen->post_ysize != 0)) {
                post_vsd_en = 1;
                post_v_fac = GET_SCALE_FACTOR_BILI_DN(y_res,
@@ -517,10 +508,33 @@ static int rk3368_lcdc_post_cfg(struct rk_lcdc_driver *dev_drv)
                post_v_fac = 0x1000;
        }
 
-       if (screen->interlace == 1) {
-               post_dsp_vact_st_f1 = v_total + post_dsp_vact_st;
-               post_dsp_vact_end_f1 = post_dsp_vact_st_f1 + screen->post_ysize;
+       if (screen->mode.vmode == FB_VMODE_INTERLACED) {
+               post_dsp_vact_st = screen->post_dsp_sty +
+                   screen->mode.vsync_len + screen->mode.upper_margin;
+               post_dsp_vact_end = post_dsp_vact_st + screen->post_ysize;
+
+               post_dsp_vact_st_f1 = screen->mode.vsync_len +
+                                     screen->mode.upper_margin +
+                                     y_res/2 +
+                                     screen->mode.lower_margin +
+                                     screen->mode.vsync_len +
+                                     screen->mode.upper_margin + 1;
+               post_dsp_vact_end_f1 = post_dsp_vact_st_f1 +
+                                       screen->post_ysize/2;
        } else {
+               if (screen->y_mirror == 0) {
+                       post_dsp_vact_st = screen->post_dsp_sty +
+                           screen->mode.vsync_len +
+                           screen->mode.upper_margin;
+                       post_dsp_vact_end = post_dsp_vact_st +
+                               screen->post_ysize;
+               } else {
+                       post_dsp_vact_end = v_total -
+                               screen->mode.lower_margin -
+                           screen->post_dsp_sty;
+                       post_dsp_vact_st = post_dsp_vact_end -
+                               screen->post_ysize;
+               }
                post_dsp_vact_st_f1 = 0;
                post_dsp_vact_end_f1 = 0;
        }
@@ -1723,6 +1737,7 @@ static int rk3368_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                        break;
                case SCREEN_HDMI:
                        /*face = OUT_RGB_AAA;*/
+                       dev_drv->overlay_mode = VOP_YUV_DOMAIN;
                        mask = m_HDMI_OUT_EN  | m_RGB_OUT_EN;
                        val = v_HDMI_OUT_EN(1) | v_RGB_OUT_EN(0);
                        lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
@@ -1798,8 +1813,20 @@ static int rk3368_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
                /*BG color */
                mask = m_DSP_BG_BLUE | m_DSP_BG_GREEN | m_DSP_BG_RED;
-               val = v_DSP_BG_BLUE(0) | v_DSP_BG_GREEN(0) | v_DSP_BG_RED(0);
+               if (dev_drv->overlay_mode == VOP_YUV_DOMAIN)
+                       val = v_DSP_BG_BLUE(0x80) | v_DSP_BG_GREEN(0x10) |
+                               v_DSP_BG_RED(0x80);
+               else
+                       val = v_DSP_BG_BLUE(0) | v_DSP_BG_GREEN(0) |
+                               v_DSP_BG_RED(0);
                lcdc_msk_reg(lcdc_dev, DSP_BG, mask, val);
+               dev_drv->output_color = screen->color_mode;
+               if (screen->dsp_lut == NULL)
+                       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, m_DSP_LUT_EN,
+                                    v_DSP_LUT_EN(0));
+               else
+                       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, m_DSP_LUT_EN,
+                                    v_DSP_LUT_EN(1));
                rk3368_lcdc_bcsh_path_sel(dev_drv);
                rk3368_config_timing(dev_drv);
        }
index 07daf387e1c9a47282f06e11e7fc84b19a57e13c..bd7429b3e8cf0e4923cf9188c68f94e03a566aa5 100644 (file)
@@ -3570,17 +3570,16 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
        if (enable == 2 /*&& dev_drv->enable*/)
                return 0;
 
-       if (rk_fb->disp_mode == ONE_DUAL) {
-               if (dev_drv->ops->dsp_black)
-                       dev_drv->ops->dsp_black(dev_drv, 1);
-               if (dev_drv->ops->set_screen_scaler)
-                       dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 0);
-       } else if (rk_fb->disp_mode == NO_DUAL) {
+       if ((rk_fb->disp_mode == ONE_DUAL) ||
+           (rk_fb->disp_mode == NO_DUAL)) {
                if ((dev_drv->ops->backlight_close) &&
                    (rk_fb->disp_policy != DISPLAY_POLICY_BOX))
                        dev_drv->ops->backlight_close(dev_drv, 1);
                if (dev_drv->ops->dsp_black)
                        dev_drv->ops->dsp_black(dev_drv, 1);
+               if (dev_drv->ops->set_screen_scaler)
+                       dev_drv->ops->set_screen_scaler(dev_drv,
+                                                       dev_drv->screen0, 0);
        }
 
        if (!enable) {