[PATCH v8 16/16] dmaengine: lgm: Fix error handling

Uwe Kleine-König
2022-03-14T14:17:16Z

It's an invalid approach to use only a single devm cleanup handler for
two resources (without further error handling at least). In this case the
core clk isn't disabled if getting the reset control fails.

This also fixes the problem that the return value of clk_prepare_enable()
wasn't checked before.

Fixes: 32d31c79a1a4 ("dmaengine: Add Intel LGM SoC DMA support.")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
drivers/dma/lgm/lgm-dma.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/dma/lgm/lgm-dma.c b/drivers/dma/lgm/lgm-dma.c
index efe8bd3a0e2a..f8904cf2d832 100644
--- a/drivers/dma/lgm/lgm-dma.c
+++ b/drivers/dma/lgm/lgm-dma.c
@@ -1463,11 +1463,10 @@ static int ldma_init_v22(struct ldma_dev *d, struct platform_device *pdev)
return 0;
}

-static void ldma_clk_disable(void *data)
+static void ldma_reset(void *data)
{
struct ldma_dev *d = data;

- clk_disable_unprepare(d->core_clk);
reset_control_assert(d->rst);
}

@@ -1590,17 +1589,16 @@ static int intel_ldma_probe(struct platform_device *pdev)
return PTR_ERR(d->base);

/* Power up and reset the dma engine, some DMAs always on?? */
- d->core_clk = devm_clk_get_optional(dev, NULL);
+ d->core_clk = devm_clk_get_optional_enabled(dev, NULL);
if (IS_ERR(d->core_clk))
return PTR_ERR(d->core_clk);
- clk_prepare_enable(d->core_clk);

d->rst = devm_reset_control_get_optional(dev, NULL);
if (IS_ERR(d->rst))
return PTR_ERR(d->rst);
reset_control_deassert(d->rst);

- ret = devm_add_action_or_reset(dev, ldma_clk_disable, d);
+ ret = devm_add_action_or_reset(dev, ldma_reset, d);
if (ret) {
dev_err(dev, "Failed to devm_add_action_or_reset, %d\n", ret);
return ret;
--
2.35.1