summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_hdmi.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-05-11 18:01:34 +0100
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-21 20:15:48 +0200
commit8ec22b214d76773c9d89f4040505ce10f677ed9a (patch)
tree7489b793162b248040eb4efb51d5b5933cb1cd6f /drivers/gpu/drm/i915/intel_hdmi.c
parent084b612ecf8e59973576b2f644e6949609c79375 (diff)
downloadlinux-8ec22b214d76773c9d89f4040505ce10f677ed9a.tar.gz
linux-8ec22b214d76773c9d89f4040505ce10f677ed9a.tar.bz2
linux-8ec22b214d76773c9d89f4040505ce10f677ed9a.zip
drm/i915/hdmi: Query the live connector status bit for G4x
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>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 2ead3bf7c21d..77f0f8fb9e35 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -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,