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) {
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) {
} 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;
}
return 0;
+
+error:
+ if (funcs->loader_protect)
+ funcs->loader_protect(connector, false);
+ return ret;
}
static int update_state(struct drm_device *drm_dev,