drm/imx/dcss: have all init functions use devres
authorPhilipp Stanner <pstanner@redhat.com>
Wed, 24 Jan 2024 11:19:05 +0000 (12:19 +0100)
committerLaurentiu Palcu <laurentiu.palcu@oss.nxp.com>
Fri, 2 Feb 2024 13:36:21 +0000 (15:36 +0200)
dcss currently allocates and ioremaps quite a few resources in its probe
function's call graph. Devres now provides convenient functions which
perform the same task but do the cleanup automatically.

Port all memory allocations and ioremap() calls to the devres
counterparts.

Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Reviewed-by: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
Signed-off-by: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240124111904.18261-4-pstanner@redhat.com
drivers/gpu/drm/imx/dcss/dcss-blkctl.c
drivers/gpu/drm/imx/dcss/dcss-ctxld.c
drivers/gpu/drm/imx/dcss/dcss-dev.c
drivers/gpu/drm/imx/dcss/dcss-dev.h
drivers/gpu/drm/imx/dcss/dcss-dpr.c
drivers/gpu/drm/imx/dcss/dcss-drv.c
drivers/gpu/drm/imx/dcss/dcss-dtg.c
drivers/gpu/drm/imx/dcss/dcss-scaler.c
drivers/gpu/drm/imx/dcss/dcss-ss.c

index c9b54bb2692d719e12b9c95afeaeb8c3fd6ac6c8..803e3fcdb50f18f71f9e1ab4dafc7f2c5a6d62e4 100644 (file)
@@ -42,14 +42,13 @@ int dcss_blkctl_init(struct dcss_dev *dcss, unsigned long blkctl_base)
 {
        struct dcss_blkctl *blkctl;
 
-       blkctl = kzalloc(sizeof(*blkctl), GFP_KERNEL);
+       blkctl = devm_kzalloc(dcss->dev, sizeof(*blkctl), GFP_KERNEL);
        if (!blkctl)
                return -ENOMEM;
 
-       blkctl->base_reg = ioremap(blkctl_base, SZ_4K);
+       blkctl->base_reg = devm_ioremap(dcss->dev, blkctl_base, SZ_4K);
        if (!blkctl->base_reg) {
                dev_err(dcss->dev, "unable to remap BLK CTRL base\n");
-               kfree(blkctl);
                return -ENOMEM;
        }
 
@@ -60,11 +59,3 @@ int dcss_blkctl_init(struct dcss_dev *dcss, unsigned long blkctl_base)
 
        return 0;
 }
-
-void dcss_blkctl_exit(struct dcss_blkctl *blkctl)
-{
-       if (blkctl->base_reg)
-               iounmap(blkctl->base_reg);
-
-       kfree(blkctl);
-}
index 3a84cb3209c4ad03d6c43ab1e845da7fd2539590..e41d5c2a3ea4bf382e955ab1da068f10711cff7b 100644 (file)
@@ -202,7 +202,7 @@ int dcss_ctxld_init(struct dcss_dev *dcss, unsigned long ctxld_base)
        struct dcss_ctxld *ctxld;
        int ret;
 
-       ctxld = kzalloc(sizeof(*ctxld), GFP_KERNEL);
+       ctxld = devm_kzalloc(dcss->dev, sizeof(*ctxld), GFP_KERNEL);
        if (!ctxld)
                return -ENOMEM;
 
@@ -217,7 +217,7 @@ int dcss_ctxld_init(struct dcss_dev *dcss, unsigned long ctxld_base)
                goto err;
        }
 
-       ctxld->ctxld_reg = ioremap(ctxld_base, SZ_4K);
+       ctxld->ctxld_reg = devm_ioremap(dcss->dev, ctxld_base, SZ_4K);
        if (!ctxld->ctxld_reg) {
                dev_err(dcss->dev, "ctxld: unable to remap ctxld base\n");
                ret = -ENOMEM;
@@ -226,18 +226,14 @@ int dcss_ctxld_init(struct dcss_dev *dcss, unsigned long ctxld_base)
 
        ret = dcss_ctxld_irq_config(ctxld, to_platform_device(dcss->dev));
        if (ret)
-               goto err_irq;
+               goto err;
 
        dcss_ctxld_hw_cfg(ctxld);
 
        return 0;
 
-err_irq:
-       iounmap(ctxld->ctxld_reg);
-
 err:
        dcss_ctxld_free_ctx(ctxld);
-       kfree(ctxld);
 
        return ret;
 }
