diff mbox series

[v1] regulator: core: Log forbidden DRMS operation

Message ID 6e471922-2850-97b8-c555-34e1708cbc38@free.fr (mailing list archive)
State Superseded
Headers show
Series [v1] regulator: core: Log forbidden DRMS operation | expand

Commit Message

Marc Gonzalez Feb. 19, 2019, 4:02 p.m. UTC
When REGULATOR_CHANGE_DRMS is not set, drms_uA_update is a no-op.
It used to print a debug message, which was dropped in commit
8a34e979f684 ("regulator: refactor valid_ops_mask checking code")

Let's bring the debug message back as KERN_INFO, because it is very
useful to diagnose missing regulator-allow-set-load properties.

Signed-off-by: Marc Gonzalez <marc.w.gonzalez@free.fr>
---
 drivers/regulator/core.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Mark Brown Feb. 19, 2019, 4:39 p.m. UTC | #1
On Tue, Feb 19, 2019 at 05:02:46PM +0100, Marc Gonzalez wrote:
> When REGULATOR_CHANGE_DRMS is not set, drms_uA_update is a no-op.
> It used to print a debug message, which was dropped in commit
> 8a34e979f684 ("regulator: refactor valid_ops_mask checking code")

> Let's bring the debug message back as KERN_INFO, because it is very
> useful to diagnose missing regulator-allow-set-load properties.

No, it's perfectly normal for machine constraints to stop drivers from
doing things so we shouldn't warn on this - it would get incredibly
noisy if we started printing every time constraints didn't let us do
something at info level.  Debug level might be viable, or definitely
vdbg or trace points.
Marc Gonzalez Feb. 21, 2019, 9:37 a.m. UTC | #2
On 19/02/2019 17:39, Mark Brown wrote:

> On Tue, Feb 19, 2019 at 05:02:46PM +0100, Marc Gonzalez wrote:
> 
>> When REGULATOR_CHANGE_DRMS is not set, drms_uA_update is a no-op.
>> It used to print a debug message, which was dropped in commit
>> 8a34e979f684 ("regulator: refactor valid_ops_mask checking code")
>> 
>> Let's bring the debug message back as KERN_INFO, because it is very
>> useful to diagnose missing regulator-allow-set-load properties.
> 
> No, it's perfectly normal for machine constraints to stop drivers from
> doing things so we shouldn't warn on this - it would get incredibly
> noisy if we started printing every time constraints didn't let us do
> something at info level.  Debug level might be viable, or definitely
> vdbg or trace points.

I had a look at the various REGULATOR_CHANGE_* flags.

#define REGULATOR_CHANGE_VOLTAGE	0x1
#define REGULATOR_CHANGE_CURRENT	0x2
#define REGULATOR_CHANGE_MODE		0x4
#define REGULATOR_CHANGE_STATUS		0x8
#define REGULATOR_CHANGE_DRMS		0x10
#define REGULATOR_CHANGE_BYPASS		0x20

Several functions return an error (and log a KERN_ERR message) if their
corresponding flag is not set:

regulator_check_voltage()	REGULATOR_CHANGE_VOLTAGE
regulator_check_current_limit()	REGULATOR_CHANGE_CURRENT
regulator_mode_constrain()	REGULATOR_CHANGE_MODE

Others succeed silently even if their corresponding flag is not set:

drms_uA_update()		REGULATOR_CHANGE_DRMS
regulator_allow_bypass()	REGULATOR_CHANGE_BYPASS


Why is setting the voltage handled differently than setting the load?

Regards.
Marc Gonzalez Feb. 21, 2019, 9:42 a.m. UTC | #3
[ SMTP server blocked by spamcop -- trying a different one ]

On 19/02/2019 17:39, Mark Brown wrote:

> On Tue, Feb 19, 2019 at 05:02:46PM +0100, Marc Gonzalez wrote:
> 
>> When REGULATOR_CHANGE_DRMS is not set, drms_uA_update is a no-op.
>> It used to print a debug message, which was dropped in commit
>> 8a34e979f684 ("regulator: refactor valid_ops_mask checking code")
>> 
>> Let's bring the debug message back as KERN_INFO, because it is very
>> useful to diagnose missing regulator-allow-set-load properties.
> 
> No, it's perfectly normal for machine constraints to stop drivers from
> doing things so we shouldn't warn on this - it would get incredibly
> noisy if we started printing every time constraints didn't let us do
> something at info level.  Debug level might be viable, or definitely
> vdbg or trace points.

I had a look at the various REGULATOR_CHANGE_* flags.

#define REGULATOR_CHANGE_VOLTAGE	0x1
#define REGULATOR_CHANGE_CURRENT	0x2
#define REGULATOR_CHANGE_MODE		0x4
#define REGULATOR_CHANGE_STATUS		0x8
#define REGULATOR_CHANGE_DRMS		0x10
#define REGULATOR_CHANGE_BYPASS		0x20

Several functions return an error (and log a KERN_ERR message) if their
corresponding flag is not set:

regulator_check_voltage()	REGULATOR_CHANGE_VOLTAGE
regulator_check_current_limit()	REGULATOR_CHANGE_CURRENT
regulator_mode_constrain()	REGULATOR_CHANGE_MODE

Others succeed silently even if their corresponding flag is not set:

drms_uA_update()		REGULATOR_CHANGE_DRMS
regulator_allow_bypass()	REGULATOR_CHANGE_BYPASS


Why is setting the voltage handled differently than setting the load?

Regards.
Mark Brown Feb. 21, 2019, 10:12 a.m. UTC | #4
On Thu, Feb 21, 2019 at 10:42:01AM +0100, Marc Gonzalez wrote:
> On 19/02/2019 17:39, Mark Brown wrote:
> > On Tue, Feb 19, 2019 at 05:02:46PM +0100, Marc Gonzalez wrote:

> > No, it's perfectly normal for machine constraints to stop drivers from
> > doing things so we shouldn't warn on this - it would get incredibly
> > noisy if we started printing every time constraints didn't let us do
> > something at info level.  Debug level might be viable, or definitely
> > vdbg or trace points.

> Several functions return an error (and log a KERN_ERR message) if their
> corresponding flag is not set:
> 
> regulator_check_voltage()	REGULATOR_CHANGE_VOLTAGE

That's a bug due to an incomplete implementation, what it's supposed to
be doing there is checking if the voltage request is satisfied by the
current voltage and returning an error only if the requested voltage is
out of range.

> regulator_check_current_limit()	REGULATOR_CHANGE_CURRENT

This one is less clear than anything else - we might want to error out
here if the device is somehow relying on being able to lower the current
limit for safety.  We'd need an audit of users.

> regulator_mode_constrain()	REGULATOR_CHANGE_MODE

This one is also a bug, modes barely mean anything anyway.
diff mbox series

Patch

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 59782a706ac4..2ff9b55cfcd8 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -930,8 +930,10 @@  static int drms_uA_update(struct regulator_dev *rdev)
 	 * first check to see if we can set modes at all, otherwise just
 	 * tell the consumer everything is OK.
 	 */
-	if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
+	if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS)) {
+		rdev_info(rdev, "DRMS operation not allowed\n");
 		return 0;
+	}
 
 	if (!rdev->desc->ops->get_optimum_mode &&
 	    !rdev->desc->ops->set_load)