|
@@ -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,
|