i915: disable DAC on Ironlake also when doing CRT load detection.

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>

authored by Dave Airlie and committed by Eric Anholt d5dd96cb 9d0498a2

+12 -11
+12 -11
drivers/gpu/drm/i915/intel_crt.c
··· 160 struct drm_i915_private *dev_priv = dev->dev_private; 161 u32 adpa, temp; 162 bool ret; 163 164 temp = adpa = I915_READ(PCH_ADPA); 165 166 - if (HAS_PCH_CPT(dev)) { 167 - /* Disable DAC before force detect */ 168 - I915_WRITE(PCH_ADPA, adpa & ~ADPA_DAC_ENABLE); 169 - (void)I915_READ(PCH_ADPA); 170 - } else { 171 - adpa &= ~ADPA_CRT_HOTPLUG_MASK; 172 - /* disable HPD first */ 173 - I915_WRITE(PCH_ADPA, adpa); 174 - (void)I915_READ(PCH_ADPA); 175 - } 176 177 adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | 178 ADPA_CRT_HOTPLUG_WARMUP_10MS | ··· 190 1000, 1)) 191 DRM_ERROR("timed out waiting for FORCE_TRIGGER"); 192 193 - if (HAS_PCH_CPT(dev)) { 194 I915_WRITE(PCH_ADPA, temp); 195 (void)I915_READ(PCH_ADPA); 196 }
··· 160 struct drm_i915_private *dev_priv = dev->dev_private; 161 u32 adpa, temp; 162 bool ret; 163 + bool turn_off_dac = false; 164 165 temp = adpa = I915_READ(PCH_ADPA); 166 167 + if (HAS_PCH_SPLIT(dev)) 168 + turn_off_dac = true; 169 + 170 + adpa &= ~ADPA_CRT_HOTPLUG_MASK; 171 + if (turn_off_dac) 172 + adpa &= ~ADPA_DAC_ENABLE; 173 + 174 + /* disable HPD first */ 175 + I915_WRITE(PCH_ADPA, adpa); 176 + (void)I915_READ(PCH_ADPA); 177 178 adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | 179 ADPA_CRT_HOTPLUG_WARMUP_10MS | ··· 189 1000, 1)) 190 DRM_ERROR("timed out waiting for FORCE_TRIGGER"); 191 192 + if (turn_off_dac) { 193 I915_WRITE(PCH_ADPA, temp); 194 (void)I915_READ(PCH_ADPA); 195 }