Rework the power management in inv_icm42600_core_probe() to use
devm_pm_runtime_set_active_enabled(), which simplifies the runtime PM
setup by handling activation and enabling in one step.
Remove the separate inv_icm42600_disable_pm callback, as it's no longer
needed with the devm-managed approach.
Using devm_pm_runtime_enable() also fixes the missing disable of
autosuspend.
Update inv_icm42600_disable_vddio_reg() to only disable the regulator if
the device is not suspended i.e. powered-down, preventing unbalanced
disables.
Also remove redundant error msg on regulator_disable(), the regulator
framework already emits an error message when regulator_disable() fails.
This simplifies the PM setup and avoids manipulating the usage counter
unnecessarily.
Fixes: 31c24c1e93c3 ("iio: imu: inv_icm42600: add core of new inv_icm42600 driver")
Signed-off-by: Sean Nyekjaer <sean@geanix.com>
---
drivers/iio/imu/inv_icm42600/inv_icm42600_core.c | 24 ++++++------------------
1 file changed, 6 insertions(+), 18 deletions(-)
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index a4d42e7e21807f7954def431e9cf03dffaa5bd5e..c19615750c717101312f358a9160dd2c455cfb14 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -711,20 +711,10 @@ static void inv_icm42600_disable_vdd_reg(void *_data)
static void inv_icm42600_disable_vddio_reg(void *_data)
{
struct inv_icm42600_state *st = _data;
- const struct device *dev = regmap_get_device(st->map);
- int ret;
-
- ret = regulator_disable(st->vddio_supply);
- if (ret)
- dev_err(dev, "failed to disable vddio error %d\n", ret);
-}
-
-static void inv_icm42600_disable_pm(void *_data)
-{
- struct device *dev = _data;
+ struct device *dev = regmap_get_device(st->map);
- pm_runtime_put_sync(dev);
- pm_runtime_disable(dev);
+ if (!pm_runtime_status_suspended(dev))
+ regulator_disable(st->vddio_supply);
}
int inv_icm42600_core_probe(struct regmap *regmap, int chip,
@@ -824,16 +814,14 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip,
return ret;
/* setup runtime power management */
- ret = pm_runtime_set_active(dev);
+ ret = devm_pm_runtime_set_active_enabled(dev);
if (ret)
return ret;
- pm_runtime_get_noresume(dev);
- pm_runtime_enable(dev);
+
pm_runtime_set_autosuspend_delay(dev, INV_ICM42600_SUSPEND_DELAY_MS);
pm_runtime_use_autosuspend(dev);
- pm_runtime_put(dev);
- return devm_add_action_or_reset(dev, inv_icm42600_disable_pm, dev);
+ return ret;
}
EXPORT_SYMBOL_NS_GPL(inv_icm42600_core_probe, "IIO_ICM42600");
--
2.50.1
On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote: > > Rework the power management in inv_icm42600_core_probe() to use > devm_pm_runtime_set_active_enabled(), which simplifies the runtime PM > setup by handling activation and enabling in one step. > Remove the separate inv_icm42600_disable_pm callback, as it's no longer > needed with the devm-managed approach. > Using devm_pm_runtime_enable() also fixes the missing disable of > autosuspend. > Update inv_icm42600_disable_vddio_reg() to only disable the regulator if > the device is not suspended i.e. powered-down, preventing unbalanced > disables. > Also remove redundant error msg on regulator_disable(), the regulator > framework already emits an error message when regulator_disable() fails. > > This simplifies the PM setup and avoids manipulating the usage counter > unnecessarily. ... > + struct device *dev = regmap_get_device(st->map); > > + if (!pm_runtime_status_suspended(dev)) > + regulator_disable(st->vddio_supply); I would rather use positive conditional as it seems to me more scalable > } -- With Best Regards, Andy Shevchenko
On Fri, 8 Aug 2025 23:37:51 +0200 Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote: > > > > Rework the power management in inv_icm42600_core_probe() to use > > devm_pm_runtime_set_active_enabled(), which simplifies the runtime PM > > setup by handling activation and enabling in one step. > > Remove the separate inv_icm42600_disable_pm callback, as it's no longer > > needed with the devm-managed approach. > > Using devm_pm_runtime_enable() also fixes the missing disable of > > autosuspend. > > Update inv_icm42600_disable_vddio_reg() to only disable the regulator if > > the device is not suspended i.e. powered-down, preventing unbalanced > > disables. > > Also remove redundant error msg on regulator_disable(), the regulator > > framework already emits an error message when regulator_disable() fails. > > > > This simplifies the PM setup and avoids manipulating the usage counter > > unnecessarily. > > ... > > > + struct device *dev = regmap_get_device(st->map); > > > > + if (!pm_runtime_status_suspended(dev)) > > + regulator_disable(st->vddio_supply); > > I would rather use positive conditional as it seems to me more scalable Hi Andy, > To potentially save time when Sean looks at this. I don't follow. Do you mean something like if (pm_runtime_status_suspended(dev)) return; regulator_disable(st->vddio_supply); ? If so I'm not seeing why we'd want this to scale as it's a single use devm_set_action_or_reset() callback doing just one thing. Jonathan > > } > >
On Sat, Aug 9, 2025 at 8:06 PM Jonathan Cameron <jic23@kernel.org> wrote:
> On Fri, 8 Aug 2025 23:37:51 +0200
> Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> > On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote:
...
> > > + struct device *dev = regmap_get_device(st->map);
> > >
> > > + if (!pm_runtime_status_suspended(dev))
> > > + regulator_disable(st->vddio_supply);
> >
> > I would rather use positive conditional as it seems to me more scalable
>
> To potentially save time when Sean looks at this. I don't follow. Do you mean
> something like
> if (pm_runtime_status_suspended(dev))
> return;
>
> regulator_disable(st->vddio_supply);
>
> ?
Yes.
> If so I'm not seeing why we'd want this to scale as it's a single use
> devm_set_action_or_reset() callback doing just one thing.
While I agree in _this_ case, in general the check and return
immediately is more scalable for reading purposes, e.g., indentation
will be one level less. Also it won't require additional churn in
adding {, i.e. changing conditional line just for that.
--
With Best Regards,
Andy Shevchenko
On Sat, Aug 09, 2025 at 10:27:52PM +0100, Andy Shevchenko wrote:
> On Sat, Aug 9, 2025 at 8:06 PM Jonathan Cameron <jic23@kernel.org> wrote:
> > On Fri, 8 Aug 2025 23:37:51 +0200
> > Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> > > On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote:
>
> ...
>
> > > > + struct device *dev = regmap_get_device(st->map);
> > > >
> > > > + if (!pm_runtime_status_suspended(dev))
> > > > + regulator_disable(st->vddio_supply);
> > >
> > > I would rather use positive conditional as it seems to me more scalable
> >
> > To potentially save time when Sean looks at this. I don't follow. Do you mean
> > something like
> > if (pm_runtime_status_suspended(dev))
> > return;
> >
> > regulator_disable(st->vddio_supply);
> >
> > ?
>
> Yes.
>
> > If so I'm not seeing why we'd want this to scale as it's a single use
> > devm_set_action_or_reset() callback doing just one thing.
>
> While I agree in _this_ case, in general the check and return
> immediately is more scalable for reading purposes, e.g., indentation
> will be one level less. Also it won't require additional churn in
> adding {, i.e. changing conditional line just for that.
>
I like the return early if pm_runtime_status_suspended() is true.
Andy, when doing reviews please keep the function name, as it's much
easier to add the changes.
Jonathan, do we think checking pm_runtime_status_suspended() is a viable
option? Should we ask on the linux-pm list?
If it's ok; I will patch:
drivers/iio/adc/ti-ads1100.c
drivers/iio/pressure/bmp280-core.c
drivers/iio/pressure/icp10100.c
/Sean
On Mon, Aug 11, 2025 at 02:21:26PM +0100, Sean Nyekjaer wrote:
> On Sat, Aug 09, 2025 at 10:27:52PM +0100, Andy Shevchenko wrote:
> > On Sat, Aug 9, 2025 at 8:06 PM Jonathan Cameron <jic23@kernel.org> wrote:
> > > On Fri, 8 Aug 2025 23:37:51 +0200
> > > Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> > > > On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote:
> >
> > ...
> >
> > > > > + struct device *dev = regmap_get_device(st->map);
> > > > >
> > > > > + if (!pm_runtime_status_suspended(dev))
> > > > > + regulator_disable(st->vddio_supply);
> > > >
> > > > I would rather use positive conditional as it seems to me more scalable
> > >
> > > To potentially save time when Sean looks at this. I don't follow. Do you mean
> > > something like
> > > if (pm_runtime_status_suspended(dev))
> > > return;
> > >
> > > regulator_disable(st->vddio_supply);
> > >
> > > ?
> >
> > Yes.
> >
> > > If so I'm not seeing why we'd want this to scale as it's a single use
> > > devm_set_action_or_reset() callback doing just one thing.
> >
> > While I agree in _this_ case, in general the check and return
> > immediately is more scalable for reading purposes, e.g., indentation
> > will be one level less. Also it won't require additional churn in
> > adding {, i.e. changing conditional line just for that.
> >
>
> I like the return early if pm_runtime_status_suspended() is true.
>
> Andy, when doing reviews please keep the function name, as it's much
> easier to add the changes.
>
> Jonathan, do we think checking pm_runtime_status_suspended() is a viable
> option? Should we ask on the linux-pm list?
>
> If it's ok; I will patch:
> drivers/iio/adc/ti-ads1100.c
> drivers/iio/pressure/bmp280-core.c
> drivers/iio/pressure/icp10100.c
Hi Jonathan,
Did you see my question here?
Just ignore this if you are vacationing...
/Sean
On Mon, 25 Aug 2025 15:14:15 +0000
Sean Nyekjaer <sean@geanix.com> wrote:
> On Mon, Aug 11, 2025 at 02:21:26PM +0100, Sean Nyekjaer wrote:
> > On Sat, Aug 09, 2025 at 10:27:52PM +0100, Andy Shevchenko wrote:
> > > On Sat, Aug 9, 2025 at 8:06 PM Jonathan Cameron <jic23@kernel.org> wrote:
> > > > On Fri, 8 Aug 2025 23:37:51 +0200
> > > > Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> > > > > On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote:
> > >
> > > ...
> > >
> > > > > > + struct device *dev = regmap_get_device(st->map);
> > > > > >
> > > > > > + if (!pm_runtime_status_suspended(dev))
> > > > > > + regulator_disable(st->vddio_supply);
> > > > >
> > > > > I would rather use positive conditional as it seems to me more scalable
> > > >
> > > > To potentially save time when Sean looks at this. I don't follow. Do you mean
> > > > something like
> > > > if (pm_runtime_status_suspended(dev))
> > > > return;
> > > >
> > > > regulator_disable(st->vddio_supply);
> > > >
> > > > ?
> > >
> > > Yes.
> > >
> > > > If so I'm not seeing why we'd want this to scale as it's a single use
> > > > devm_set_action_or_reset() callback doing just one thing.
> > >
> > > While I agree in _this_ case, in general the check and return
> > > immediately is more scalable for reading purposes, e.g., indentation
> > > will be one level less. Also it won't require additional churn in
> > > adding {, i.e. changing conditional line just for that.
> > >
> >
> > I like the return early if pm_runtime_status_suspended() is true.
> >
> > Andy, when doing reviews please keep the function name, as it's much
> > easier to add the changes.
> >
> > Jonathan, do we think checking pm_runtime_status_suspended() is a viable
> > option? Should we ask on the linux-pm list?
Perhaps +CC linux-pm and Rafael on one of the patches and see if any replies.
> >
> > If it's ok; I will patch:
> > drivers/iio/adc/ti-ads1100.c
> > drivers/iio/pressure/bmp280-core.c
> > drivers/iio/pressure/icp10100.c
>
> Hi Jonathan,
>
> Did you see my question here?
Indeed not. Wise to poke!
> Just ignore this if you are vacationing...
>
> /Sean
>
>
On Mon, Aug 11, 2025 at 4:21 PM Sean Nyekjaer <sean@geanix.com> wrote: > On Sat, Aug 09, 2025 at 10:27:52PM +0100, Andy Shevchenko wrote: > > On Sat, Aug 9, 2025 at 8:06 PM Jonathan Cameron <jic23@kernel.org> wrote: > > > On Fri, 8 Aug 2025 23:37:51 +0200 > > > Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > > > On Fri, Aug 8, 2025 at 5:58 PM Sean Nyekjaer <sean@geanix.com> wrote: ... > > > > > + struct device *dev = regmap_get_device(st->map); > > > > > > > > > > + if (!pm_runtime_status_suspended(dev)) > > > > > + regulator_disable(st->vddio_supply); > Andy, when doing reviews please keep the function name, as it's much > easier to add the changes. Sure, sorry I missed it, I thought it was obvious, but you are right, it's better to keep more context. -- With Best Regards, Andy Shevchenko
© 2016 - 2026 Red Hat, Inc.