2014-11-12 11:18:42

by Richard Fitzgerald

[permalink] [raw]
Subject: [PATCH] regulator: core: export function to check if regulator always on

Export a function to allow a consumer to check if its supply
regulator is always on. Drivers might wish to take different
action based on this - for example skipping time-consuming
power-saving preparations that are irrelevant if the regulator
cannot be disabled.

Signed-off-by: Richard Fitzgerald <[email protected]>
---
drivers/regulator/core.c | 16 ++++++++++++++++
include/linux/regulator/consumer.h | 6 ++++++
2 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index cd87c0c..e93db90 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2184,6 +2184,22 @@ int regulator_is_enabled(struct regulator *regulator)
EXPORT_SYMBOL_GPL(regulator_is_enabled);

/**
+ * regulator_is_always_on - check if regulator is always on
+ * @regulator: regulator source
+ *
+ * Returns positive if the regulator driver backing the source/client
+ * is always on, false otherwise.
+ */
+int regulator_is_always_on(struct regulator *regulator)
+{
+ if (regulator->always_on)
+ return 1;
+ else
+ return 0;
+}
+EXPORT_SYMBOL_GPL(regulator_is_always_on);
+
+/**
* regulator_can_change_voltage - check if regulator can change voltage
* @regulator: regulator source
*
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index f540b14..bd6daef 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -217,6 +217,7 @@ int regulator_bulk_force_disable(int num_consumers,
void regulator_bulk_free(int num_consumers,
struct regulator_bulk_data *consumers);

+int regulator_is_always_on(struct regulator *regulator);
int regulator_can_change_voltage(struct regulator *regulator);
int regulator_count_voltages(struct regulator *regulator);
int regulator_list_voltage(struct regulator *regulator, unsigned selector);
@@ -425,6 +426,11 @@ static inline void regulator_bulk_free(int num_consumers,
{
}

+static inline int regulator_is_always_on(struct regulator *regulator)
+{
+ return 1;
+}
+
static inline int regulator_can_change_voltage(struct regulator *regulator)
{
return 0;
--
1.7.2.5


2014-11-12 11:37:10

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH] regulator: core: export function to check if regulator always on

On Wed, Nov 12, 2014 at 11:18:35AM +0000, Richard Fitzgerald wrote:
> Export a function to allow a consumer to check if its supply
> regulator is always on. Drivers might wish to take different
> action based on this - for example skipping time-consuming
> power-saving preparations that are irrelevant if the regulator
> cannot be disabled.

I'd like to see a user here, and I'd also like to understand why this is
a better approach than using a callback to postpone these expensive
operations until the regulator is actually powered off like we already
do for some things like register cache resyncs. That is normally better
since it also avoids the work in cases where the regulator isn't always
on like reenabling during a delayed powerdown or shared regulators.

You're also missing a !CONFIG_REGULATOR stub.


Attachments:
(No filename) (815.00 B)
signature.asc (473.00 B)
Digital signature
Download all attachments

2014-11-12 13:07:44

by Richard Fitzgerald

[permalink] [raw]
Subject: Re: [PATCH] regulator: core: export function to check if regulator always on

On Wed, Nov 12, 2014 at 11:35:41AM +0000, Mark Brown wrote:
> On Wed, Nov 12, 2014 at 11:18:35AM +0000, Richard Fitzgerald wrote:
> > Export a function to allow a consumer to check if its supply
> > regulator is always on. Drivers might wish to take different
> > action based on this - for example skipping time-consuming
> > power-saving preparations that are irrelevant if the regulator
> > cannot be disabled.
>
> I'd like to see a user here,

The user will be the Arizona codec drivers but I wanted to upstream
this patch first for discussion.


> and I'd also like to understand why this is
> a better approach than using a callback to postpone these expensive
> operations until the regulator is actually powered off like we already
> do for some things like register cache resyncs. That is normally better
> since it also avoids the work in cases where the regulator isn't always
> on like reenabling during a delayed powerdown or shared regulators.
>

The runtime_suspend() for the Arizona drivers has to do a bunch of
preparation before disabling the DCVDD regulator (and there's more
preparation steps that need to be upstreamed). There's no point doing
any of this if at the end the regulator isn't going to switch off.

> You're also missing a !CONFIG_REGULATOR stub.

It's there at the end of the patch, returning 1.

2014-11-12 14:59:20

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH] regulator: core: export function to check if regulator always on

On Wed, Nov 12, 2014 at 01:07:35PM +0000, Richard Fitzgerald wrote:
> On Wed, Nov 12, 2014 at 11:35:41AM +0000, Mark Brown wrote:

> > I'd like to see a user here,

> The user will be the Arizona codec drivers but I wanted to upstream
> this patch first for discussion.

My point is that the code using the API is useful input to the
discussion.

> > and I'd also like to understand why this is
> > a better approach than using a callback to postpone these expensive
> > operations until the regulator is actually powered off like we already
> > do for some things like register cache resyncs. That is normally better
> > since it also avoids the work in cases where the regulator isn't always
> > on like reenabling during a delayed powerdown or shared regulators.

> The runtime_suspend() for the Arizona drivers has to do a bunch of
> preparation before disabling the DCVDD regulator (and there's more
> preparation steps that need to be upstreamed). There's no point doing
> any of this if at the end the regulator isn't going to switch off.

I'm not sure that this addresses my concern about postponing the
expensive work until the regulator is actually powered off at all?

> > You're also missing a !CONFIG_REGULATOR stub.

> It's there at the end of the patch, returning 1.

Bah, so it is.


Attachments:
(No filename) (1.27 kB)
signature.asc (473.00 B)
Digital signature
Download all attachments

2014-11-12 16:59:05

by Richard Fitzgerald

[permalink] [raw]
Subject: Re: [PATCH] regulator: core: export function to check if regulator always on

On Wed, Nov 12, 2014 at 02:58:02PM +0000, Mark Brown wrote:
> On Wed, Nov 12, 2014 at 01:07:35PM +0000, Richard Fitzgerald wrote:
> > On Wed, Nov 12, 2014 at 11:35:41AM +0000, Mark Brown wrote:
>
> > > I'd like to see a user here,
>
> > The user will be the Arizona codec drivers but I wanted to upstream
> > this patch first for discussion.
>
> My point is that the code using the API is useful input to the
> discussion.
>

Ok, I'll push up a patch showing what I'm intending to do with this
new function

> > > and I'd also like to understand why this is
> > > a better approach than using a callback to postpone these expensive
> > > operations until the regulator is actually powered off like we already
> > > do for some things like register cache resyncs. That is normally better
> > > since it also avoids the work in cases where the regulator isn't always
> > > on like reenabling during a delayed powerdown or shared regulators.
>
> > The runtime_suspend() for the Arizona drivers has to do a bunch of
> > preparation before disabling the DCVDD regulator (and there's more
> > preparation steps that need to be upstreamed). There's no point doing
> > any of this if at the end the regulator isn't going to switch off.
>
> I'm not sure that this addresses my concern about postponing the
> expensive work until the regulator is actually powered off at all?
>

The point is that the work we want to avoid has to happen while the
regulator is still powered up. We can't just rip power from the codec,
it has to be setup ready for the DCVDD to be turned off. So it's
pre-power down work we're avoiding by knowing that a power-down will
never actually happen, it's not post-power-down work.
But as you say the code that's going to use it will help explain.


> > > You're also missing a !CONFIG_REGULATOR stub.
>
> > It's there at the end of the patch, returning 1.
>
> Bah, so it is.

2014-11-12 17:28:04

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH] regulator: core: export function to check if regulator always on

On Wed, Nov 12, 2014 at 04:58:56PM +0000, Richard Fitzgerald wrote:
> On Wed, Nov 12, 2014 at 02:58:02PM +0000, Mark Brown wrote:

> > > > and I'd also like to understand why this is
> > > > a better approach than using a callback to postpone these expensive
> > > > operations until the regulator is actually powered off like we already
> > > > do for some things like register cache resyncs. That is normally better
> > > > since it also avoids the work in cases where the regulator isn't always
> > > > on like reenabling during a delayed powerdown or shared regulators.

> > > The runtime_suspend() for the Arizona drivers has to do a bunch of
> > > preparation before disabling the DCVDD regulator (and there's more
> > > preparation steps that need to be upstreamed). There's no point doing
> > > any of this if at the end the regulator isn't going to switch off.

> > I'm not sure that this addresses my concern about postponing the
> > expensive work until the regulator is actually powered off at all?

> The point is that the work we want to avoid has to happen while the
> regulator is still powered up. We can't just rip power from the codec,
> it has to be setup ready for the DCVDD to be turned off. So it's
> pre-power down work we're avoiding by knowing that a power-down will
> never actually happen, it's not post-power-down work.

I'm sorry but you're still not addressing my question - to repeat, my
question is why this is better than postponing these expensive
operations to a callback at the time we want to power off. You keep
saying that you want to avoid these operations when they're not needed
but that's not what I'm asking about, what I'm asking is why polling
this particular possible reason is better than a notifier?


Attachments:
(No filename) (1.71 kB)
signature.asc (473.00 B)
Digital signature
Download all attachments