summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2014-09-04 16:27:24 -0600
committerSimon Glass <sjg@chromium.org>2014-09-10 12:59:59 -0600
commitaac07d49d00b4bc8ca3f4aca0f3ad26385fb1d37 (patch)
tree5fd5a26caa1150bad11fb2d06e27d3f5a219dbf7
parentaddf9513d0b1a57062a8604330e8c0e822d9d214 (diff)
downloadu-boot-imx-aac07d49d00b4bc8ca3f4aca0f3ad26385fb1d37.zip
u-boot-imx-aac07d49d00b4bc8ca3f4aca0f3ad26385fb1d37.tar.gz
u-boot-imx-aac07d49d00b4bc8ca3f4aca0f3ad26385fb1d37.tar.bz2
dm: fdt: Add a function to look up a chosen node
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>
-rw-r--r--include/fdtdec.h12
-rw-r--r--lib/fdtdec.c15
2 files changed, 27 insertions, 0 deletions
diff --git a/include/fdtdec.h b/include/fdtdec.h
index 856e6cf..4f5aafb 100644
--- a/include/fdtdec.h
+++ b/include/fdtdec.h
@@ -374,6 +374,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 eb5aa20..2b08be2 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -380,6 +380,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)
{
/*