summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-07-07 11:10:57 -0700
committerKeith Packard <keithp@keithp.com>2011-07-07 13:38:27 -0700
commit61da5fab5a9b129cf05b1fe4666c3e45b3103fd4 (patch)
treed32b39d60881878ae7df4818a9387a884b7fba78 /drivers
parentfe0d42203cb5616eeff68b14576a0f7e2dd56625 (diff)
drm/i915/dp: retry link status read 3 times on failure
Especially after a hotplug or power status change, the sink may not reply immediately to a link status query. So retry 3 times per the spec to really make sure nothing is there. See section 9.1 of the 1.1a DisplayPort spec. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 391b55f1cc7..86912bd737a 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1019,14 +1019,20 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode)
static bool
intel_dp_get_link_status(struct intel_dp *intel_dp)
{
- int ret;
+ int ret, i;
+
+ /* Must try AUX reads for this at least 3 times */
+ for (i = 0; i < 3; i++) {
+ ret = intel_dp_aux_native_read(intel_dp,
+ DP_LANE0_1_STATUS,
+ intel_dp->link_status,
+ DP_LINK_STATUS_SIZE);
+ if (ret == DP_LINK_STATUS_SIZE)
+ return true;
+ msleep(1);
+ }
- ret = intel_dp_aux_native_read(intel_dp,
- DP_LANE0_1_STATUS,
- intel_dp->link_status, DP_LINK_STATUS_SIZE);
- if (ret != DP_LINK_STATUS_SIZE)
- return false;
- return true;
+ return false;
}
static uint8_t