drm/i915: fix pipe DDI mode select
authorPaulo Zanoni <paulo.r.zanoni@intel.com>
Wed, 8 Aug 2012 17:15:27 +0000 (14:15 -0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 9 Aug 2012 16:36:04 +0000 (18:36 +0200)
Mask the value before changing it and also select DVI when needed.

DVI was working in cases where the BIOS was setting the correct value
because we were not masking the value before changing it.

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_ddi.c

index 1310caaaafd616e6d96e49a28e6594a55b19975c..97f00fb5307fcdb59901e0a850917d44a3f65f24 100644 (file)
 /* Those bits are ignored by pipe EDP since it can only connect to DDI A */
 #define  PIPE_DDI_PORT_MASK                    (7<<28)
 #define  PIPE_DDI_SELECT_PORT(x)               ((x)<<28)
+#define  PIPE_DDI_MODE_SELECT_MASK             (7<<24)
 #define  PIPE_DDI_MODE_SELECT_HDMI             (0<<24)
 #define  PIPE_DDI_MODE_SELECT_DVI              (1<<24)
 #define  PIPE_DDI_MODE_SELECT_DP_SST   (2<<24)
index 32604ac802042c8a3b339e89580a351ad86f9793..0d7acd76c1b42320a811fcdf7820df9a16fd5209 100644 (file)
@@ -726,13 +726,18 @@ void intel_ddi_mode_set(struct drm_encoder *encoder,
        temp = I915_READ(DDI_FUNC_CTL(pipe));
        temp &= ~PIPE_DDI_PORT_MASK;
        temp &= ~PIPE_DDI_BPC_12;
+       temp &= ~PIPE_DDI_MODE_SELECT_MASK;
        temp |= PIPE_DDI_SELECT_PORT(port) |
-                       PIPE_DDI_MODE_SELECT_HDMI |
                        ((intel_crtc->bpp > 24) ?
                                PIPE_DDI_BPC_12 :
                                PIPE_DDI_BPC_8) |
                        PIPE_DDI_FUNC_ENABLE;
 
+       if (intel_hdmi->has_hdmi_sink)
+               temp |= PIPE_DDI_MODE_SELECT_HDMI;
+       else
+               temp |= PIPE_DDI_MODE_SELECT_DVI;
+
        I915_WRITE(DDI_FUNC_CTL(pipe), temp);
 
        intel_hdmi->set_infoframes(encoder, adjusted_mode);