@@ -246,11 +242,7 @@ void dcss_ctxld_exit(struct dcss_ctxld *ctxld)
 {
        free_irq(ctxld->irq, ctxld);
 
-       if (ctxld->ctxld_reg)
-               iounmap(ctxld->ctxld_reg);
-
        dcss_ctxld_free_ctx(ctxld);
-       kfree(ctxld);
 }
 
 static int dcss_ctxld_enable_locked(struct dcss_ctxld *ctxld)
index d448bf1c205e2bc86cf4fa9c46bea281c2805da3..597e9b7bd4bfa4faf3864322af318835e95d0f80 100644 (file)
@@ -109,8 +109,6 @@ dtg_err:
        dcss_ctxld_exit(dcss->ctxld);
 
 ctxld_err:
-       dcss_blkctl_exit(dcss->blkctl);
-
        dcss_clocks_disable(dcss);
 
        return ret;
@@ -124,7 +122,6 @@ static void dcss_submodules_stop(struct dcss_dev *dcss)
        dcss_ss_exit(dcss->ss);
        dcss_dtg_exit(dcss->dtg);
        dcss_ctxld_exit(dcss->ctxld);
-       dcss_blkctl_exit(dcss->blkctl);
        dcss_clocks_disable(dcss);
 }
 
@@ -190,7 +187,7 @@ struct dcss_dev *dcss_dev_create(struct device *dev, bool hdmi_output)
                return ERR_PTR(-EBUSY);
        }
 
-       dcss = kzalloc(sizeof(*dcss), GFP_KERNEL);
+       dcss = devm_kzalloc(dev, sizeof(*dcss), GFP_KERNEL);
        if (!dcss)
                return ERR_PTR(-ENOMEM);
 
@@ -201,7 +198,7 @@ struct dcss_dev *dcss_dev_create(struct device *dev, bool hdmi_output)
        ret = dcss_clks_init(dcss);
        if (ret) {
                dev_err(dev, "clocks initialization failed\n");
-               goto err;
+               return ERR_PTR(ret);
        }
 
        dcss->of_port = of_graph_get_port_by_id(dev->of_node, 0);
@@ -233,9 +230,6 @@ struct dcss_dev *dcss_dev_create(struct device *dev, bool hdmi_output)
 clks_err:
        dcss_clks_release(dcss);
 
-err:
-       kfree(dcss);
-
        return ERR_PTR(ret);
 }
 
@@ -253,8 +247,6 @@ void dcss_dev_destroy(struct dcss_dev *dcss)
        dcss_submodules_stop(dcss);
 
        dcss_clks_release(dcss);
-
-       kfree(dcss);
 }
 
 static int dcss_dev_suspend(struct device *dev)
index f27b87c0959915322e31cde1b85d9fd3646c4a7c..b032e873d227ce3d25757fb43c1a623aaa7c9abb 100644 (file)
@@ -104,7 +104,6 @@ extern const struct dev_pm_ops dcss_dev_pm_ops;
 /* BLKCTL */
 int dcss_blkctl_init(struct dcss_dev *dcss, unsigned long blkctl_base);
 void dcss_blkctl_cfg(struct dcss_blkctl *blkctl);
-void dcss_blkctl_exit(struct dcss_blkctl *blkctl);
 
 /* CTXLD */
 int dcss_ctxld_init(struct dcss_dev *dcss, unsigned long ctxld_base);
index df9dab949bf2b8bc95f2c20073a643982b293004..072eb209249f46000fe3ae8c3a7d7a880ad5cc01 100644 (file)
@@ -135,7 +135,7 @@ static int dcss_dpr_ch_init_all(struct dcss_dpr *dpr, unsigned long dpr_base)
 
                ch->base_ofs = dpr_base + i * 0x1000;
 
