diff options
author | Eric Anholt <eric@anholt.net> | 2010-11-17 20:32:59 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-12-02 17:31:30 -0500 |
commit | 5bddd17fec58f253cddd0bc9eab2cd9eb1bbab4a (patch) | |
tree | e9e86a9d078e2d996313399e798952a26224c401 | |
parent | 220cad3cbf553f893432919b458da36489373fc6 (diff) |
drm/i915: Apply a workaround for transitioning from DP on pipe B to HDMI.
This workaround only applies to Ironlake.
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@kernel.org
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 300f64b4238b..1d8d068bc473 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1374,6 +1374,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
1374 | { | 1374 | { |
1375 | struct drm_device *dev = intel_dp->base.base.dev; | 1375 | struct drm_device *dev = intel_dp->base.base.dev; |
1376 | struct drm_i915_private *dev_priv = dev->dev_private; | 1376 | struct drm_i915_private *dev_priv = dev->dev_private; |
1377 | struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); | ||
1377 | uint32_t DP = intel_dp->DP; | 1378 | uint32_t DP = intel_dp->DP; |
1378 | 1379 | ||
1379 | DRM_DEBUG_KMS("\n"); | 1380 | DRM_DEBUG_KMS("\n"); |
@@ -1398,6 +1399,26 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
1398 | 1399 | ||
1399 | if (is_edp(intel_dp)) | 1400 | if (is_edp(intel_dp)) |
1400 | DP |= DP_LINK_TRAIN_OFF; | 1401 | DP |= DP_LINK_TRAIN_OFF; |
1402 | |||
1403 | if (!HAS_PCH_CPT(dev) && (DP & DP_PIPEB_SELECT)) { | ||
1404 | /* Hardware workaround: leaving our transcoder select | ||
1405 | * set to transcoder B while it's off will prevent the | ||
1406 | * corresponding HDMI output on transcoder A. | ||
1407 | * | ||
1408 | * Combine this with another hardware workaround: | ||
1409 | * transcoder select bit can only be cleared while the | ||
1410 | * port is enabled. | ||
1411 | */ | ||
1412 | DP &= ~DP_PIPEB_SELECT; | ||
1413 | I915_WRITE(intel_dp->output_reg, DP); | ||
1414 | |||
1415 | /* Changes to enable or select take place the vblank | ||
1416 | * after being written. | ||
1417 | */ | ||
1418 | intel_wait_for_vblank(intel_dp->base.base.dev, | ||
1419 | intel_crtc->pipe); | ||
1420 | } | ||
1421 | |||
1401 | I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); | 1422 | I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); |
1402 | POSTING_READ(intel_dp->output_reg); | 1423 | POSTING_READ(intel_dp->output_reg); |
1403 | } | 1424 | } |