drm_sysfb_plane_reset() handles both state creation and teardown of
the previous state through the reset hook, which conflates initial
state allocation with hardware and software reset at resume.

Convert it to drm_sysfb_plane_atomic_create_state(), which only
allocates and initializes a pristine state using
__drm_gem_shadow_plane_state_init(). Update DRM_SYSFB_PLANE_FUNCS to
use .atomic_create_state instead of .reset.

Signed-off-by: Maxime Ripard <[email protected]>
---
Cc: [email protected]
---
 drivers/gpu/drm/sysfb/drm_sysfb_helper.h  |  4 ++--
 drivers/gpu/drm/sysfb/drm_sysfb_modeset.c | 30 +++++++++++++++++++++---------
 2 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/sysfb/drm_sysfb_helper.h 
b/drivers/gpu/drm/sysfb/drm_sysfb_helper.h
index 547f2327af5e..1c31267daa00 100644
--- a/drivers/gpu/drm/sysfb/drm_sysfb_helper.h
+++ b/drivers/gpu/drm/sysfb/drm_sysfb_helper.h
@@ -132,19 +132,19 @@ int drm_sysfb_plane_helper_get_scanout_buffer(struct 
drm_plane *plane,
        .atomic_check = drm_sysfb_plane_helper_atomic_check, \
        .atomic_update = drm_sysfb_plane_helper_atomic_update, \
        .atomic_disable = drm_sysfb_plane_helper_atomic_disable, \
        .get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer
 
-void drm_sysfb_plane_reset(struct drm_plane *plane);
+struct drm_plane_state *drm_sysfb_plane_atomic_create_state(struct drm_plane 
*plane);
 struct drm_plane_state *drm_sysfb_plane_atomic_duplicate_state(struct 
drm_plane *plane);
 void drm_sysfb_plane_atomic_destroy_state(struct drm_plane *plane,
                                          struct drm_plane_state *plane_state);
 
 #define DRM_SYSFB_PLANE_FUNCS \
-       .reset = drm_sysfb_plane_reset, \
        .update_plane = drm_atomic_helper_update_plane, \
        .disable_plane = drm_atomic_helper_disable_plane, \
+       .atomic_create_state = drm_sysfb_plane_atomic_create_state, \
        .atomic_duplicate_state = drm_sysfb_plane_atomic_duplicate_state, \
        .atomic_destroy_state = drm_sysfb_plane_atomic_destroy_state
 
 /*
  * CRTC
diff --git a/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c 
b/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c
index d2de29caf89e..9a4c210d6f96 100644
--- a/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c
+++ b/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c
@@ -418,24 +418,36 @@ int drm_sysfb_plane_helper_get_scanout_buffer(struct 
drm_plane *plane,
 
        return 0;
 }
 EXPORT_SYMBOL(drm_sysfb_plane_helper_get_scanout_buffer);
 
-void drm_sysfb_plane_reset(struct drm_plane *plane)
+/**
+ * drm_sysfb_plane_atomic_create_state - creates sysfb plane state
+ * @plane: the plane
+ *
+ * This function implements struct &drm_plane_funcs.atomic_create_state for
+ * sysfb planes. It allocates the plane state of type
+ * struct drm_sysfb_plane_state.
+ *
+ * Returns:
+ * A pointer to a new plane state on success, or an ERR_PTR()-encoded
+ * error code otherwise.
+ */
+struct drm_plane_state *
+drm_sysfb_plane_atomic_create_state(struct drm_plane *plane)
 {
        struct drm_sysfb_plane_state *sysfb_plane_state;
 
-       if (plane->state)
-               
drm_sysfb_plane_state_destroy(to_drm_sysfb_plane_state(plane->state));
-
        sysfb_plane_state = kzalloc_obj(*sysfb_plane_state);
-       if (sysfb_plane_state)
-               __drm_gem_reset_shadow_plane(plane, &sysfb_plane_state->base);
-       else
-               __drm_gem_reset_shadow_plane(plane, NULL);
+       if (!sysfb_plane_state)
+               return ERR_PTR(-ENOMEM);
+
+       __drm_gem_shadow_plane_state_init(plane, &sysfb_plane_state->base);
+
+       return &sysfb_plane_state->base.base;
 }
-EXPORT_SYMBOL(drm_sysfb_plane_reset);
+EXPORT_SYMBOL(drm_sysfb_plane_atomic_create_state);
 
 struct drm_plane_state *drm_sysfb_plane_atomic_duplicate_state(struct 
drm_plane *plane)
 {
        struct drm_device *dev = plane->dev;
        struct drm_plane_state *plane_state = plane->state;

-- 
2.54.0

Reply via email to