-               ch->base_reg = ioremap(ch->base_ofs, SZ_4K);
+               ch->base_reg = devm_ioremap(dpr->dev, ch->base_ofs, SZ_4K);
                if (!ch->base_reg) {
                        dev_err(dpr->dev, "dpr: unable to remap ch %d base\n",
                                i);
@@ -155,7 +155,7 @@ int dcss_dpr_init(struct dcss_dev *dcss, unsigned long dpr_base)
 {
        struct dcss_dpr *dpr;
 
-       dpr = kzalloc(sizeof(*dpr), GFP_KERNEL);
+       dpr = devm_kzalloc(dcss->dev, sizeof(*dpr), GFP_KERNEL);
        if (!dpr)
                return -ENOMEM;
 
@@ -164,18 +164,8 @@ int dcss_dpr_init(struct dcss_dev *dcss, unsigned long dpr_base)
        dpr->ctxld = dcss->ctxld;
        dpr->ctx_id = CTX_SB_HP;
 
-       if (dcss_dpr_ch_init_all(dpr, dpr_base)) {
-               int i;
-
-               for (i = 0; i < 3; i++) {
-                       if (dpr->ch[i].base_reg)
-                               iounmap(dpr->ch[i].base_reg);
-               }
-
-               kfree(dpr);
-
+       if (dcss_dpr_ch_init_all(dpr, dpr_base))
                return -ENOMEM;
-       }
 
        return 0;
 }
@@ -189,12 +179,7 @@ void dcss_dpr_exit(struct dcss_dpr *dpr)
                struct dcss_dpr_ch *ch = &dpr->ch[ch_no];
 
                dcss_writel(0, ch->base_reg + DCSS_DPR_SYSTEM_CTRL0);
-
-               if (ch->base_reg)
-                       iounmap(ch->base_reg);
        }
-
-       kfree(dpr);
 }
 
 static u32 dcss_dpr_x_pix_wide_adjust(struct dcss_dpr_ch *ch, u32 pix_wide,
index ad5f29ea8f6a156c3b7fc7022ecf723a83277ae7..d881f5a347608652b93fe2f77260266688b49d44 100644 (file)
@@ -51,15 +51,13 @@ static int dcss_drv_platform_probe(struct platform_device *pdev)
 
        of_node_put(remote);
 
-       mdrv = kzalloc(sizeof(*mdrv), GFP_KERNEL);
+       mdrv = devm_kzalloc(dev, sizeof(*mdrv), GFP_KERNEL);
        if (!mdrv)
                return -ENOMEM;
 
        mdrv->dcss = dcss_dev_create(dev, hdmi_output);
-       if (IS_ERR(mdrv->dcss)) {
-               err = PTR_ERR(mdrv->dcss);
-               goto err;
-       }
+       if (IS_ERR(mdrv->dcss))
+               return PTR_ERR(mdrv->dcss);
 
        dev_set_drvdata(dev, mdrv);
 
@@ -75,8 +73,6 @@ static int dcss_drv_platform_probe(struct platform_device *pdev)
 dcss_shutoff:
        dcss_dev_destroy(mdrv->dcss);
 
-err:
-       kfree(mdrv);
        return err;
 }
 
@@ -86,8 +82,6 @@ static void dcss_drv_platform_remove(struct platform_device *pdev)
 
        dcss_kms_detach(mdrv->kms);
        dcss_dev_destroy(mdrv->dcss);
-
-       kfree(mdrv);
 }
 
 static void dcss_drv_platform_shutdown(struct platform_device *pdev)
index 30de00540f63a3448968889d0bb325b35a39272e..2968f5d5bd412e2276f8724de8e0a49ea786fcc5 100644 (file)
@@ -152,7 +152,7 @@ int dcss_dtg_init(struct dcss_dev *dcss, unsigned long dtg_base)
        int ret = 0;
        struct dcss_dtg *dtg;
 
-       dtg = kzalloc(sizeof(*dtg), GFP_KERNEL);
+       dtg = devm_kzalloc(dcss->dev, sizeof(*dtg), GFP_KERNEL);
        if (!dtg)
                return -ENOMEM;
 
@@ -160,11 +160,10 @@ int dcss_dtg_init(struct dcss_dev *dcss, unsigned long dtg_base)
        dtg->dev = dcss->dev;
        dtg->ctxld = dcss->ctxld;
 
-       dtg->base_reg = ioremap(dtg_base, SZ_4K);
+       dtg->base_reg = devm_ioremap(dtg->dev, dtg_base, SZ_4K);
        if (!dtg->base_reg) {
-               dev_err(dcss->dev, "dtg: unable to remap dtg base\n");
-               ret = -ENOMEM;
-               goto err_ioremap;
+               dev_err(dtg->dev, "dtg: unable to remap dtg base\n");
+               return -ENOMEM;
        }
 
        dtg->base_ofs = dtg_base;
@@ -175,17 +174,7 @@ int dcss_dtg_init(struct dcss_dev *dcss, unsigned long dtg_base)
        dtg->control_status |= OVL_DATA_MODE | BLENDER_VIDEO_ALPHA_SEL |
                ((dtg->alpha << DEFAULT_FG_ALPHA_POS) & DEFAULT_FG_ALPHA_MASK);
 
