drm/i915/hdmi: Query the live connector status bit for G4x
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 11 May 2012 17:01:34 +0000 (18:01 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 21 May 2012 18:15:48 +0000 (20:15 +0200)
Similar to g4x_dp_detect() we should probe the PORT_HOTPLUG_STATUS as to
whether the connector is active prior to attempting to retrieve the EDID.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_hdmi.c

index 2ead3bf7c21d9a2839901d2d28fcd858d5411a88..77f0f8fb9e355a7a868d1fda6c89a7319bb884ce 100644 (file)
@@ -452,6 +452,30 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
        return true;
 }
 
+static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
+{
+       struct drm_device *dev = intel_hdmi->base.base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       uint32_t bit;
+
+       switch (intel_hdmi->sdvox_reg) {
+       case HDMIB:
+               bit = HDMIB_HOTPLUG_LIVE_STATUS;
+               break;
+       case HDMIC:
+               bit = HDMIC_HOTPLUG_LIVE_STATUS;
+               break;
+       case HDMID:
+               bit = HDMID_HOTPLUG_LIVE_STATUS;
+               break;
+       default:
+               bit = 0;
+               break;
+       }
+
+       return I915_READ(PORT_HOTPLUG_STAT) & bit;
+}
+
 static enum drm_connector_status
 intel_hdmi_detect(struct drm_connector *connector, bool force)
 {
@@ -460,6 +484,9 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
        struct edid *edid;
        enum drm_connector_status status = connector_status_disconnected;
 
+       if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
+               return status;
+
        intel_hdmi->has_hdmi_sink = false;
        intel_hdmi->has_audio = false;
        edid = drm_get_edid(connector,