Re: [PATCH] iio: adc: ti-ads1015: use devm_pm_runtime_enable() to fix probe error path
From: Jonathan Cameron
Date: Fri May 29 2026 - 13:42:53 EST
On Fri, 29 May 2026 15:10:11 +0500
Stepan Ionichev <sozdayvek@xxxxxxxxx> wrote:
> ads1015_probe() calls pm_runtime_enable() and then iio_device_register().
> If iio_device_register() fails the function returns directly, leaving
> runtime PM enabled and autosuspend in use. On subsequent probe/rebind
> the runtime PM tracking complains about an unbalanced enable.
>
> Switch to devm_pm_runtime_enable() so the enable (and the matching
> dont_use_autosuspend) are torn down automatically on probe failure and
> on driver unbind. The manual pm_runtime_disable() and
> pm_runtime_set_suspended() calls in ads1015_remove() are no longer
> needed and are dropped; the devm action runs after .remove() and now
> handles the teardown. While here, convert the dev_err() + return to
> dev_err_probe() to follow current style.
>
> Signed-off-by: Stepan Ionichev <sozdayvek@xxxxxxxxx>
> ---
> drivers/iio/adc/ti-ads1015.c | 14 ++++++--------
> 1 file changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
> index c7ffe47449e2..2331e946c519 100644
> --- a/drivers/iio/adc/ti-ads1015.c
> +++ b/drivers/iio/adc/ti-ads1015.c
> @@ -1037,13 +1037,14 @@ static int ads1015_probe(struct i2c_client *client)
> return ret;
> pm_runtime_set_autosuspend_delay(&client->dev, ADS1015_SLEEP_DELAY_MS);
> pm_runtime_use_autosuspend(&client->dev);
> - pm_runtime_enable(&client->dev);
> + ret = devm_pm_runtime_enable(&client->dev);
> + if (ret)
> + return ret;
>
> ret = iio_device_register(indio_dev);
> - if (ret < 0) {
> - dev_err(&client->dev, "Failed to register IIO device\n");
> - return ret;
> - }
> + if (ret < 0)
> + return dev_err_probe(&client->dev, ret,
> + "Failed to register IIO device\n");
>
> return 0;
> }
> @@ -1056,9 +1057,6 @@ static void ads1015_remove(struct i2c_client *client)
>
> iio_device_unregister(indio_dev);
>
> - pm_runtime_disable(&client->dev);
> - pm_runtime_set_suspended(&client->dev);
> -
> /* power down single shot mode */
> ret = ads1015_set_conv_mode(data, ADS1015_SINGLESHOT);
Hmm. Looks like this is undoing the setting of continuous mode just above the runtime PM
stuff. That isn't done in the error path but should be. If it were then there would have
been a goto for that iio_deivce_unregister() and it would have been obvious the change
here would break the ordering.
> if (ret)