diff mbox series

[v3,1/3] PM: runtime: add devm_pm_runtime_enable helper

Message ID 20210731195034.979084-2-dmitry.baryshkov@linaro.org
State Accepted
Commit b3636a3a2c51715736d3ec45f635ed03191962ce
Headers show
Series [v3,1/3] PM: runtime: add devm_pm_runtime_enable helper | expand

Commit Message

Dmitry Baryshkov July 31, 2021, 7:50 p.m. UTC
A typical code pattern for pm_runtime_enable() call is to call it in the
_probe function and to call pm_runtime_disable() both from _probe error
path and from _remove function. For some drivers the whole remove
function would consist of the call to pm_remove_disable().

Add helper function to replace this bolierplate piece of code. Calling
devm_pm_runtime_enable() removes the need for calling
pm_runtime_disable() both in the probe()'s error path and in the
remove() function.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

---
 drivers/base/power/runtime.c | 17 +++++++++++++++++
 include/linux/pm_runtime.h   |  4 ++++
 2 files changed, 21 insertions(+)

-- 
2.30.2

Comments

Rafael J. Wysocki Aug. 4, 2021, 6:06 p.m. UTC | #1
On Sat, Jul 31, 2021 at 9:50 PM Dmitry Baryshkov
<dmitry.baryshkov@linaro.org> wrote:
>
> A typical code pattern for pm_runtime_enable() call is to call it in the
> _probe function and to call pm_runtime_disable() both from _probe error
> path and from _remove function. For some drivers the whole remove
> function would consist of the call to pm_remove_disable().
>
> Add helper function to replace this bolierplate piece of code. Calling
> devm_pm_runtime_enable() removes the need for calling
> pm_runtime_disable() both in the probe()'s error path and in the
> remove() function.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
>  drivers/base/power/runtime.c | 17 +++++++++++++++++
>  include/linux/pm_runtime.h   |  4 ++++
>  2 files changed, 21 insertions(+)
>
> diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> index 8a66eaf731e4..ec94049442b9 100644
> --- a/drivers/base/power/runtime.c
> +++ b/drivers/base/power/runtime.c
> @@ -1447,6 +1447,23 @@ void pm_runtime_enable(struct device *dev)
>  }
>  EXPORT_SYMBOL_GPL(pm_runtime_enable);
>
> +static void pm_runtime_disable_action(void *data)
> +{
> +       pm_runtime_disable(data);
> +}
> +
> +/**
> + * devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.
> + * @dev: Device to handle.
> + */
> +int devm_pm_runtime_enable(struct device *dev)
> +{
> +       pm_runtime_enable(dev);
> +
> +       return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);

When exactly is pm_runtime_disable_action() going to run by this rule?
 When the device goes away or when the driver is unbound from it?

