Hi Maxime,

Le lundi 19 janvier 2026 à 13:50 +0100, Maxime Ripard a écrit :
> The ingenic driver relies on two drm_private_objs, that are
> initialized
> by allocating and initializing a state, and then passing it to
> drm_private_obj_init.
> 
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation,
> let's
> migrate this instance to the new pattern.
> 
> Signed-off-by: Maxime Ripard <[email protected]>

Thought I had ack'd it before, apparently I didn't.

Acked-by: Paul Cercueil <[email protected]>

Cheers,
-Paul

> 
> ---
> 
> Cc: Paul Cercueil <[email protected]>
> Cc: [email protected]
> ---
>  drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 28 +++++++++++++++++----
> -------
>  drivers/gpu/drm/ingenic/ingenic-ipu.c     | 28 ++++++++++++++++-----
> -------
>  2 files changed, 33 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index
> d3213fbf22be14b177fc1b7100c5b721d5f17924..862691991ed2770d30342bf531e
> 828e34bd7080a 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -952,10 +952,24 @@ static void ingenic_drm_destroy_state(struct
> drm_private_obj *obj,
>       struct ingenic_drm_private_state *priv_state =
> to_ingenic_drm_priv_state(state);
>  
>       kfree(priv_state);
>  }
>  
> +static struct drm_private_state *
> +ingenic_drm_create_state(struct drm_private_obj *obj)
> +{
> +     struct ingenic_drm_private_state *priv_state;
> +
> +     priv_state = kzalloc(sizeof(*priv_state), GFP_KERNEL);
> +     if (!priv_state)
> +             return ERR_PTR(-ENOMEM);
> +
> +     __drm_atomic_helper_private_obj_create_state(obj,
> &priv_state->base);
> +
> +     return &priv_state->base;
> +}
> +
>  DEFINE_DRM_GEM_DMA_FOPS(ingenic_drm_fops);
>  
>  static const struct drm_driver ingenic_drm_driver_data = {
>       .driver_features        = DRIVER_MODESET | DRIVER_GEM |
> DRIVER_ATOMIC,
>       .name                   = "ingenic-drm",
> @@ -1032,10 +1046,11 @@ static const struct drm_mode_config_funcs
> ingenic_drm_mode_config_funcs = {
>  static struct drm_mode_config_helper_funcs
> ingenic_drm_mode_config_helpers = {
>       .atomic_commit_tail = drm_atomic_helper_commit_tail,
>  };
>  
>  static const struct drm_private_state_funcs
> ingenic_drm_private_state_funcs = {
> +     .atomic_create_state = ingenic_drm_create_state,
>       .atomic_duplicate_state = ingenic_drm_duplicate_state,
>       .atomic_destroy_state = ingenic_drm_destroy_state,
>  };
>  
>  static void ingenic_drm_unbind_all(void *d)
> @@ -1085,11 +1100,10 @@ static void
> ingenic_drm_atomic_private_obj_fini(struct drm_device *drm, void *pr
>  }
>  
>  static int ingenic_drm_bind(struct device *dev, bool has_components)
>  {
>       struct platform_device *pdev = to_platform_device(dev);
> -     struct ingenic_drm_private_state *private_state;
>       const struct jz_soc_info *soc_info;
>       struct ingenic_drm *priv;
>       struct clk *parent_clk;
>       struct drm_plane *primary;
>       struct drm_bridge *bridge;
> @@ -1385,23 +1399,17 @@ static int ingenic_drm_bind(struct device
> *dev, bool has_components)
>       if (ret) {
>               dev_err(dev, "Unable to register clock notifier\n");
>               goto err_devclk_disable;
>       }
>  
> -     private_state = kzalloc(sizeof(*private_state), GFP_KERNEL);
> -     if (!private_state) {
> -             ret = -ENOMEM;
> -             goto err_clk_notifier_unregister;
> -     }
> -
> -     drm_atomic_private_obj_init(drm, &priv->private_obj,
> &private_state->base,
> +     drm_atomic_private_obj_init(drm, &priv->private_obj, NULL,
>                                  
> &ingenic_drm_private_state_funcs);
>  
>       ret = drmm_add_action_or_reset(drm,
> ingenic_drm_atomic_private_obj_fini,
>                                      &priv->private_obj);
>       if (ret)
> -             goto err_private_state_free;
> +             goto err_clk_notifier_unregister;
>  
>       ret = drm_dev_register(drm, 0);
>       if (ret) {
>               dev_err(dev, "Failed to register DRM driver\n");
>               goto err_clk_notifier_unregister;
> @@ -1409,12 +1417,10 @@ static int ingenic_drm_bind(struct device
> *dev, bool has_components)
>  
>       drm_client_setup(drm, NULL);
>  
>       return 0;
>  
> -err_private_state_free:
> -     kfree(private_state);
>  err_clk_notifier_unregister:
>       clk_notifier_unregister(parent_clk, &priv->clock_nb);
>  err_devclk_disable:
>       if (priv->lcd_clk)
>               clk_disable_unprepare(priv->lcd_clk);
> diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c
> b/drivers/gpu/drm/ingenic/ingenic-ipu.c
> index
> 32638a713241abbd4eaed09f0aaec2b790650cc9..253a1ce30997308547b61339468
> d52e6875785d3 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-ipu.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c
> @@ -748,11 +748,26 @@ static void ingenic_ipu_destroy_state(struct
> drm_private_obj *obj,
>       struct ingenic_ipu_private_state *priv_state =
> to_ingenic_ipu_priv_state(state);
>  
>       kfree(priv_state);
>  }
>  
> +static struct drm_private_state *
> +ingenic_ipu_create_state(struct drm_private_obj *obj)
> +{
> +     struct ingenic_ipu_private_state *priv_state;
> +
> +     priv_state = kzalloc(sizeof(*priv_state), GFP_KERNEL);
> +     if (!priv_state)
> +             return ERR_PTR(-ENOMEM);
> +
> +     __drm_atomic_helper_private_obj_create_state(obj,
> &priv_state->base);
> +
> +     return &priv_state->base;
> +}
> +
>  static const struct drm_private_state_funcs
> ingenic_ipu_private_state_funcs = {
> +     .atomic_create_state = ingenic_ipu_create_state,
>       .atomic_duplicate_state = ingenic_ipu_duplicate_state,
>       .atomic_destroy_state = ingenic_ipu_destroy_state,
>  };
>  
>  static irqreturn_t ingenic_ipu_irq_handler(int irq, void *arg)
> @@ -791,11 +806,10 @@ static const struct regmap_config
> ingenic_ipu_regmap_config = {
>  };
>  
>  static int ingenic_ipu_bind(struct device *dev, struct device
> *master, void *d)
>  {
>       struct platform_device *pdev = to_platform_device(dev);
> -     struct ingenic_ipu_private_state *private_state;
>       const struct soc_info *soc_info;
>       struct drm_device *drm = d;
>       struct drm_plane *plane;
>       struct ingenic_ipu *ipu;
>       void __iomem *base;
> @@ -885,24 +899,14 @@ static int ingenic_ipu_bind(struct device *dev,
> struct device *master, void *d)
>       if (err) {
>               dev_err(dev, "Unable to prepare clock\n");
>               return err;
>       }
>  
> -     private_state = kzalloc(sizeof(*private_state), GFP_KERNEL);
> -     if (!private_state) {
> -             err = -ENOMEM;
> -             goto err_clk_unprepare;
> -     }
> -
> -     drm_atomic_private_obj_init(drm, &ipu->private_obj,
> &private_state->base,
> +     drm_atomic_private_obj_init(drm, &ipu->private_obj, NULL,
>                                  
> &ingenic_ipu_private_state_funcs);
>  
>       return 0;
> -
> -err_clk_unprepare:
> -     clk_unprepare(ipu->clk);
> -     return err;
>  }
>  
>  static void ingenic_ipu_unbind(struct device *dev,
>                              struct device *master, void *d)
>  {

Reply via email to