drm/rockchip: protect connector status with loader protect
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / drm_atomic_helper.c
index 3f44b62b023e9360eb90d82ecb354c5f3bbfd02b..d5524917e7c4de36e24961d9285447e494e4dcc2 100644 (file)
@@ -265,7 +265,7 @@ mode_fixup(struct drm_atomic_state *state)
        struct drm_connector *connector;
        struct drm_connector_state *conn_state;
        int i;
-       bool ret;
+       int ret;
 
        for_each_crtc_in_state(state, crtc, crtc_state, i) {
                if (!crtc_state->mode_changed &&
@@ -579,6 +579,7 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 
        for_each_connector_in_state(old_state, connector, old_conn_state, i) {
                const struct drm_encoder_helper_funcs *funcs;
+               const struct drm_connector_helper_funcs *conn_funcs;
                struct drm_encoder *encoder;
                struct drm_crtc_state *old_crtc_state;
 
@@ -606,6 +607,21 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
                DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
                                 encoder->base.id, encoder->name);
 
+               conn_funcs = connector->helper_private;
+               if (connector->loader_protect) {
+                       drm_bridge_pre_enable(encoder->bridge);
+
+                       if (funcs->enable)
+                               funcs->enable(encoder);
+                       else
+                               funcs->commit(encoder);
+
+                       drm_bridge_enable(encoder->bridge);
+
+                       if (conn_funcs->loader_protect)
+                               conn_funcs->loader_protect(connector, false);
+                       connector->loader_protect = false;
+               }
                /*
                 * Each encoder has at most one connector (since we always steal
                 * it away), so we won't call disable hooks twice.