summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorNarender Ankam <nankam@codeaurora.org>2019-05-29 13:37:52 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-03-03 02:30:04 -0800
commit9dde78e73eaa19da181d324d2c76281c456db561 (patch)
tree481d7a4d85dc932ba75903b1dafa723700efcdd9 /drivers/video/fbdev
parent4692a596e6814433baaa2751311d30bc3bc02525 (diff)
msm: mdss: hdmi: parse extended EDID block map
As part of EDID parser, add support to parse extended EDID Block Map (0xf0) block and parse all subsequent CEA (0x02) extended EDID Blocks. Change-Id: I581efae59dde3abf6f297d5a2519ac0088554b64 Signed-off-by: Narender Ankam <nankam@codeaurora.org> Signed-off-by: Ramendra Kumar <ramendra@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_edid.c53
1 files changed, 32 insertions, 21 deletions
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_edid.c b/drivers/video/fbdev/msm/mdss_hdmi_edid.c
index feb4c05873e2..497f0ad31d17 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_edid.c
+++ b/drivers/video/fbdev/msm/mdss_hdmi_edid.c
@@ -2290,6 +2290,7 @@ int hdmi_edid_parser(void *input)
u16 ieee_reg_id;
int status = 0;
u32 i = 0;
+ u32 cea_idx = 1;
struct hdmi_edid_ctrl *edid_ctrl = (struct hdmi_edid_ctrl *)input;
if (!edid_ctrl) {
@@ -2316,7 +2317,7 @@ int hdmi_edid_parser(void *input)
/* EDID_CEA_EXTENSION_FLAG[0x7E] - CEC extension byte */
num_of_cea_blocks = edid_buf[EDID_BLOCK_SIZE - 2];
- DEV_DBG("%s: No. of CEA blocks is [%u]\n", __func__,
+ DEV_DBG("%s: No. of CEA/Extended EDID blocks is [%u]\n", __func__,
num_of_cea_blocks);
/* Find out any CEA extension blocks following block 0 */
@@ -2335,30 +2336,40 @@ int hdmi_edid_parser(void *input)
num_of_cea_blocks = MAX_EDID_BLOCKS - 1;
}
- /* check for valid CEA block */
- if (edid_buf[EDID_BLOCK_SIZE] != 2) {
- DEV_ERR("%s: Invalid CEA block\n", __func__);
- num_of_cea_blocks = 0;
- goto bail;
+ if (edid_buf[EDID_BLOCK_SIZE] == 0xF0) {
+ DEV_DBG("%s: Extended EDID Block Map found\n", __func__);
+ edid_buf += EDID_BLOCK_SIZE;
+ cea_idx++;
}
- /* goto to CEA extension edid block */
- edid_buf += EDID_BLOCK_SIZE;
+ for (i = cea_idx; i <= num_of_cea_blocks; i++) {
- ieee_reg_id = hdmi_edid_extract_ieee_reg_id(edid_ctrl, edid_buf);
- DEV_DBG("%s: ieee_reg_id = 0x%08x\n", __func__, ieee_reg_id);
- if (ieee_reg_id == EDID_IEEE_REG_ID)
- edid_ctrl->sink_mode = SINK_MODE_HDMI;
- else
- edid_ctrl->sink_mode = SINK_MODE_DVI;
+ /* check for valid CEA block */
+ if (edid_buf[EDID_BLOCK_SIZE] != 2) {
+ DEV_ERR("%s: Not a CEA block\n", __func__);
+ edid_buf += EDID_BLOCK_SIZE;
+ continue;
+ }
- hdmi_edid_extract_sink_caps(edid_ctrl, edid_buf);
- hdmi_edid_extract_latency_fields(edid_ctrl, edid_buf);
- hdmi_edid_extract_dc(edid_ctrl, edid_buf);
- hdmi_edid_extract_speaker_allocation_data(edid_ctrl, edid_buf);
- hdmi_edid_extract_audio_data_blocks(edid_ctrl, edid_buf);
- hdmi_edid_extract_3d_present(edid_ctrl, edid_buf);
- hdmi_edid_extract_extended_data_blocks(edid_ctrl, edid_buf);
+ /* goto to CEA extension edid block */
+ edid_buf += EDID_BLOCK_SIZE;
+
+ ieee_reg_id = hdmi_edid_extract_ieee_reg_id(edid_ctrl,
+ edid_buf);
+ DEV_DBG("%s: ieee_reg_id = 0x%08x\n", __func__, ieee_reg_id);
+ if (ieee_reg_id == EDID_IEEE_REG_ID)
+ edid_ctrl->sink_mode = SINK_MODE_HDMI;
+ else
+ edid_ctrl->sink_mode = SINK_MODE_DVI;
+
+ hdmi_edid_extract_sink_caps(edid_ctrl, edid_buf);
+ hdmi_edid_extract_latency_fields(edid_ctrl, edid_buf);
+ hdmi_edid_extract_dc(edid_ctrl, edid_buf);
+ hdmi_edid_extract_speaker_allocation_data(edid_ctrl, edid_buf);
+ hdmi_edid_extract_audio_data_blocks(edid_ctrl, edid_buf);
+ hdmi_edid_extract_3d_present(edid_ctrl, edid_buf);
+ hdmi_edid_extract_extended_data_blocks(edid_ctrl, edid_buf);
+ }
bail:
for (i = 1; i <= num_of_cea_blocks; i++) {