diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_crt.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 6de97fc66029..4cf8e2e88a40 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -46,7 +46,7 @@ static void intel_crt_dpms(struct drm_encoder *encoder, int mode) | |||
46 | 46 | ||
47 | temp = I915_READ(reg); | 47 | temp = I915_READ(reg); |
48 | temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE); | 48 | temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE); |
49 | temp |= ADPA_DAC_ENABLE; | 49 | temp &= ~ADPA_DAC_ENABLE; |
50 | 50 | ||
51 | switch(mode) { | 51 | switch(mode) { |
52 | case DRM_MODE_DPMS_ON: | 52 | case DRM_MODE_DPMS_ON: |
@@ -156,6 +156,9 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) | |||
156 | 156 | ||
157 | temp = adpa = I915_READ(PCH_ADPA); | 157 | temp = adpa = I915_READ(PCH_ADPA); |
158 | 158 | ||
159 | adpa &= ~ADPA_DAC_ENABLE; | ||
160 | I915_WRITE(PCH_ADPA, adpa); | ||
161 | |||
159 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; | 162 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; |
160 | 163 | ||
161 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | | 164 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | |
@@ -169,13 +172,14 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) | |||
169 | DRM_DEBUG("pch crt adpa 0x%x", adpa); | 172 | DRM_DEBUG("pch crt adpa 0x%x", adpa); |
170 | I915_WRITE(PCH_ADPA, adpa); | 173 | I915_WRITE(PCH_ADPA, adpa); |
171 | 174 | ||
172 | /* This might not be needed as not specified in spec...*/ | 175 | while ((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) != 0) |
173 | udelay(1000); | 176 | ; |
174 | 177 | ||
175 | /* Check the status to see if both blue and green are on now */ | 178 | /* Check the status to see if both blue and green are on now */ |
176 | adpa = I915_READ(PCH_ADPA); | 179 | adpa = I915_READ(PCH_ADPA); |
177 | if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) == | 180 | adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK; |
178 | ADPA_CRT_HOTPLUG_MONITOR_COLOR) | 181 | if ((adpa == ADPA_CRT_HOTPLUG_MONITOR_COLOR) || |
182 | (adpa == ADPA_CRT_HOTPLUG_MONITOR_MONO)) | ||
179 | ret = true; | 183 | ret = true; |
180 | else | 184 | else |
181 | ret = false; | 185 | ret = false; |
@@ -428,8 +432,34 @@ static void intel_crt_destroy(struct drm_connector *connector) | |||
428 | 432 | ||
429 | static int intel_crt_get_modes(struct drm_connector *connector) | 433 | static int intel_crt_get_modes(struct drm_connector *connector) |
430 | { | 434 | { |
435 | int ret; | ||
431 | struct intel_output *intel_output = to_intel_output(connector); | 436 | struct intel_output *intel_output = to_intel_output(connector); |
432 | return intel_ddc_get_modes(intel_output); | 437 | struct i2c_adapter *ddcbus; |
438 | struct drm_device *dev = connector->dev; | ||
439 | |||
440 | |||
441 | ret = intel_ddc_get_modes(intel_output); | ||
442 | if (ret || !IS_G4X(dev)) | ||
443 | goto end; | ||
444 | |||
445 | ddcbus = intel_output->ddc_bus; | ||
446 | /* Try to probe digital port for output in DVI-I -> VGA mode. */ | ||
447 | intel_output->ddc_bus = | ||
448 | intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D"); | ||
449 | |||
450 | if (!intel_output->ddc_bus) { | ||
451 | intel_output->ddc_bus = ddcbus; | ||
452 | dev_printk(KERN_ERR, &connector->dev->pdev->dev, | ||
453 | "DDC bus registration failed for CRTDDC_D.\n"); | ||
454 | goto end; | ||
455 | } | ||
456 | /* Try to get modes by GPIOD port */ | ||
457 | ret = intel_ddc_get_modes(intel_output); | ||
458 | intel_i2c_destroy(ddcbus); | ||
459 | |||
460 | end: | ||
461 | return ret; | ||
462 | |||
433 | } | 463 | } |
434 | 464 | ||
435 | static int intel_crt_set_property(struct drm_connector *connector, | 465 | static int intel_crt_set_property(struct drm_connector *connector, |