[PATCH] regulator: preserve error code properly in regulator_list_autoset()

This code has a & vs && typo so it only preserves odd value error codes and not even value error codes.
Signed-off-by: Dan Carpenter dan.carpenter@linaro.org --- drivers/power/regulator/regulator-uclass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c index 3a6ba69f6d5f..52dd1bd3eafd 100644 --- a/drivers/power/regulator/regulator-uclass.c +++ b/drivers/power/regulator/regulator-uclass.c @@ -380,7 +380,7 @@ int regulator_list_autoset(const char *list_platname[], ret = regulator_autoset_by_name(list_platname[i], &dev); if (ret != -EMEDIUMTYPE && verbose) regulator_show(dev, ret); - if (ret & !error) + if (ret && !error) error = ret;
if (list_devp)

On Wed, 26 Jul 2023 at 01:01, Dan Carpenter dan.carpenter@linaro.org wrote:
This code has a & vs && typo so it only preserves odd value error codes and not even value error codes.
Signed-off-by: Dan Carpenter dan.carpenter@linaro.org
drivers/power/regulator/regulator-uclass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Simon Glass sjg@chromium.org

On Wed, Jul 26, 2023 at 10:01:21AM +0300, Dan Carpenter wrote:
This code has a & vs && typo so it only preserves odd value error codes and not even value error codes.
Signed-off-by: Dan Carpenter dan.carpenter@linaro.org Reviewed-by: Simon Glass sjg@chromium.org
drivers/power/regulator/regulator-uclass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c index 3a6ba69f6d5f..52dd1bd3eafd 100644 --- a/drivers/power/regulator/regulator-uclass.c +++ b/drivers/power/regulator/regulator-uclass.c @@ -380,7 +380,7 @@ int regulator_list_autoset(const char *list_platname[], ret = regulator_autoset_by_name(list_platname[i], &dev); if (ret != -EMEDIUMTYPE && verbose) regulator_show(dev, ret);
if (ret & !error)
if (ret && !error) error = ret;
if (list_devp)
This then leads to the test power_regulator_autoset_list in test/dm/regulator.c failing. Simon, please take a look, thanks.

Hi,
On Tue, 8 Aug 2023 at 15:42, Tom Rini trini@konsulko.com wrote:
On Wed, Jul 26, 2023 at 10:01:21AM +0300, Dan Carpenter wrote:
This code has a & vs && typo so it only preserves odd value error codes and not even value error codes.
Signed-off-by: Dan Carpenter dan.carpenter@linaro.org Reviewed-by: Simon Glass sjg@chromium.org
drivers/power/regulator/regulator-uclass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c index 3a6ba69f6d5f..52dd1bd3eafd 100644 --- a/drivers/power/regulator/regulator-uclass.c +++ b/drivers/power/regulator/regulator-uclass.c @@ -380,7 +380,7 @@ int regulator_list_autoset(const char *list_platname[], ret = regulator_autoset_by_name(list_platname[i], &dev); if (ret != -EMEDIUMTYPE && verbose) regulator_show(dev, ret);
if (ret & !error)
if (ret && !error) error = ret; if (list_devp)
This then leads to the test power_regulator_autoset_list in test/dm/regulator.c failing. Simon, please take a look, thanks.
The failure is: test/dm/regulator.c:379, dm_test_power_regulator_autoset_list(): 0 == regulator_list_autoset(platname_list, dev_list, 0): Expected 0x0 (0), got 0xffffff84 (-124)
This looks to be regulator_autoset() returning -EMEDIUMTYPE because:
(!uc_pdata->always_on && !uc_pdata->boot_on)
You apparently cannot autoset a regulator unless it has one of those enabled. Just adding:
regulator-boot-on;
to LTO2 in arch/sandbox/dts/sandbox_pmic.dtsi
does not fix it:
test/dm/regulator.c:390, dm_test_power_regulator_autoset_list(): regulator_get_value(dev_list[i]) == expected_setting_list[i].voltage: Expected 0x325aa0 (3300000), got 0x2dc6c0 (3000000)
So I suspect this is a real bug and the tests are checking for the bug.
+Jaehoon Chung (power maintainer)
Regards, Simon
participants (3)
-
Dan Carpenter
-
Simon Glass
-
Tom Rini