From: Romain Gantois <romain.gantois@bootlin.com>
To: Liam Girdwood <lgirdwood@gmail.com>, Mark Brown <broonie@kernel.org>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
linux-kernel@vger.kernel.org,
Romain Gantois <romain.gantois@bootlin.com>
Subject: [PATCH] regulator: core: do not ignore repeated requests on stepped regulators
Date: Wed, 21 May 2025 10:47:24 +0200 [thread overview]
Message-ID: <20250521-regulator-stepping-v1-1-b681ad012c0f@bootlin.com> (raw)
Currently, the regulator_set_voltage() function will assume a noop if a
consumer requests the same voltage range twice in a row.
This can lead to unexpected behavior if the target regulator has a maximum
voltage step constraint. With such constraints, the regulator core may
clamp the requested voltage to a lesser value, to ensure that the voltage
delta stays under the specified limit.
This means that the resulting regulator voltage depends on the current
voltage, as well as the requested range, which invalidates the assumption
that a repeated request for a specific voltage range will amount to a noop.
Considering the case of a regulator with a maximum voltage step constraint
of 1V:
initial voltage: 2.5V
consumer requests 4V
expected result: 3.5V
resulting voltage: 3.5V
consumer requests 4V again
expected result: 4V
actual result: 3.5V
Do not ignore repeated calls to regulator_set_voltage() if the regulator
has a voltage step constraint.
Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
---
drivers/regulator/core.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 7a248dc8d2e2ffd21e7daf729de9b33a5efc1937..4196b1d79fd53bfdd2d8e780272f5037d5ddab0e 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -3810,8 +3810,13 @@ static int regulator_set_voltage_unlocked(struct regulator *regulator,
/* If we're setting the same range as last time the change
* should be a noop (some cpufreq implementations use the same
* voltage for multiple frequencies, for example).
+ *
+ * This isn't true for regulator devices with a "max_uV_step"
+ * constraint, as they can progressively step their voltage with each
+ * subsequent request.
*/
- if (voltage->min_uV == min_uV && voltage->max_uV == max_uV)
+ if (voltage->min_uV == min_uV && voltage->max_uV == max_uV &&
+ !rdev->constraints->max_uV_step)
goto out;
/* If we're trying to set a range that overlaps the current voltage,
---
base-commit: a02c7665c216471413ed5442637a34364221e91c
change-id: 20250521-regulator-stepping-1bfdc34e5039
Best regards,
--
Romain Gantois <romain.gantois@bootlin.com>
next reply other threads:[~2025-05-21 8:47 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-21 8:47 Romain Gantois [this message]
2025-05-21 10:07 ` Mark Brown
2025-05-21 11:50 ` Romain Gantois
2025-05-21 12:25 ` Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250521-regulator-stepping-v1-1-b681ad012c0f@bootlin.com \
--to=romain.gantois@bootlin.com \
--cc=broonie@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®