Commit aa93d632 authored by Keith Packard's avatar Keith Packard

drm/i915: Require digital monitor on HDMI ports for detect

HDMI and DVI both require DDC/EDID on monitors, so use
that to know when a monitor is connected as the hot-plug
pins are shared with SDVO and DisplayPort
Signed-off-by: default avatarKeith Packard <keithp@keithp.com>
parent 52dc7d32
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "drmP.h" #include "drmP.h"
#include "drm.h" #include "drm.h"
#include "drm_crtc.h" #include "drm_crtc.h"
#include "drm_edid.h"
#include "intel_drv.h" #include "intel_drv.h"
#include "i915_drm.h" #include "i915_drm.h"
#include "i915_drv.h" #include "i915_drv.h"
...@@ -129,20 +130,26 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder, ...@@ -129,20 +130,26 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
return true; return true;
} }
static void static enum drm_connector_status
intel_hdmi_sink_detect(struct drm_connector *connector) intel_hdmi_edid_detect(struct drm_connector *connector)
{ {
struct intel_output *intel_output = to_intel_output(connector); struct intel_output *intel_output = to_intel_output(connector);
struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
struct edid *edid = NULL; struct edid *edid = NULL;
enum drm_connector_status status = connector_status_disconnected;
edid = drm_get_edid(&intel_output->base, edid = drm_get_edid(&intel_output->base,
&intel_output->ddc_bus->adapter); &intel_output->ddc_bus->adapter);
if (edid != NULL) { hdmi_priv->has_hdmi_sink = false;
hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid); if (edid) {
kfree(edid); if (edid->digital) {
status = connector_status_connected;
hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
}
intel_output->base.display_info.raw_edid = NULL; intel_output->base.display_info.raw_edid = NULL;
kfree(edid);
} }
return status;
} }
static enum drm_connector_status static enum drm_connector_status
...@@ -154,11 +161,7 @@ igdng_hdmi_detect(struct drm_connector *connector) ...@@ -154,11 +161,7 @@ igdng_hdmi_detect(struct drm_connector *connector)
/* FIXME hotplug detect */ /* FIXME hotplug detect */
hdmi_priv->has_hdmi_sink = false; hdmi_priv->has_hdmi_sink = false;
intel_hdmi_sink_detect(connector); return intel_hdmi_edid_detect(connector);
if (hdmi_priv->has_hdmi_sink)
return connector_status_connected;
else
return connector_status_disconnected;
} }
static enum drm_connector_status static enum drm_connector_status
...@@ -201,10 +204,9 @@ intel_hdmi_detect(struct drm_connector *connector) ...@@ -201,10 +204,9 @@ intel_hdmi_detect(struct drm_connector *connector)
return connector_status_unknown; return connector_status_unknown;
} }
if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0) { if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0)
intel_hdmi_sink_detect(connector); return intel_hdmi_edid_detect(connector);
return connector_status_connected; else
} else
return connector_status_disconnected; return connector_status_disconnected;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment