diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2009-03-03 05:07:52 -0500 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-03-27 18:12:11 -0400 |
commit | 771cb081354161eea21534ba58e5cc1a2db94a25 (patch) | |
tree | 4b69e297bafee3be46ef3059b7f79b74170dd4cf /drivers/gpu/drm/i915/intel_crt.c | |
parent | 6bcdcd9e3c09d133e3278edabebc314a2451b74a (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.c | 45 |
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) |