From: Zheng Yang Date: Mon, 9 Mar 2015 03:11:52 +0000 (+0800) Subject: HDMI: Modify color output policy. X-Git-Tag: firefly_0821_release~4263^2~18 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=9b5e918130549b655b08b2deb349f4012ca7d96e;p=firefly-linux-kernel-4.4.55.git HDMI: Modify color output policy. 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 --- diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c b/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c index a598ad5aad66..b9b3f4e92991 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c @@ -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) diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c b/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c index 966e0e2ff8ae..21d8f4e14165 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c @@ -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; diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi.h b/drivers/video/rockchip/hdmi/rockchip-hdmi.h index c9b2d2cd39e8..51da78dc60d6 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi.h +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi.h @@ -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*/ diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c index 9200dc9d11dd..b11fb18a54f5 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c @@ -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 */ diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.h b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.h index bcc2864ae449..83b7924051b6 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.h +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.h @@ -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 */ };