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: Rob Herring <robh@kernel.org> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
0b382fb3d9
commit
ea47dd191d
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user