On 30/08/2025 19:45, Tom Rini wrote:
On Thu, Jul 03, 2025 at 12:53:42PM +0100, Andrew Goodbody wrote:

In regulator_list_autoset there is a test for ret being non-zero and
error being zero but it uses the binary '&' instead of the logical '&&'
which could well lead to unexpected results. Correct this to use the
logical '&&' instead.

This issue found by Smatch.

Signed-off-by: Andrew Goodbody <[email protected]>
---
  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 09567eb9dbb..fbd1f69ac72 100644
--- a/drivers/power/regulator/regulator-uclass.c
+++ b/drivers/power/regulator/regulator-uclass.c
@@ -389,7 +389,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 leads to the testcase failing:
https://source.denx.de/u-boot/u-boot/-/jobs/1234999#L272
which should be fixed in the same commit.

Ah, sorry I did not pick that up. The old incorrect code would ignore all even error returns. A couple of the regulators in the list returned -EALREADY (-114) which was quietly ignored. The corrected code picked this up and returned it, which I think is wrong in this specific case.

V2 coming to ignore -EALREADY.

Andrew

Reply via email to