public inbox for linux-iio@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 0/5] iio: adc: ad799x: modernize resource management
@ 2026-04-03  8:06 Archit Anant
  2026-04-03  8:06 ` [PATCH v7 1/5] iio: adc: ad799x: sort headers alphabetically Archit Anant
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Archit Anant @ 2026-04-03  8:06 UTC (permalink / raw)
  To: jic23, dlechner
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Archit Anant

This series modernizes the ad799x driver by converting resource 
management to the devm_ infrastructure. This results in cleaner 
probe error handling, the removal of the ad799x_remove() function, 
and improved overall code maintainability and safety.

Key changes in this series include:
- A prerequisite cleanup to sort headers alphabetically.
- Static allocation of the rx_buf using IIO_DECLARE_BUFFER_WITH_TS()
  to avoid dynamic memory leaks during scan mode updates.
- Caching of VCC and VREF regulator voltages during probe() to 
  optimize read_raw() performance and simplify power management logic.
- Migration of regulators and mutex initialization to device-managed 
  resources (devm).
- Fixing a potential race condition by moving mutex initialization 
  before IRQ registration.
- Removal of the manual ad799x_remove() function and all goto-based 
  error cleanup labels in ad799x_probe().

These changes ensure the teardown sequence is always correct, 
following the reverse order of allocation, and remove unnecessary 
boilerplate code from the driver.

Changes in v7:
- Added a prerequisite patch (Patch 1/5) to sort the header includes
  alphabetically as requested by Andy Shevchenko.
- Moved devm_mutex_init() to the very beginning of probe() (before IRQ
  request) to prevent a race condition where an interrupt could fire
  and attempt to take an uninitialized lock.

Changes in v6:
- Addressed style feedback from Andy Shevchenko: used '(MICRO / MILLI)'
  for clearer unit conversion and refactored the optional VREF error
  path for better readability.
- Removed the phrase "Reading the regulator voltage via
  regulator_get_voltage() can be a slow operation" from the commit
  message of patch 3/4 as requested by Jonathan Cameron.
- Confirmed with maintainers that the devm_add_action_or_reset() pattern
  must remain to preserve PM functionality.

Changes in v5:
- Used devm_add_action_or_reset() for regulator disabling instead of
  devm_regulator_get_enable_read_voltage() as suggested by Jonathan 
  Cameron. This was necessary to preserve the regulator pointers (st->reg 
  and st->vref) required by the driver's suspend/resume power management 
  callbacks.
- Simplified voltage caching to use a single 'vref_uV' variable.
- Converted mutex_init() to devm_mutex_init().
- Resolved error path ordering issues by using devm_* exclusively, 
  allowing for the complete removal of the ad799x_remove() function.

Changes in v4:
- Simplified voltage caching to use a single 'vref_uV' variable as
suggested by David Lechner.
- Capitalized 'uV' in variable names as suggested by Andy Shevchenko.
- Removed redundant 'if (ret < 0)' check in read_raw() (dead check).
- Used devm_mutex_init() to replace manual mutex handling.
- Introduced a local 'dev' pointer in probe() to simplify function calls.
- Switched to IIO_DECLARE_BUFFER_WITH_TS() for the buffer declaration.
- Moved goto removals into the respective patches where devm conversion
occurs.

Changes in v3:
- Split the monolithic v2 patch into 4 logical commits as requested by
  Andy Shevchenko.

Changes in v2:
- Eliminated dynamic buffer allocation (feedback from David Lechner).
- Cached voltages to prevent devm/manual ordering hazards (feedback 
  from Jonathan Cameron).

Archit Anant (5):
  iio: adc: ad799x: sort headers alphabetically
  iio: adc: ad799x: use local device pointer in probe
  iio: adc: ad799x: use a static buffer for scan data
  iio: adc: ad799x: cache regulator voltages during probe
  iio: adc: ad799x: convert to fully managed resources and drop remove()

 drivers/iio/adc/ad799x.c | 132 ++++++++++++++++++---------------------
 1 file changed, 62 insertions(+), 70 deletions(-)

-- 
2.39.5


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v7 1/5] iio: adc: ad799x: sort headers alphabetically
  2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
@ 2026-04-03  8:06 ` Archit Anant
  2026-04-03  8:06 ` [PATCH v7 2/5] iio: adc: ad799x: use local device pointer in probe Archit Anant
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Archit Anant @ 2026-04-03  8:06 UTC (permalink / raw)
  To: jic23, dlechner
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Archit Anant

Reorder header includes to maintain proper alphabetical ordering.

No functional changes.

Signed-off-by: Archit Anant <architanant5@gmail.com>
---
 drivers/iio/adc/ad799x.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
index 108bb22162ef..f37f1fda2dc4 100644
--- a/drivers/iio/adc/ad799x.c
+++ b/drivers/iio/adc/ad799x.c
@@ -18,23 +18,23 @@
  * ad7998 and similar chips.
  */
 
-#include <linux/interrupt.h>
+#include <linux/bitops.h>
 #include <linux/device.h>
-#include <linux/kernel.h>
-#include <linux/sysfs.h>
+#include <linux/err.h>
 #include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/regulator/consumer.h>
 #include <linux/slab.h>
+#include <linux/sysfs.h>
 #include <linux/types.h>
-#include <linux/err.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/bitops.h>
 
+#include <linux/iio/buffer.h>
+#include <linux/iio/events.h>
 #include <linux/iio/iio.h>
 #include <linux/iio/sysfs.h>
-#include <linux/iio/events.h>
-#include <linux/iio/buffer.h>
 #include <linux/iio/trigger_consumer.h>
 #include <linux/iio/triggered_buffer.h>
 
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 2/5] iio: adc: ad799x: use local device pointer in probe
  2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
  2026-04-03  8:06 ` [PATCH v7 1/5] iio: adc: ad799x: sort headers alphabetically Archit Anant
