aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_crt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_crt.c')
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c23
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;
93out:
94 intel_display_power_put(dev_priv, power_domain);
95
96 return ret;
90} 97}
91 98
92static unsigned int intel_crt_get_flags(struct intel_encoder *encoder) 99static 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
207static void intel_enable_crt(struct intel_encoder *encoder) 214static 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
214static enum drm_mode_status 219static enum drm_mode_status
@@ -473,11 +478,10 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
473} 478}
474 479
475static enum drm_connector_status 480static enum drm_connector_status
476intel_crt_load_detect(struct intel_crt *crt) 481intel_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);