HDMI: Modify color output policy.
authorZheng Yang <zhengyang@rock-chips.com>
Mon, 9 Mar 2015 03:11:52 +0000 (11:11 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Mon, 9 Mar 2015 03:11:52 +0000 (11:11 +0800)
        Introduce feature SUPPORT_YCBCR_INPUT. If VOP can
        output YCbCr, VOP output color mode is equal to HDMI
        output color mode. Otherwise, VOP just output RGB,
        HDMI will conver color space.

Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
drivers/video/rockchip/hdmi/rockchip-hdmi-core.c
drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c
drivers/video/rockchip/hdmi/rockchip-hdmi.h
drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c
drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.h

index a598ad5aad6634cf287179ff440ed55f11ee5e9d..b9b3f4e92991fa035de73c6066e561cf03635133 100644 (file)
@@ -78,12 +78,6 @@ static void hdmi_wq_set_video(struct hdmi *hdmi)
        DBG("%s", __func__);
 
        video.vic = hdmi->vic & HDMI_VIC_MASK;
-       if (hdmi->vic & HDMI_VIDEO_YUV420)
-               video.color_input = HDMI_COLOR_YCBCR420;
-       else if (hdmi->edid.sink_hdmi == 0)
-               video.color_input = HDMI_COLOR_RGB_0_255;
-       else
-               video.color_input = HDMI_COLOR_YCBCR444;
        video.sink_hdmi = hdmi->edid.sink_hdmi;
        video.format_3d = hdmi->mode_3d;
        /* For DVI, output RGB */
@@ -112,6 +106,16 @@ static void hdmi_wq_set_video(struct hdmi *hdmi)
        if (hdmi->vic & HDMI_VIDEO_YUV420)
                video.color_output = HDMI_COLOR_YCBCR420;
        pr_info("hdmi output corlor mode is %d\n", video.color_output);
+       video.color_input = HDMI_COLOR_RGB_0_255;
+       if (hdmi->property->feature & SUPPORT_YCBCR_INPUT) {
+               if (video.color_output == HDMI_COLOR_YCBCR444 ||
+                   video.color_output == HDMI_COLOR_YCBCR422)
+                       video.color_input = HDMI_COLOR_YCBCR444;
+               else if (video.color_output == HDMI_COLOR_YCBCR420)
+                       video.color_input = HDMI_COLOR_YCBCR420;
+       }
+       hdmi->colormode_input = video.color_input;
+       hdmi_set_lcdc(hdmi);
        if (hdmi->ops->setvideo)
                hdmi->ops->setvideo(hdmi, &video);
 }
