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 /drivers/gpu | |
| 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
Diffstat (limited to 'drivers/gpu')
| -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 | } |
