diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 26 |
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 = { | |||
5484 | bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, | 5484 | bool 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 | ||
5576 | void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, | 5580 | void 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 | ||