diff options
Diffstat (limited to 'drivers/gpu/drm/drm_crtc_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index f2f42b17967a..9297a61a7c95 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
@@ -927,14 +927,15 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod | |||
927 | 927 | ||
928 | if (crtc->funcs->atomic_duplicate_state) | 928 | if (crtc->funcs->atomic_duplicate_state) |
929 | crtc_state = crtc->funcs->atomic_duplicate_state(crtc); | 929 | crtc_state = crtc->funcs->atomic_duplicate_state(crtc); |
930 | else if (crtc->state) | 930 | else { |
931 | crtc_state = kmemdup(crtc->state, sizeof(*crtc_state), | ||
932 | GFP_KERNEL); | ||
933 | else | ||
934 | crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL); | 931 | crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL); |
935 | if (!crtc_state) | 932 | if (!crtc_state) |
936 | return -ENOMEM; | 933 | return -ENOMEM; |
937 | crtc_state->crtc = crtc; | 934 | if (crtc->state) |
935 | __drm_atomic_helper_crtc_duplicate_state(crtc, crtc_state); | ||
936 | else | ||
937 | crtc_state->crtc = crtc; | ||
938 | } | ||
938 | 939 | ||
939 | crtc_state->enable = true; | 940 | crtc_state->enable = true; |
940 | crtc_state->planes_changed = true; | 941 | crtc_state->planes_changed = true; |
@@ -944,30 +945,25 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod | |||
944 | 945 | ||
945 | if (crtc_funcs->atomic_check) { | 946 | if (crtc_funcs->atomic_check) { |
946 | ret = crtc_funcs->atomic_check(crtc, crtc_state); | 947 | ret = crtc_funcs->atomic_check(crtc, crtc_state); |
947 | if (ret) { | 948 | if (ret) |
948 | if (crtc->funcs->atomic_destroy_state) { | 949 | goto out; |
949 | crtc->funcs->atomic_destroy_state(crtc, | ||
950 | crtc_state); | ||
951 | } else { | ||
952 | kfree(crtc_state); | ||
953 | } | ||
954 | |||
955 | return ret; | ||
956 | } | ||
957 | } | 950 | } |
958 | 951 | ||
959 | swap(crtc->state, crtc_state); | 952 | swap(crtc->state, crtc_state); |
960 | 953 | ||
961 | crtc_funcs->mode_set_nofb(crtc); | 954 | crtc_funcs->mode_set_nofb(crtc); |
962 | 955 | ||
963 | if (crtc_state) { | 956 | ret = drm_helper_crtc_mode_set_base(crtc, x, y, old_fb); |
964 | if (crtc->funcs->atomic_destroy_state) | 957 | |
965 | crtc->funcs->atomic_destroy_state(crtc, crtc_state); | 958 | out: |
966 | else | 959 | if (crtc->funcs->atomic_destroy_state) |
967 | kfree(crtc_state); | 960 | crtc->funcs->atomic_destroy_state(crtc, crtc_state); |
961 | else { | ||
962 | __drm_atomic_helper_crtc_destroy_state(crtc, crtc_state); | ||
963 | kfree(crtc_state); | ||
968 | } | 964 | } |
969 | 965 | ||
970 | return drm_helper_crtc_mode_set_base(crtc, x, y, old_fb); | 966 | return ret; |
971 | } | 967 | } |
972 | EXPORT_SYMBOL(drm_helper_crtc_mode_set); | 968 | EXPORT_SYMBOL(drm_helper_crtc_mode_set); |
973 | 969 | ||