drm/rockchip: add loader protect ops to drm connector
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / rockchip / rockchip_drm_drv.c
index 22183397259e8fdf4372530355735a7b796ac123..13ccdc0c9bba8c7b06e8a3c77465d1ec5d13362f 100644 (file)
@@ -296,11 +296,14 @@ int setup_initial_state(struct drm_device *drm_dev,
 
        funcs = connector->helper_private;
        conn_state->best_encoder = funcs->best_encoder(connector);
+       if (funcs->loader_protect)
+               funcs->loader_protect(connector, true);
        num_modes = connector->funcs->fill_modes(connector, 4096, 4096);
        if (!num_modes) {
                dev_err(drm_dev->dev, "connector[%s] can't found any modes\n",
                        connector->name);
-               return -EINVAL;
+               ret = -EINVAL;
+               goto error;
        }
 
        list_for_each_entry(mode, &connector->modes, head) {
@@ -327,15 +330,18 @@ int setup_initial_state(struct drm_device *drm_dev,
                                                        head);
                        if (!mode) {
                                pr_err("failed to find available modes\n");
-                               return -EINVAL;
+                               ret = -EINVAL;
+                               goto error;
                        }
                }
        }
 
        set->mode = mode;
        crtc_state = drm_atomic_get_crtc_state(state, crtc);
-       if (IS_ERR(crtc_state))
-               return PTR_ERR(crtc_state);
+       if (IS_ERR(crtc_state)) {
+               ret = PTR_ERR(crtc_state);
+               goto error;
+       }
 
        drm_mode_copy(&crtc_state->adjusted_mode, mode);
        if (!match || !is_crtc_enabled) {
@@ -343,20 +349,24 @@ int setup_initial_state(struct drm_device *drm_dev,
        } else {
                ret = drm_atomic_set_crtc_for_connector(conn_state, crtc);
                if (ret)
-                       return ret;
+                       goto error;
 
                ret = drm_atomic_set_mode_for_crtc(crtc_state, mode);
                if (ret)
-                       return ret;
+                       goto error;
 
                crtc_state->active = true;
        }
 
-       if (!set->fb)
-               return 0;
+       if (!set->fb) {
+               ret = 0;
+               goto error;
+       }
        primary_state = drm_atomic_get_plane_state(state, crtc->primary);
-       if (IS_ERR(primary_state))
-               return PTR_ERR(primary_state);
+       if (IS_ERR(primary_state)) {
+               ret = PTR_ERR(primary_state);
+               goto error;
+       }
 
        hdisplay = mode->hdisplay;
        vdisplay = mode->vdisplay;
@@ -392,6 +402,11 @@ int setup_initial_state(struct drm_device *drm_dev,
        }
 
        return 0;
+
+error:
+       if (funcs->loader_protect)
+               funcs->loader_protect(connector, false);
+       return ret;
 }
 
 static int update_state(struct drm_device *drm_dev,