aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_crt.c
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2009-03-03 05:07:52 -0500
committerEric Anholt <eric@anholt.net>2009-03-27 18:12:11 -0400
commit771cb081354161eea21534ba58e5cc1a2db94a25 (patch)
tree4b69e297bafee3be46ef3059b7f79b74170dd4cf /drivers/gpu/drm/i915/intel_crt.c
parent6bcdcd9e3c09d133e3278edabebc314a2451b74a (diff)
drm/i915: Sync crt hotplug detection with intel video driver
This covers: Use long crt hotplug activation time on GM45. Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_crt.c')
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index e58defa247d5..2b6d44381c31 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -146,20 +146,39 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
146{ 146{
147 struct drm_device *dev = connector->dev; 147 struct drm_device *dev = connector->dev;
148 struct drm_i915_private *dev_priv = dev->dev_private; 148 struct drm_i915_private *dev_priv = dev->dev_private;
149 u32 temp; 149 u32 hotplug_en;
150 150 int i, tries = 0;
151 unsigned long timeout = jiffies + msecs_to_jiffies(1000); 151 /*
152 152 * On 4 series desktop, CRT detect sequence need to be done twice
153 temp = I915_READ(PORT_HOTPLUG_EN); 153 * to get a reliable result.
154 154 */
155 I915_WRITE(PORT_HOTPLUG_EN,
156 temp | CRT_HOTPLUG_FORCE_DETECT | (1 << 5));
157 155
158 do { 156 if (IS_G4X(dev) && !IS_GM45(dev))
159 if (!(I915_READ(PORT_HOTPLUG_EN) & CRT_HOTPLUG_FORCE_DETECT)) 157 tries = 2;
160 break; 158 else
161 msleep(1); 159 tries = 1;
162 } while (time_after(timeout, jiffies)); 160 hotplug_en = I915_READ(PORT_HOTPLUG_EN);
161 hotplug_en &= ~(CRT_HOTPLUG_MASK);
162 hotplug_en |= CRT_HOTPLUG_FORCE_DETECT;
163
164 if (IS_GM45(dev))
165 hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
166
167 hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
168
169 for (i = 0; i < tries ; i++) {
170 unsigned long timeout;
171 /* turn on the FORCE_DETECT */
172 I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
173 timeout = jiffies + msecs_to_jiffies(1000);
174 /* wait for FORCE_DETECT to go off */
175 do {
176 if (!(I915_READ(PORT_HOTPLUG_EN) &
177 CRT_HOTPLUG_FORCE_DETECT))
178 break;
179 msleep(1);
180 } while (time_after(timeout, jiffies));
181 }
163 182
164 if ((I915_READ(PORT_HOTPLUG_STAT) & CRT_HOTPLUG_MONITOR_MASK) == 183 if ((I915_READ(PORT_HOTPLUG_STAT) & CRT_HOTPLUG_MONITOR_MASK) ==
165 CRT_HOTPLUG_MONITOR_COLOR) 184 CRT_HOTPLUG_MONITOR_COLOR)