return 0;
 }
 
+static
+struct drm_crtc *analogix_dp_get_old_crtc(struct analogix_dp_device *dp,
+                                         struct drm_atomic_state *state)
+{
+       struct drm_encoder *encoder = dp->encoder;
+       struct drm_connector *connector;
+       struct drm_connector_state *conn_state;
+
+       connector = drm_atomic_get_old_connector_for_encoder(state, encoder);
+       if (!connector)
+               return NULL;
+
+       conn_state = drm_atomic_get_old_connector_state(state, connector);
+       if (!conn_state)
+               return NULL;
+
+       return conn_state->crtc;
+}
+
 static
 struct drm_crtc *analogix_dp_get_new_crtc(struct analogix_dp_device *dp,
                                          struct drm_atomic_state *state)
 {
        struct drm_atomic_state *old_state = old_bridge_state->base.state;
        struct analogix_dp_device *dp = bridge->driver_private;
-       struct drm_crtc *crtc;
+       struct drm_crtc *old_crtc, *new_crtc;
+       struct drm_crtc_state *old_crtc_state = NULL;
        struct drm_crtc_state *new_crtc_state = NULL;
+       int ret;
 
-       crtc = analogix_dp_get_new_crtc(dp, old_state);
-       if (!crtc)
+       new_crtc = analogix_dp_get_new_crtc(dp, old_state);
+       if (!new_crtc)
                goto out;
 
-       new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
+       new_crtc_state = drm_atomic_get_new_crtc_state(old_state, new_crtc);
        if (!new_crtc_state)
                goto out;
 
                return;
 
 out:
+       old_crtc = analogix_dp_get_old_crtc(dp, old_state);
+       if (old_crtc) {
+               old_crtc_state = drm_atomic_get_old_crtc_state(old_state,
+                                                              old_crtc);
+
+               /* When moving from PSR to fully disabled, exit PSR first. */
+               if (old_crtc_state && old_crtc_state->self_refresh_active) {
+                       ret = analogix_dp_disable_psr(dp);
+                       if (ret)
+                               DRM_ERROR("Failed to disable psr (%d)\n", ret);
+               }
+       }
+
        analogix_dp_bridge_disable(bridge);
 }