|
@@ -927,15 +927,13 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod
|
|
|
|
|
|
if (crtc->funcs->atomic_duplicate_state)
|
|
|
crtc_state = crtc->funcs->atomic_duplicate_state(crtc);
|
|
|
- else {
|
|
|
+ else if (crtc->state)
|
|
|
+ crtc_state = drm_atomic_helper_crtc_duplicate_state(crtc);
|
|
|
+ else
|
|
|
crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
|
|
|
- if (!crtc_state)
|
|
|
- return -ENOMEM;
|
|
|
- if (crtc->state)
|
|
|
- __drm_atomic_helper_crtc_duplicate_state(crtc, crtc_state);
|
|
|
- else
|
|
|
- crtc_state->crtc = crtc;
|
|
|
- }
|
|
|
+
|
|
|
+ if (!crtc_state)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
crtc_state->planes_changed = true;
|
|
|
crtc_state->mode_changed = true;
|
|
@@ -957,11 +955,11 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod
|
|
|
ret = drm_helper_crtc_mode_set_base(crtc, x, y, old_fb);
|
|
|
|
|
|
out:
|
|
|
- if (crtc->funcs->atomic_destroy_state)
|
|
|
- crtc->funcs->atomic_destroy_state(crtc, crtc_state);
|
|
|
- else {
|
|
|
- __drm_atomic_helper_crtc_destroy_state(crtc, crtc_state);
|
|
|
- kfree(crtc_state);
|
|
|
+ if (crtc_state) {
|
|
|
+ if (crtc->funcs->atomic_destroy_state)
|
|
|
+ crtc->funcs->atomic_destroy_state(crtc, crtc_state);
|
|
|
+ else
|
|
|
+ drm_atomic_helper_crtc_destroy_state(crtc, crtc_state);
|
|
|
}
|
|
|
|
|
|
return ret;
|