diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_crt.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index ad5dfabc452e..505fc5cf26f8 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -71,22 +71,29 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder, | |||
71 | struct intel_crt *crt = intel_encoder_to_crt(encoder); | 71 | struct intel_crt *crt = intel_encoder_to_crt(encoder); |
72 | enum intel_display_power_domain power_domain; | 72 | enum intel_display_power_domain power_domain; |
73 | u32 tmp; | 73 | u32 tmp; |
74 | bool ret; | ||
74 | 75 | ||
75 | power_domain = intel_display_port_power_domain(encoder); | 76 | power_domain = intel_display_port_power_domain(encoder); |
76 | if (!intel_display_power_is_enabled(dev_priv, power_domain)) | 77 | if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) |
77 | return false; | 78 | return false; |
78 | 79 | ||
80 | ret = false; | ||
81 | |||
79 | tmp = I915_READ(crt->adpa_reg); | 82 | tmp = I915_READ(crt->adpa_reg); |
80 | 83 | ||
81 | if (!(tmp & ADPA_DAC_ENABLE)) | 84 | if (!(tmp & ADPA_DAC_ENABLE)) |
82 | return false; | 85 | goto out; |
83 | 86 | ||
84 | if (HAS_PCH_CPT(dev)) | 87 | if (HAS_PCH_CPT(dev)) |
85 | *pipe = PORT_TO_PIPE_CPT(tmp); | 88 | *pipe = PORT_TO_PIPE_CPT(tmp); |
86 | else | 89 | else |
87 | *pipe = PORT_TO_PIPE(tmp); | 90 | *pipe = PORT_TO_PIPE(tmp); |
88 | 91 | ||
89 | return true; | 92 | ret = true; |
93 | out: | ||
94 | intel_display_power_put(dev_priv, power_domain); | ||
95 | |||
96 | return ret; | ||
90 | } | 97 | } |
91 | 98 | ||
92 | static unsigned int intel_crt_get_flags(struct intel_encoder *encoder) | 99 | static unsigned int intel_crt_get_flags(struct intel_encoder *encoder) |
@@ -206,9 +213,7 @@ static void pch_post_disable_crt(struct intel_encoder *encoder) | |||
206 | 213 | ||
207 | static void intel_enable_crt(struct intel_encoder *encoder) | 214 | static void intel_enable_crt(struct intel_encoder *encoder) |
208 | { | 215 | { |
209 | struct intel_crt *crt = intel_encoder_to_crt(encoder); | 216 | intel_crt_set_dpms(encoder, DRM_MODE_DPMS_ON); |
210 | |||
211 | intel_crt_set_dpms(encoder, crt->connector->base.dpms); | ||
212 | } | 217 | } |
213 | 218 | ||
214 | static enum drm_mode_status | 219 | static enum drm_mode_status |
@@ -473,11 +478,10 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) | |||
473 | } | 478 | } |
474 | 479 | ||
475 | static enum drm_connector_status | 480 | static enum drm_connector_status |
476 | intel_crt_load_detect(struct intel_crt *crt) | 481 | intel_crt_load_detect(struct intel_crt *crt, uint32_t pipe) |
477 | { | 482 | { |
478 | struct drm_device *dev = crt->base.base.dev; | 483 | struct drm_device *dev = crt->base.base.dev; |
479 | struct drm_i915_private *dev_priv = dev->dev_private; | 484 | struct drm_i915_private *dev_priv = dev->dev_private; |
480 | uint32_t pipe = to_intel_crtc(crt->base.base.crtc)->pipe; | ||
481 | uint32_t save_bclrpat; | 485 | uint32_t save_bclrpat; |
482 | uint32_t save_vtotal; | 486 | uint32_t save_vtotal; |
483 | uint32_t vtotal, vactive; | 487 | uint32_t vtotal, vactive; |
@@ -646,7 +650,8 @@ intel_crt_detect(struct drm_connector *connector, bool force) | |||
646 | if (intel_crt_detect_ddc(connector)) | 650 | if (intel_crt_detect_ddc(connector)) |
647 | status = connector_status_connected; | 651 | status = connector_status_connected; |
648 | else if (INTEL_INFO(dev)->gen < 4) | 652 | else if (INTEL_INFO(dev)->gen < 4) |
649 | status = intel_crt_load_detect(crt); | 653 | status = intel_crt_load_detect(crt, |
654 | to_intel_crtc(connector->state->crtc)->pipe); | ||
650 | else | 655 | else |
651 | status = connector_status_unknown; | 656 | status = connector_status_unknown; |
652 | intel_release_load_detect_pipe(connector, &tmp, &ctx); | 657 | intel_release_load_detect_pipe(connector, &tmp, &ctx); |