[PATCH v6 06/11] iio: adc: ti-ads1015: Remove ads1015_set_power_state()
From: Archit Anant
Date: Mon Nov 09 2026 - 12:15:16 EST
Remove the unnecessary ads1015_set_power_state() helper and
use runtime PM helpers directly at the call sites.
Use PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND() to manage the
runtime PM reference in __ads1015_read_info_raw(), ensuring
it is automatically released on function exit, including
error paths.
For event configuration and buffer operations, retain
explicit reference management as the runtime PM reference
must remain held beyond the lifetime of the respective
function.
Mark the device as last busy before putting it into
autosuspend.
Suggested-by: Jonathan Cameron <jic23@xxxxxxxxxx>
Signed-off-by: Archit Anant <architanant5@xxxxxxxxx>
---
drivers/iio/adc/ti-ads1015.c | 59 +++++++++++++++---------------------
1 file changed, 24 insertions(+), 35 deletions(-)
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 9fd07ee21ede8..2e6bf45871340 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -366,30 +366,6 @@ static const struct iio_chan_spec tla2024_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP),
};
-
-#ifdef CONFIG_PM
-static int ads1015_set_power_state(struct ads1015_data *data, bool on)
-{
- int ret;
- struct device *dev = regmap_get_device(data->regmap);
-
- if (on)
- ret = pm_runtime_resume_and_get(dev);
- else
- ret = pm_runtime_put_autosuspend(dev);
-
- return ret < 0 ? ret : 0;
-}
-
-#else /* !CONFIG_PM */
-
-static int ads1015_set_power_state(struct ads1015_data *data, bool on)
-{
- return 0;
-}
-
-#endif /* !CONFIG_PM */
-
static
int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
{
@@ -532,26 +508,26 @@ static int ads1015_read_avail(struct iio_dev *indio_dev,
static int __ads1015_read_info_raw(struct ads1015_data *data,
struct iio_chan_spec const *chan, int *val)
{
+ struct device *dev = regmap_get_device(data->regmap);
int ret;
if (ads1015_event_channel_enabled(data) &&
data->event_channel != chan->address)
return -EBUSY;
- ret = ads1015_set_power_state(data, true);
- if (ret < 0)
+ PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND(dev, guard);
+ ret = PM_RUNTIME_ACQUIRE_ERR(&guard);
+ if (ret)
return ret;
ret = ads1015_get_adc_result(data, chan->address, val);
- if (ret < 0) {
- ads1015_set_power_state(data, false);
+ if (ret < 0)
return ret;
- }
*val = sign_extend32(*val >> chan->scan_type.shift,
chan->scan_type.realbits - 1);
- return ads1015_set_power_state(data, false);
+ return 0;
}
static int ads1015_read_raw(struct iio_dev *indio_dev,
@@ -709,6 +685,7 @@ static int ads1015_enable_event_config(struct ads1015_data *data,
{
int low_thresh = data->thresh_data[chan->address].low_thresh;
int high_thresh = data->thresh_data[chan->address].high_thresh;
+ struct device *dev = regmap_get_device(data->regmap);
int ret;
unsigned int val;
@@ -735,7 +712,7 @@ static int ads1015_enable_event_config(struct ads1015_data *data,
if (ret)
return ret;
- ret = ads1015_set_power_state(data, true);
+ ret = pm_runtime_resume_and_get(dev);
if (ret < 0)
return ret;
@@ -744,7 +721,8 @@ static int ads1015_enable_event_config(struct ads1015_data *data,
ret = ads1015_get_adc_result(data, chan->address, &val);
if (ret) {
ads1015_event_channel_disable(data, chan->address);
- ads1015_set_power_state(data, false);
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
}
return ret;
@@ -753,6 +731,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)
{
+ struct device *dev = regmap_get_device(data->regmap);
int ret;
if (!ads1015_event_channel_enabled(data))
@@ -774,7 +753,10 @@ static int ads1015_disable_event_config(struct ads1015_data *data,
ads1015_event_channel_disable(data, chan->address);
- return ads1015_set_power_state(data, false);
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+ return 0;
}
static int ads1015_write_event_config(struct iio_dev *indio_dev,
@@ -830,17 +812,24 @@ static irqreturn_t ads1015_event_handler(int irq, void *priv)
static int ads1015_buffer_preenable(struct iio_dev *indio_dev)
{
struct ads1015_data *data = iio_priv(indio_dev);
+ struct device *dev = regmap_get_device(data->regmap);
/* Prevent from enabling both buffer and event at a time */
if (ads1015_event_channel_enabled(data))
return -EBUSY;
- return ads1015_set_power_state(iio_priv(indio_dev), true);
+ return pm_runtime_resume_and_get(dev);
}
static int ads1015_buffer_postdisable(struct iio_dev *indio_dev)
{
- return ads1015_set_power_state(iio_priv(indio_dev), false);
+ struct ads1015_data *data = iio_priv(indio_dev);
+ struct device *dev = regmap_get_device(data->regmap);
+
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+ return 0;
}
static const struct iio_buffer_setup_ops ads1015_buffer_setup_ops = {
--
2.39.5