|
@@ -216,7 +216,7 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
|
|
|
EXPORT_SYMBOL(drm_helper_crtc_in_use);
|
|
|
|
|
|
/**
|
|
|
- * drm_disable_unused_functions - disable unused objects
|
|
|
+ * drm_helper_disable_unused_functions - disable unused objects
|
|
|
* @dev: DRM device
|
|
|
*
|
|
|
* LOCKING:
|
|
@@ -1162,6 +1162,9 @@ EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
|
|
|
int drm_helper_resume_force_mode(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_crtc *crtc;
|
|
|
+ struct drm_encoder *encoder;
|
|
|
+ struct drm_encoder_helper_funcs *encoder_funcs;
|
|
|
+ struct drm_crtc_helper_funcs *crtc_funcs;
|
|
|
int ret;
|
|
|
|
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
|
@@ -1174,6 +1177,25 @@ int drm_helper_resume_force_mode(struct drm_device *dev)
|
|
|
|
|
|
if (ret == false)
|
|
|
DRM_ERROR("failed to set mode on crtc %p\n", crtc);
|
|
|
+
|
|
|
+ /* Turn off outputs that were already powered off */
|
|
|
+ if (drm_helper_choose_crtc_dpms(crtc)) {
|
|
|
+ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
|
|
+
|
|
|
+ if(encoder->crtc != crtc)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ encoder_funcs = encoder->helper_private;
|
|
|
+ if (encoder_funcs->dpms)
|
|
|
+ (*encoder_funcs->dpms) (encoder,
|
|
|
+ drm_helper_choose_encoder_dpms(encoder));
|
|
|
+
|
|
|
+ crtc_funcs = crtc->helper_private;
|
|
|
+ if (crtc_funcs->dpms)
|
|
|
+ (*crtc_funcs->dpms) (crtc,
|
|
|
+ drm_helper_choose_crtc_dpms(crtc));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
/* disable the unused connectors while restoring the modesetting */
|
|
|
drm_helper_disable_unused_functions(dev);
|