aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-10-03 03:55:16 -0400
committerJani Nikula <jani.nikula@intel.com>2016-10-10 09:06:43 -0400
commit16c83fad79ca912b8b5bbdcb5272794a2be41262 (patch)
treeec1845b4730340a479485d0e7bff37d6d933b3c5 /drivers/gpu
parent1015811609c0328b5ed670d07748591b837e74eb (diff)
drm/i915: Allow DP to work w/o EDID
Allow returning "connected" or "unknown" connector status for DP branch devices that don't have an EDID. Currently we'd claim the thing as "disconnected" if there is no EDID. This stuff used to broken already, I think, but it got more broken by commit f21a21983ef1 ("drm/i915: Splitting intel_dp_detect") Cc: Damien Cassou <damien@cassou.me> Cc: freedesktop.org@gp.mailgun.org Cc: Arno <blouin.arno@gmail.com> Cc: Shubhangi Shrivastava <shubhangi.shrivastava@intel.com> Cc: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com> Cc: Ander Conselvan de Oliveira <conselvan2@gmail.com> Cc: stable@vger.kernel.org Tested-by: Arno <blouin.arno@gmail.com> Fixes: f21a21983ef1 ("drm/i915: Splitting intel_dp_detect") Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83348 Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1475481316-8194-2-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Ander Conselvan de Oliveira <conselvan2@gmail.com> (cherry picked from commit 5cb651a7959310ef4dbb0b93f005b10286789656) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 43d6fd3c460b..14a3cf0b7213 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4337,7 +4337,7 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
4337 intel_dp->has_audio = false; 4337 intel_dp->has_audio = false;
4338} 4338}
4339 4339
4340static void 4340static enum drm_connector_status
4341intel_dp_long_pulse(struct intel_connector *intel_connector) 4341intel_dp_long_pulse(struct intel_connector *intel_connector)
4342{ 4342{
4343 struct drm_connector *connector = &intel_connector->base; 4343 struct drm_connector *connector = &intel_connector->base;
@@ -4361,7 +4361,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
4361 else 4361 else
4362 status = connector_status_disconnected; 4362 status = connector_status_disconnected;
4363 4363
4364 if (status != connector_status_connected) { 4364 if (status == connector_status_disconnected) {
4365 intel_dp->compliance_test_active = 0; 4365 intel_dp->compliance_test_active = 0;
4366 intel_dp->compliance_test_type = 0; 4366 intel_dp->compliance_test_type = 0;
4367 intel_dp->compliance_test_data = 0; 4367 intel_dp->compliance_test_data = 0;
@@ -4423,8 +4423,8 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
4423 intel_dp->aux.i2c_defer_count = 0; 4423 intel_dp->aux.i2c_defer_count = 0;
4424 4424
4425 intel_dp_set_edid(intel_dp); 4425 intel_dp_set_edid(intel_dp);
4426 4426 if (is_edp(intel_dp) || intel_connector->detect_edid)
4427 status = connector_status_connected; 4427 status = connector_status_connected;
4428 intel_dp->detect_done = true; 4428 intel_dp->detect_done = true;
4429 4429
4430 /* Try to read the source of the interrupt */ 4430 /* Try to read the source of the interrupt */
@@ -4443,12 +4443,11 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
4443 } 4443 }
4444 4444
4445out: 4445out:
4446 if ((status != connector_status_connected) && 4446 if (status != connector_status_connected && !intel_dp->is_mst)
4447 (intel_dp->is_mst == false))
4448 intel_dp_unset_edid(intel_dp); 4447 intel_dp_unset_edid(intel_dp);
4449 4448
4450 intel_display_power_put(to_i915(dev), power_domain); 4449 intel_display_power_put(to_i915(dev), power_domain);
4451 return; 4450 return status;
4452} 4451}
4453 4452
4454static enum drm_connector_status 4453static enum drm_connector_status
@@ -4457,7 +4456,7 @@ intel_dp_detect(struct drm_connector *connector, bool force)
4457 struct intel_dp *intel_dp = intel_attached_dp(connector); 4456 struct intel_dp *intel_dp = intel_attached_dp(connector);
4458 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 4457 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4459 struct intel_encoder *intel_encoder = &intel_dig_port->base; 4458 struct intel_encoder *intel_encoder = &intel_dig_port->base;
4460 struct intel_connector *intel_connector = to_intel_connector(connector); 4459 enum drm_connector_status status = connector->status;
4461 4460
4462 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 4461 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
4463 connector->base.id, connector->name); 4462 connector->base.id, connector->name);
@@ -4472,14 +4471,11 @@ intel_dp_detect(struct drm_connector *connector, bool force)
4472 4471
4473 /* If full detect is not performed yet, do a full detect */ 4472 /* If full detect is not performed yet, do a full detect */
4474 if (!intel_dp->detect_done) 4473 if (!intel_dp->detect_done)
4475 intel_dp_long_pulse(intel_dp->attached_connector); 4474 status = intel_dp_long_pulse(intel_dp->attached_connector);
4476 4475
4477 intel_dp->detect_done = false; 4476 intel_dp->detect_done = false;
4478 4477
4479 if (is_edp(intel_dp) || intel_connector->detect_edid) 4478 return status;
4480 return connector_status_connected;
4481 else
4482 return connector_status_disconnected;
4483} 4479}
4484 4480
4485static void 4481static void