Commit ea47dd19 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

of/fdt: introduce of_scan_flat_dt_subnodes and of_get_flat_dt_phandle

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: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 0b382fb3
...@@ -753,6 +753,36 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node, ...@@ -753,6 +753,36 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
return rc; 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 * 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) ...@@ -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); 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 { struct fdt_scan_status {
const char *name; const char *name;
int namelen; int namelen;
......
...@@ -54,6 +54,11 @@ extern char __dtb_end[]; ...@@ -54,6 +54,11 @@ extern char __dtb_end[];
extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname, extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname,
int depth, void *data), int depth, void *data),
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, extern int of_get_flat_dt_subnode_by_name(unsigned long node,
const char *uname); const char *uname);
extern const void *of_get_flat_dt_prop(unsigned long node, const char *name, 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); ...@@ -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 int of_flat_dt_match(unsigned long node, const char *const *matches);
extern unsigned long of_get_flat_dt_root(void); extern unsigned long of_get_flat_dt_root(void);
extern int of_get_flat_dt_size(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, extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,
int depth, void *data); int depth, void *data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment