power: regulator: fix autoset error handling
authorJohn Keeping <john@metanate.com>
Thu, 8 Sep 2022 11:38:35 +0000 (12:38 +0100)
committerJaehoon Chung <jh80.chung@samsung.com>
Wed, 26 Oct 2022 02:47:12 +0000 (11:47 +0900)
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: 11406b8f7e ("dm: regulator: support regulator more state")
Signed-off-by: John Keeping <john@metanate.com>
drivers/power/regulator/regulator-uclass.c

index aca00e5..d608f7c 100644 (file)
@@ -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;
        }