> +}
> +EXPORT_SYMBOL_GPL(devm_pm_runtime_enable);
> +
>  /**
>   * pm_runtime_forbid - Block runtime PM of a device.
>   * @dev: Device to handle.
> diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
> index aab8b35e9f8a..222da43b7096 100644
> --- a/include/linux/pm_runtime.h
> +++ b/include/linux/pm_runtime.h
> @@ -59,6 +59,8 @@ extern void pm_runtime_put_suppliers(struct device *dev);
>  extern void pm_runtime_new_link(struct device *dev);
>  extern void pm_runtime_drop_link(struct device_link *link);
>
> +extern int devm_pm_runtime_enable(struct device *dev);
> +
>  /**
>   * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
>   * @dev: Target device.
> @@ -253,6 +255,8 @@ static inline void __pm_runtime_disable(struct device *dev, bool c) {}
>  static inline void pm_runtime_allow(struct device *dev) {}
>  static inline void pm_runtime_forbid(struct device *dev) {}
>
> +static inline int devm_pm_runtime_enable(struct device *dev) { return 0; }
> +
>  static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
>  static inline void pm_runtime_get_noresume(struct device *dev) {}
>  static inline void pm_runtime_put_noidle(struct device *dev) {}
> --
> 2.30.2
>
Dmitry Baryshkov Aug. 4, 2021, 9:02 p.m. UTC | #2
On Wed, 4 Aug 2021 at 21:07, Rafael J. Wysocki <rafael@kernel.org> wrote:
>

> On Sat, Jul 31, 2021 at 9:50 PM Dmitry Baryshkov

> <dmitry.baryshkov@linaro.org> wrote:

> >

> > A typical code pattern for pm_runtime_enable() call is to call it in the

> > _probe function and to call pm_runtime_disable() both from _probe error

> > path and from _remove function. For some drivers the whole remove

> > function would consist of the call to pm_remove_disable().

> >

> > Add helper function to replace this bolierplate piece of code. Calling

> > devm_pm_runtime_enable() removes the need for calling

> > pm_runtime_disable() both in the probe()'s error path and in the

> > remove() function.

> >

> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

> > ---

> >  drivers/base/power/runtime.c | 17 +++++++++++++++++

> >  include/linux/pm_runtime.h   |  4 ++++

> >  2 files changed, 21 insertions(+)

> >

> > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c

> > index 8a66eaf731e4..ec94049442b9 100644

> > --- a/drivers/base/power/runtime.c

> > +++ b/drivers/base/power/runtime.c

> > @@ -1447,6 +1447,23 @@ void pm_runtime_enable(struct device *dev)

> >  }

> >  EXPORT_SYMBOL_GPL(pm_runtime_enable);

> >

> > +static void pm_runtime_disable_action(void *data)

> > +{

> > +       pm_runtime_disable(data);

> > +}

> > +

> > +/**

> > + * devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.

> > + * @dev: Device to handle.

> > + */

> > +int devm_pm_runtime_enable(struct device *dev)

> > +{

> > +       pm_runtime_enable(dev);

> > +

> > +       return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);

>

> When exactly is pm_runtime_disable_action() going to run by this rule?

>  When the device goes away or when the driver is unbound from it?


When the driver is unbound (either because probe() returns an error or
because __device_release_driver() is being called).
This corresponds to a typical call to pm_runtime_disable() from the
probe()'s error path or in the remove() callback.

> > +}

> > +EXPORT_SYMBOL_GPL(devm_pm_runtime_enable);

> > +

