When the "w1 bus" command is used with no bus master present
a data abort may occur.

This is because uclass_first_device() returns zero, but sets the output
struct udevice pointer to NULL in the no device found case.

Fix w1_get_bus() to account for this and return an error code
as is expected by the callers.

Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
---
 drivers/w1/w1-uclass.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/w1/w1-uclass.c b/drivers/w1/w1-uclass.c
index aecf7fe..cb41b68 100644
--- a/drivers/w1/w1-uclass.c
+++ b/drivers/w1/w1-uclass.c
@@ -115,17 +115,19 @@ int w1_get_bus(int busnum, struct udevice **busp)
        struct udevice *dev;
 
        for (ret = uclass_first_device(UCLASS_W1, &dev);
-            !ret;
-            uclass_next_device(&dev), i++) {
-               if (ret) {
-                       debug("Cannot find w1 bus %d\n", busnum);
-                       return ret;
-               }
+            dev && !ret;
+            ret = uclass_next_device(&dev), i++) {
                if (i == busnum) {
                        *busp = dev;
                        return 0;
                }
        }
+
+       if (!ret) {
+               debug("Cannot find w1 bus %d\n", busnum);
+               ret = -ENODEV;
+       }
+
        return ret;
 }
 
-- 
1.9.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to