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

Since this is exactly what the atomic_create_state hook is meant to
do, minus the old state cleanup which the caller handles, convert the
implementation to use atomic_create_state with
__drm_atomic_helper_crtc_state_init() instead.

Signed-off-by: Maxime Ripard <[email protected]>
---
Cc: "MaĆ­ra Canal" <[email protected]>
Cc: Dave Stevenson <[email protected]>
Cc: Raspberry Pi Kernel Maintenance <[email protected]>
---
 drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c |  2 +-
 drivers/gpu/drm/vc4/vc4_crtc.c            | 14 ++++++--------
 drivers/gpu/drm/vc4/vc4_drv.h             |  2 +-
 drivers/gpu/drm/vc4/vc4_txp.c             |  2 +-
 4 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c 
b/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c
index ade3309ae042..247863f8e2c5 100644
--- a/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c
+++ b/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c
@@ -12,11 +12,11 @@ static const struct drm_crtc_helper_funcs 
vc4_dummy_crtc_helper_funcs = {
 };
 
 static const struct drm_crtc_funcs vc4_dummy_crtc_funcs = {
        .atomic_destroy_state   = vc4_crtc_destroy_state,
        .atomic_duplicate_state = vc4_crtc_duplicate_state,
-       .reset                  = vc4_crtc_reset,
+       .atomic_create_state    = vc4_crtc_create_state,
 };
 
 struct vc4_dummy_crtc *vc4_mock_pv(struct kunit *test,
                                   struct drm_device *drm,
                                   struct drm_plane *plane,
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
index 4572b0b9bae1..f42cd5353230 100644
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
@@ -1133,25 +1133,23 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc,
        }
 
        drm_atomic_helper_crtc_destroy_state(crtc, state);
 }
 
-void vc4_crtc_reset(struct drm_crtc *crtc)
+struct drm_crtc_state *vc4_crtc_create_state(struct drm_crtc *crtc)
 {
        struct vc4_crtc_state *vc4_crtc_state;
 
-       if (crtc->state)
-               vc4_crtc_destroy_state(crtc, crtc->state);
-
        vc4_crtc_state = kzalloc_obj(*vc4_crtc_state);
        if (!vc4_crtc_state) {
-               crtc->state = NULL;
-               return;
+               return ERR_PTR(-ENOMEM);
        }
 
        vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED;
-       __drm_atomic_helper_crtc_reset(crtc, &vc4_crtc_state->base);
+       __drm_atomic_helper_crtc_state_init(&vc4_crtc_state->base, crtc);
+
+       return &vc4_crtc_state->base;
 }
 
 int vc4_crtc_late_register(struct drm_crtc *crtc)
 {
        struct drm_device *drm = crtc->dev;
@@ -1168,11 +1166,11 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = {
        .set_config = drm_atomic_helper_set_config,
        .page_flip = vc4_page_flip,
        .set_property = NULL,
        .cursor_set = NULL, /* handled by drm_mode_cursor_universal */
        .cursor_move = NULL, /* handled by drm_mode_cursor_universal */
-       .reset = vc4_crtc_reset,
+       .atomic_create_state = vc4_crtc_create_state,
        .atomic_duplicate_state = vc4_crtc_duplicate_state,
        .atomic_destroy_state = vc4_crtc_destroy_state,
        .enable_vblank = vc4_enable_vblank,
        .disable_vblank = vc4_disable_vblank,
        .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 0f5958c1e6b6..649032174dbd 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -947,11 +947,11 @@ int vc4_page_flip(struct drm_crtc *crtc,
 int vc4_crtc_atomic_check(struct drm_crtc *crtc,
                          struct drm_atomic_commit *state);
 struct drm_crtc_state *vc4_crtc_duplicate_state(struct drm_crtc *crtc);
 void vc4_crtc_destroy_state(struct drm_crtc *crtc,
                            struct drm_crtc_state *state);
-void vc4_crtc_reset(struct drm_crtc *crtc);
+struct drm_crtc_state *vc4_crtc_create_state(struct drm_crtc *crtc);
 void vc4_crtc_handle_vblank(struct vc4_crtc *crtc);
 void vc4_crtc_send_vblank(struct drm_crtc *crtc);
 int vc4_crtc_late_register(struct drm_crtc *crtc);
 void vc4_crtc_get_margins(struct drm_crtc_state *state,
                          unsigned int *left, unsigned int *right,
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index bc3f366fc3e6..c469f8b1068b 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -423,11 +423,11 @@ static int vc4_txp_enable_vblank(struct drm_crtc *crtc)
 static void vc4_txp_disable_vblank(struct drm_crtc *crtc) {}
 
 static const struct drm_crtc_funcs vc4_txp_crtc_funcs = {
        .set_config             = drm_atomic_helper_set_config,
        .page_flip              = vc4_page_flip,
-       .reset                  = vc4_crtc_reset,
+       .atomic_create_state    = vc4_crtc_create_state,
        .atomic_duplicate_state = vc4_crtc_duplicate_state,
        .atomic_destroy_state   = vc4_crtc_destroy_state,
        .enable_vblank          = vc4_txp_enable_vblank,
        .disable_vblank         = vc4_txp_disable_vblank,
        .late_register          = vc4_crtc_late_register,

-- 
2.55.0

Reply via email to