* [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver
@ 2026-08-27 17:20 Archit Anant
2026-08-27 17:20 ` [PATCH v4 1/8] iio: adc: ti-ads1015: use DEFINE_RUNTIME_DEV_PM_OPS() Archit Anant
` (7 more replies)
0 siblings, 8 replies; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
This series modernizes the ti-ads1015 driver by updating its runtime PM
handling, error handling, resource management, and register bitfield
operations.
This series builds on the series [1] and:
- replaces SET_RUNTIME_PM_OPS() with DEFINE_RUNTIME_DEV_PM_OPS().
- sorts the driver headers.
- uses a local device pointer in probe.
- converts suitable error paths to dev_err_probe().
- drops unneeded < 0 error checks.
- converts mutex and runtime PM handling to managed resources.
- replaces custom shift macros with FIELD_PREP()/FIELD_GET().
- removes the redundant ads1015_set_conv_mode() helper.
[1] https://lore.kernel.org/all/20260529183708.17819-1-sozdayvek@gmail.com/
---
v4:
- Rebased the series as requested by Jonathan Cameron.
- Use devm_pm_runtime_set_active_enabled() for runtime PM setup.
- Reworked the register bitfield changes and inlined
ads1015_set_conv_mode() following review feedback.
- Incorporated review feedback from Jonathan Cameron and Andy Shevchenko.
v3: https://lore.kernel.org/linux-iio/20260812164433.23011-1-architanant5@gmail.com/
Archit Anant (8):
iio: adc: ti-ads1015: use DEFINE_RUNTIME_DEV_PM_OPS()
iio: adc: ti-ads1015: sort headers alphabetically
iio: adc: ti-ads1015: use local device pointer in probe
iio: adc: ti-ads1015: use dev_err_probe() for error handling
iio: adc: ti-ads1015: drop unneeded < 0 error checks
iio: adc: ti-ads1015: Convert to managed resources
iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET
iio: adc: ti-ads1015: inline ads1015_set_conv_mode()
drivers/iio/adc/ti-ads1015.c | 153 ++++++++++++++++-------------------
1 file changed, 69 insertions(+), 84 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 1/8] iio: adc: ti-ads1015: use DEFINE_RUNTIME_DEV_PM_OPS()
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 17:20 ` [PATCH v4 2/8] iio: adc: ti-ads1015: sort headers alphabetically Archit Anant
` (6 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
Replace the deprecated SET_RUNTIME_PM_OPS() with the modern
DEFINE_RUNTIME_DEV_PM_OPS() macro. This allows for the removal of the
macro automatically handles dropping unused functions when PM is
disabled.
Update the driver struct to use pm_ptr() to avoid unused variable
warnings.
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 0fbfa4e499aa..93a165c5416a 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -1059,7 +1059,6 @@ static int ads1015_probe(struct i2c_client *client)
return devm_iio_device_register(&client->dev, indio_dev);
}
-#ifdef CONFIG_PM
static int ads1015_runtime_suspend(struct device *dev)
{
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
@@ -1080,12 +1079,11 @@ static int ads1015_runtime_resume(struct device *dev)
return ret;
}
-#endif
-static const struct dev_pm_ops ads1015_pm_ops = {
- SET_RUNTIME_PM_OPS(ads1015_runtime_suspend,
- ads1015_runtime_resume, NULL)
-};
+static DEFINE_RUNTIME_DEV_PM_OPS(ads1015_pm_ops,
+ ads1015_runtime_suspend,
+ ads1015_runtime_resume,
+ NULL);
static const struct ads1015_chip_data ads1015_data = {
.channels = ads1015_channels,
@@ -1140,7 +1138,7 @@ static struct i2c_driver ads1015_driver = {
.driver = {
.name = ADS1015_DRV_NAME,
.of_match_table = ads1015_of_match,
- .pm = &ads1015_pm_ops,
+ .pm = pm_ptr(&ads1015_pm_ops),
},
.probe = ads1015_probe,
.id_table = ads1015_id,
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 2/8] iio: adc: ti-ads1015: sort headers alphabetically
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
2026-08-27 17:20 ` [PATCH v4 1/8] iio: adc: ti-ads1015: use DEFINE_RUNTIME_DEV_PM_OPS() Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 17:20 ` [PATCH v4 3/8] iio: adc: ti-ads1015: use local device pointer in probe Archit Anant
` (5 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
Reorder include headers alphabetically to comply with the preferred
coding style and improve maintainability.
No functional changes.
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 93a165c5416a..ef03b74bda3e 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -11,24 +11,24 @@
* * 0x4B - ADDR connected to SCL
*/
-#include <linux/module.h>
#include <linux/cleanup.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/irq.h>
-#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/pm_runtime.h>
#include <linux/property.h>
#include <linux/regmap.h>
-#include <linux/pm_runtime.h>
-#include <linux/mutex.h>
-#include <linux/delay.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/events.h>
#include <linux/iio/iio.h>
-#include <linux/iio/types.h>
#include <linux/iio/sysfs.h>
-#include <linux/iio/events.h>
-#include <linux/iio/buffer.h>
-#include <linux/iio/triggered_buffer.h>
#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/types.h>
#define ADS1015_DRV_NAME "ads1015"
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 3/8] iio: adc: ti-ads1015: use local device pointer in probe
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
2026-08-27 17:20 ` [PATCH v4 1/8] iio: adc: ti-ads1015: use DEFINE_RUNTIME_DEV_PM_OPS() Archit Anant
2026-08-27 17:20 ` [PATCH v4 2/8] iio: adc: ti-ads1015: sort headers alphabetically Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 18:55 ` Andy Shevchenko
2026-08-27 17:20 ` [PATCH v4 4/8] iio: adc: ti-ads1015: use dev_err_probe() for error handling Archit Anant
` (4 subsequent siblings)
7 siblings, 1 reply; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
Introduce a local device pointer 'dev' in ads1015_probe to
avoid accessing &client->dev repeatedly.
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index ef03b74bda3e..9c1d36db15e8 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -944,6 +944,7 @@ static void ads1015_power_down(void *p)
static int ads1015_probe(struct i2c_client *client)
{
const struct ads1015_chip_data *chip;
+ struct device *dev = &client->dev;
struct iio_dev *indio_dev;
struct ads1015_data *data;
int ret;
@@ -951,9 +952,9 @@ static int ads1015_probe(struct i2c_client *client)
chip = i2c_get_match_data(client);
if (!chip)
- return dev_err_probe(&client->dev, -EINVAL, "Unknown chip\n");
+ return dev_err_probe(dev, -EINVAL, "Unknown chip\n");
- indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
if (!indio_dev)
return -ENOMEM;
@@ -993,7 +994,7 @@ static int ads1015_probe(struct i2c_client *client)
return PTR_ERR(data->regmap);
}
- ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL,
+ ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
ads1015_trigger_handler,
&ads1015_buffer_setup_ops);
if (ret < 0) {
@@ -1029,7 +1030,7 @@ static int ads1015_probe(struct i2c_client *client)
if (ret)
return ret;
- ret = devm_request_threaded_irq(&client->dev, client->irq,
+ ret = devm_request_threaded_irq(dev, client->irq,
NULL, ads1015_event_handler,
irq_trig | IRQF_ONESHOT,
client->name, indio_dev);
@@ -1041,22 +1042,22 @@ static int ads1015_probe(struct i2c_client *client)
if (ret)
return ret;
- ret = devm_add_action_or_reset(&client->dev, ads1015_power_down, data);
+ ret = devm_add_action_or_reset(dev, ads1015_power_down, data);
if (ret)
return ret;
data->conv_invalid = true;
- ret = pm_runtime_set_active(&client->dev);
+ ret = pm_runtime_set_active(dev);
if (ret)
return ret;
- pm_runtime_set_autosuspend_delay(&client->dev, ADS1015_SLEEP_DELAY_MS);
- pm_runtime_use_autosuspend(&client->dev);
- ret = devm_pm_runtime_enable(&client->dev);
+ pm_runtime_set_autosuspend_delay(dev, ADS1015_SLEEP_DELAY_MS);
+ pm_runtime_use_autosuspend(dev);
+ ret = devm_pm_runtime_enable(dev);
if (ret)
return ret;
- return devm_iio_device_register(&client->dev, indio_dev);
+ return devm_iio_device_register(dev, indio_dev);
}
static int ads1015_runtime_suspend(struct device *dev)
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 4/8] iio: adc: ti-ads1015: use dev_err_probe() for error handling
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
` (2 preceding siblings ...)
2026-08-27 17:20 ` [PATCH v4 3/8] iio: adc: ti-ads1015: use local device pointer in probe Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 17:20 ` [PATCH v4 5/8] iio: adc: ti-ads1015: drop unneeded < 0 error checks Archit Anant
` (3 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
Simplify the error handling paths in ads1015_probe() and
ads1015_client_get_channels_config() by converting dev_err()
calls that are immediately followed by a return statement
over to the modern dev_err_probe() helper.
Note: This patch takes advantage of the previously introduced
local 'dev' pointer when converting the legacy
dev_err(&client->dev, ...) calls, avoiding unnecessary
code churn.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 28 ++++++++++++----------------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 9c1d36db15e8..0d1006041819 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -883,18 +883,16 @@ static int ads1015_client_get_channels_config(struct i2c_client *client)
if (!fwnode_property_read_u32(node, "ti,gain", &pval)) {
pga = pval;
- if (pga > 5) {
- dev_err(dev, "invalid gain on %pfw\n", node);
- return -EINVAL;
- }
+ if (pga > 5)
+ return dev_err_probe(dev, -EINVAL,
+ "invalid gain on %pfw\n", node);
}
if (!fwnode_property_read_u32(node, "ti,datarate", &pval)) {
data_rate = pval;
- if (data_rate > 7) {
- dev_err(dev, "invalid data_rate on %pfw\n", node);
- return -EINVAL;
- }
+ if (data_rate > 7)
+ return dev_err_probe(dev, -EINVAL,
+ "invalid data_rate on %pfw\n", node);
}
data->channel_data[channel].pga = pga;
@@ -989,18 +987,16 @@ static int ads1015_probe(struct i2c_client *client)
data->regmap = devm_regmap_init_i2c(client, chip->has_comparator ?
&ads1015_regmap_config :
&tla2024_regmap_config);
- if (IS_ERR(data->regmap)) {
- dev_err(&client->dev, "Failed to allocate register map\n");
- return PTR_ERR(data->regmap);
- }
+ if (IS_ERR(data->regmap))
+ return dev_err_probe(dev, PTR_ERR(data->regmap),
+ "Failed to allocate register map\n");
ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
ads1015_trigger_handler,
&ads1015_buffer_setup_ops);
- if (ret < 0) {
- dev_err(&client->dev, "iio triggered buffer setup failed\n");
- return ret;
- }
+ if (ret < 0)
+ return dev_err_probe(dev, ret,
+ "iio triggered buffer setup failed\n");
if (client->irq && chip->has_comparator) {
unsigned long irq_trig = irq_get_trigger_type(client->irq);
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 5/8] iio: adc: ti-ads1015: drop unneeded < 0 error checks
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
` (3 preceding siblings ...)
2026-08-27 17:20 ` [PATCH v4 4/8] iio: adc: ti-ads1015: use dev_err_probe() for error handling Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 17:20 ` [PATCH v4 6/8] iio: adc: ti-ads1015: Convert to managed resources Archit Anant
` (2 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant, Andy Shevchenko
Several functions in the driver only return 0 on success
or a negative error code on failure.
Change the error checking to align with standard kernel
coding style.
Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 0d1006041819..ba4a01850531 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -539,7 +539,7 @@ static int __ads1015_read_info_raw(struct ads1015_data *data,
return -EBUSY;
ret = ads1015_set_power_state(data, true);
- if (ret < 0)
+ if (ret)
return ret;
ret = ads1015_get_adc_result(data, chan->address, val);
@@ -727,7 +727,7 @@ static int ads1015_enable_event_config(struct ads1015_data *data,
return ret;
ret = ads1015_set_power_state(data, true);
- if (ret < 0)
+ if (ret)
return ret;
ads1015_event_channel_enable(data, chan->address, comp_mode);
@@ -994,7 +994,7 @@ static int ads1015_probe(struct i2c_client *client)
ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
ads1015_trigger_handler,
&ads1015_buffer_setup_ops);
- if (ret < 0)
+ if (ret)
return dev_err_probe(dev, ret,
"iio triggered buffer setup failed\n");
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 6/8] iio: adc: ti-ads1015: Convert to managed resources
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
` (4 preceding siblings ...)
2026-08-27 17:20 ` [PATCH v4 5/8] iio: adc: ti-ads1015: drop unneeded < 0 error checks Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 19:28 ` Andy Shevchenko
2026-08-27 17:20 ` [PATCH v4 7/8] iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET Archit Anant
2026-08-27 17:21 ` [PATCH v4 8/8] iio: adc: ti-ads1015: inline ads1015_set_conv_mode() Archit Anant
7 siblings, 1 reply; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
Use managed resource helpers for the mutex and runtime PM setup.
Replace mutex_init() with devm_mutex_init() and replace the separate
pm_runtime_set_active() and devm_pm_runtime_enable() calls with
devm_pm_runtime_set_active_enabled().
This simplifies resource management and ensures resources are
automatically cleaned up on probe failure and device removal.
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index ba4a01850531..a6dd85debc0e 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -959,7 +959,9 @@ static int ads1015_probe(struct i2c_client *client)
data = iio_priv(indio_dev);
i2c_set_clientdata(client, indio_dev);
- mutex_init(&data->lock);
+ ret = devm_mutex_init(dev, &data->lock);
+ if (ret)
+ return ret;
indio_dev->name = ADS1015_DRV_NAME;
indio_dev->modes = INDIO_DIRECT_MODE;
@@ -1044,12 +1046,9 @@ static int ads1015_probe(struct i2c_client *client)
data->conv_invalid = true;
- ret = pm_runtime_set_active(dev);
- if (ret)
- return ret;
pm_runtime_set_autosuspend_delay(dev, ADS1015_SLEEP_DELAY_MS);
pm_runtime_use_autosuspend(dev);
- ret = devm_pm_runtime_enable(dev);
+ ret = devm_pm_runtime_set_active_enabled(dev);
if (ret)
return ret;
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 7/8] iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
` (5 preceding siblings ...)
2026-08-27 17:20 ` [PATCH v4 6/8] iio: adc: ti-ads1015: Convert to managed resources Archit Anant
@ 2026-08-27 17:20 ` Archit Anant
2026-08-27 19:32 ` Andy Shevchenko
2026-08-27 17:21 ` [PATCH v4 8/8] iio: adc: ti-ads1015: inline ads1015_set_conv_mode() Archit Anant
7 siblings, 1 reply; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:20 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
The driver currently uses custom _SHIFT macros and manual bitwise
operations to read and write to the configuration register.
Modernize the bitwise logic by replacing all manual shifts with the
standard FIELD_PREP() and FIELD_GET() macros from <linux/bitfield.h>.
This improves readability and prevents potential bitwise errors.
Remove the now-unused _SHIFT macros from the top of the file.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 40 +++++++++++++++---------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index a6dd85debc0e..d675f82c0bd5 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -11,6 +11,7 @@
* * 0x4B - ADDR connected to SCL
*/
+#include <linux/bitfield.h>
#include <linux/cleanup.h>
#include <linux/delay.h>
#include <linux/i2c.h>
@@ -39,14 +40,7 @@
#define ADS1015_LO_THRESH_REG 0x02
#define ADS1015_HI_THRESH_REG 0x03
-#define ADS1015_CFG_COMP_QUE_SHIFT 0
-#define ADS1015_CFG_COMP_LAT_SHIFT 2
-#define ADS1015_CFG_COMP_POL_SHIFT 3
-#define ADS1015_CFG_COMP_MODE_SHIFT 4
-#define ADS1015_CFG_DR_SHIFT 5
#define ADS1015_CFG_MOD_SHIFT 8
-#define ADS1015_CFG_PGA_SHIFT 9
-#define ADS1015_CFG_MUX_SHIFT 12
#define ADS1015_CFG_COMP_QUE_MASK GENMASK(1, 0)
#define ADS1015_CFG_COMP_LAT_MASK BIT(2)
@@ -408,15 +402,15 @@ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
dr = data->channel_data[chan].data_rate;
mask = ADS1015_CFG_MUX_MASK | ADS1015_CFG_PGA_MASK |
ADS1015_CFG_DR_MASK;
- cfg = chan << ADS1015_CFG_MUX_SHIFT | pga << ADS1015_CFG_PGA_SHIFT |
- dr << ADS1015_CFG_DR_SHIFT;
+ cfg = FIELD_PREP(ADS1015_CFG_MUX_MASK, chan) | FIELD_PREP(ADS1015_CFG_PGA_MASK, pga) |
+ FIELD_PREP(ADS1015_CFG_DR_MASK, dr);
if (ads1015_event_channel_enabled(data)) {
mask |= ADS1015_CFG_COMP_QUE_MASK | ADS1015_CFG_COMP_MODE_MASK;
- cfg |= data->thresh_data[chan].comp_queue <<
- ADS1015_CFG_COMP_QUE_SHIFT |
- data->comp_mode <<
- ADS1015_CFG_COMP_MODE_SHIFT;
+ cfg |= FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK,
+ data->thresh_data[chan].comp_queue) |
+ FIELD_PREP(ADS1015_CFG_COMP_MODE_MASK,
+ data->comp_mode);
}
cfg = (old & ~mask) | (cfg & mask);
@@ -427,7 +421,7 @@ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
data->conv_invalid = true;
}
if (data->conv_invalid) {
- dr_old = (old & ADS1015_CFG_DR_MASK) >> ADS1015_CFG_DR_SHIFT;
+ dr_old = FIELD_GET(ADS1015_CFG_DR_MASK, old);
conv_time = DIV_ROUND_UP(USEC_PER_SEC, data_rate[dr_old]);
conv_time += DIV_ROUND_UP(USEC_PER_SEC, data_rate[dr]);
conv_time += conv_time / 10; /* 10% internal clock inaccuracy */
@@ -744,6 +738,7 @@ static int ads1015_enable_event_config(struct ads1015_data *data,
static int ads1015_disable_event_config(struct ads1015_data *data,
const struct iio_chan_spec *chan, int comp_mode)
{
+ unsigned int val = FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK, ADS1015_CFG_COMP_DISABLE);
int ret;
if (!ads1015_event_channel_enabled(data))
@@ -756,10 +751,7 @@ static int ads1015_disable_event_config(struct ads1015_data *data,
comp_mode == ADS1015_CFG_COMP_MODE_WINDOW)
return 0;
- ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG,
- ADS1015_CFG_COMP_QUE_MASK,
- ADS1015_CFG_COMP_DISABLE <<
- ADS1015_CFG_COMP_QUE_SHIFT);
+ ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, ADS1015_CFG_COMP_QUE_MASK, val);
if (ret)
return ret;
@@ -1005,19 +997,19 @@ static int ads1015_probe(struct i2c_client *client)
unsigned int cfg_comp_mask = ADS1015_CFG_COMP_QUE_MASK |
ADS1015_CFG_COMP_LAT_MASK | ADS1015_CFG_COMP_POL_MASK;
unsigned int cfg_comp =
- ADS1015_CFG_COMP_DISABLE << ADS1015_CFG_COMP_QUE_SHIFT |
- 1 << ADS1015_CFG_COMP_LAT_SHIFT;
+ FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK, ADS1015_CFG_COMP_DISABLE) |
+ FIELD_PREP(ADS1015_CFG_COMP_LAT_MASK, 1);
switch (irq_trig) {
case IRQF_TRIGGER_FALLING:
case IRQF_TRIGGER_LOW:
- cfg_comp |= ADS1015_CFG_COMP_POL_LOW <<
- ADS1015_CFG_COMP_POL_SHIFT;
+ cfg_comp |= FIELD_PREP(ADS1015_CFG_COMP_POL_MASK,
+ ADS1015_CFG_COMP_POL_LOW);
break;
case IRQF_TRIGGER_HIGH:
case IRQF_TRIGGER_RISING:
- cfg_comp |= ADS1015_CFG_COMP_POL_HIGH <<
- ADS1015_CFG_COMP_POL_SHIFT;
+ cfg_comp |= FIELD_PREP(ADS1015_CFG_COMP_POL_MASK,
+ ADS1015_CFG_COMP_POL_HIGH);
break;
default:
return -EINVAL;
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 8/8] iio: adc: ti-ads1015: inline ads1015_set_conv_mode()
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
` (6 preceding siblings ...)
2026-08-27 17:20 ` [PATCH v4 7/8] iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET Archit Anant
@ 2026-08-27 17:21 ` Archit Anant
2026-08-27 19:34 ` Andy Shevchenko
7 siblings, 1 reply; 13+ messages in thread
From: Archit Anant @ 2026-08-27 17:21 UTC (permalink / raw)
To: jic23
Cc: dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio, linux-kernel,
Archit Anant
The ads1015_set_conv_mode() helper function is a single-line wrapper
around regmap_update_bits().
With the transition to the FIELD_PREP() macro, the raw register updates
are now self-documenting and easy to read. Remove the wrapper function
and inline the regmap calls directly at the call sites.
This also allows for the removal of the final custom shift macro,
ADS1015_CFG_MOD_SHIFT.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Archit Anant <architanant5@gmail.com>
---
drivers/iio/adc/ti-ads1015.c | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index d675f82c0bd5..2072b9dd43e8 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -40,8 +40,6 @@
#define ADS1015_LO_THRESH_REG 0x02
#define ADS1015_HI_THRESH_REG 0x03
-#define ADS1015_CFG_MOD_SHIFT 8
-
#define ADS1015_CFG_COMP_QUE_MASK GENMASK(1, 0)
#define ADS1015_CFG_COMP_LAT_MASK BIT(2)
#define ADS1015_CFG_COMP_POL_MASK BIT(3)
@@ -739,6 +737,7 @@ static int ads1015_disable_event_config(struct ads1015_data *data,
const struct iio_chan_spec *chan, int comp_mode)
{
unsigned int val = FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK, ADS1015_CFG_COMP_DISABLE);
+ struct regmap *map = data->regmap;
int ret;
if (!ads1015_event_channel_enabled(data))
@@ -751,7 +750,7 @@ static int ads1015_disable_event_config(struct ads1015_data *data,
comp_mode == ADS1015_CFG_COMP_MODE_WINDOW)
return 0;
- ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, ADS1015_CFG_COMP_QUE_MASK, val);
+ ret = regmap_update_bits(map, ADS1015_CFG_REG, ADS1015_CFG_COMP_QUE_MASK, val);
if (ret)
return ret;
@@ -913,19 +912,14 @@ static void ads1015_get_channels_config(struct i2c_client *client)
}
}
-static int ads1015_set_conv_mode(struct ads1015_data *data, int mode)
-{
- return regmap_update_bits(data->regmap, ADS1015_CFG_REG,
- ADS1015_CFG_MOD_MASK,
- mode << ADS1015_CFG_MOD_SHIFT);
-}
-
static void ads1015_power_down(void *p)
{
+ unsigned int val = FIELD_PREP(ADS1015_CFG_MOD_MASK, ADS1015_SINGLESHOT);
struct ads1015_data *data = p;
+ struct regmap *map = data->regmap;
int ret;
- ret = ads1015_set_conv_mode(data, ADS1015_SINGLESHOT);
+ ret = regmap_update_bits(map, ADS1015_CFG_REG, ADS1015_CFG_MOD_MASK, val);
if (ret)
dev_warn(regmap_get_device(data->regmap),
"Failed to power down (%pe)\n", ERR_PTR(ret));
@@ -933,6 +927,7 @@ static void ads1015_power_down(void *p)
static int ads1015_probe(struct i2c_client *client)
{
+ unsigned int cfg_mode = FIELD_PREP(ADS1015_CFG_MOD_MASK, ADS1015_CONTINUOUS);
const struct ads1015_chip_data *chip;
struct device *dev = &client->dev;
struct iio_dev *indio_dev;
@@ -1028,7 +1023,7 @@ static int ads1015_probe(struct i2c_client *client)
return ret;
}
- ret = ads1015_set_conv_mode(data, ADS1015_CONTINUOUS);
+ ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, ADS1015_CFG_MOD_MASK, cfg_mode);
if (ret)
return ret;
@@ -1049,19 +1044,23 @@ static int ads1015_probe(struct i2c_client *client)
static int ads1015_runtime_suspend(struct device *dev)
{
+ unsigned int val = FIELD_PREP(ADS1015_CFG_MOD_MASK, ADS1015_SINGLESHOT);
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
struct ads1015_data *data = iio_priv(indio_dev);
+ struct regmap *map = data->regmap;
- return ads1015_set_conv_mode(data, ADS1015_SINGLESHOT);
+ return regmap_update_bits(map, ADS1015_CFG_REG, ADS1015_CFG_MOD_MASK, val);
}
static int ads1015_runtime_resume(struct device *dev)
{
+ unsigned int val = FIELD_PREP(ADS1015_CFG_MOD_MASK, ADS1015_CONTINUOUS);
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
struct ads1015_data *data = iio_priv(indio_dev);
+ struct regmap *map = data->regmap;
int ret;
- ret = ads1015_set_conv_mode(data, ADS1015_CONTINUOUS);
+ ret = regmap_update_bits(map, ADS1015_CFG_REG, ADS1015_CFG_MOD_MASK, val);
if (!ret)
data->conv_invalid = true;
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/8] iio: adc: ti-ads1015: use local device pointer in probe
2026-08-27 17:20 ` [PATCH v4 3/8] iio: adc: ti-ads1015: use local device pointer in probe Archit Anant
@ 2026-08-27 18:55 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 18:55 UTC (permalink / raw)
To: Archit Anant
Cc: jic23, dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio,
linux-kernel
On Thu, Aug 27, 2026 at 10:50:55PM +0530, Archit Anant wrote:
> Introduce a local device pointer 'dev' in ads1015_probe to
ads1015_probe()
> avoid accessing &client->dev repeatedly.
...
> chip = i2c_get_match_data(client);
> if (!chip)
> - return dev_err_probe(&client->dev, -EINVAL, "Unknown chip\n");
> + return dev_err_probe(dev, -EINVAL, "Unknown chip\n");
Please, add a patch that converts EINVAL to ENODATA here.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 6/8] iio: adc: ti-ads1015: Convert to managed resources
2026-08-27 17:20 ` [PATCH v4 6/8] iio: adc: ti-ads1015: Convert to managed resources Archit Anant
@ 2026-08-27 19:28 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 19:28 UTC (permalink / raw)
To: Archit Anant
Cc: jic23, dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio,
linux-kernel
On Thu, Aug 27, 2026 at 10:50:58PM +0530, Archit Anant wrote:
> Use managed resource helpers for the mutex and runtime PM setup.
>
> Replace mutex_init() with devm_mutex_init() and replace the separate
> pm_runtime_set_active() and devm_pm_runtime_enable() calls with
> devm_pm_runtime_set_active_enabled().
>
> This simplifies resource management and ensures resources are
> automatically cleaned up on probe failure and device removal.
...
> data = iio_priv(indio_dev);
> i2c_set_clientdata(client, indio_dev);
>
> - mutex_init(&data->lock);
> + ret = devm_mutex_init(dev, &data->lock);
> + if (ret)
> + return ret;
This part is good and maybe introduced in a separate commit (depends on the
resolution for the below).
...
> - ret = pm_runtime_set_active(dev);
> - if (ret)
> - return ret;
> pm_runtime_set_autosuspend_delay(dev, ADS1015_SLEEP_DELAY_MS);
> pm_runtime_use_autosuspend(dev);
> - ret = devm_pm_runtime_enable(dev);
> + ret = devm_pm_runtime_set_active_enabled(dev);
> if (ret)
> return ret;
This should be done with care. There were some changes lately that actually
moved from devm_*() back to regular calls due to some races in runtime PM.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 7/8] iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET
2026-08-27 17:20 ` [PATCH v4 7/8] iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET Archit Anant
@ 2026-08-27 19:32 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 19:32 UTC (permalink / raw)
To: Archit Anant
Cc: jic23, dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio,
linux-kernel
On Thu, Aug 27, 2026 at 10:50:59PM +0530, Archit Anant wrote:
> The driver currently uses custom _SHIFT macros and manual bitwise
> operations to read and write to the configuration register.
>
> Modernize the bitwise logic by replacing all manual shifts with the
> standard FIELD_PREP() and FIELD_GET() macros from <linux/bitfield.h>.
> This improves readability and prevents potential bitwise errors.
>
> Remove the now-unused _SHIFT macros from the top of the file.
...
> + cfg = FIELD_PREP(ADS1015_CFG_MUX_MASK, chan) | FIELD_PREP(ADS1015_CFG_PGA_MASK, pga) |
> + FIELD_PREP(ADS1015_CFG_DR_MASK, dr);
Indentation is broken.
...
> + cfg |= FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK,
> + data->thresh_data[chan].comp_queue) |
> + FIELD_PREP(ADS1015_CFG_COMP_MODE_MASK,
> + data->comp_mode);
Same issue here.
...
> static int ads1015_disable_event_config(struct ads1015_data *data,
> const struct iio_chan_spec *chan, int comp_mode)
> {
struct regmap *map = data->regmap;
> + unsigned int val = FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK, ADS1015_CFG_COMP_DISABLE);
Split the assignment.
> int ret;
...
> - ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG,
> - ADS1015_CFG_COMP_QUE_MASK,
> - ADS1015_CFG_COMP_DISABLE <<
> - ADS1015_CFG_COMP_QUE_SHIFT);
> + ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, ADS1015_CFG_COMP_QUE_MASK, val);
> if (ret)
> return ret;
val = FIELD_PREP(ADS1015_CFG_COMP_QUE_MASK, ADS1015_CFG_COMP_DISABLE);
ret = regmap_update_bits(map, ADS1015_CFG_REG, ADS1015_CFG_COMP_QUE_MASK, val);
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 8/8] iio: adc: ti-ads1015: inline ads1015_set_conv_mode()
2026-08-27 17:21 ` [PATCH v4 8/8] iio: adc: ti-ads1015: inline ads1015_set_conv_mode() Archit Anant
@ 2026-08-27 19:34 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 19:34 UTC (permalink / raw)
To: Archit Anant
Cc: jic23, dlechner, andy, nuno.sa, u.kleine-koenig, linux-iio,
linux-kernel
On Thu, Aug 27, 2026 at 10:51:00PM +0530, Archit Anant wrote:
> The ads1015_set_conv_mode() helper function is a single-line wrapper
> around regmap_update_bits().
>
> With the transition to the FIELD_PREP() macro, the raw register updates
> are now self-documenting and easy to read. Remove the wrapper function
> and inline the regmap calls directly at the call sites.
>
> This also allows for the removal of the final custom shift macro,
> ADS1015_CFG_MOD_SHIFT.
Ah, this patch should be done before previous one, so that one will use 'map'.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-08-27 19:34 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-27 17:20 [PATCH v4 0/8] iio: adc: ti-ads1015: modernize driver Archit Anant
2026-08-27 17:20 ` [PATCH v4 1/8] iio: adc: ti-ads1015: use DEFINE_RUNTIME_DEV_PM_OPS() Archit Anant
2026-08-27 17:20 ` [PATCH v4 2/8] iio: adc: ti-ads1015: sort headers alphabetically Archit Anant
2026-08-27 17:20 ` [PATCH v4 3/8] iio: adc: ti-ads1015: use local device pointer in probe Archit Anant
2026-08-27 18:55 ` Andy Shevchenko
2026-08-27 17:20 ` [PATCH v4 4/8] iio: adc: ti-ads1015: use dev_err_probe() for error handling Archit Anant
2026-08-27 17:20 ` [PATCH v4 5/8] iio: adc: ti-ads1015: drop unneeded < 0 error checks Archit Anant
2026-08-27 17:20 ` [PATCH v4 6/8] iio: adc: ti-ads1015: Convert to managed resources Archit Anant
2026-08-27 19:28 ` Andy Shevchenko
2026-08-27 17:20 ` [PATCH v4 7/8] iio: adc: ti-ads1015: replace custom shift macros with FIELD_PREP/GET Archit Anant
2026-08-27 19:32 ` Andy Shevchenko
2026-08-27 17:21 ` [PATCH v4 8/8] iio: adc: ti-ads1015: inline ads1015_set_conv_mode() Archit Anant
2026-08-27 19:34 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox