platform: msm_shared: check for dvi mode
Check for DVI mode in EDID, if the sink is DVI, do not do
audio configurations and set HDMI Tx core in DVI mode.
Change-Id: Ibd9b44a3d50a04900b99e9062d36f2768d5ca8a1
diff --git a/platform/msm_shared/mdss_hdmi.c b/platform/msm_shared/mdss_hdmi.c
index fb345ef..3214a87 100644
--- a/platform/msm_shared/mdss_hdmi.c
+++ b/platform/msm_shared/mdss_hdmi.c
@@ -603,12 +603,40 @@
return ret;
}
+static bool mdss_hdmi_is_dvi_mode(void)
+{
+ uint8_t len;
+ uint32_t ieee_tag;
+ const uint8_t *vsd = NULL;
+
+ vsd = hdmi_edid_find_block(DBC_START_OFFSET,
+ VENDOR_SPECIFIC_DATA_BLOCK, &len);
+
+ if (vsd == NULL || len == 0) {
+ dprintf(SPEW, "%s: Invalid VSDB\n", __func__);
+ return false;
+ }
+
+ ieee_tag = ((uint32_t) vsd[3] << 16) + ((uint32_t) vsd[2] << 8) +
+ (uint32_t) vsd[1];
+
+ if (ieee_tag == 0x0c03)
+ return false;
+ else
+ return true;
+}
+
static void mdss_hdmi_set_mode(bool on)
{
uint32_t val = 0;
- if (on)
- val = 0x3;
+ if (on) {
+ /* tx on */
+ val = 0x1;
+
+ if (!mdss_hdmi_is_dvi_mode())
+ val |= 0x2;
+ }
writel(val, HDMI_CTRL);
}
@@ -1032,16 +1060,20 @@
int mdss_hdmi_init(void)
{
+ bool is_dvi_mode = mdss_hdmi_is_dvi_mode();
+
mdss_hdmi_set_mode(false);
/* Audio settings */
- mdss_hdmi_audio_playback();
+ if (!is_dvi_mode)
+ mdss_hdmi_audio_playback();
/* Video settings */
mdss_hdmi_video_setup();
/* AVI info settings */
- mdss_hdmi_avi_info_frame();
+ if (!is_dvi_mode)
+ mdss_hdmi_avi_info_frame();
/* Enable HDMI */
mdss_hdmi_set_mode(true);