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);