drm/rockchip: dw_hdmi: Set default color base on previous color

Fixed color anomalies caused by plug when playing hdr videos.

Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
Change-Id: I487ba996add98e5d474149bae3552fe0e8371ff2
This commit is contained in:
Algea Cao
2023-03-20 16:21:26 +08:00
committed by Tao Huang
parent c21d550407
commit cbac047f24

View File

@@ -762,6 +762,35 @@ static int hdmi_bus_fmt_color_depth(unsigned int bus_format)
}
}
static int hdmi_bus_fmt_to_color_format(unsigned int bus_format)
{
switch (bus_format) {
case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
case MEDIA_BUS_FMT_UYYVYY12_0_5X36:
case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
return RK_IF_FORMAT_YCBCR420;
case MEDIA_BUS_FMT_YUV8_1X24:
case MEDIA_BUS_FMT_YUV10_1X30:
case MEDIA_BUS_FMT_YUV12_1X36:
case MEDIA_BUS_FMT_YUV16_1X48:
return RK_IF_FORMAT_YCBCR444;
case MEDIA_BUS_FMT_UYVY8_1X16:
case MEDIA_BUS_FMT_UYVY10_1X20:
case MEDIA_BUS_FMT_UYVY12_1X24:
return RK_IF_FORMAT_YCBCR422;
case MEDIA_BUS_FMT_RGB888_1X24:
case MEDIA_BUS_FMT_RGB101010_1X30:
case MEDIA_BUS_FMT_RGB121212_1X36:
case MEDIA_BUS_FMT_RGB161616_1X48:
default:
return RK_IF_FORMAT_RGB;
}
}
static unsigned int
hdmi_get_tmdsclock(struct rockchip_hdmi *hdmi, unsigned long pixelclock)
{
@@ -2005,8 +2034,9 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
*enc_out_encoding = V4L2_YCBCR_ENC_709;
}
if ((yuv422_out || hdmi->hdmi_output == RK_IF_FORMAT_YCBCR_HQ) &&
color_depth == 10 && hdmi_bus_fmt_color_depth(hdmi->prev_bus_format) == 8) {
if ((yuv422_out || hdmi->hdmi_output == RK_IF_FORMAT_YCBCR_HQ) && color_depth == 10 &&
(hdmi_bus_fmt_color_depth(hdmi->prev_bus_format) == 8 ||
hdmi_bus_fmt_to_color_format(hdmi->prev_bus_format) == RK_IF_FORMAT_YCBCR422)) {
/* We prefer use YCbCr422 to send hdr 10bit */
if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422)
*color_format = RK_IF_FORMAT_YCBCR422;