
Within /chosen we may have a node which points to another node, similar to how /aliases works. Add a helper function to do this lookup.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v5: - Add new patch to add a function to look up a chosen node
Changes in v4: None Changes in v3: None Changes in v2: None
include/fdtdec.h | 12 ++++++++++++ lib/fdtdec.c | 15 +++++++++++++++ 2 files changed, 27 insertions(+)
diff --git a/include/fdtdec.h b/include/fdtdec.h index 5f88938..2590d30 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -376,6 +376,18 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int node, */ int fdtdec_get_alias_node(const void *blob, const char *name);
+/** + * Get the offset of the given chosen node + * + * This looks up a property in /chosen containing the path to another node, + * then finds the offset of that node. + * + * @param blob Device tree blob (if NULL, then error is returned) + * @param name Property name, e.g. "stdout-path" + * @return Node offset referred to by that chosen node, or -ve FDT_ERR_... + */ +int fdtdec_get_chosen_node(const void *blob, const char *name); + /* * Get the name for a compatible ID * diff --git a/lib/fdtdec.c b/lib/fdtdec.c index c2f3645..06d4542 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -382,6 +382,21 @@ int fdtdec_get_alias_node(const void *blob, const char *name) return fdt_path_offset(blob, prop); }
+int fdtdec_get_chosen_node(const void *blob, const char *name) +{ + const char *prop; + int chosen_node; + int len; + + if (!blob) + return -FDT_ERR_NOTFOUND; + chosen_node = fdt_path_offset(blob, "/chosen"); + prop = fdt_getprop(blob, chosen_node, name, &len); + if (!prop) + return -FDT_ERR_NOTFOUND; + return fdt_path_offset(blob, prop); +} + int fdtdec_check_fdt(void) { /*