lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250521-regulator-stepping-v1-1-b681ad012c0f@bootlin.com>
Date: Wed, 21 May 2025 10:47:24 +0200
From: Romain Gantois <romain.gantois@...tlin.com>
To: Liam Girdwood <lgirdwood@...il.com>, Mark Brown <broonie@...nel.org>
Cc: Thomas Petazzoni <thomas.petazzoni@...tlin.com>, 
 linux-kernel@...r.kernel.org, Romain Gantois <romain.gantois@...tlin.com>
Subject: [PATCH] regulator: core: do not ignore repeated requests on
 stepped regulators

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@...tlin.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@...tlin.com>


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