drm/atomic: shutdown *current* encoder
authorRob Clark <robdclark@gmail.com>
Thu, 20 Nov 2014 20:40:36 +0000 (15:40 -0500)
committerRob Clark <robdclark@gmail.com>
Fri, 21 Nov 2014 21:06:15 +0000 (16:06 -0500)
In disable_outputs() we need to shut down the outgoing encoder, not the
incoming one (we have already swapped-state at this point).  Without
this, we end up telling the driver to crtc->dpms(OFF) without first
encoder->dpms(OFF), and that makes some hw quite unhappy.

v2: missing WARN_ON() hunk and comment

Reviewed-by: Daniel Vetter <daniel.vetter@intel.com>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/drm_atomic_helper.c

index 3a74e81a78df99db4908c8cd99ae898d54a2299a..a17b8e9c0a81c9b7b6bd47bc592e286f1d82bba9 100644 (file)
@@ -499,9 +499,12 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
                if (!old_conn_state || !old_conn_state->crtc)
                        continue;
 
-               encoder = connector->state->best_encoder;
+               encoder = old_conn_state->best_encoder;
 
-               if (!encoder)
+               /* We shouldn't get this far if we didn't previously have
+                * an encoder.. but WARN_ON() rather than explode.
+                */
+               if (WARN_ON(!encoder))
                        continue;
 
                funcs = encoder->helper_private;