It's rather pointless to compute crtc->enabled twice right away ;-)

The only thing we really have to be careful about is that we frob the
dpms state only after a successful modeset and when we've actually
haven't just disabled the crtc.

Hooray for convoluted interfaces ...

Signed-Off-by: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 drivers/gpu/drm/i915/intel_display.c |   32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index e0cc193..d003fb3 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6580,9 +6580,13 @@ bool intel_set_mode(struct drm_crtc *crtc,
        struct drm_encoder *encoder;
        bool ret = true;
 
+       intel_modeset_commit_output_state(dev);
+
        crtc->enabled = drm_helper_crtc_in_use(crtc);
-       if (!crtc->enabled)
+       if (!crtc->enabled) {
+               drm_helper_disable_unused_functions(dev);
                return true;
+       }
 
        adjusted_mode = drm_mode_duplicate(dev, mode);
        if (!adjusted_mode)
@@ -6944,20 +6948,21 @@ static int intel_crtc_set_config(struct drm_mode_set 
*set)
                goto fail;
 
        if (config->mode_changed) {
-               intel_modeset_commit_output_state(dev);
-
-               set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
-               if (set->crtc->enabled) {
+               if (set->mode) {
                        DRM_DEBUG_KMS("attempting to set mode from"
                                        " userspace\n");
                        drm_mode_debug_printmodeline(set->mode);
-                       if (!intel_set_mode(set->crtc, set->mode,
-                                           set->x, set->y, set->fb)) {
-                               DRM_ERROR("failed to set mode on [CRTC:%d]\n",
-                                         set->crtc->base.id);
-                               ret = -EINVAL;
-                               goto fail;
-                       }
+               }
+
+               if (!intel_set_mode(set->crtc, set->mode,
+                                   set->x, set->y, set->fb)) {
+                       DRM_ERROR("failed to set mode on [CRTC:%d]\n",
+                                 set->crtc->base.id);
+                       ret = -EINVAL;
+                       goto fail;
+               }
+
+               if (set->crtc->enabled) {
                        DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
                        for (i = 0; i < set->num_connectors; i++) {
                                DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS 
on\n", set->connectors[i]->base.id,
@@ -6965,7 +6970,6 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
                                
set->connectors[i]->funcs->dpms(set->connectors[i], DRM_MODE_DPMS_ON);
                        }
                }
-               drm_helper_disable_unused_functions(dev);
        } else if (config->fb_changed) {
                ret = intel_pipe_set_base(set->crtc,
                                          set->x, set->y, set->fb);
@@ -6978,8 +6982,6 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
 fail:
        intel_set_config_restore_state(dev, config);
 
-       intel_modeset_commit_output_state(dev);
-
        /* Try to restore the config */
        if (config->mode_changed &&
            !intel_set_mode(save_set.crtc, save_set.mode,
-- 
1.7.10.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to