Re: [PATCH togreg v3 2/2] iio: imu: inv_icm42607: restore runtime PM on system resume errors

Jonathan Cameron <[email protected]>
Newsgroups org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel
Message-ID <20260815215848.20d5ea79@jic23-huawei>
On Tue, 11 Aug 2026 18:33:01 +0800
Linmao Li <[email protected]> wrote:

> pm_runtime_force_suspend() leaves runtime PM disabled after it succeeds and
> expects pm_runtime_force_resume() to restore runtime PM management during
> system resume.
> 
> The resume callback returns early if enabling the vddio regulator or
> synchronizing the register cache fails, skipping the matching
> pm_runtime_force_resume() call. Runtime PM consequently remains disabled
> after the system has resumed, so runtime autosuspend can no longer turn off
> sensors enabled afterward.
> 
> Call pm_runtime_force_resume() on both error paths. Keep the first error as
> the return value and report a runtime PM restore failure separately.
> 
> Fixes: 3007c1530f96 ("iio: imu: inv_icm42607: Add PM support for icm42607")
> Signed-off-by: Linmao Li <[email protected]>

Sashiko has some comments on this:
https://sashiko.dev/#/patchset/20260811103301.1157404-1-lilinmao%40kylinos.cn

I would note that in some paths error handling is best effort.
There isn't always a sequence that leaves us in a remotely
useful state.  So maybe what you have here is the best we can do
even though it is a bit crazy to expect the driver to do anything
useful if it can't power the device.

> ---
> Changes since v2:
> - Restructure inv_icm42607_resume() along the lines Andy suggested:
>   handle the error case in its own block and call
>   pm_runtime_force_resume() directly on the success path.  No
>   functional change.
> 
> Changes since v1:
> - Split the device side of inv_icm42607_resume() into a helper so the
>   PM bookkeeping stays in the wrapper.  No functional change.
> 
>  .../iio/imu/inv_icm42607/inv_icm42607_core.c  | 23 +++++++++++++++----
>  1 file changed, 19 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c b/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c
> index 0da362967f63b..f4ef75da22c76 100644
> --- a/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c
> +++ b/drivers/iio/imu/inv_icm42607/inv_icm42607_core.c
> @@ -664,9 +664,8 @@ static int inv_icm42607_suspend(struct device *dev)
>  	return 0;
>  }
>  
> -static int inv_icm42607_resume(struct device *dev)
> +static int inv_icm42607_resume_core(struct inv_icm42607_state *st)
>  {
> -	struct inv_icm42607_state *st = dev_get_drvdata(dev);
>  	int ret;
>  
>  	ret = inv_icm42607_enable_vddio_reg(st);
> @@ -675,9 +674,25 @@ static int inv_icm42607_resume(struct device *dev)
>  
>  	/* Sync the regcache again after regulator shutdown. */
>  	regcache_mark_dirty(st->map);
> -	ret = regcache_sync(st->map);
> -	if (ret)
> +
> +	return regcache_sync(st->map);
> +}
> +
> +static int inv_icm42607_resume(struct device *dev)
> +{
> +	struct inv_icm42607_state *st = dev_get_drvdata(dev);
> +	int ret;
> +
> +	ret = inv_icm42607_resume_core(st);
> +	if (ret) {
> +		int rc;
> +
> +		rc = pm_runtime_force_resume(dev);
> +		if (rc)
> +			dev_warn(dev, "Failed to restore runtime PM state: %d\n", rc);
> +

There is a question from sashiko on whether this can be reached. 
Even though that may be the case I'd keep the the error print because
it hardens us against future changes.

>  		return ret;
> +	}
>  
>  	return pm_runtime_force_resume(dev);
>  }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.