Commit a4a6b901 authored by Zhenyu Wang's avatar Zhenyu Wang Committed by Eric Anholt
Browse files

drm/i915: Fix CRT force detect on Cougarpoint



To make CRT force detect reliable on Cougarpoint, we need to
disable DAC before force detect, and restore back when trigger
is completed.

Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent 8db9d77b
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -157,15 +157,21 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	u32 adpa;
	u32 adpa, temp;
	bool ret;

	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);
	}

	adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 |
			ADPA_CRT_HOTPLUG_WARMUP_10MS |
@@ -181,6 +187,11 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
	while ((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) != 0)
		;

	if (HAS_PCH_CPT(dev)) {
		I915_WRITE(PCH_ADPA, temp);
		(void)I915_READ(PCH_ADPA);
	}

	/* Check the status to see if both blue and green are on now */
	adpa = I915_READ(PCH_ADPA);
	adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK;