lib: utils/reset: Fix fdt_reset to search for more dt nodes
authorXiang W <wxjstz@126.com>
Tue, 11 Jun 2024 11:19:34 +0000 (19:19 +0800)
committerAnup Patel <anup@brainfault.org>
Thu, 13 Jun 2024 13:19:51 +0000 (18:49 +0530)
If there are multiple dt nodes, the previous code only tries to match
the first one, which may lose initialization.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
lib/utils/reset/fdt_reset.c

index 327fb991d4ed3d3872d6091da55105dd87a676a7..c41b838708b040635877648f10365629860b06ce 100644 (file)
@@ -22,22 +22,24 @@ int fdt_reset_driver_init(void *fdt, struct fdt_reset *drv)
        int noff, rc = SBI_ENODEV;
        const struct fdt_match *match;
 
-       noff = fdt_find_match(fdt, -1, drv->match_table, &match);
-       if (noff < 0)
-               return SBI_ENODEV;
-
-       if (!fdt_node_is_enabled(fdt, noff))
-               return SBI_ENODEV;
-
-       if (drv->init) {
-               rc = drv->init(fdt, noff, match);
-               if (rc && rc != SBI_ENODEV) {
-                       sbi_printf("%s: %s init failed, %d\n",
-                                  __func__, match->compatible, rc);
+       noff = -1;
+       while ((noff = fdt_find_match(fdt, noff,
+                               drv->match_table, &match)) >= 0) {
+               if (!fdt_node_is_enabled(fdt, noff))
+                       continue;
+
+               if (drv->init) {
+                       rc = drv->init(fdt, noff, match);
+                       if (rc && rc != SBI_ENODEV) {
+                               sbi_printf("%s: %s init failed, %d\n",
+                                       __func__, match->compatible, rc);
+                       }
                }
+
+               return rc;
        }
 
-       return rc;
+       return SBI_ENODEV;
 }
 
 void fdt_reset_init(void)