summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2012-02-03 15:13:53 (GMT)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>2012-03-29 06:12:49 (GMT)
commitc67822704b73dcfb86debf4c25151e43309af844 (patch)
tree1ed8997f2f8f023fa3ddf2a244c69ba5434deddd /lib
parentf4589a7d6f477876c18eb8087e3ee7fa0a8655ca (diff)
downloadu-boot-c67822704b73dcfb86debf4c25151e43309af844.tar.xz
fdt: Add function to allow aliases to refer to multiple nodes
Some devices can deal with multiple compatible properties. The devices need to know which nodes to bind to which features. For example an I2C driver which supports two different controller types will want to know which type it is dealing with in each case. The new fdtdec_add_aliases_for_id() function deals with this by allowing the driver to search for additional compatible nodes for a different ID. It can then detect the new ones and perform appropriate processing. Another option considered was to return a tuple (node offset, compat id) and have the function be passed a list of compatible IDs. This is more overhead for the common case though. We may add such a function later if more drivers in U-Boot require it. Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Warren <twarren@nvidia.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/fdtdec.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index 5239e79..2149bd7 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -153,10 +153,18 @@ int fdtdec_next_alias(const void *blob, const char *name,
return node;
}
-/* TODO: Can we tighten this code up a little? */
int fdtdec_find_aliases_for_id(const void *blob, const char *name,
enum fdt_compat_id id, int *node_list, int maxcount)
{
+ memset(node_list, '\0', sizeof(*node_list) * maxcount);
+
+ return fdtdec_add_aliases_for_id(blob, name, id, node_list, maxcount);
+}
+
+/* TODO: Can we tighten this code up a little? */
+int fdtdec_add_aliases_for_id(const void *blob, const char *name,
+ enum fdt_compat_id id, int *node_list, int maxcount)
+{
int name_len = strlen(name);
int nodes[maxcount];
int num_found = 0;
@@ -185,8 +193,6 @@ int fdtdec_find_aliases_for_id(const void *blob, const char *name,
__func__, name);
/* Now find all the aliases */
- memset(node_list, '\0', sizeof(*node_list) * maxcount);
-
for (offset = fdt_first_property_offset(blob, alias_node);
offset > 0;
offset = fdt_next_property_offset(blob, offset)) {
@@ -233,11 +239,19 @@ int fdtdec_find_aliases_for_id(const void *blob, const char *name,
* it as done.
*/
if (fdtdec_get_is_enabled(blob, node)) {
+ if (node_list[number]) {
+ debug("%s: warning: alias '%s' requires that "
+ "a node be placed in the list in a "
+ "position which is already filled by "
+ "node '%s'\n", __func__, path,
+ fdt_get_name(blob, node, NULL));
+ continue;
+ }
node_list[number] = node;
if (number >= num_found)
num_found = number + 1;
}
- nodes[j] = 0;
+ nodes[found] = 0;
}
/* Add any nodes not mentioned by an alias */