@@ -211,7 +215,6 @@ static void hdmi_wq_insert(struct hdmi *hdmi)
        hdmi_send_uevent(hdmi, KOBJ_ADD);
        if (hdmi->enable) {
                /*hdmi->autoset = 0;*/
-               hdmi_set_lcdc(hdmi);
                hdmi_wq_set_video(hdmi);
                #ifdef CONFIG_SWITCH
                if ((hdmi->edid.baseaudio_support &&
@@ -347,9 +350,8 @@ static void hdmi_work_queue(struct work_struct *work)
                                msleep(2000);
                        else
                                msleep(1000);
-                       hdmi_set_lcdc(hdmi);
-                       hdmi_send_uevent(hdmi, KOBJ_CHANGE);
                        hdmi_wq_set_video(hdmi);
+                       hdmi_send_uevent(hdmi, KOBJ_CHANGE);
                        hdmi_wq_set_audio(hdmi);
                        hdmi_wq_set_output(hdmi, hdmi->mute);
                        if (hdmi->ops->hdcp_cb)
index 966e0e2ff8ae15d19495fde76d68c1fa18384aa2..21d8f4e141654fab7fdb178cb0dd839d81589bbd 100644 (file)
@@ -54,10 +54,10 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
 
        /* screen type & face */
        screen->type = SCREEN_HDMI;
-       if (hdmi->edid.sink_hdmi)
-               screen->color_mode = COLOR_YCBCR;
-       else
+       if (hdmi->colormode_input == HDMI_COLOR_RGB_0_255)
                screen->color_mode = COLOR_RGB;
+       else
+               screen->color_mode = COLOR_YCBCR;
        if (hdmi->vic & HDMI_VIDEO_YUV420)
                screen->face = OUT_YUV_420;
        else
@@ -451,7 +451,7 @@ static void hdmi_sort_modelist(struct hdmi_edid *edid, int feature)
                        if (vic == hdmi_mode[i].vic ||
                            vic == hdmi_mode[i].vic_2nd) {
                                if ((((feature & SUPPORT_TMDS_600M) == 0 &&
-                                   !(modelist->vic & HDMI_VIDEO_YUV420)) ||
+                                     !(modelist->vic & HDMI_VIDEO_YUV420)) ||
                                    edid->maxtmdsclock < 340000000) &&
                                    hdmi_mode[i].mode.pixclock > 340000000)
                                        continue;
index c9b2d2cd39e8d1d9aaa6221b7ad7d0e2801f0b86..51da78dc60d6717382c51dd2c6a71a4e57771fd7 100644 (file)
@@ -330,6 +330,7 @@ enum rk_hdmi_feature {
        SUPPORT_CEC             =       (1 << 9),
        SUPPORT_HDCP            =       (1 << 10),
        SUPPORT_HDCP2           =       (1 << 11),
+       SUPPORT_YCBCR_INPUT     =       (1 << 12),
 };
 
 struct hdmi_property {
@@ -372,9 +373,9 @@ struct hdmi {
                           2 means mute audio,
                           1 means mute display;
                           0 is unmute*/
-       int colordepth;
-       int colormode;
-
+       int colordepth;                 /* Ouput color depth*/
+       int colormode;                  /* Ouput color mode*/
+       int colormode_input;            /* Input color mode*/
        struct hdmi_edid edid;          /* EDID information*/
        int enable;                     /* Enable flag*/
        int sleep;                      /* Sleep flag*/
index 9200dc9d11dd9262afa17e655281bff0b570f2bf..b11fb18a54f5d310a771a1d3239cc503d68b3e10 100644 (file)
@@ -416,7 +416,8 @@ static int rockchip_hdmiv2_probe(struct platform_device *pdev)
                rk_hdmi_property.feature |=
                                SUPPORT_4K |
                                SUPPORT_4K_4096 |
-                               SUPPORT_YUV420;
+                               SUPPORT_YUV420 |
+                               SUPPORT_YCBCR_INPUT;
        }
        hdmi_dev->hdmi =
                rockchip_hdmi_register(&rk_hdmi_property, &rk_hdmi_ops);
@@ -442,8 +443,7 @@ static int rockchip_hdmiv2_probe(struct platform_device *pdev)
                                    hdmi_dev->debugfs_dir,
                                    hdmi_dev, &rockchip_hdmiv2_reg_fops);
 #endif
-       if (rk_fb_get_display_policy() == DISPLAY_POLICY_BOX)
-               rk_display_device_enable(hdmi_dev->hdmi->ddev);
+       rk_display_device_enable(hdmi_dev->hdmi->ddev);
 
 #ifndef HDMI_INT_USE_POLL
        /* get and request the IRQ */
index bcc2864ae449cfc9c6823547c68d8c78c2755e4e..83b7924051b6d0e5e41a91eabe59eaad3939a7d5 100644 (file)
@@ -39,20 +39,20 @@ enum {
                                                   16-235 output accroding
                                                   BT709 that is 10bit clolor
                                                   depth */
-       CSC_ITU601_16_235_TO_RGB_16_235_8BIT,   /* YCbCr 16-235 input to RGB
-                                                  16-235 output according
+       CSC_ITU601_16_235_TO_RGB_0_255_8BIT,    /* YCbCr 16-235 input to RGB
+                                                  0-255 output according
                                                   BT601 that is 8bit clolor
                                                   depth */
-       CSC_ITU709_16_235_TO_RGB_16_235_8BIT,   /* YCbCr 16-235 input to RGB
-                                                  16-235 output according
+       CSC_ITU709_16_235_TO_RGB_0_255_8BIT,    /* YCbCr 16-235 input to RGB
+                                                  0-255 output according
                                                   BT709 that is 8bit clolor
                                                   depth */
-       CSC_ITU601_16_235_TO_RGB_0_255_8BIT,    /* YCbCr 16-235 input to RGB
-                                                  0-255 output according
+       CSC_ITU601_16_235_TO_RGB_16_235_8BIT,   /* YCbCr 16-235 input to RGB
+                                                  16-235 output according
                                                   BT601 that is 8bit clolor
                                                   depth */
-       CSC_ITU709_16_235_TO_RGB_0_255_8BIT     /* YCbCr 16-235 input to RGB
-                                                  0-255 output according
+       CSC_ITU709_16_235_TO_RGB_16_235_8BIT    /* YCbCr 16-235 input to RGB
+                                                  16-235 output according
                                                   BT709 that is 8bit clolor
                                                   depth */
 };