Re: [PATCH v4 2/2] drm/imx/dcss: have all init functions use devres

From: Laurentiu Palcu
Date: Fri Feb 02 2024 - 08:50:02 EST


Hi Philipp,

On Wed, Jan 24, 2024 at 12:19:05PM +0100, Philipp Stanner wrote:
> 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@xxxxxxxxxx>

Reviewed-by: Laurentiu Palcu <laurentiu.palcu@xxxxxxxxxxx>

Thanks,
Laurentiu
> ---
> drivers/gpu/drm/imx/dcss/dcss-blkctl.c | 13 ++-----------
> drivers/gpu/drm/imx/dcss/dcss-ctxld.c | 14 +++-----------
> drivers/gpu/drm/imx/dcss/dcss-dev.c | 12 ++----------
> drivers/gpu/drm/imx/dcss/dcss-dev.h | 1 -
> drivers/gpu/drm/imx/dcss/dcss-dpr.c | 21 +++------------------
> drivers/gpu/drm/imx/dcss/dcss-drv.c | 12 +++---------
> drivers/gpu/drm/imx/dcss/dcss-dtg.c | 26 +++++---------------------
> drivers/gpu/drm/imx/dcss/dcss-scaler.c | 21 +++------------------
> drivers/gpu/drm/imx/dcss/dcss-ss.c | 12 +++---------
> 9 files changed, 24 insertions(+), 108 deletions(-)
>
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-blkctl.c b/drivers/gpu/drm/imx/dcss/dcss-blkctl.c
> index c9b54bb2692d..803e3fcdb50f 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-blkctl.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-blkctl.c
> @@ -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);
> -}
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-ctxld.c b/drivers/gpu/drm/imx/dcss/dcss-ctxld.c
> index 3a84cb3209c4..e41d5c2a3ea4 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-ctxld.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-ctxld.c
> @@ -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)
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-dev.c b/drivers/gpu/drm/imx/dcss/dcss-dev.c
> index d448bf1c205e..597e9b7bd4bf 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-dev.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-dev.c
> @@ -109,8 +109,6 @@ static int dcss_submodules_init(struct dcss_dev *dcss)
> 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)
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-dev.h b/drivers/gpu/drm/imx/dcss/dcss-dev.h
> index f27b87c09599..b032e873d227 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-dev.h
> +++ b/drivers/gpu/drm/imx/dcss/dcss-dev.h
> @@ -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);
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-dpr.c b/drivers/gpu/drm/imx/dcss/dcss-dpr.c
> index df9dab949bf2..072eb209249f 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-dpr.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-dpr.c
> @@ -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,
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-drv.c b/drivers/gpu/drm/imx/dcss/dcss-drv.c
> index ad5f29ea8f6a..d881f5a34760 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-drv.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-drv.c
> @@ -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)
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-dtg.c b/drivers/gpu/drm/imx/dcss/dcss-dtg.c
> index 30de00540f63..2968f5d5bd41 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-dtg.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-dtg.c
> @@ -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 @@ int dcss_dtg_init(struct dcss_dev *dcss, unsigned long dtg_base)
> 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)
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-scaler.c b/drivers/gpu/drm/imx/dcss/dcss-scaler.c
> index 47852b9dd5ea..825728c356ff 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-scaler.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-scaler.c
> @@ -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)
> diff --git a/drivers/gpu/drm/imx/dcss/dcss-ss.c b/drivers/gpu/drm/imx/dcss/dcss-ss.c
> index 8ddf08da911b..0df81866fb7b 100644
> --- a/drivers/gpu/drm/imx/dcss/dcss-ss.c
> +++ b/drivers/gpu/drm/imx/dcss/dcss-ss.c
> @@ -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)
> --
> 2.43.0
>