Hi Andrew, On Mon, Jun 10, 2024 at 10:17:20AM -0500, Andrew Davis wrote: > This helps prevent mistakes like freeing out of order in cleanup functions > and forgetting to free on error paths. > > Signed-off-by: Andrew Davis <afd@xxxxxx> > --- > drivers/remoteproc/da8xx_remoteproc.c | 29 +++++++++++++-------------- > 1 file changed, 14 insertions(+), 15 deletions(-) > > diff --git a/drivers/remoteproc/da8xx_remoteproc.c b/drivers/remoteproc/da8xx_remoteproc.c > index c8b7576937733..1ce91516fc6e5 100644 > --- a/drivers/remoteproc/da8xx_remoteproc.c > +++ b/drivers/remoteproc/da8xx_remoteproc.c > @@ -233,6 +233,13 @@ static int da8xx_rproc_get_internal_memories(struct platform_device *pdev, > return 0; > } > > +static void da8xx_rproc_mem_release(void *data) > +{ > + struct device *dev = data; > + > + of_reserved_mem_device_release(dev); > +} > + > static int da8xx_rproc_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -293,14 +300,13 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > ret); > return ret; > } > + devm_add_action_or_reset(&pdev->dev, da8xx_rproc_mem_release, &pdev->dev); > } > > rproc = devm_rproc_alloc(dev, "dsp", &da8xx_rproc_ops, da8xx_fw_name, > sizeof(*drproc)); > - if (!rproc) { > - ret = -ENOMEM; > - goto free_mem; > - } > + if (!rproc) > + return -ENOMEM; > > /* error recovery is not supported at present */ > rproc->recovery_disabled = true; > @@ -313,7 +319,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > > ret = da8xx_rproc_get_internal_memories(pdev, drproc); > if (ret) > - goto free_mem; > + return ret; > > platform_set_drvdata(pdev, rproc); > > @@ -323,7 +329,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > rproc); > if (ret) { > dev_err(dev, "devm_request_threaded_irq error: %d\n", ret); > - goto free_mem; > + return ret; > } > > /* > @@ -333,7 +339,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > */ > ret = reset_control_assert(dsp_reset); > if (ret) > - goto free_mem; > + return ret; > > drproc->chipsig = chipsig; > drproc->bootreg = bootreg; > @@ -344,15 +350,10 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > ret = rproc_add(rproc); > if (ret) { > dev_err(dev, "rproc_add failed: %d\n", ret); > - goto free_mem; > + return ret; > } > > return 0; > - > -free_mem: > - if (dev->of_node) > - of_reserved_mem_device_release(dev); > - return ret; > } > > static void da8xx_rproc_remove(struct platform_device *pdev) > @@ -369,8 +370,6 @@ static void da8xx_rproc_remove(struct platform_device *pdev) > disable_irq(drproc->irq); > > rproc_del(rproc); > - if (dev->of_node) > - of_reserved_mem_device_release(dev); This patch gives me the following compilation warning: CC kernel/module/main.o CC drivers/remoteproc/da8xx_remoteproc.o AR drivers/base/firmware_loader/built-in.a AR drivers/base/built-in.a remoteproc/kernel/drivers/remoteproc/da8xx_remoteproc.c: In function ‘da8xx_rproc_remove’: remoteproc/kernel/drivers/remoteproc/da8xx_remoteproc.c:363:24: warning: unused variable ‘dev’ [-Wunused-variable] 363 | struct device *dev = &pdev->dev; | ^~~ AR drivers/remoteproc/built-in.a which is then fixed in the following patch with the introduction of devm_rproc_add(). I suggest doing the opposite, i.e introduce devm_rproc_add() and then get rid of da8xx_rproc_remove() by introducing da8xx_rproc_mem_release(). No need to resend the omap set, I have them. Thanks, Mathieu > } > > static const struct of_device_id davinci_rproc_of_match[] __maybe_unused = { > -- > 2.39.2 >