i915: disable DAC on Ironlake also when doing CRT load detection.
authorDave Airlie <airlied@redhat.com>
Wed, 4 Aug 2010 05:52:19 +0000 (15:52 +1000)
committerEric Anholt <eric@anholt.net>
Sun, 22 Aug 2010 06:07:04 +0000 (23:07 -0700)
Like on Sandybridge, disabling the DAC here when doing CRT load detect
avoids forever hangs waiting on the hardware.

test procedure on HP 2740p:
boot with no VGA plugged in, start X,
plug in VGA monitor (1280x1024)
chvt 3
machine hangs waiting forever.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/intel_crt.c

index eb31fdf758e822680069a1eca0987f73b90072b1..4b7735196cd5a516eb3bb34b9a843450da3f1fe4 100644 (file)
@@ -160,19 +160,20 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 adpa, temp;
        bool ret;
+       bool turn_off_dac = false;
 
        temp = adpa = I915_READ(PCH_ADPA);
 
-       if (HAS_PCH_CPT(dev)) {
-               /* Disable DAC before force detect */
-               I915_WRITE(PCH_ADPA, adpa & ~ADPA_DAC_ENABLE);
-               (void)I915_READ(PCH_ADPA);
-       } else {
-               adpa &= ~ADPA_CRT_HOTPLUG_MASK;
-               /* disable HPD first */
-               I915_WRITE(PCH_ADPA, adpa);
-               (void)I915_READ(PCH_ADPA);
-       }
+       if (HAS_PCH_SPLIT(dev))
+               turn_off_dac = true;
+
+       adpa &= ~ADPA_CRT_HOTPLUG_MASK;
+       if (turn_off_dac)
+               adpa &= ~ADPA_DAC_ENABLE;
+
+       /* disable HPD first */
+       I915_WRITE(PCH_ADPA, adpa);
+       (void)I915_READ(PCH_ADPA);
 
        adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 |
                        ADPA_CRT_HOTPLUG_WARMUP_10MS |
@@ -189,7 +190,7 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
                     1000, 1))
                DRM_ERROR("timed out waiting for FORCE_TRIGGER");
 
-       if (HAS_PCH_CPT(dev)) {
+       if (turn_off_dac) {
                I915_WRITE(PCH_ADPA, temp);
                (void)I915_READ(PCH_ADPA);
        }