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;
|
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)
|
|||||||
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[];
|
|||||||
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);
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user