diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c index 05215a9940a2..9fb0ce6a26b8 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c @@ -893,7 +893,8 @@ static void Edid_ParsingVendSpec(struct rx_cap *pRXCap, dv->block_flag = ERROR_LENGTH; } if (dv->ver == 2) { - if (dv->length == 0x0B) { + if ((dv->length == 0xB) || (dv->length == 0xC) + || (dv->length == 0xF)) { dv->sup_2160p60hz = 0x1;/*default*/ dv->dm_version = (dat[pos] >> 2) & 0x7; dv->sup_yuv422_12bit = dat[pos] & 0x1; @@ -922,7 +923,7 @@ static void Edid_ParsingVendSpec(struct rx_cap *pRXCap, dv->block_flag = ERROR_LENGTH; } - if (pos > dv->length) + if (pos > (dv->length + 1)) pr_info("hdmitx: edid: maybe invalid dv%d data\n", dv->ver); } @@ -2360,6 +2361,7 @@ bool hdmitx_edid_check_valid_mode(struct hdmitx_dev *hdev, { bool valid = 0; struct rx_cap *pRXCap = NULL; + const struct dv_info *dv = &(hdev->RXCap.dv_info); unsigned int rx_max_tmds_clk = 0; unsigned int calc_tmds_clk = 0; int i = 0; @@ -2454,9 +2456,11 @@ bool hdmitx_edid_check_valid_mode(struct hdmitx_dev *hdev, /* Rx may not support Y444 */ if (!(pRXCap->native_Mode & (1 << 5))) return 0; - if (pRXCap->dc_y444 && pRXCap->dc_30bit) + if ((pRXCap->dc_y444 && pRXCap->dc_30bit) + || (dv->sup_10b_12b_444 == 0x1)) rx_y444_max_dc = COLORDEPTH_30B; - if (pRXCap->dc_y444 && pRXCap->dc_36bit) + if ((pRXCap->dc_y444 && pRXCap->dc_36bit) + || (dv->sup_10b_12b_444 == 0x2)) rx_y444_max_dc = COLORDEPTH_36B; if (para->cd <= rx_y444_max_dc) valid = 1; @@ -2470,7 +2474,8 @@ bool hdmitx_edid_check_valid_mode(struct hdmitx_dev *hdev, return 0; if (pRXCap->dc_y444 && pRXCap->dc_30bit) rx_y422_max_dc = COLORDEPTH_30B; - if (pRXCap->dc_y444 && pRXCap->dc_36bit) + if ((pRXCap->dc_y444 && pRXCap->dc_36bit) + || (dv->sup_yuv422_12bit)) rx_y422_max_dc = COLORDEPTH_36B; if (para->cd <= rx_y422_max_dc) valid = 1; @@ -2480,9 +2485,9 @@ bool hdmitx_edid_check_valid_mode(struct hdmitx_dev *hdev, } if (para->cs == COLORSPACE_RGB444) { /* Always assume RX supports RGB444 */ - if (pRXCap->dc_30bit) + if ((pRXCap->dc_30bit) || (dv->sup_10b_12b_444 == 0x1)) rx_rgb_max_dc = COLORDEPTH_30B; - if (pRXCap->dc_36bit) + if ((pRXCap->dc_36bit) || (dv->sup_10b_12b_444 == 0x2)) rx_rgb_max_dc = COLORDEPTH_36B; if (para->cd <= rx_rgb_max_dc) valid = 1; diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index 4a8729673e86..2eb4a12bc116 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -2443,6 +2443,7 @@ static ssize_t show_dc_cap(struct device *dev, enum hdmi_vic vic = HDMI_Unknown; int pos = 0; struct rx_cap *pRXCap = &(hdmitx_device.RXCap); + const struct dv_info *dv = &(hdmitx_device.RXCap.dv_info); #if 0 if (pRXCap->dc_48bit_420) @@ -2477,9 +2478,9 @@ static ssize_t show_dc_cap(struct device *dev, } next444: if (pRXCap->dc_y444) { - if (pRXCap->dc_36bit) + if ((pRXCap->dc_36bit) || (dv->sup_10b_12b_444 == 0x2)) pos += snprintf(buf + pos, PAGE_SIZE, "444,12bit\n"); - if (pRXCap->dc_30bit) { + if ((pRXCap->dc_30bit) || (dv->sup_10b_12b_444 == 0x1)) { pos += snprintf(buf + pos, PAGE_SIZE, "444,10bit\n"); pos += snprintf(buf + pos, PAGE_SIZE, "444,8bit\n"); } @@ -2487,7 +2488,7 @@ next444: if (pRXCap->dc_48bit) pos += snprintf(buf + pos, PAGE_SIZE, "444,16bit\n"); #endif - if (pRXCap->dc_36bit) + if ((pRXCap->dc_36bit) || (dv->sup_yuv422_12bit)) pos += snprintf(buf + pos, PAGE_SIZE, "422,12bit\n"); if (pRXCap->dc_30bit) { pos += snprintf(buf + pos, PAGE_SIZE, "422,10bit\n"); @@ -2505,9 +2506,9 @@ nextrgb: if (pRXCap->dc_48bit) pos += snprintf(buf + pos, PAGE_SIZE, "rgb,16bit\n"); #endif - if (pRXCap->dc_36bit) + if ((pRXCap->dc_36bit) || (dv->sup_10b_12b_444 == 0x2)) pos += snprintf(buf + pos, PAGE_SIZE, "rgb,12bit\n"); - if (pRXCap->dc_30bit) + if ((pRXCap->dc_30bit) || (dv->sup_10b_12b_444 == 0x1)) pos += snprintf(buf + pos, PAGE_SIZE, "rgb,10bit\n"); pos += snprintf(buf + pos, PAGE_SIZE, "rgb,8bit\n"); return pos;