summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndré Draszik <andre.draszik@linaro.org>2026-01-09 11:38:40 +0300
committerMark Brown <broonie@kernel.org>2026-01-09 16:37:57 +0300
commit4f3323b752bfcc185c98ce4fb841cca8b700a7c0 (patch)
tree4252e1b73f54811cdd2975646978e40882b4c517
parent86a8eeb0e913f4b6a55dabba5122098d4e805e55 (diff)
downloadlinux-4f3323b752bfcc185c98ce4fb841cca8b700a7c0.tar.xz
regulator: core: streamline supply resolution for always-on/boot-on regulators
For always-on and boot-on regulators, regulator_register() is currently trying to anticipate the requirement to resolve a supply early. Unfortunately, this code executes too early, before we have potentially updated the regulator's always_on constraint as part of set_machine_constraints(), causing it to miss cases. Rather than trying to hack it more, just defer to the outcome of set_machine_constraints(). The latter returns early (without doing any regulator initialisation) with -EPROBE_DEFER as of commit 'regulator: core: move supply check earlier in set_machine_constraints()' and is therefore safe to call multiple times to determine if supplies need to be resolved early. Commit 8a866d527ac0 ("regulator: core: Resolve supply name earlier to prevent double-init") (later updated by commit 520fb178212d ("regulator: core: Fix regulator supply registration with sysfs")) added these tests originally to avoid calling set_machine_constraints() multiple times to try to avoid voltage glitches due to all the regulator initialisation happening each time. This isn't an issue anymore as per above. Signed-off-by: André Draszik <andre.draszik@linaro.org> Link: https://patch.msgid.link/20260109-regulators-defer-v2-4-1a25dc968e60@linaro.org Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/regulator/core.c19
1 files changed, 4 insertions, 15 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 9ce0eef1dcfc..08bdb1e4175e 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -5937,7 +5937,6 @@ regulator_register(struct device *dev,
bool dangling_cfg_gpiod = false;
bool dangling_of_gpiod = false;
int ret, i;
- bool resolved_early = false;
if (cfg == NULL)
return ERR_PTR(-EINVAL);
@@ -6075,17 +6074,6 @@ regulator_register(struct device *dev,
goto wash;
}
- if ((rdev->supply_name && !rdev->supply) &&
- (rdev->constraints->always_on ||
- rdev->constraints->boot_on)) {
- ret = regulator_resolve_supply(rdev);
- if (ret)
- rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
- ERR_PTR(ret));
-
- resolved_early = true;
- }
-
if (config->ena_gpiod) {
ret = regulator_ena_gpio_request(rdev, config);
if (ret != 0) {
@@ -6099,9 +6087,10 @@ regulator_register(struct device *dev,
}
ret = set_machine_constraints(rdev);
- if (ret == -EPROBE_DEFER && !resolved_early) {
- /* Regulator might be in bypass mode and so needs its supply
- * to set the constraints
+ if (ret == -EPROBE_DEFER) {
+ /* Regulator might be in bypass mode or an always-on or boot-on
+ * regulator and so needs its supply to set the constraints or
+ * for enable.
*/
/* FIXME: this currently triggers a chicken-and-egg problem
* when creating -SUPPLY symlink in sysfs to a regulator