[PATCH v1 2/3] iio: adc: bcm_iproc_adc: use devm_add_action_or_reset()

From: mdshahid03

Date: Tue Aug 25 2026 - 13:25:16 EST


From: Mohammad Shahid <mdshahid03@xxxxxxxxx>

Replace the manual ADC and clock cleanup in probe error paths
and remove() with devm_add_action_or_reset().

Register cleanup actions immediately after enabling the clock and
ADC so that the resources are automatically released on probe
failure and device removal.

This also allows the cleanup labels to be removed and the
iio_device_register() failure path to return directly.

Signed-off-by: Mohammad Shahid <mdshahid03@xxxxxxxxx>
---
drivers/iio/adc/bcm_iproc_adc.c | 39 +++++++++++++++++++++------------
1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/drivers/iio/adc/bcm_iproc_adc.c b/drivers/iio/adc/bcm_iproc_adc.c
index e46e3761993a..1464c60bc83e 100644
--- a/drivers/iio/adc/bcm_iproc_adc.c
+++ b/drivers/iio/adc/bcm_iproc_adc.c
@@ -448,6 +448,20 @@ static void iproc_adc_disable(struct iio_dev *indio_dev)
}
}

+static void iproc_adc_disable_action(void *data)
+{
+ struct iio_dev *indio_dev = data;
+
+ iproc_adc_disable(indio_dev);
+}
+
+static void iproc_adc_clk_disable(void *data)
+{
+ struct clk *clk = data;
+
+ clk_disable_unprepare(clk);
+}
+
static int iproc_adc_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
int *val,
@@ -551,9 +565,17 @@ static int iproc_adc_probe(struct platform_device *pdev)
if (ret)
return dev_err_probe(dev, ret, "failed to enable clock\n");

+ ret = devm_add_action_or_reset(dev, iproc_adc_clk_disable, adc_priv->adc_clk);
+ if (ret)
+ return ret;
+
ret = iproc_adc_enable(indio_dev);
if (ret)
- goto err_adc_enable;
+ return ret;
+
+ ret = devm_add_action_or_reset(dev, iproc_adc_disable_action, indio_dev);
+ if (ret)
+ return ret;

indio_dev->name = "iproc-static-adc";
indio_dev->info = &iproc_adc_iio_info;
@@ -562,29 +584,18 @@ static int iproc_adc_probe(struct platform_device *pdev)
indio_dev->num_channels = ARRAY_SIZE(iproc_adc_iio_channels);

ret = iio_device_register(indio_dev);
- if (ret) {
- dev_err(&pdev->dev, "iio_device_register failed:err %d\n", ret);
- goto err_clk;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "iio_device_register failed\n");

return 0;

-err_clk:
- iproc_adc_disable(indio_dev);
-err_adc_enable:
- clk_disable_unprepare(adc_priv->adc_clk);
-
- return ret;
}

static void iproc_adc_remove(struct platform_device *pdev)
{
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
- struct iproc_adc_priv *adc_priv = iio_priv(indio_dev);

iio_device_unregister(indio_dev);
- iproc_adc_disable(indio_dev);
- clk_disable_unprepare(adc_priv->adc_clk);
}

static const struct of_device_id iproc_adc_of_match[] = {
--
2.43.0