video: dw_hdmi: Select HDMI mode only if monitor supports it
authorJernej Skrabec <jernej.skrabec@siol.net>
Sat, 29 Apr 2017 12:43:37 +0000 (14:43 +0200)
committerAnatolij Gustschin <agust@denx.de>
Mon, 15 May 2017 18:38:24 +0000 (20:38 +0200)
Some DVI monitors don't work in HDMI mode. Set it only if edid data
explicitly states that it is supported.

Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/video/dw_hdmi.c

index 8a53109..6039d67 100644 (file)
@@ -414,13 +414,9 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
                   HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_HIGH :
                   HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_LOW);
 
-       /*
-        * TODO(sjg@chromium.org>: Need to check for HDMI / DVI
-        * inv_val |= (edid->hdmi_monitor_detected ?
-        *         HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE :
-        *         HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE);
-        */
-       inv_val |= HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE;
+       inv_val |= (edid->hdmi_monitor ?
+                  HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE :
+                  HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE);
 
        inv_val |= HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_LOW;
 
@@ -459,7 +455,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
 }
 
 /* hdmi initialization step b.4 */
-static void hdmi_enable_video_path(struct dw_hdmi *hdmi)
+static void hdmi_enable_video_path(struct dw_hdmi *hdmi, bool audio)
 {
        uint clkdis;
 
@@ -484,8 +480,10 @@ static void hdmi_enable_video_path(struct dw_hdmi *hdmi)
        clkdis &= ~HDMI_MC_CLKDIS_TMDSCLK_DISABLE;
        hdmi_write(hdmi, clkdis, HDMI_MC_CLKDIS);
 
-       clkdis &= ~HDMI_MC_CLKDIS_AUDCLK_DISABLE;
-       hdmi_write(hdmi, clkdis, HDMI_MC_CLKDIS);
+       if (audio) {
+               clkdis &= ~HDMI_MC_CLKDIS_AUDCLK_DISABLE;
+               hdmi_write(hdmi, clkdis, HDMI_MC_CLKDIS);
+       }
 }
 
 /* workaround to clear the overflow condition */
@@ -716,7 +714,8 @@ int dw_hdmi_enable(struct dw_hdmi *hdmi, const struct display_timing *edid)
 {
        int ret;
 
-       debug("hdmi, mode info : clock %d hdis %d vdis %d\n",
+       debug("%s, mode info : clock %d hdis %d vdis %d\n",
+             edid->hdmi_monitor ? "hdmi" : "dvi",
              edid->pixelclock.typ, edid->hactive.typ, edid->vactive.typ);
 
        hdmi_av_composer(hdmi, edid);
@@ -725,11 +724,13 @@ int dw_hdmi_enable(struct dw_hdmi *hdmi, const struct display_timing *edid)
        if (ret)
                return ret;
 
-       hdmi_enable_video_path(hdmi);
+       hdmi_enable_video_path(hdmi, edid->hdmi_monitor);
 
-       hdmi_audio_fifo_reset(hdmi);
-       hdmi_audio_set_format(hdmi);
-       hdmi_audio_set_samplerate(hdmi, edid->pixelclock.typ);
+       if (edid->hdmi_monitor) {
+               hdmi_audio_fifo_reset(hdmi);
+               hdmi_audio_set_format(hdmi);
+               hdmi_audio_set_samplerate(hdmi, edid->pixelclock.typ);
+       }
 
        hdmi_video_packetize(hdmi);
        hdmi_video_sample(hdmi);