]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/ingenic: Switch private_obj initialization to atomic_create_state
authorMaxime Ripard <mripard@kernel.org>
Wed, 28 Jan 2026 12:43:53 +0000 (13:43 +0100)
committerMaxime Ripard <mripard@kernel.org>
Tue, 10 Feb 2026 09:07:05 +0000 (10:07 +0100)
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 <paul@crapouillou.net>
Link: https://patch.msgid.link/20260128-drm-private-obj-reset-v4-9-90891fa3d3b0@redhat.com
Signed-off-by: Maxime Ripard <mripard@kernel.org>
drivers/gpu/drm/ingenic/ingenic-drm-drv.c
drivers/gpu/drm/ingenic/ingenic-ipu.c

index d3213fbf22be14b177fc1b7100c5b721d5f17924..862691991ed2770d30342bf531e828e34bd7080a 100644 (file)
@@ -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:
index 32638a713241abbd4eaed09f0aaec2b790650cc9..253a1ce30997308547b61339468d52e6875785d3 100644 (file)
@@ -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,