mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Brian Norris <briannorris@chromium.org>
Cc: "Nuno Sá" <nuno.sa@analog.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	"Ulf Hansson" <ulfh@kernel.org>,
	linux-pm@vger.kernel.org, "Andy Shevchenko" <andy@kernel.org>,
	"David Lechner" <dlechner@baylibre.com>,
	linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 04/17] iio: accel: mma955x: Discard pm_runtime_put_autosuspend() return values
Date: Mon, 2 Nov 2026 01:58:34 +0000	[thread overview]
Message-ID: <20261102015834.18155f42@jic23-hlaptop> (raw)
In-Reply-To: <20261021165858.v2.4.Ie9a9de6adbe98d063c6c45b2f59e143303586067@changeid>

On Wed, 21 Oct 2026 16:57:05 -0700
Brian Norris <briannorris@chromium.org> wrote:

> These drivers propagate the return value of
> pm_runtime_put_autosuspend(), which is not particularly useful.
> 
> Returning an error code from pm_runtime_put_autosuspend() merely means
> that it has not queued up a timer or work item to check whether or not
> the device can be suspended and there are many perfectly valid
> situations in which that can happen, like after writing "on" to the
> device's runtime PM "control" attribute in sysfs for one example.
> 
> For this reason, modify these drivers to simply discard the
> pm_runtime_put_autosuspend() return value, and inline the pm_runtime
> helpers now that they behave the same with and without CONFIG_PM.
> 
> While at it, I see that mma9553_write_event_config() mismanages the
> runtime PM reference count. It should only put() a reference after it's
> done touching the hardware, not before. Resolve this ordering issue.
> 
> This will facilitate a planned change of the
> pm_runtime_put_autosuspend() return type to void in the future, similar
> to commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return
> type to void").
> 
> Signed-off-by: Brian Norris <briannorris@chromium.org>

Mostly for my own reference, this looks fine to me, but if there
is time it would be nice to use some ACQUIRE magic to simplify some error
handling etc.

I'd also ideally like some eyes on the actual functional changes
were reordering occurs just in case there is something subtle
going on.


