[PATCH v3 4/4] iio: adc: ad799x: use devm_iio_device_register and drop remove

Archit Anant posted 4 patches 1 month, 1 week ago
There is a newer version of this series
[PATCH v3 4/4] iio: adc: ad799x: use devm_iio_device_register and drop remove
Posted by Archit Anant 1 month, 1 week ago
Convert the driver to use the device-managed versions of
iio_device_register() and iio_triggered_buffer_setup().

Because all resources (buffer, regulators, IRQs, IIO device) are now
managed by the devm core, the unwinding order is guaranteed to be
safe and correct. We can safely remove all manual error handling goto
labels in ad799x_probe() and delete the ad799x_remove() function
entirely.

This eliminates boilerplate code and prevents future resource leaks.

Suggested-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
 drivers/iio/adc/ad799x.c | 43 ++++++++++------------------------------
 1 file changed, 11 insertions(+), 32 deletions(-)

diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
index 1a96b5417ecf..2b40ef2da7a2 100644
--- a/drivers/iio/adc/ad799x.c
+++ b/drivers/iio/adc/ad799x.c
@@ -822,7 +822,7 @@ static int ad799x_probe(struct i2c_client *client)
 		return ret;
 	ret = regulator_get_voltage(st->reg);
 	if (ret < 0)
-		goto error_disable_reg;
+		return ret;
 	st->vcc_uv = ret;
 
 	ret = devm_add_action_or_reset(&client->dev, ad799x_reg_disable, st->reg);
@@ -835,7 +835,7 @@ static int ad799x_probe(struct i2c_client *client)
 		ret = PTR_ERR_OR_ZERO(st->vref);
 		if (ret) {
 			if (ret != -ENODEV)
-				goto error_disable_reg;
+				return ret;
 			st->vref = NULL;
 			dev_info(&client->dev, "Using VCC reference voltage\n");
 		}
@@ -845,17 +845,17 @@ static int ad799x_probe(struct i2c_client *client)
 			extra_config |= AD7991_REF_SEL;
 			ret = regulator_enable(st->vref);
 			if (ret)
-				goto error_disable_reg;
+				return ret;
 
 			ret = regulator_get_voltage(st->vref);
 			if (ret < 0)
-				goto error_disable_vref;
+				return ret;
 			st->vref_uv = ret;
 
 			ret = devm_add_action_or_reset(&client->dev, ad799x_reg_disable,
 							st->vref);
 			if (ret)
-				goto error_disable_reg;
+				return ret;
 		}
 	}
 
@@ -870,12 +870,12 @@ static int ad799x_probe(struct i2c_client *client)
 
 	ret = ad799x_update_config(st, st->chip_config->default_config | extra_config);
 	if (ret)
-		goto error_disable_vref;
+		return ret;
 
-	ret = iio_triggered_buffer_setup(indio_dev, NULL,
+	ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL,
 		&ad799x_trigger_handler, NULL);
 	if (ret)
-		goto error_disable_vref;
+		return ret;
 
 	if (client->irq > 0) {
 		ret = devm_request_threaded_irq(&client->dev,
@@ -887,36 +887,16 @@ static int ad799x_probe(struct i2c_client *client)
 						client->name,
 						indio_dev);
 		if (ret)
-			goto error_cleanup_ring;
+			return ret;
 	}
 
 	mutex_init(&st->lock);
 
-	ret = iio_device_register(indio_dev);
+	ret = devm_iio_device_register(&client->dev, indio_dev);
 	if (ret)
-		goto error_cleanup_ring;
+		return ret;
 
 	return 0;
-
-error_cleanup_ring:
-	iio_triggered_buffer_cleanup(indio_dev);
-error_disable_vref:
-	if (st->vref)
-		regulator_disable(st->vref);
-error_disable_reg:
-	regulator_disable(st->reg);
-
-	return ret;
-}
-
-static void ad799x_remove(struct i2c_client *client)
-{
-	struct iio_dev *indio_dev = i2c_get_clientdata(client);
-	struct ad799x_state *st = iio_priv(indio_dev);
-
-	iio_device_unregister(indio_dev);
-
-	iio_triggered_buffer_cleanup(indio_dev);
 }
 
 static int ad799x_suspend(struct device *dev)
@@ -986,7 +966,6 @@ static struct i2c_driver ad799x_driver = {
 		.pm = pm_sleep_ptr(&ad799x_pm_ops),
 	},
 	.probe = ad799x_probe,
-	.remove = ad799x_remove,
 	.id_table = ad799x_id,
 };
 module_i2c_driver(ad799x_driver);
-- 
2.39.5
Re: [PATCH v3 4/4] iio: adc: ad799x: use devm_iio_device_register and drop remove
Posted by Andy Shevchenko 1 month, 1 week ago
On Mon, Mar 02, 2026 at 06:36:32PM +0530, Archit Anant wrote:
> Convert the driver to use the device-managed versions of
> iio_device_register() and iio_triggered_buffer_setup().
> 
> Because all resources (buffer, regulators, IRQs, IIO device) are now
> managed by the devm core, the unwinding order is guaranteed to be
> safe and correct. We can safely remove all manual error handling goto
> labels in ad799x_probe() and delete the ad799x_remove() function
> entirely.
> 
> This eliminates boilerplate code and prevents future resource leaks.

...

>  	mutex_init(&st->lock);

Missed devm_mutex_init().

-- 
With Best Regards,
Andy Shevchenko