drm/i915/dp: Only apply the workaround if the select is still active
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 6 Dec 2010 11:20:45 +0000 (11:20 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 7 Dec 2010 22:46:11 +0000 (22:46 +0000)
As we may try to power down the link at various times, it is not
necessarily still coupled with an encoder and so we must be careful not
to depend upon an operation that is only valid when the link is still
attached to a pipe.

Fixes regression in 5bddd17.

Reported-and-tested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@kernel.org [after applying 5bddd17]
drivers/gpu/drm/i915/intel_dp.c

index 1d8d068bc4730ce2fec78e8207588ef289dbc5b9..df648cb4c29641cec581307b1c40a46d812fd58b 100644 (file)
@@ -1374,9 +1374,11 @@ 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;
 
+       if ((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0)
+               return;
+
        DRM_DEBUG_KMS("\n");
 
        if (is_edp(intel_dp)) {
@@ -1400,7 +1402,9 @@ 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)) {
+       if (!HAS_PCH_CPT(dev) &&
+           I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) {
+               struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc);
                /* Hardware workaround: leaving our transcoder select
                 * set to transcoder B while it's off will prevent the
                 * corresponding HDMI output on transcoder A.