summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Van Baren <gvb@unssw.com>2011-07-14 21:40:10 -0400
committerGerald Van Baren <gvb@unssw.com>2011-07-14 21:43:45 -0400
commita8d2a75d729ef0a701258a4b5bfcaf121fa30463 (patch)
treef0d94cc0ffde9c4268d2779fb0190f0d3fc3e7d9
parentb3606f141e56df972b5caf5e2316d652f0089ee6 (diff)
fdt: introduce fdt_create_phandle()
The ePAPR specification says that phandle properties should be called "phandle", and not "linux,phandle". To facilitate the migration from "linux,phandle" to "phandle", introduce function fdt_create_phandle(), which creates a phandle in a given node. For now, we create both the "phandle" and "linux,phandle" properties. A later version of this function will remove support for "linux,phandle". Signed-off-by: Timur Tabi <timur@freescale.com>
-rw-r--r--common/fdt_support.c40
-rw-r--r--include/fdt_support.h1
2 files changed, 41 insertions, 0 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c
index 150a3c5a591..19b2ef6ea4b 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -1195,6 +1195,46 @@ int fdt_alloc_phandle(void *blob)
return phandle + 1;
}
+/*
+ * fdt_create_phandle: Create a phandle property for the given node
+ *
+ * @fdt: ptr to device tree
+ * @nodeoffset: node to update
+ * @phandle: phandle value to set (must be unique)
+*/
+int fdt_create_phandle(void *fdt, int nodeoffset, uint32_t phandle)
+{
+ int ret;
+
+#ifdef DEBUG
+ int off = fdt_node_offset_by_phandle(fdt, phandle);
+
+ if ((off >= 0) && (off != nodeoffset)) {
+ char buf[64];
+
+ fdt_get_path(fdt, nodeoffset, buf, sizeof(buf));
+ printf("Trying to update node %s with phandle %u ",
+ buf, phandle);
+
+ fdt_get_path(fdt, off, buf, sizeof(buf));
+ printf("that already exists in node %s.\n", buf);
+ return -FDT_ERR_BADPHANDLE;
+ }
+#endif
+
+ ret = fdt_setprop_cell(fdt, nodeoffset, "phandle", phandle);
+ if (ret < 0)
+ return ret;
+
+ /*
+ * For now, also set the deprecated "linux,phandle" property, so that we
+ * don't break older kernels.
+ */
+ ret = fdt_setprop_cell(fdt, nodeoffset, "linux,phandle", phandle);
+
+ return ret;
+}
+
#if defined(CONFIG_VIDEO)
int fdt_add_edid(void *blob, const char *compat, unsigned char *edid_buf)
{
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 382f63221dd..863024ff775 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -89,6 +89,7 @@ u64 fdt_translate_address(void *blob, int node_offset, const u32 *in_addr);
int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
phys_addr_t compat_off);
int fdt_alloc_phandle(void *blob);
+int fdt_create_phandle(void *fdt, int nodeoffset, uint32_t phandle);
int fdt_add_edid(void *blob, const char *compat, unsigned char *buf);
int fdt_verify_alias_address(void *fdt, int anode, const char *alias,