of/fdt: Remove of_scan_flat_dt() usage for __fdt_scan_reserved_mem()
authorRob Herring <robh@kernel.org>
Wed, 20 Oct 2021 20:44:36 +0000 (15:44 -0500)
committerRob Herring <robh@kernel.org>
Tue, 2 Nov 2021 01:33:56 +0000 (20:33 -0500)
Use of the of_scan_flat_dt() function predates libfdt and is discouraged
as libfdt provides a nicer set of APIs. Rework __fdt_scan_reserved_mem()
to be called directly and use libfdt.

Cc: Frank Rowand <frowand.list@gmail.com>
Link: https://lore.kernel.org/r/20211029183615.2721777-1-robh@kernel.org/
Signed-off-by: Rob Herring <robh@kernel.org>
drivers/of/fdt.c

index 4546572af24bbf1433460b6a837477041e5286fa..bdca35284cebd569731f74eae6b58d789f31910b 100644 (file)
@@ -562,39 +562,35 @@ static int __init __reserved_mem_check_root(unsigned long node)
 }
 
 /*
- * __fdt_scan_reserved_mem() - scan a single FDT node for reserved memory
+ * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory
  */
-static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname,
-                                         int depth, void *data)
+static int __init fdt_scan_reserved_mem(void)
 {
-       static int found;
-       int err;
-
-       if (!found && depth == 1 && strcmp(uname, "reserved-memory") == 0) {
-               if (__reserved_mem_check_root(node) != 0) {
-                       pr_err("Reserved memory: unsupported node format, ignoring\n");
-                       /* break scan */
-                       return 1;
-               }
-               found = 1;
-               /* scan next node */
-               return 0;
-       } else if (!found) {
-               /* scan next node */
-               return 0;
-       } else if (found && depth < 2) {
-               /* scanning of /reserved-memory has been finished */
-               return 1;
+       int node, child;
+       const void *fdt = initial_boot_params;
+
+       node = fdt_path_offset(fdt, "/reserved-memory");
+       if (node < 0)
+               return -ENODEV;
+
+       if (__reserved_mem_check_root(node) != 0) {
+               pr_err("Reserved memory: unsupported node format, ignoring\n");
+               return -EINVAL;
        }
 
-       if (!of_fdt_device_is_available(initial_boot_params, node))
-               return 0;
+       fdt_for_each_subnode(child, fdt, node) {
+               const char *uname;
+               int err;
 
-       err = __reserved_mem_reserve_reg(node, uname);
-       if (err == -ENOENT && of_get_flat_dt_prop(node, "size", NULL))
-               fdt_reserved_mem_save_node(node, uname, 0, 0);
+               if (!of_fdt_device_is_available(fdt, child))
+                       continue;
 
-       /* scan next node */
+               uname = fdt_get_name(fdt, child, NULL);
+
+               err = __reserved_mem_reserve_reg(child, uname);
+               if (err == -ENOENT && of_get_flat_dt_prop(child, "size", NULL))
+                       fdt_reserved_mem_save_node(child, uname, 0, 0);
+       }
        return 0;
 }
 
@@ -645,7 +641,7 @@ void __init early_init_fdt_scan_reserved_mem(void)
                early_init_dt_reserve_memory_arch(base, size, false);
        }
 
-       of_scan_flat_dt(__fdt_scan_reserved_mem, NULL);
+       fdt_scan_reserved_mem();
        fdt_init_reserved_mem();
        fdt_reserve_elfcorehdr();
 }