The loongsoon crtc implementation provides a custom reset hook. However,
this hook only allocates the state, initializes it with
__drm_atomic_helper_crtc_reset(), and frees the previous state. It does
not perform any hardware reset.

Since the atomic_create_state hook is only meant to deal with state
allocation and initialization, convert it accordingly. The hardware
reset through ops->reset() is kept as part of the state creation
since the core currently calls atomic_create_state in the same
context where the reset hook was called.

Signed-off-by: Maxime Ripard <[email protected]>
---
Cc: Huacai Chen <[email protected]>
Cc: Icenowy Zheng <[email protected]>
Cc: Jianmin Lv <[email protected]>
Cc: Mingcong Bai <[email protected]>
Cc: Qianhai Wu <[email protected]>
Cc: Xi Ruoyao <[email protected]>
---
 drivers/gpu/drm/loongson/lsdc_crtc.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/loongson/lsdc_crtc.c 
b/drivers/gpu/drm/loongson/lsdc_crtc.c
index 97a3443739e1..2815366abc14 100644
--- a/drivers/gpu/drm/loongson/lsdc_crtc.c
+++ b/drivers/gpu/drm/loongson/lsdc_crtc.c
@@ -386,23 +386,22 @@ static const struct lsdc_crtc_hw_ops 
ls7a2000_crtc_hw_ops[2] = {
                .get_vblank_counter = lsdc_crtc1_get_vblank_count,
                .reset = lsdc_crtc1_reset,
        },
 };
 
-static void lsdc_crtc_reset(struct drm_crtc *crtc)
+static struct drm_crtc_state *lsdc_crtc_create_state(struct drm_crtc *crtc)
 {
        struct lsdc_crtc_state *priv_crtc_state;
 
-       if (crtc->state)
-               crtc->funcs->atomic_destroy_state(crtc, crtc->state);
-
        priv_crtc_state = kzalloc_obj(*priv_crtc_state);
 
        if (!priv_crtc_state)
-               __drm_atomic_helper_crtc_reset(crtc, NULL);
-       else
-               __drm_atomic_helper_crtc_reset(crtc, &priv_crtc_state->base);
+               return ERR_PTR(-ENOMEM);
+
+       __drm_atomic_helper_crtc_state_init(&priv_crtc_state->base, crtc);
+
+       return &priv_crtc_state->base;
 }
 
 static void lsdc_crtc_atomic_destroy_state(struct drm_crtc *crtc,
                                           struct drm_crtc_state *state)
 {
@@ -705,11 +704,11 @@ static void lsdc_crtc_atomic_print_state(struct 
drm_printer *p,
        drm_printf(p, "\tMedium clock multiplier = %u\n", pparms->loopc);
        drm_printf(p, "\tOutput clock divider = %u\n", pparms->div_out);
 }
 
 static const struct drm_crtc_funcs ls7a1000_crtc_funcs = {
-       .reset = lsdc_crtc_reset,
+       .atomic_create_state = lsdc_crtc_create_state,
        .destroy = drm_crtc_cleanup,
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
        .atomic_duplicate_state = lsdc_crtc_atomic_duplicate_state,
        .atomic_destroy_state = lsdc_crtc_atomic_destroy_state,
@@ -719,11 +718,11 @@ static const struct drm_crtc_funcs ls7a1000_crtc_funcs = {
        .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
        .atomic_print_state = lsdc_crtc_atomic_print_state,
 };
 
 static const struct drm_crtc_funcs ls7a2000_crtc_funcs = {
-       .reset = lsdc_crtc_reset,
+       .atomic_create_state = lsdc_crtc_create_state,
        .destroy = drm_crtc_cleanup,
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
        .atomic_duplicate_state = lsdc_crtc_atomic_duplicate_state,
        .atomic_destroy_state = lsdc_crtc_atomic_destroy_state,

-- 
2.55.0

Reply via email to