Merge remote-tracking branch 'drm/drm-next' into msm-next
[linux-2.6-block.git] / drivers / gpu / drm / bridge / panel.c
index d4b112911a99102836f563bdb1aac9c1b797de55..9316384b44745beeeca84b9961be4ae38c7aeb6e 100644 (file)
@@ -111,30 +111,82 @@ static void panel_bridge_detach(struct drm_bridge *bridge)
                drm_connector_cleanup(connector);
 }
 
-static void panel_bridge_pre_enable(struct drm_bridge *bridge)
+static void panel_bridge_atomic_pre_enable(struct drm_bridge *bridge,
+                               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);
 }
 
-static void panel_bridge_enable(struct drm_bridge *bridge)
+static void panel_bridge_atomic_enable(struct drm_bridge *bridge,
+                               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);
 }
 
-static void panel_bridge_disable(struct drm_bridge *bridge)
+static void panel_bridge_atomic_disable(struct drm_bridge *bridge,
+                               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);
 }
 
-static void panel_bridge_post_disable(struct drm_bridge *bridge)
+static void panel_bridge_atomic_post_disable(struct drm_bridge *bridge,
+                               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);
 }
@@ -161,10 +213,10 @@ static void panel_bridge_debugfs_init(struct drm_bridge *bridge,
 static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
        .attach = panel_bridge_attach,
        .detach = panel_bridge_detach,
-       .pre_enable = panel_bridge_pre_enable,
-       .enable = panel_bridge_enable,
-       .disable = panel_bridge_disable,
-       .post_disable = panel_bridge_post_disable,
+       .atomic_pre_enable = panel_bridge_atomic_pre_enable,
+       .atomic_enable = panel_bridge_atomic_enable,
+       .atomic_disable = panel_bridge_atomic_disable,
+       .atomic_post_disable = panel_bridge_atomic_post_disable,
        .get_modes = panel_bridge_get_modes,
        .atomic_reset = drm_atomic_helper_bridge_reset,
        .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,