From 9c6287d6a14b7f7105e4b61774c5310cb96489c3 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 11 Aug 2014 11:37:01 +0000 Subject: brcm63xx: add support for registering parallel flash through dtb Add the required nodes to the dtsi files and code to prevent double registration from the board support code. Signed-off-by: Jonas Gorski SVN-Revision: 42123 --- ...-Make-of_find_node_by_path-handle-aliases.patch | 106 +++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 target/linux/brcm63xx/patches-3.14/003-of-Make-of_find_node_by_path-handle-aliases.patch (limited to 'target/linux/brcm63xx/patches-3.14/003-of-Make-of_find_node_by_path-handle-aliases.patch') diff --git a/target/linux/brcm63xx/patches-3.14/003-of-Make-of_find_node_by_path-handle-aliases.patch b/target/linux/brcm63xx/patches-3.14/003-of-Make-of_find_node_by_path-handle-aliases.patch new file mode 100644 index 0000000..9ad0780 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.14/003-of-Make-of_find_node_by_path-handle-aliases.patch @@ -0,0 +1,106 @@ +From c22e650e66b862babe9c00bebb20b8029c7b0362 Mon Sep 17 00:00:00 2001 +From: Grant Likely +Date: Fri, 14 Mar 2014 17:07:12 +0000 +Subject: [PATCH] of: Make of_find_node_by_path() handle /aliases + +Make of_find_node_by_path() handle aliases as prefixes. To make this +work the name search is refactored to search by path component instead +of by full string. This should be a more efficient search, and it makes +it possible to start a search at a subnode of a tree. + +Signed-off-by: David Daney +Signed-off-by: Pantelis Antoniou +[grant.likely: Rework to not require allocating at runtime] +Acked-by: Rob Herring +Signed-off-by: Grant Likely +--- + drivers/of/base.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 61 insertions(+), 6 deletions(-) + +--- a/drivers/of/base.c ++++ b/drivers/of/base.c +@@ -633,23 +633,78 @@ struct device_node *of_get_child_by_name + } + EXPORT_SYMBOL(of_get_child_by_name); + ++static struct device_node *__of_find_node_by_path(struct device_node *parent, ++ const char *path) ++{ ++ struct device_node *child; ++ int len = strchrnul(path, '/') - path; ++ ++ if (!len) ++ return NULL; ++ ++ __for_each_child_of_node(parent, child) { ++ const char *name = strrchr(child->full_name, '/'); ++ if (WARN(!name, "malformed device_node %s\n", child->full_name)) ++ continue; ++ name++; ++ if (strncmp(path, name, len) == 0 && (strlen(name) == len)) ++ return child; ++ } ++ return NULL; ++} ++ + /** + * of_find_node_by_path - Find a node matching a full OF path +- * @path: The full path to match ++ * @path: Either the full path to match, or if the path does not ++ * start with '/', the name of a property of the /aliases ++ * node (an alias). In the case of an alias, the node ++ * matching the alias' value will be returned. ++ * ++ * Valid paths: ++ * /foo/bar Full path ++ * foo Valid alias ++ * foo/bar Valid alias + relative path + * + * Returns a node pointer with refcount incremented, use + * of_node_put() on it when done. + */ + struct device_node *of_find_node_by_path(const char *path) + { +- struct device_node *np = of_allnodes; ++ struct device_node *np = NULL; ++ struct property *pp; + unsigned long flags; + ++ if (strcmp(path, "/") == 0) ++ return of_node_get(of_allnodes); ++ ++ /* The path could begin with an alias */ ++ if (*path != '/') { ++ char *p = strchrnul(path, '/'); ++ int len = p - path; ++ ++ /* of_aliases must not be NULL */ ++ if (!of_aliases) ++ return NULL; ++ ++ for_each_property_of_node(of_aliases, pp) { ++ if (strlen(pp->name) == len && !strncmp(pp->name, path, len)) { ++ np = of_find_node_by_path(pp->value); ++ break; ++ } ++ } ++ if (!np) ++ return NULL; ++ path = p; ++ } ++ ++ /* Step down the tree matching path components */ + raw_spin_lock_irqsave(&devtree_lock, flags); +- for (; np; np = np->allnext) { +- if (np->full_name && (of_node_cmp(np->full_name, path) == 0) +- && of_node_get(np)) +- break; ++ if (!np) ++ np = of_node_get(of_allnodes); ++ while (np && *path == '/') { ++ path++; /* Increment past '/' delimiter */ ++ np = __of_find_node_by_path(np, path); ++ path = strchrnul(path, '/'); + } + raw_spin_unlock_irqrestore(&devtree_lock, flags); + return np; -- cgit v1.1