@ 2026-04-03  8:06 ` Archit Anant
  2026-04-03  8:06 ` [PATCH v7 3/5] iio: adc: ad799x: use a static buffer for scan data Archit Anant
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Archit Anant @ 2026-04-03  8:06 UTC (permalink / raw)
  To: jic23, dlechner
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Archit Anant

Introduce a local device pointer 'dev' in ad799x_probe() and use it
throughout the function instead of accessing &client->dev repeatedly.

Signed-off-by: Archit Anant <architanant5@gmail.com>
---
 drivers/iio/adc/ad799x.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
index f37f1fda2dc4..bf0575585a59 100644
--- a/drivers/iio/adc/ad799x.c
+++ b/drivers/iio/adc/ad799x.c
@@ -783,6 +783,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
 
 static int ad799x_probe(struct i2c_client *client)
 {
+	struct device *dev = &client->dev;
 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
 	int ret;
 	int extra_config = 0;
@@ -791,7 +792,7 @@ static int ad799x_probe(struct i2c_client *client)
 	const struct ad799x_chip_info *chip_info =
 		&ad799x_chip_info_tbl[id->driver_data];
 
-	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st));
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
 	if (indio_dev == NULL)
 		return -ENOMEM;
 
@@ -807,7 +808,7 @@ static int ad799x_probe(struct i2c_client *client)
 
 	/* TODO: Add pdata options for filtering and bit delay */
 
-	st->reg = devm_regulator_get(&client->dev, "vcc");
+	st->reg = devm_regulator_get(dev, "vcc");
 	if (IS_ERR(st->reg))
 		return PTR_ERR(st->reg);
 	ret = regulator_enable(st->reg);
