1.rockchip:screen: add color-mode node in screen timing and add prop at lcd-xxx.dtsi
authorzwl <zwl@rockchips.com>
Mon, 25 Aug 2014 14:45:32 +0000 (22:45 +0800)
committerzwl <zwl@rockchips.com>
Mon, 25 Aug 2014 14:45:32 +0000 (22:45 +0800)
2.rk312x:lcdc: modify set overlay mode according to the screen color-mode

arch/arm/boot/dts/lcd-b101ew05.dtsi
arch/arm/boot/dts/lcd-box.dtsi
drivers/video/of_display_timing.c
drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c
drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/rk_fb.c
include/dt-bindings/rkfb/rk_fb.h
include/linux/rk_fb.h
include/linux/rk_screen.h
include/video/display_timing.h

index 2d79841e5abdd5ea3121e0354af5d099fe73fdd0..00cbce6a763d9a884837e3d5b60c9e8b2774ca6f 100644 (file)
@@ -11,6 +11,7 @@
                                screen-type = <SCREEN_LVDS>;
                                lvds-format = <LVDS_8BIT_2>;
                                out-face    = <OUT_D888_P666>;
+                               color-mode = <COLOR_RGB>;
                                clock-frequency = <71000000>;
                                hactive = <1280>;
                                vactive = <800>;