> >  /**

> >   * pm_runtime_forbid - Block runtime PM of a device.

> >   * @dev: Device to handle.

> > diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h

> > index aab8b35e9f8a..222da43b7096 100644

> > --- a/include/linux/pm_runtime.h

> > +++ b/include/linux/pm_runtime.h

> > @@ -59,6 +59,8 @@ extern void pm_runtime_put_suppliers(struct device *dev);

> >  extern void pm_runtime_new_link(struct device *dev);

> >  extern void pm_runtime_drop_link(struct device_link *link);

> >

> > +extern int devm_pm_runtime_enable(struct device *dev);

> > +

> >  /**

> >   * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.

> >   * @dev: Target device.

> > @@ -253,6 +255,8 @@ static inline void __pm_runtime_disable(struct device *dev, bool c) {}

> >  static inline void pm_runtime_allow(struct device *dev) {}

> >  static inline void pm_runtime_forbid(struct device *dev) {}

> >

> > +static inline int devm_pm_runtime_enable(struct device *dev) { return 0; }

> > +

> >  static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}

> >  static inline void pm_runtime_get_noresume(struct device *dev) {}

> >  static inline void pm_runtime_put_noidle(struct device *dev) {}

> > --

> > 2.30.2

> >




-- 
With best wishes
Dmitry
Rafael J. Wysocki Aug. 6, 2021, 1:27 p.m. UTC | #3
On Wed, Aug 4, 2021 at 11:03 PM Dmitry Baryshkov
<dmitry.baryshkov@linaro.org> wrote:
>
> On Wed, 4 Aug 2021 at 21:07, Rafael J. Wysocki <rafael@kernel.org> wrote:
> >
> > On Sat, Jul 31, 2021 at 9:50 PM Dmitry Baryshkov
> > <dmitry.baryshkov@linaro.org> wrote:
> > >
> > > A typical code pattern for pm_runtime_enable() call is to call it in the
> > > _probe function and to call pm_runtime_disable() both from _probe error
> > > path and from _remove function. For some drivers the whole remove
> > > function would consist of the call to pm_remove_disable().
> > >
> > > Add helper function to replace this bolierplate piece of code. Calling
> > > devm_pm_runtime_enable() removes the need for calling
> > > pm_runtime_disable() both in the probe()'s error path and in the
> > > remove() function.
> > >
> > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> > > ---
> > >  drivers/base/power/runtime.c | 17 +++++++++++++++++
> > >  include/linux/pm_runtime.h   |  4 ++++
> > >  2 files changed, 21 insertions(+)
> > >
> > > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> > > index 8a66eaf731e4..ec94049442b9 100644
> > > --- a/drivers/base/power/runtime.c
> > > +++ b/drivers/base/power/runtime.c
> > > @@ -1447,6 +1447,23 @@ void pm_runtime_enable(struct device *dev)
> > >  }
> > >  EXPORT_SYMBOL_GPL(pm_runtime_enable);
> > >
> > > +static void pm_runtime_disable_action(void *data)
> > > +{
> > > +       pm_runtime_disable(data);
> > > +}
> > > +
> > > +/**
> > > + * devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.
> > > + * @dev: Device to handle.
> > > + */
> > > +int devm_pm_runtime_enable(struct device *dev)
> > > +{
> > > +       pm_runtime_enable(dev);
> > > +
> > > +       return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);
> >
> > When exactly is pm_runtime_disable_action() going to run by this rule?
> >  When the device goes away or when the driver is unbound from it?
>
> When the driver is unbound (either because probe() returns an error or
> because __device_release_driver() is being called).
> This corresponds to a typical call to pm_runtime_disable() from the
> probe()'s error path or in the remove() callback.

OK, so

Acked-by: Rafael J. Wysocki <rafael@kernel.org>

for the PM-runtime framework changes in this series (patches [1-2/3])
and please feel free to route them in through whatever tree is most
suitable (or let me know if you want me to pick them up).
diff mbox series

Patch

diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 8a66eaf731e4..ec94049442b9 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -1447,6 +1447,23 @@  void pm_runtime_enable(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(pm_runtime_enable);
 
+static void pm_runtime_disable_action(void *data)
+{
+	pm_runtime_disable(data);
+}
+
+/**
+ * devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.
+ * @dev: Device to handle.
+ */
+int devm_pm_runtime_enable(struct device *dev)
+{
+	pm_runtime_enable(dev);
+
+	return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);
+}
+EXPORT_SYMBOL_GPL(devm_pm_runtime_enable);
+
 /**
  * pm_runtime_forbid - Block runtime PM of a device.
  * @dev: Device to handle.
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index aab8b35e9f8a..222da43b7096 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -59,6 +59,8 @@  extern void pm_runtime_put_suppliers(struct device *dev);
 extern void pm_runtime_new_link(struct device *dev);
 extern void pm_runtime_drop_link(struct device_link *link);
 
+extern int devm_pm_runtime_enable(struct device *dev);
+
 /**
  * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
  * @dev: Target device.
@@ -253,6 +255,8 @@  static inline void __pm_runtime_disable(struct device *dev, bool c) {}
 static inline void pm_runtime_allow(struct device *dev) {}
 static inline void pm_runtime_forbid(struct device *dev) {}
 
+static inline int devm_pm_runtime_enable(struct device *dev) { return 0; }
+
 static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
 static inline void pm_runtime_get_noresume(struct device *dev) {}
 static inline void pm_runtime_put_noidle(struct device *dev) {}