--- /dev/null
+From 7885d2052bd94395e337709cfba093a41f273ff1 Mon Sep 17 00:00:00 2001
+From: Jesse Barnes <jbarnes@virtuousgeek.org>
+Date: Thu, 12 Jan 2012 14:51:17 -0800
+Subject: drm/i915: mask transcoder select bits before setting them on LVDS
+
+From: Jesse Barnes <jbarnes@virtuousgeek.org>
+
+commit 7885d2052bd94395e337709cfba093a41f273ff1 upstream.
+
+The transcoder port may changed from mode set to mode set, so make sure
+to mask out the selection bits before setting the right ones or we'll
+get black screens when going from transcoder B to A.
+
+Tested-by: Vincent Vanackere <vincent.vanackere@gmail.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Reviewed-by: Keith Packard <keithp@keithp.com>
+Signed-off-by: Keith Packard <keithp@keithp.com>
+Cc: Jonathan Nieder <jrnieder@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ drivers/gpu/drm/i915/intel_display.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -5646,12 +5646,15 @@ static int ironlake_crtc_mode_set(struct
+ if (is_lvds) {
+ temp = I915_READ(PCH_LVDS);
+ temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
+- if (HAS_PCH_CPT(dev))
++ if (HAS_PCH_CPT(dev)) {
++ temp &= ~PORT_TRANS_SEL_MASK;
+ temp |= PORT_TRANS_SEL_CPT(pipe);
+- else if (pipe == 1)
+- temp |= LVDS_PIPEB_SELECT;
+- else
+- temp &= ~LVDS_PIPEB_SELECT;
++ } else {
++ if (pipe == 1)
++ temp |= LVDS_PIPEB_SELECT;
++ else
++ temp &= ~LVDS_PIPEB_SELECT;
++ }
+
+ /* set the corresponsding LVDS_BORDER bit */
+ temp |= dev_priv->lvds_border_bits;