From: Maxime Ripard Date: Wed, 28 Jan 2026 12:43:53 +0000 (+0100) Subject: drm/ingenic: Switch private_obj initialization to atomic_create_state X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8e46b1ebf37048303ac6cdd8abf9e31f9b4772ef;p=thirdparty%2Fkernel%2Flinux.git drm/ingenic: Switch private_obj initialization to atomic_create_state 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. Acked-by: Paul Cercueil Link: https://patch.msgid.link/20260128-drm-private-obj-reset-v4-9-90891fa3d3b0@redhat.com Signed-off-by: Maxime Ripard --- diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c index d3213fbf22be1..862691991ed27 100644 --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c @@ -954,6 +954,20 @@ static void ingenic_drm_destroy_state(struct drm_private_obj *obj, 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 = { @@ -1034,6 +1048,7 @@ static struct drm_mode_config_helper_funcs ingenic_drm_mode_config_helpers = { }; 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, }; @@ -1087,7 +1102,6 @@ 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; @@ -1387,19 +1401,13 @@ static int ingenic_drm_bind(struct device *dev, bool has_components) 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) { @@ -1411,8 +1419,6 @@ static int ingenic_drm_bind(struct device *dev, bool has_components) return 0; -err_private_state_free: - kfree(private_state); err_clk_notifier_unregister: clk_notifier_unregister(parent_clk, &priv->clock_nb); err_devclk_disable: diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c b/drivers/gpu/drm/ingenic/ingenic-ipu.c index 32638a713241a..253a1ce309973 100644 --- a/drivers/gpu/drm/ingenic/ingenic-ipu.c +++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c @@ -750,7 +750,22 @@ static void ingenic_ipu_destroy_state(struct drm_private_obj *obj, 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, }; @@ -793,7 +808,6 @@ 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; @@ -887,20 +901,10 @@ static int ingenic_ipu_bind(struct device *dev, struct device *master, void *d) 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,