of/fdt: introduce of_scan_flat_dt_subnodes and of_get_flat_dt_phandle
authorNicholas Piggin <npiggin@gmail.com>
Tue, 18 Apr 2017 19:12:18 +0000 (05:12 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 9 May 2017 12:55:58 +0000 (22:55 +1000)
Introduce primitives for FDT parsing. These will be used for powerpc
cpufeatures node scanning, which has quite complex structure but should
be processed early.

Cc: devicetree@vger.kernel.org
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
drivers/of/fdt.c
include/linux/of_fdt.h

index e5ce4b59e16282cc1240514beec867ae8664e052..961ca97072a9f468e98387bc16d76f8f6a74dfb8 100644 (file)
@@ -753,6 +753,36 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
        return rc;
 }
 
+/**
+ * of_scan_flat_dt_subnodes - scan sub-nodes of a node call callback on each.
+ * @it: callback function
+ * @data: context data pointer
+ *
+ * This function is used to scan sub-nodes of a node.
+ */
+int __init of_scan_flat_dt_subnodes(unsigned long parent,
+                                   int (*it)(unsigned long node,
+                                             const char *uname,
+                                             void *data),
+                                   void *data)
+{
+       const void *blob = initial_boot_params;
+       int node;
+
+       fdt_for_each_subnode(node, blob, parent) {
+               const char *pathp;
+               int rc;
+
+               pathp = fdt_get_name(blob, node, NULL);
+               if (*pathp == '/')
+                       pathp = kbasename(pathp);
+               rc = it(node, pathp, data);
+               if (rc)
+                       return rc;
+       }
+       return 0;
+}
+
 /**
  * of_get_flat_dt_subnode_by_name - get the subnode by given name
  *
@@ -812,6 +842,14 @@ int __init of_flat_dt_match(unsigned long node, const char *const *compat)
        return of_fdt_match(initial_boot_params, node, compat);
 }
 
+/**
+ * of_get_flat_dt_prop - Given a node in the flat blob, return the phandle
+ */
+uint32_t __init of_get_flat_dt_phandle(unsigned long node)
+{
+       return fdt_get_phandle(initial_boot_params, node);
+}
+
 struct fdt_scan_status {
        const char *name;
        int namelen;
index 271b3fdf00709e2752115e0d371cfa397791eec4..1dfbfd0d8040cb56820e43f51fc9bf58b7d117e8 100644 (file)
@@ -54,6 +54,11 @@ extern char __dtb_end[];
 extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname,
                                     int depth, void *data),
                           void *data);
+extern int of_scan_flat_dt_subnodes(unsigned long node,
+                                   int (*it)(unsigned long node,
+                                             const char *uname,
+                                             void *data),
+                                   void *data);
 extern int of_get_flat_dt_subnode_by_name(unsigned long node,
                                          const char *uname);
 extern const void *of_get_flat_dt_prop(unsigned long node, const char *name,
@@ -62,6 +67,7 @@ extern int of_flat_dt_is_compatible(unsigned long node, const char *name);
 extern int of_flat_dt_match(unsigned long node, const char *const *matches);
 extern unsigned long of_get_flat_dt_root(void);
 extern int of_get_flat_dt_size(void);
+extern uint32_t of_get_flat_dt_phandle(unsigned long node);
 
 extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,
                                     int depth, void *data);