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) > {