@@ -816,17 +817,17 @@ static int ad799x_probe(struct i2c_client *client)
 
 	/* check if an external reference is supplied */
 	if (chip_info->has_vref) {
-		st->vref = devm_regulator_get_optional(&client->dev, "vref");
+		st->vref = devm_regulator_get_optional(dev, "vref");
 		ret = PTR_ERR_OR_ZERO(st->vref);
 		if (ret) {
 			if (ret != -ENODEV)
 				goto error_disable_reg;
 			st->vref = NULL;
-			dev_info(&client->dev, "Using VCC reference voltage\n");
+			dev_info(dev, "Using VCC reference voltage\n");
 		}
 
 		if (st->vref) {
-			dev_info(&client->dev, "Using external reference voltage\n");
+			dev_info(dev, "Using external reference voltage\n");
 			extra_config |= AD7991_REF_SEL;
 			ret = regulator_enable(st->vref);
 			if (ret)
@@ -853,7 +854,7 @@ static int ad799x_probe(struct i2c_client *client)
 		goto error_disable_vref;
 
 	if (client->irq > 0) {
-		ret = devm_request_threaded_irq(&client->dev,
+		ret = devm_request_threaded_irq(dev,
 						client->irq,
 						NULL,
 						ad799x_event_handler,
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 3/5] iio: adc: ad799x: use a static buffer for scan data
  2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
  2026-04-03  8:06 ` [PATCH v7 1/5] iio: adc: ad799x: sort headers alphabetically Archit Anant
  2026-04-03  8:06 ` [PATCH v7 2/5] iio: adc: ad799x: use local device pointer in probe Archit Anant
@ 2026-04-03  8:06 ` Archit Anant
  2026-04-03  8:06 ` [PATCH v7 4/5] iio: adc: ad799x: cache regulator voltages during probe Archit Anant
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Archit Anant @ 2026-04-03  8:06 UTC (permalink / raw)
  To: jic23, dlechner
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Archit Anant

Currently, rx_buf is dynamically allocated using kmalloc() every time
ad799x_update_scan_mode() is called. This can lead to memory leaks if
the scan mask is updated multiple times.

Drop the dynamic allocation and replace it with a static buffer at the
end of the state structure using IIO_DECLARE_BUFFER_WITH_TS().
This eliminates the allocation overhead, prevents leaks, and removes
the need for manual kfree() on driver removal.

Signed-off-by: Archit Anant <architanant5@gmail.com>
---
 drivers/iio/adc/ad799x.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
index bf0575585a59..d8389b6e19b5 100644
--- a/drivers/iio/adc/ad799x.c
+++ b/drivers/iio/adc/ad799x.c
@@ -39,6 +39,7 @@
 #include <linux/iio/triggered_buffer.h>
 
 #define AD799X_CHANNEL_SHIFT			4
+#define AD799X_MAX_CHANNELS			8
 
 /*
  * AD7991, AD7995 and AD7999 defines
@@ -133,8 +134,8 @@ struct ad799x_state {
 	unsigned int			id;
 	u16				config;
 
-	u8				*rx_buf;
 	unsigned int			transfer_size;
+	IIO_DECLARE_BUFFER_WITH_TS(__be16, rx_buf, AD799X_MAX_CHANNELS);
 };
 
 static int ad799x_write_config(struct ad799x_state *st, u16 val)
@@ -217,7 +218,8 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
 	}
 
 	b_sent = i2c_smbus_read_i2c_block_data(st->client,
-			cmd, st->transfer_size, st->rx_buf);
+						cmd, st->transfer_size,
+						(u8 *)st->rx_buf);
 	if (b_sent < 0)
 		goto out;
 
@@ -234,11 +236,6 @@ static int ad799x_update_scan_mode(struct iio_dev *indio_dev,
 {
 	struct ad799x_state *st = iio_priv(indio_dev);
 
-	kfree(st->rx_buf);
-	st->rx_buf = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
-	if (!st->rx_buf)
-		return -ENOMEM;
-
 	st->transfer_size = bitmap_weight(scan_mask,
 					  iio_get_masklength(indio_dev)) * 2;
 
@@ -896,7 +893,6 @@ static void ad799x_remove(struct i2c_client *client)
 	if (st->vref)
 		regulator_disable(st->vref);
 	regulator_disable(st->reg);
-	kfree(st->rx_buf);
 }
 
 static int ad799x_suspend(struct device *dev)
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 4/5] iio: adc: ad799x: cache regulator voltages during probe
  2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
                   ` (2 preceding siblings ...)
  2026-04-03  8:06 ` [PATCH v7 3/5] iio: adc: ad799x: use a static buffer for scan data Archit Anant
@ 2026-04-03  8:06 ` Archit Anant
  2026-04-04 16:04   ` David Lechner
  2026-04-03  8:06 ` [PATCH v7 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove() Archit Anant
  2026-04-04 16:10 ` [PATCH v7 0/5] iio: adc: ad799x: modernize resource management David Lechner
  5 siblings, 1 reply; 9+ messages in thread
From: Archit Anant @ 2026-04-03  8:06 UTC (permalink / raw)
  To: jic23, dlechner
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Archit Anant

Since the reference voltage for this ADC is not expected to
change at runtime, determine the active reference voltage (either VREF
or VCC) during probe() and cache it in a single variable in the state
structure.

This improves the performance of ad799x_read_raw() and removes the
dependency on the regulator pointers during fast-path reads.

Suggested-by: Jonathan Cameron <jic23@kernel.org>
Suggested-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
 drivers/iio/adc/ad799x.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
index d8389b6e19b5..e37bb64edd2b 100644
--- a/drivers/iio/adc/ad799x.c
+++ b/drivers/iio/adc/ad799x.c
@@ -30,6 +30,7 @@
 #include <linux/slab.h>
 #include <linux/sysfs.h>
 #include <linux/types.h>
+#include <linux/units.h>
 
 #include <linux/iio/buffer.h>
 #include <linux/iio/events.h>
@@ -135,6 +136,9 @@ struct ad799x_state {
 	u16				config;
 
 	unsigned int			transfer_size;
+
+	int				vref_uV;
+
 	IIO_DECLARE_BUFFER_WITH_TS(__be16, rx_buf, AD799X_MAX_CHANNELS);
 };
 
@@ -303,14 +307,7 @@ static int ad799x_read_raw(struct iio_dev *indio_dev,
 			GENMASK(chan->scan_type.realbits - 1, 0);
 		return IIO_VAL_INT;
 	case IIO_CHAN_INFO_SCALE:
-		if (st->vref)
-			ret = regulator_get_voltage(st->vref);
-		else
-			ret = regulator_get_voltage(st->reg);
-
-		if (ret < 0)
-			return ret;
-		*val = ret / 1000;
+		*val = st->vref_uV / (MICRO / MILLI);
 		*val2 = chan->scan_type.realbits;
 		return IIO_VAL_FRACTIONAL_LOG2;
 	}
@@ -829,9 +826,20 @@ static int ad799x_probe(struct i2c_client *client)
 			ret = regulator_enable(st->vref);
 			if (ret)
 				goto error_disable_reg;
+			ret = regulator_get_voltage(st->vref);
+			if (ret < 0)
+				goto error_disable_vref;
+			st->vref_uV = ret;
 		}
 	}
 
+	if (!st->vref) {
+		ret = regulator_get_voltage(st->reg);
+		if (ret < 0)
+			goto error_disable_reg;
+		st->vref_uV = ret;
+	}
+
 	st->client = client;
 
 	indio_dev->name = id->name;
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove()
  2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
                   ` (3 preceding siblings ...)
  2026-04-03  8:06 ` [PATCH v7 4/5] iio: adc: ad799x: cache regulator voltages during probe Archit Anant
@ 2026-04-03  8:06 ` Archit Anant
  2026-04-04 16:09   ` David Lechner
  2026-04-04 16:10 ` [PATCH v7 0/5] iio: adc: ad799x: modernize resource management David Lechner
  5 siblings, 1 reply; 9+ messages in thread
From: Archit Anant @ 2026-04-03  8:06 UTC (permalink / raw)
  To: jic23, dlechner
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Archit Anant, Andy Shevchenko

Convert the driver's remaining manual resource management to use the
devm_ infrastructure, allowing for the complete removal of the
ad799x_remove() function and the simplification of the probe error paths.

Specifically:
- Initialize the mutex using devm_mutex_init() and move it to the top
  of probe() (before IRQ registration) to prevent a race condition where
  an interrupt could attempt to take an uninitialized lock.
- Use devm_add_action_or_reset() to ensure that the VCC and VREF
  regulators are disabled safely and in the correct order during driver
  teardown or probe failure.
- Refactor the optional VREF error handling path for better readability.
- Convert iio_triggered_buffer_setup() and iio_device_register() to
  their devm_ variants.

Because all resources are now managed by the devm core, the unwinding
order is guaranteed to follow the reverse order of allocation. All manual
error handling goto labels in ad799x_probe() have been removed.

Suggested-by: Jonathan Cameron <jic23@kernel.org>
Suggested-by: David Lechner <dlechner@baylibre.com>
Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
 drivers/iio/adc/ad799x.c | 69 ++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 41 deletions(-)

diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
index e37bb64edd2b..9170109d64ef 100644
--- a/drivers/iio/adc/ad799x.c
+++ b/drivers/iio/adc/ad799x.c
@@ -775,6 +775,11 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
 	},
 };
 
+static void ad799x_reg_disable(void *reg)
+{
+	regulator_disable(reg);
+}
+
 static int ad799x_probe(struct i2c_client *client)
 {
 	struct device *dev = &client->dev;
@@ -793,6 +798,9 @@ static int ad799x_probe(struct i2c_client *client)
 	st = iio_priv(indio_dev);
 	/* this is only used for device removal purposes */
 	i2c_set_clientdata(client, indio_dev);
+	ret = devm_mutex_init(dev, &st->lock);
+	if (ret)
+		return ret;
 
 	st->id = id->driver_data;
 	if (client->irq > 0 && chip_info->irq_config.info)
@@ -809,15 +817,19 @@ static int ad799x_probe(struct i2c_client *client)
 	if (ret)
 		return ret;
 
+	ret = devm_add_action_or_reset(dev, ad799x_reg_disable, st->reg);
+	if (ret)
+		return ret;
+
 	/* check if an external reference is supplied */
 	if (chip_info->has_vref) {
 		st->vref = devm_regulator_get_optional(dev, "vref");
 		ret = PTR_ERR_OR_ZERO(st->vref);
-		if (ret) {
-			if (ret != -ENODEV)
-				goto error_disable_reg;
+		if (ret == -ENODEV) {
 			st->vref = NULL;
 			dev_info(dev, "Using VCC reference voltage\n");
+		} else if (ret) {
+			return ret;
 		}
 
 		if (st->vref) {
@@ -825,10 +837,15 @@ 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 = devm_add_action_or_reset(dev, ad799x_reg_disable, st->vref);
+			if (ret)
+				return ret;
+
 			ret = regulator_get_voltage(st->vref);
 			if (ret < 0)
-				goto error_disable_vref;
+				return ret;
 			st->vref_uV = ret;
 		}
 	}
@@ -836,7 +853,7 @@ static int ad799x_probe(struct i2c_client *client)
 	if (!st->vref) {
 		ret = regulator_get_voltage(st->reg);
 		if (ret < 0)
-			goto error_disable_reg;
+			return ret;
 		st->vref_uV = ret;
 	}
 
@@ -851,12 +868,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(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(dev,
@@ -868,39 +885,10 @@ 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);
-	if (ret)
-		goto error_cleanup_ring;
-
-	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);
-	if (st->vref)
-		regulator_disable(st->vref);
-	regulator_disable(st->reg);
+	return devm_iio_device_register(dev, indio_dev);
 }
 
 static int ad799x_suspend(struct device *dev)
@@ -970,7 +958,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


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 4/5] iio: adc: ad799x: cache regulator voltages during probe
  2026-04-03  8:06 ` [PATCH v7 4/5] iio: adc: ad799x: cache regulator voltages during probe Archit Anant
@ 2026-04-04 16:04   ` David Lechner
  0 siblings, 0 replies; 9+ messages in thread
From: David Lechner @ 2026-04-04 16:04 UTC (permalink / raw)
  To: Archit Anant, jic23
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel

On 4/3/26 3:06 AM, Archit Anant wrote:
> Since the reference voltage for this ADC is not expected to
> change at runtime, determine the active reference voltage (either VREF
> or VCC) during probe() and cache it in a single variable in the state
> structure.
> 


> This improves the performance of ad799x_read_raw() and removes the
> dependency on the regulator pointers during fast-path reads.

To make this claim, it should be backed up by performance measurements.
I would drop it since I don't think it would actually make a measurable
difference and it is not in a hot path anyway.



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove()
  2026-04-03  8:06 ` [PATCH v7 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove() Archit Anant
@ 2026-04-04 16:09   ` David Lechner
  0 siblings, 0 replies; 9+ messages in thread
From: David Lechner @ 2026-04-04 16:09 UTC (permalink / raw)
  To: Archit Anant, jic23
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel,
	Andy Shevchenko

On 4/3/26 3:06 AM, Archit Anant wrote:
> Convert the driver's remaining manual resource management to use the
> devm_ infrastructure, allowing for the complete removal of the
> ad799x_remove() function and the simplification of the probe error paths.
> 
> Specifically:
> - Initialize the mutex using devm_mutex_init() and move it to the top
>   of probe() (before IRQ registration) to prevent a race condition where
>   an interrupt could attempt to take an uninitialized lock.
> - Use devm_add_action_or_reset() to ensure that the VCC and VREF
>   regulators are disabled safely and in the correct order during driver
>   teardown or probe failure.
> - Refactor the optional VREF error handling path for better readability.
> - Convert iio_triggered_buffer_setup() and iio_device_register() to
>   their devm_ variants.
> 
> Because all resources are now managed by the devm core, the unwinding
> order is guaranteed to follow the reverse order of allocation. All manual
> error handling goto labels in ad799x_probe() have been removed.
> 
> Suggested-by: Jonathan Cameron <jic23@kernel.org>
> Suggested-by: David Lechner <dlechner@baylibre.com>
> Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
> Signed-off-by: Archit Anant <architanant5@gmail.com>
> ---
>  drivers/iio/adc/ad799x.c | 69 ++++++++++++++++------------------------
>  1 file changed, 28 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c
> index e37bb64edd2b..9170109d64ef 100644
> --- a/drivers/iio/adc/ad799x.c
> +++ b/drivers/iio/adc/ad799x.c
> @@ -775,6 +775,11 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
>  	},
>  };
>  
> +static void ad799x_reg_disable(void *reg)
> +{
> +	regulator_disable(reg);
> +}
> +
>  static int ad799x_probe(struct i2c_client *client)
>  {
>  	struct device *dev = &client->dev;
> @@ -793,6 +798,9 @@ static int ad799x_probe(struct i2c_client *client)
>  	st = iio_priv(indio_dev);
>  	/* this is only used for device removal purposes */
>  	i2c_set_clientdata(client, indio_dev);

Insert blank line here.

> +	ret = devm_mutex_init(dev, &st->lock);
> +	if (ret)
> +		return ret;
>  

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 0/5] iio: adc: ad799x: modernize resource management
  2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
                   ` (4 preceding siblings ...)
  2026-04-03  8:06 ` [PATCH v7 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove() Archit Anant
@ 2026-04-04 16:10 ` David Lechner
  5 siblings, 0 replies; 9+ messages in thread
From: David Lechner @ 2026-04-04 16:10 UTC (permalink / raw)
  To: Archit Anant, jic23
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel

On 4/3/26 3:06 AM, Archit Anant wrote:
> This series modernizes the ad799x driver by converting resource 
> management to the devm_ infrastructure. This results in cleaner 
> probe error handling, the removal of the ad799x_remove() function, 
> and improved overall code maintainability and safety.
> 


Reviewed-by: David Lechner <dlechner@baylibre.com>


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-04-04 16:10 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-03  8:06 [PATCH v7 0/5] iio: adc: ad799x: modernize resource management Archit Anant
2026-04-03  8:06 ` [PATCH v7 1/5] iio: adc: ad799x: sort headers alphabetically Archit Anant
2026-04-03  8:06 ` [PATCH v7 2/5] iio: adc: ad799x: use local device pointer in probe Archit Anant
2026-04-03  8:06 ` [PATCH v7 3/5] iio: adc: ad799x: use a static buffer for scan data Archit Anant
2026-04-03  8:06 ` [PATCH v7 4/5] iio: adc: ad799x: cache regulator voltages during probe Archit Anant
2026-04-04 16:04   ` David Lechner
2026-04-03  8:06 ` [PATCH v7 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove() Archit Anant
2026-04-04 16:09   ` David Lechner
2026-04-04 16:10 ` [PATCH v7 0/5] iio: adc: ad799x: modernize resource management David Lechner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox