From 5c9bff8f5824770e8303e4ff5ee66b13d3f062b2 Mon Sep 17 00:00:00 2001 From: John Keeping Date: Thu, 8 Sep 2022 12:38:35 +0100 Subject: [PATCH] power: regulator: fix autoset error handling If a regulator does not support .set_suspend_enable or .set_suspend_value then ret is set to ENOSYS early in the function. The most serious impact of this is that when no automatic setting of voltage is needed then the final regulator_set_enable() is skipped because ret has not been cleared. It seems that the error handling for regulator_set_suspend_value() is also wrong as if this succeeds then the normal boot-on checks are still required, and again ENOSYS needs special treatment here. Fixes: b8931caa4b ("dm: regulator: support regulator more state") Signed-off-by: John Keeping --- drivers/power/regulator/regulator-uclass.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c index aca00e56bb..d608f7c236 100644 --- a/drivers/power/regulator/regulator-uclass.c +++ b/drivers/power/regulator/regulator-uclass.c @@ -288,9 +288,15 @@ int regulator_autoset(struct udevice *dev) uc_pdata = dev_get_uclass_plat(dev); ret = regulator_set_suspend_enable(dev, uc_pdata->suspend_on); + if (ret == -ENOSYS) + ret = 0; + if (!ret && uc_pdata->suspend_on) { ret = regulator_set_suspend_value(dev, uc_pdata->suspend_uV); - if (!ret) + if (ret == -ENOSYS) + ret = 0; + + if (ret) return ret; } -- 2.39.5