> ---
> 
> Changes in v2:
>  * Split iio patch into per-driver patches
>  * Inlining
>  * Refcount ordering
> 
>  drivers/iio/accel/mma9551.c      | 21 +++++++++--------
>  drivers/iio/accel/mma9551_core.c | 39 ++++----------------------------
>  drivers/iio/accel/mma9551_core.h |  1 -
>  drivers/iio/accel/mma9553.c      | 36 ++++++++++++++++++++---------
>  4 files changed, 42 insertions(+), 55 deletions(-)
> 
> diff --git a/drivers/iio/accel/mma9551.c b/drivers/iio/accel/mma9551.c
> index 182f488edab1..4c549fb106bc 100644
> --- a/drivers/iio/accel/mma9551.c
> +++ b/drivers/iio/accel/mma9551.c
> @@ -71,9 +71,11 @@ static int mma9551_read_incli_chan(struct i2c_client *client,
>  		return -EINVAL;
>  	}
>  
> -	ret = mma9551_set_power_state(client, true);
> -	if (ret < 0)
> +	ret = pm_runtime_resume_and_get(&client->dev);
> +	if (ret < 0) {
> +		dev_err(&client->dev, "failed to resume: %d\n", ret);
>  		return ret;
> +	}
>  
>  	ret = mma9551_read_status_byte(client, MMA9551_APPID_TILT,
>  				       reg_addr, &angle);
> @@ -96,7 +98,7 @@ static int mma9551_read_incli_chan(struct i2c_client *client,
>  	ret = IIO_VAL_INT;
>  
>  out_poweroff:
> -	mma9551_set_power_state(client, false);
> +	pm_runtime_put_autosuspend(&client->dev);
>  	return ret;
>  }
>  
> @@ -178,9 +180,7 @@ static int mma9551_config_incli_event(struct iio_dev *indio_dev,
>  		if (ret < 0)
>  			return ret;
>  
> -		ret = mma9551_set_power_state(data->client, false);
> -		if (ret < 0)
> -			return ret;
> +		pm_runtime_put_autosuspend(&data->client->dev);
>  	} else {
>  		int bitnum;
>  
> @@ -200,15 +200,18 @@ static int mma9551_config_incli_event(struct iio_dev *indio_dev,
>  		}
>  
>  
> -		ret = mma9551_set_power_state(data->client, true);
> -		if (ret < 0)
> +		ret = pm_runtime_resume_and_get(&data->client->dev);
> +		if (ret < 0) {
> +			dev_err(&data->client->dev, "failed to resume: %d\n",
> +				ret);
>  			return ret;
> +		}
>  
>  		ret = mma9551_gpio_config(data->client,
>  					  (enum mma9551_gpio_pin)mma_axis,
>  					  MMA9551_APPID_TILT, bitnum, 0);
>  		if (ret < 0) {
> -			mma9551_set_power_state(data->client, false);
> +			pm_runtime_put_autosuspend(&data->client->dev);
>  			return ret;
>  		}
>  	}
> diff --git a/drivers/iio/accel/mma9551_core.c b/drivers/iio/accel/mma9551_core.c
> index 2ccb1fb19b96..68df195d5b24 100644
> --- a/drivers/iio/accel/mma9551_core.c
> +++ b/drivers/iio/accel/mma9551_core.c
> @@ -654,37 +654,6 @@ int mma9551_set_device_state(struct i2c_client *client, bool enable)
>  }
>  EXPORT_SYMBOL_NS(mma9551_set_device_state, "IIO_MMA9551");
>  
> -/**
> - * mma9551_set_power_state() - sets runtime PM state
> - * @client:	I2C client
> - * @on:		Use true to power on device, false to power off
> - *
> - * Resume or suspend the device using Runtime PM.
> - * The device will suspend after the autosuspend delay.
> - *
> - * Returns: 0 on success, negative value on failure.
> - */
> -int mma9551_set_power_state(struct i2c_client *client, bool on)
> -{
> -#ifdef CONFIG_PM
> -	int ret;
> -
> -	if (on)
> -		ret = pm_runtime_resume_and_get(&client->dev);
> -	else
> -		ret = pm_runtime_put_autosuspend(&client->dev);
> -	if (ret < 0) {
> -		dev_err(&client->dev,
> -			"failed to change power state to %d\n", on);
> -
> -		return ret;
> -	}
> -#endif
> -
> -	return 0;
> -}
> -EXPORT_SYMBOL_NS(mma9551_set_power_state, "IIO_MMA9551");
> -
>  /**
>   * mma9551_sleep() - sleep
>   * @freq:	Application frequency
> @@ -741,9 +710,11 @@ int mma9551_read_accel_chan(struct i2c_client *client,
>  		return -EINVAL;
>  	}
>  
> -	ret = mma9551_set_power_state(client, true);
> -	if (ret < 0)
> +	ret = pm_runtime_resume_and_get(&client->dev);
> +	if (ret < 0) {
> +		dev_err(&client->dev, "failed to resume: %d\n", ret);
>  		return ret;
> +	}
>  
>  	ret = mma9551_read_status_word(client, MMA9551_APPID_AFE,
>  				       reg_addr, &raw_accel);
> @@ -755,7 +726,7 @@ int mma9551_read_accel_chan(struct i2c_client *client,
>  	ret = IIO_VAL_INT;
>  
>  out_poweroff:
> -	mma9551_set_power_state(client, false);
> +	pm_runtime_put_autosuspend(&client->dev);
>  	return ret;
>  }
>  EXPORT_SYMBOL_NS(mma9551_read_accel_chan, "IIO_MMA9551");
> diff --git a/drivers/iio/accel/mma9551_core.h b/drivers/iio/accel/mma9551_core.h
> index 543454a31dc0..1d55fdfd0a92 100644
> --- a/drivers/iio/accel/mma9551_core.h
> +++ b/drivers/iio/accel/mma9551_core.h
> @@ -62,7 +62,6 @@ int mma9551_gpio_config(struct i2c_client *client, enum mma9551_gpio_pin pin,
>  			u8 app_id, u8 bitnum, int polarity);
>  int mma9551_read_version(struct i2c_client *client);
>  int mma9551_set_device_state(struct i2c_client *client, bool enable);
> -int mma9551_set_power_state(struct i2c_client *client, bool on);
>  void mma9551_sleep(int freq);
>  int mma9551_read_accel_chan(struct i2c_client *client,
>  			    const struct iio_chan_spec *chan,
> diff --git a/drivers/iio/accel/mma9553.c b/drivers/iio/accel/mma9553.c
> index 5a36d415a837..2ccb68dfbcd4 100644
> --- a/drivers/iio/accel/mma9553.c
> +++ b/drivers/iio/accel/mma9553.c
> @@ -610,10 +610,16 @@ static int mma9553_write_raw(struct iio_dev *indio_dev,
>  		if (data->stepcnt_enabled == !!val)
>  			return 0;
>  		mutex_lock(&data->mutex);
> -		ret = mma9551_set_power_state(data->client, val);
> -		if (ret < 0) {
> -			mutex_unlock(&data->mutex);
> -			return ret;
> +		if (val) {
> +			ret = pm_runtime_resume_and_get(&data->client->dev);
> +			if (ret < 0) {
> +				dev_err(&data->client->dev,
> +					"failed to resume: %d\n", ret);
> +				mutex_unlock(&data->mutex);
> +				return ret;
> +			}
> +		} else {
> +			pm_runtime_put_autosuspend(&data->client->dev);
>  		}
>  		data->stepcnt_enabled = val;
>  		mutex_unlock(&data->mutex);
> @@ -737,24 +743,32 @@ static int mma9553_write_event_config(struct iio_dev *indio_dev,
>  
>  	mutex_lock(&data->mutex);
>  
> -	ret = mma9551_set_power_state(data->client, state);
> -	if (ret < 0)
> -		goto err_out;
> +	if (state) {
> +		ret = pm_runtime_resume_and_get(&data->client->dev);
> +		if (ret < 0) {
> +			dev_err(&data->client->dev, "failed to resume: %d\n",
> +				ret);
> +			goto err_out;
> +		}
> +	}
> +
>  	event->enabled = state;
>  
>  	ret = mma9553_conf_gpio(data);
>  	if (ret < 0)
>  		goto err_conf_gpio;
>  
> +	if (!state)
> +		pm_runtime_put_autosuspend(&data->client->dev);
> +
>  	mutex_unlock(&data->mutex);
>  
>  	return 0;
>  
>  err_conf_gpio:
> -	if (state) {
> -		event->enabled = false;
> -		mma9551_set_power_state(data->client, false);
> -	}
> +	if (state)
> +		pm_runtime_put_autosuspend(&data->client->dev);
> +	event->enabled = !state;
>  err_out:
>  	mutex_unlock(&data->mutex);
>  	return ret;


  reply	other threads:[~2026-11-02  1:58 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-21 23:57 [PATCH v2 00/17] iio: Stop looking at pm_runtime_put_autosuspend() return codes Brian Norris
2026-10-21 23:57 ` [PATCH v2 01/17] iio: accel: fxls8962af: Discard pm_runtime_put_autosuspend() return values Brian Norris
2026-10-22  6:53   ` Andy Shevchenko
2026-10-22 17:51     ` Brian Norris
2026-10-23  3:29       ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 02/17] iio: accel: kxcjk-1013: " Brian Norris
2026-10-22  6:58   ` Andy Shevchenko
2026-10-23  3:36   ` Jonathan Cameron
2026-10-23 16:43     ` Brian Norris
2026-10-21 23:57 ` [PATCH v2 03/17] iio: accel: mma8452: " Brian Norris
2026-10-22  6:59   ` Andy Shevchenko
2026-10-21 23:57 ` [PATCH v2 04/17] iio: accel: mma955x: " Brian Norris
2026-11-02  1:58   ` Jonathan Cameron [this message]
2026-10-21 23:57 ` [PATCH v2 05/17] iio: accel: bmc150: " Brian Norris
2026-10-21 23:57 ` [PATCH v2 06/17] iio: adc: rcar-gyroadc: " Brian Norris
2026-10-22  9:23   ` Geert Uytterhoeven
2026-10-26  3:28     ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 07/17] iio: adc: ti-ads1015: " Brian Norris
2026-10-26  3:27   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 08/17] iio: chemical: atlas-sensor: " Brian Norris
2026-10-26  3:25   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 09/17] iio: hid-sensors: " Brian Norris
2026-11-02  1:52   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 10/17] iio: gyro: bmg160: " Brian Norris
2026-10-21 23:57 ` [PATCH v2 11/17] iio: gyro: fxas21002c: " Brian Norris
2026-10-26  3:21   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 12/17] iio: imu: kmx61: " Brian Norris
2026-10-26  1:13   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 13/17] iio: light: apds9960: " Brian Norris
2026-11-02  1:27   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 14/17] iio: light: pa12203001: " Brian Norris
2026-10-26  1:08   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 15/17] iio: light: rpr0521: " Brian Norris
2026-10-26  0:58   ` Jonathan Cameron
2026-10-21 23:57 ` [PATCH v2 16/17] iio: light: tsl2583: " Brian Norris
2026-10-26  0:55   ` Jonathan Cameron
2026-10-26 17:59     ` Brian Norris
2026-10-26 18:42       ` Andy Shevchenko
2026-10-21 23:57 ` [PATCH v2 17/17] iio: light: us5182d: " Brian Norris
2026-10-26  0:53   ` Jonathan Cameron
2026-10-22  7:01 ` [PATCH v2 00/17] iio: Stop looking at pm_runtime_put_autosuspend() return codes Andy Shevchenko
2026-10-22 17:47   ` Brian Norris
2026-10-23  6:54     ` Andy Shevchenko
2026-10-23 16:43       ` Brian Norris
2026-10-26 10:09         ` Andy Shevchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261102015834.18155f42@jic23-hlaptop \
    --to=jic23@kernel.org \
    --cc=andy@kernel.org \
    --cc=briannorris@chromium.org \
    --cc=dlechner@baylibre.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=nuno.sa@analog.com \
    --cc=rafael@kernel.org \
    --cc=ulfh@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®