diff --git a/drivers/media/i2c/rk628/rk628.c b/drivers/media/i2c/rk628/rk628.c index adb2d128450a..95c97944adc1 100644 --- a/drivers/media/i2c/rk628/rk628.c +++ b/drivers/media/i2c/rk628/rk628.c @@ -76,8 +76,8 @@ static const struct regmap_range rk628_hdmirx_readable_ranges[] = { regmap_reg_range(HDMI_RX_PDEC_STS, HDMI_RX_PDEC_STS), regmap_reg_range(HDMI_RX_PDEC_GCP_AVMUTE, HDMI_RX_PDEC_GCP_AVMUTE), regmap_reg_range(HDMI_RX_PDEC_ACR_CTS, HDMI_RX_PDEC_ACR_N), + regmap_reg_range(HDMI_RX_PDEC_AVI_HB, HDMI_RX_PDEC_AVI_PB), regmap_reg_range(HDMI_RX_PDEC_AIF_CTRL, HDMI_RX_PDEC_AIF_PB0), - regmap_reg_range(HDMI_RX_PDEC_AVI_PB, HDMI_RX_PDEC_AVI_PB), regmap_reg_range(HDMI_RX_HDMI20_CONTROL, HDMI_RX_CHLOCK_CONFIG), regmap_reg_range(HDMI_RX_SCDC_REGS0, HDMI_RX_SCDC_REGS2), regmap_reg_range(HDMI_RX_SCDC_WRDATA0, HDMI_RX_SCDC_WRDATA0), diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.c b/drivers/media/i2c/rk628/rk628_hdmirx.c index 5af2cc8223bb..ab5ea36adde5 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.c +++ b/drivers/media/i2c/rk628/rk628_hdmirx.c @@ -71,6 +71,11 @@ enum hdmirx_pix_fmt { HDMIRX_YUV420 = 3, }; +enum hdmirx_ycc_range { + HDMIRX_YCC_LIMIT, + HDMIRX_YCC_FULL, +}; + static const char * const bus_format_str[] = { "RGB", "YUV422", @@ -1759,13 +1764,23 @@ EXPORT_SYMBOL(rk628_hdmirx_get_timings); u8 rk628_hdmirx_get_range(struct rk628 *rk628) { - u8 color_range; - u32 val, vic, fmt; + u8 color_range, yuv_range; + u32 val, vic, fmt, avi_hb; rk628_i2c_read(rk628, HDMI_RX_PDEC_AVI_PB, &val); + rk628_i2c_read(rk628, HDMI_RX_PDEC_AVI_HB, &avi_hb); color_range = (val & RGB_COLORRANGE_MASK) >> 18; + yuv_range = (avi_hb & YUV_COLORRANGE_MASK) >> 30; vic = (val & VID_IDENT_CODE_MASK) >> 24; fmt = (val & VIDEO_FORMAT_MASK) >> 5; + if (fmt != HDMIRX_RGB888) { + if (yuv_range == HDMIRX_YCC_LIMIT) + color_range = HDMIRX_LIMIT_RANGE; + else if (yuv_range == HDMIRX_YCC_FULL) + color_range = HDMIRX_FULL_RANGE; + else + color_range = HDMIRX_DEFAULT_RANGE; + } if (fmt == HDMIRX_RGB888 && color_range == HDMIRX_DEFAULT_RANGE) { (vic) ? (color_range = HDMIRX_LIMIT_RANGE) : diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.h b/drivers/media/i2c/rk628/rk628_hdmirx.h index ed5c4c05ac01..015c3df0aa38 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.h +++ b/drivers/media/i2c/rk628/rk628_hdmirx.h @@ -267,6 +267,7 @@ #define VIDEO_FORMAT_MASK GENMASK(6, 5) #define VIDEO_FORMAT(x) UPDATE(x, 6, 5) #define RGB_COLORRANGE_MASK GENMASK(19, 18) +#define YUV_COLORRANGE_MASK GENMASK(31, 30) #define RGB_COLORRANGE(x) UPDATE(x, 19, 18) #define ACT_INFO_PRESENT_MASK BIT(4) #define HDMI_RX_PDEC_ACR_CTS (HDMI_RX_BASE + 0x0390)