aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 943bcbcb4670..81c4f597cac0 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5484,7 +5484,7 @@ static struct drm_display_mode load_detect_mode = {
5484bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, 5484bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
5485 struct drm_connector *connector, 5485 struct drm_connector *connector,
5486 struct drm_display_mode *mode, 5486 struct drm_display_mode *mode,
5487 int *dpms_mode) 5487 struct intel_load_detect_pipe *old)
5488{ 5488{
5489 struct intel_crtc *intel_crtc; 5489 struct intel_crtc *intel_crtc;
5490 struct drm_crtc *possible_crtc; 5490 struct drm_crtc *possible_crtc;
@@ -5509,14 +5509,18 @@ bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
5509 /* See if we already have a CRTC for this connector */ 5509 /* See if we already have a CRTC for this connector */
5510 if (encoder->crtc) { 5510 if (encoder->crtc) {
5511 crtc = encoder->crtc; 5511 crtc = encoder->crtc;
5512 /* Make sure the crtc and connector are running */ 5512
5513 intel_crtc = to_intel_crtc(crtc); 5513 intel_crtc = to_intel_crtc(crtc);
5514 *dpms_mode = intel_crtc->dpms_mode; 5514 old->dpms_mode = intel_crtc->dpms_mode;
5515 old->load_detect_temp = false;
5516
5517 /* Make sure the crtc and connector are running */
5515 if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) { 5518 if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) {
5516 crtc_funcs = crtc->helper_private; 5519 crtc_funcs = crtc->helper_private;
5517 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); 5520 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
5518 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); 5521 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
5519 } 5522 }
5523
5520 return true; 5524 return true;
5521 } 5525 }
5522 5526
@@ -5543,10 +5547,10 @@ bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
5543 5547
5544 encoder->crtc = crtc; 5548 encoder->crtc = crtc;
5545 connector->encoder = encoder; 5549 connector->encoder = encoder;
5546 intel_encoder->load_detect_temp = true;
5547 5550
5548 intel_crtc = to_intel_crtc(crtc); 5551 intel_crtc = to_intel_crtc(crtc);
5549 *dpms_mode = intel_crtc->dpms_mode; 5552 old->dpms_mode = intel_crtc->dpms_mode;
5553 old->load_detect_temp = true;
5550 5554
5551 if (!crtc->enabled) { 5555 if (!crtc->enabled) {
5552 if (!mode) 5556 if (!mode)
@@ -5574,7 +5578,8 @@ bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
5574} 5578}
5575 5579
5576void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, 5580void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
5577 struct drm_connector *connector, int dpms_mode) 5581 struct drm_connector *connector,
5582 struct intel_load_detect_pipe *old)
5578{ 5583{
5579 struct drm_encoder *encoder = &intel_encoder->base; 5584 struct drm_encoder *encoder = &intel_encoder->base;
5580 struct drm_device *dev = encoder->dev; 5585 struct drm_device *dev = encoder->dev;
@@ -5582,19 +5587,18 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
5582 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; 5587 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
5583 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 5588 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
5584 5589
5585 if (intel_encoder->load_detect_temp) { 5590 if (old->load_detect_temp) {
5586 encoder->crtc = NULL; 5591 encoder->crtc = NULL;
5587 connector->encoder = NULL; 5592 connector->encoder = NULL;
5588 intel_encoder->load_detect_temp = false;
5589 crtc->enabled = drm_helper_crtc_in_use(crtc); 5593 crtc->enabled = drm_helper_crtc_in_use(crtc);
5590 drm_helper_disable_unused_functions(dev); 5594 drm_helper_disable_unused_functions(dev);
5591 } 5595 }
5592 5596
5593 /* Switch crtc and encoder back off if necessary */ 5597 /* Switch crtc and encoder back off if necessary */
5594 if (crtc->enabled && dpms_mode != DRM_MODE_DPMS_ON) { 5598 if (crtc->enabled && old->dpms_mode != DRM_MODE_DPMS_ON) {
5595 if (encoder->crtc == crtc) 5599 if (encoder->crtc == crtc)
5596 encoder_funcs->dpms(encoder, dpms_mode); 5600 encoder_funcs->dpms(encoder, old->dpms_mode);
5597 crtc_funcs->dpms(crtc, dpms_mode); 5601 crtc_funcs->dpms(crtc, old->dpms_mode);
5598 } 5602 }
5599} 5603}
5600 5604