Browse Source

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>
Dave Airlie 15 năm trước cách đây
mục cha
commit
d5dd96cb28
1 tập tin đã thay đổi với 12 bổ sung11 xóa
  1. 12 11
      drivers/gpu/drm/i915/intel_crt.c

+ 12 - 11
drivers/gpu/drm/i915/intel_crt.c

@@ -160,19 +160,20 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	u32 adpa, temp;
 	u32 adpa, temp;
 	bool ret;
 	bool ret;
+	bool turn_off_dac = false;
 
 
 	temp = adpa = I915_READ(PCH_ADPA);
 	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 |= (ADPA_CRT_HOTPLUG_PERIOD_128 |
 			ADPA_CRT_HOTPLUG_WARMUP_10MS |
 			ADPA_CRT_HOTPLUG_WARMUP_10MS |
@@ -189,7 +190,7 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
 		     1000, 1))
 		     1000, 1))
 		DRM_ERROR("timed out waiting for FORCE_TRIGGER");
 		DRM_ERROR("timed out waiting for FORCE_TRIGGER");
 
 
-	if (HAS_PCH_CPT(dev)) {
+	if (turn_off_dac) {
 		I915_WRITE(PCH_ADPA, temp);
 		I915_WRITE(PCH_ADPA, temp);
 		(void)I915_READ(PCH_ADPA);
 		(void)I915_READ(PCH_ADPA);
 	}
 	}