@@ -1362,19 +1362,33 @@ static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
{
enum drm_connector_status status;
+ struct intel_connector *intel_connector =
+ to_intel_connector(connector);
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
connector->base.id, connector->name);
+ /*
+ * There are many userspace calls which probe EDID from
+ * detect path. In case on multiple hotplug/unplug, these
+ * can cause race conditions while probing EDID. Also its
+ * waste of CPU cycles to read the EDID again and again
+ * unless there is a real hotplug.
+ * So until we are forced, check connector status
+ * based on availability of cached EDID. This will avoid many of
+ * these race conditions and timing problems.
+ */
+ if (force)
+ intel_hdmi_probe(intel_connector->encoder);
- intel_hdmi_unset_edid(connector);
-
- if (intel_hdmi_set_edid(connector)) {
+ if (intel_connector->detect_edid) {
struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
-
- hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
status = connector_status_connected;
- } else
+ hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
+ DRM_DEBUG_DRIVER("hdmi status = connected\n");
+ } else {
status = connector_status_disconnected;
+ DRM_DEBUG_DRIVER("hdmi status = disconnected\n");
+ }
return status;
}