index d5822467d0c9eb30957595d61811ee2434cc538d..4907735e621d2ad385f6af7f4c4e4c8bd03c710b 100755 (executable)
@@ -36,6 +36,7 @@
                        timing0: timing0 {
                                screen-type = <SCREEN_HDMI>;
                                out-face    = <OUT_P888>;
+                               color-mode = <COLOR_YCBCR>;
                                clock-frequency = <74250000>;
                                hactive = <1280>;
                                vactive = <720>;
@@ -56,6 +57,7 @@
                        timing1: timing1 {
                                screen-type = <SCREEN_HDMI>;
                                out-face    = <OUT_P888>;
+                               color-mode = <COLOR_YCBCR>;
                                clock-frequency = <148500000>;
                                hactive = <1920>;
                                vactive = <1080>;
@@ -76,6 +78,7 @@
                        timing2: timing2 {
                                screen-type = <SCREEN_HDMI>;
                                out-face    = <OUT_P888>;
+                               color-mode = <COLOR_YCBCR>;
                                clock-frequency = <297000000>;
                                hactive = <3840>;
                                vactive = <2160>;
index 1e7ea6318cb8fd5c8f228ac85eb6b28e785d59fb..bcc28c6a6099802e19a44edca865897cfc8c6f0b 100644 (file)
@@ -111,6 +111,8 @@ static struct display_timing *of_get_display_timing(struct device_node *np)
                dt->lvds_format = val;
        if (!of_property_read_u32(np, "out-face", &val))
                dt->face = val;
+       if (!of_property_read_u32(np, "color-mode", &val))
+                dt->color_mode = val;
 #endif
 
        if (ret) {
index 16d5dce051e3b0e8ab3333bb74b27c872e5a5cdd..f41a73a19fabebf9060cf998fc55229fd58f667b 100755 (executable)
@@ -106,6 +106,7 @@ int hdmi_set_info(struct rk_screen *screen, unsigned int vic)
        /* screen type & face */
        screen->type = OUT_TYPE;
        screen->face = OUT_FACE;
+       screen->color_mode = COLOR_YCBCR;
 
        /* Screen size */
        screen->mode.xres = hdmi_mode[i].xres;
@@ -582,7 +583,7 @@ int hdmi_init_video_para(struct hdmi *hdmi_drv, struct hdmi_video_para *video)
 
        video->vic = hdmi_drv->vic;
        video->input_mode = VIDEO_INPUT_RGB_YCBCR_444;
-       if (lcdc_drv->output_domain == OUTPUT_RGB_DOMAIN)
+       if (lcdc_drv->output_color == COLOR_RGB)
                video->input_color = VIDEO_INPUT_COLOR_RGB;
        else
                video->input_color = VIDEO_INPUT_COLOR_YCBCR444;
index 4819c9c1d3304e1a50a4e89aca67ad9e9d29369c..136cae9456123a1ed6af50e73cf778116bbf1b4d 100755 (executable)
@@ -777,6 +777,16 @@ static int rk312x_lcdc_set_scaler(struct rk_lcdc_driver *dev_drv,
         scl_v_factor = ((src_h - 1) << 12) / (dst_h - 1);
 
         spin_lock(&lcdc_dev->reg_lock);
+       if (dst->color_mode != src->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));
+       }
+
        lcdc_writel(lcdc_dev, SCALER_FACTOR,
                     v_SCALER_H_FACTOR(scl_h_factor) |
                     v_SCALER_V_FACTOR(scl_v_factor));
@@ -805,6 +815,8 @@ static int rk312x_lcdc_set_scaler(struct rk_lcdc_driver *dev_drv,
        lcdc_msk_reg(lcdc_dev, SCALER_CTRL,
                     m_SCALER_EN | m_SCALER_OUT_ZERO | m_SCALER_OUT_EN,
                     v_SCALER_EN(1) | v_SCALER_OUT_ZERO(0) | v_SCALER_OUT_EN(1));
+
+       lcdc_cfg_done(lcdc_dev);
         spin_unlock(&lcdc_dev->reg_lock);
 
        return 0;
@@ -826,14 +838,24 @@ 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;
+               if (lcdc_dev->soc_type == VOP_RK312X) {
+                       if (dev_drv->output_color == COLOR_YCBCR)
+                               dev_drv->overlay_mode = VOP_YUV_DOMAIN;
+                       else
+                               dev_drv->overlay_mode = VOP_RGB_DOMAIN;
+               } else {
+                       dev_drv->output_color = COLOR_RGB;
+                       dev_drv->overlay_mode = VOP_RGB_DOMAIN;
+               }
+
                switch (screen->type) {
                 case SCREEN_RGB:
                         if (lcdc_dev->soc_type == VOP_RK312X) {
                                 mask = m_RGB_DCLK_EN | m_RGB_DCLK_INVERT;
                                val = v_RGB_DCLK_EN(1) | v_RGB_DCLK_INVERT(0);
                                 lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
-                               dev_drv->overlay_mode = VOP_RGB_DOMAIN;
-                               dev_drv->output_domain = OUTPUT_RGB_DOMAIN;
                         }
                         break;
                 case SCREEN_LVDS:
@@ -841,8 +863,6 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                                 mask = m_LVDS_DCLK_EN | m_LVDS_DCLK_INVERT;
                                val = v_LVDS_DCLK_EN(1) | v_LVDS_DCLK_INVERT(1);
                                 lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
-                               dev_drv->overlay_mode = VOP_RGB_DOMAIN;
-                               dev_drv->output_domain = OUTPUT_RGB_DOMAIN;
                         }
                         break;
                 case SCREEN_MIPI:
@@ -850,8 +870,6 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                                mask = m_MIPI_DCLK_EN | m_MIPI_DCLK_INVERT;
                                val = v_MIPI_DCLK_EN(1) | v_MIPI_DCLK_INVERT(0);
                                lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
-                               dev_drv->overlay_mode = VOP_RGB_DOMAIN;
-                               dev_drv->output_domain = OUTPUT_RGB_DOMAIN;
                         }
                         break;
                case SCREEN_HDMI:
@@ -866,10 +884,6 @@ static int rk312x_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                        }
                        lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
                         if (lcdc_dev->soc_type == VOP_RK312X) {
-                               if (dev_drv->output_domain == OUTPUT_YUV_DOMAIN)
-                                       dev_drv->overlay_mode = VOP_YUV_DOMAIN;
-                               else
-                                       dev_drv->overlay_mode = VOP_RGB_DOMAIN;
                                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0,
                                              m_SW_UV_OFFSET_EN,
                                              v_SW_UV_OFFSET_EN(0));
@@ -1641,7 +1655,7 @@ static int rk312x_lcdc_open_bcsh(struct rk_lcdc_driver *dev_drv, bool open)
        }
 
        if (dev_drv->overlay_mode == VOP_YUV_DOMAIN) {
-               if (dev_drv->output_domain == OUTPUT_YUV_DOMAIN)        /* bypass */
+               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 */
@@ -1649,7 +1663,7 @@ static int rk312x_lcdc_open_bcsh(struct rk_lcdc_driver *dev_drv, bool open)
                                        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_domain == OUTPUT_RGB_DOMAIN)        /* bypass */
+               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 */
index 32d252d1b5b7a81e217631f1d71a5d581ed97b64..bfc6aec5bb9cb8074ce386592051e79cb883162c 100755 (executable)
@@ -347,6 +347,7 @@ int rk_fb_video_mode_from_timing(const struct display_timing *dt,
        screen->type = dt->screen_type;
        screen->lvds_format = dt->lvds_format;
        screen->face = dt->face;
+       screen->color_mode = dt->color_mode;
 
        if (dt->flags & DISPLAY_FLAGS_PIXDATA_POSEDGE)
                screen->pin_dclk = 1;
index 59f23127e91c2853328a5046c2a4ee938d126d66..4ee91d4bc0d313383c3491a7f2b87a73680e7141 100755 (executable)
@@ -45,6 +45,9 @@
 #define ROTATE_180     8
 #define ROTATE_270     12
 
+#define COLOR_RGB      0
+#define COLOR_YCBCR    1
+
 /*             lvds connect config       
  *                                        
  *             LVDS_8BIT_1    LVDS_8BIT_2     LVDS_8BIT_3     LVDS_6BIT
index 3d605afe20da27f8d20498012534a41f609f4dc0..44b581dbca1eeb34a928d1947689fc6cf8dcebae 100755 (executable)
@@ -232,11 +232,6 @@ enum
        SCALE_DOWN = 0x2
 };
 
-enum dsp_out_domain {
-       OUTPUT_RGB_DOMAIN = 0x0,
-       OUTPUT_YUV_DOMAIN,
-};
-
 typedef enum {
        BRIGHTNESS      = 0x0,
        CONTRAST        = 0x1,
@@ -553,7 +548,7 @@ struct rk_lcdc_driver {
        u16 rotate_mode;
        u16 cabc_mode;
        u16 overlay_mode;
-       u16 output_domain;
+       u16 output_color;
 
        char fb0_win_id;
        char fb1_win_id;
index 013ccbb44c9cf0a6652e60c8d3fd54940c6ed92a..681c453f58053e1a0f18a22c1d209583f6228907 100755 (executable)
@@ -64,6 +64,7 @@ struct rk_screen {
        u16 type;
        u16 lvds_format; 
        u16 face;
+       u16 color_mode;
        u8 lcdc_id;   
        u8 screen_id; 
        struct fb_videomode mode;
index bf2bd657e0c45b78296017a75d12d29af5cec411..365067d27cd4b8527b3ffe9f847aab1955e62405 100644 (file)
@@ -79,6 +79,7 @@ struct display_timing {
        u16 screen_type;                        /*screen type*/
        u16 lvds_format;                        /*lvds data format for lvds screen*/
        u16 face;                               /*display output  interface format:24bit 18bit 16bit*/
+       u16 color_mode;                         /* input color mode: RGB or YUV */
 #endif
 };