diff options
author | Eric Anholt <eric@anholt.net> | 2010-11-18 09:32:59 +0800 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-12-02 22:31:30 +0000 |
commit | 5bddd17fec58f253cddd0bc9eab2cd9eb1bbab4a (patch) | |
tree | e9e86a9d078e2d996313399e798952a26224c401 /drivers/gpu/drm/i915/intel_dp.c | |
parent | 220cad3cbf553f893432919b458da36489373fc6 (diff) | |
download | kernel_samsung_aries-5bddd17fec58f253cddd0bc9eab2cd9eb1bbab4a.zip kernel_samsung_aries-5bddd17fec58f253cddd0bc9eab2cd9eb1bbab4a.tar.gz kernel_samsung_aries-5bddd17fec58f253cddd0bc9eab2cd9eb1bbab4a.tar.bz2 |
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/drm/i915/intel_dp.c')
-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 300f64b..1d8d068 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) { struct drm_device *dev = intel_dp->base.base.dev; struct drm_i915_private *dev_priv = dev->dev_private; + struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); uint32_t DP = intel_dp->DP; DRM_DEBUG_KMS("\n"); @@ -1398,6 +1399,26 @@ intel_dp_link_down(struct intel_dp *intel_dp) if (is_edp(intel_dp)) DP |= DP_LINK_TRAIN_OFF; + + if (!HAS_PCH_CPT(dev) && (DP & DP_PIPEB_SELECT)) { + /* Hardware workaround: leaving our transcoder select + * set to transcoder B while it's off will prevent the + * corresponding HDMI output on transcoder A. + * + * Combine this with another hardware workaround: + * transcoder select bit can only be cleared while the + * port is enabled. + */ + DP &= ~DP_PIPEB_SELECT; + I915_WRITE(intel_dp->output_reg, DP); + + /* Changes to enable or select take place the vblank + * after being written. + */ + intel_wait_for_vblank(intel_dp->base.base.dev, + intel_crtc->pipe); + } + I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); POSTING_READ(intel_dp->output_reg); } |