-       ret = dcss_dtg_irq_config(dtg, to_platform_device(dcss->dev));
-       if (ret)
-               goto err_irq;
-
-       return 0;
-
-err_irq:
-       iounmap(dtg->base_reg);
-
-err_ioremap:
-       kfree(dtg);
+       ret = dcss_dtg_irq_config(dtg, to_platform_device(dtg->dev));
 
        return ret;
 }
@@ -193,11 +182,6 @@ err_ioremap:
 void dcss_dtg_exit(struct dcss_dtg *dtg)
 {
        free_irq(dtg->ctxld_kick_irq, dtg);
-
-       if (dtg->base_reg)
-               iounmap(dtg->base_reg);
-
-       kfree(dtg);
 }
 
 void dcss_dtg_sync_set(struct dcss_dtg *dtg, struct videomode *vm)
index 47852b9dd5eaa281471ef77df3c948802aefeea8..825728c356ffbebd598a2c4851512668b19c93a2 100644 (file)
@@ -302,7 +302,7 @@ static int dcss_scaler_ch_init_all(struct dcss_scaler *scl,
 
                ch->base_ofs = scaler_base + i * 0x400;
 
-               ch->base_reg = ioremap(ch->base_ofs, SZ_4K);
+               ch->base_reg = devm_ioremap(scl->dev, ch->base_ofs, SZ_4K);
                if (!ch->base_reg) {
                        dev_err(scl->dev, "scaler: unable to remap ch base\n");
                        return -ENOMEM;
@@ -318,7 +318,7 @@ int dcss_scaler_init(struct dcss_dev *dcss, unsigned long scaler_base)
 {
        struct dcss_scaler *scaler;
 
-       scaler = kzalloc(sizeof(*scaler), GFP_KERNEL);
+       scaler = devm_kzalloc(dcss->dev, sizeof(*scaler), GFP_KERNEL);
        if (!scaler)
                return -ENOMEM;
 
@@ -327,18 +327,8 @@ int dcss_scaler_init(struct dcss_dev *dcss, unsigned long scaler_base)
        scaler->ctxld = dcss->ctxld;
        scaler->ctx_id = CTX_SB_HP;
 
-       if (dcss_scaler_ch_init_all(scaler, scaler_base)) {
-               int i;
-
-               for (i = 0; i < 3; i++) {
-                       if (scaler->ch[i].base_reg)
-                               iounmap(scaler->ch[i].base_reg);
-               }
-
-               kfree(scaler);
-
+       if (dcss_scaler_ch_init_all(scaler, scaler_base))
                return -ENOMEM;
-       }
 
        return 0;
 }
@@ -351,12 +341,7 @@ void dcss_scaler_exit(struct dcss_scaler *scl)
                struct dcss_scaler_ch *ch = &scl->ch[ch_no];
 
                dcss_writel(0, ch->base_reg + DCSS_SCALER_CTRL);
-
-               if (ch->base_reg)
-                       iounmap(ch->base_reg);
        }
-
-       kfree(scl);
 }
 
 void dcss_scaler_ch_enable(struct dcss_scaler *scl, int ch_num, bool en)
index 8ddf08da911b7ecafd2d7287ca7d78ef255add72..0df81866fb7b9895802ac4bf9ccc17892c95b40f 100644 (file)
@@ -83,7 +83,7 @@ int dcss_ss_init(struct dcss_dev *dcss, unsigned long ss_base)
 {
        struct dcss_ss *ss;
 
-       ss = kzalloc(sizeof(*ss), GFP_KERNEL);
+       ss = devm_kzalloc(dcss->dev, sizeof(*ss), GFP_KERNEL);
        if (!ss)
                return -ENOMEM;
 
@@ -91,10 +91,9 @@ int dcss_ss_init(struct dcss_dev *dcss, unsigned long ss_base)
        ss->dev = dcss->dev;
        ss->ctxld = dcss->ctxld;
 
-       ss->base_reg = ioremap(ss_base, SZ_4K);
+       ss->base_reg = devm_ioremap(ss->dev, ss_base, SZ_4K);
        if (!ss->base_reg) {
-               dev_err(dcss->dev, "ss: unable to remap ss base\n");
-               kfree(ss);
+               dev_err(ss->dev, "ss: unable to remap ss base\n");
                return -ENOMEM;
        }
 
@@ -108,11 +107,6 @@ void dcss_ss_exit(struct dcss_ss *ss)
 {
        /* stop SS */
        dcss_writel(0, ss->base_reg + DCSS_SS_SYS_CTRL);
-
-       if (ss->base_reg)
-               iounmap(ss->base_reg);
-
-       kfree(ss);
 }
 
 void dcss_ss_subsam_set(struct dcss_ss *ss)