struct drm_bridge_state *old_bridge_state)
 {
        struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
+       struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
+       struct drm_encoder *encoder = bridge->encoder;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
+
+       crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder);
+       if (!crtc)
+               return;
+
+       old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc);
+       if (old_crtc_state && old_crtc_state->self_refresh_active)
+               return;
 
        drm_panel_prepare(panel_bridge->panel);
 }
                                struct drm_bridge_state *old_bridge_state)
 {
        struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
+       struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
+       struct drm_encoder *encoder = bridge->encoder;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
+
+       crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder);
+       if (!crtc)
+               return;
+
+       old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc);
+       if (old_crtc_state && old_crtc_state->self_refresh_active)
+               return;
 
        drm_panel_enable(panel_bridge->panel);
 }
                                struct drm_bridge_state *old_bridge_state)
 {
        struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
+       struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
+       struct drm_encoder *encoder = bridge->encoder;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+
+       crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder);
+       if (!crtc)
+               return;
+
+       new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc);
+       if (new_crtc_state && new_crtc_state->self_refresh_active)
+               return;
 
        drm_panel_disable(panel_bridge->panel);
 }
                                struct drm_bridge_state *old_bridge_state)
 {
        struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
+       struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
+       struct drm_encoder *encoder = bridge->encoder;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+
+       crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder);
+       if (!crtc)
+               return;
+
+       new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc);
+       if (new_crtc_state && new_crtc_state->self_refresh_active)
+               return;
 
        drm_panel_unprepare(panel_bridge->panel);
 }