From: Rob Herring <robh@kernel.org>
To: Frank Rowand <frowand.list@gmail.com>,
Mark Rutland <mark.rutland@arm.com>
Cc: Pantelis Antoniou <pantelis.antoniou@konsulko.com>,
Joe Perches <joe@perches.com>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 2/4] of: find_node_by_full_name rewrite to compare each level
Date: Wed, 14 Jun 2017 15:30:23 -0500 [thread overview]
Message-ID: <20170614203025.7581-3-robh@kernel.org> (raw)
In-Reply-To: <20170614203025.7581-1-robh@kernel.org>
find_node_by_full_name() does the same thing as of_find_node_by_path(),
but takes no locks and doesn't work on aliases. Refactor
of_find_node_opts_by_path() into __of_find_node_by_full_path() and
replace find_node_by_full_name() with it.
Signed-off-by: Rob Herring <robh@kernel.org>
---
drivers/of/base.c | 29 +++++++++++++++++++----------
drivers/of/of_private.h | 3 +++
drivers/of/resolver.c | 30 +++---------------------------
3 files changed, 25 insertions(+), 37 deletions(-)
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 054159ccd5f8..02be991a29c5 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -780,6 +780,24 @@ static struct device_node *__of_find_node_by_path(struct device_node *parent,
return NULL;
}
+struct device_node *__of_find_node_by_full_path(struct device_node *node,
+ const char *path)
+{
+ const char *separator = strchr(path, ':');
+
+ while (node && *path == '/') {
+ struct device_node *tmp = node;
+
+ path++; /* Increment past '/' delimiter */
+ node = __of_find_node_by_path(node, path);
+ of_node_put(tmp);
+ path = strchrnul(path, '/');
+ if (separator && separator < path)
+ break;
+ }
+ return node;
+}
+
/**
* of_find_node_opts_by_path - Find a node matching a full OF path
* @path: Either the full path to match, or if the path does not
@@ -839,16 +857,7 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt
raw_spin_lock_irqsave(&devtree_lock, flags);
if (!np)
np = of_node_get(of_root);
- while (np && *path == '/') {
- struct device_node *tmp = np;
-
- path++; /* Increment past '/' delimiter */
- np = __of_find_node_by_path(np, path);
- of_node_put(tmp);
- path = strchrnul(path, '/');
- if (separator && separator < path)
- break;
- }
+ np =__of_find_node_by_full_path(np, path);
raw_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 4ebb0149d118..e7bbfa3e9632 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -77,6 +77,9 @@ extern void *__unflatten_device_tree(const void *blob,
struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
__printf(2, 3) struct device_node *__of_node_dup(const struct device_node *np, const char *fmt, ...);
+struct device_node *__of_find_node_by_full_path(struct device_node *node,
+ const char *path);
+
extern const void *__of_get_property(const struct device_node *np,
const char *name, int *lenp);
extern int __of_add_property(struct device_node *np, struct property *prop);
diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
index 63626d7d9adb..b3f987c1301b 100644
--- a/drivers/of/resolver.c
+++ b/drivers/of/resolver.c
@@ -20,35 +20,11 @@
#include <linux/errno.h>
#include <linux/slab.h>
+#include "of_private.h"
+
/* illegal phandle value (set when unresolved) */
#define OF_PHANDLE_ILLEGAL 0xdeadbeef
-/**
- * Find a node with the give full name by recursively following any of
- * the child node links.
- */
-static struct device_node *find_node_by_full_name(struct device_node *node,
- const char *full_name)
-{
- struct device_node *child, *found;
-
- if (!node)
- return NULL;
-
- if (!of_node_cmp(node->full_name, full_name))
- return of_node_get(node);
-
- for_each_child_of_node(node, child) {
- found = find_node_by_full_name(child, full_name);
- if (found != NULL) {
- of_node_put(child);
- return found;
- }
- }
-
- return NULL;
-}
-
static phandle live_tree_max_phandle(void)
{
struct device_node *node;
@@ -138,7 +114,7 @@ static int update_usages_of_a_phandle_reference(struct device_node *overlay,
if (err)
goto err_fail;
- refnode = find_node_by_full_name(overlay, node_path);
+ refnode = __of_find_node_by_full_path(overlay, node_path);
if (!refnode)
continue;
--
2.11.0
next prev parent reply other threads:[~2017-06-14 20:30 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-14 20:30 [PATCH 0/4] DT printf format specifiers Rob Herring
2017-06-14 20:30 ` Rob Herring
[not found] ` <20170614203025.7581-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-06-14 20:30 ` [PATCH 1/4] of: use kbasename instead of open coding Rob Herring
2017-06-14 20:30 ` Rob Herring
[not found] ` <20170614203025.7581-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-06-17 17:30 ` Andy Shevchenko
2017-06-17 17:30 ` Andy Shevchenko
2017-06-14 20:30 ` Rob Herring [this message]
2017-06-14 20:30 ` [PATCH 3/4] of: Custom printk format specifier for device node Rob Herring
[not found] ` <20170614203025.7581-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-06-14 20:56 ` Joe Perches
2017-06-14 20:56 ` Joe Perches
[not found] ` <1497473808.18751.70.camel-6d6DIl74uiNBDgjK7y7TUQ@public.gmane.org>
2017-06-15 12:30 ` Rob Herring
2017-06-15 12:30 ` Rob Herring
[not found] ` <CAL_JsqJ_cc46Hf2XdZoXkgZyOh+0KXVXfeWYe1100E9vuRt12A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-06-15 16:51 ` Joe Perches
2017-06-15 16:51 ` Joe Perches
2017-06-15 21:26 ` Rob Herring
2017-06-15 21:26 ` Rob Herring
2017-06-15 21:50 ` Joe Perches
2017-06-15 21:50 ` Joe Perches
2017-06-22 20:44 ` [PATCH v2] vsprintf: Add %p extension "%pOF" for device tree Rob Herring
2017-06-22 20:44 ` Rob Herring
2017-06-22 22:44 ` Randy Dunlap
[not found] ` <d22444aa-39da-ec74-42a1-63f1fa40c7d3-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2017-06-23 14:08 ` Rob Herring
2017-06-23 14:08 ` Rob Herring
[not found] ` <20170622204445.14930-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-06-23 3:01 ` Joe Perches
2017-06-23 3:01 ` Joe Perches
[not found] ` <1498186912.24295.9.camel-6d6DIl74uiNBDgjK7y7TUQ@public.gmane.org>
2017-06-23 14:13 ` Rob Herring
2017-06-23 14:13 ` Rob Herring
2017-06-23 17:30 ` [PATCH v3] " Rob Herring
[not found] ` <20170623173053.636-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-06-23 17:38 ` Joe Perches
2017-06-23 17:38 ` Joe Perches
2017-06-14 20:30 ` [PATCH 4/4] of: Convert to using %pOF instead of full_name Rob Herring
[not found] ` <20170614203025.7581-5-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-06-14 20:58 ` Joe Perches
2017-06-14 20:58 ` Joe Perches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170614203025.7581-3-robh@kernel.org \
--to=robh@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=frowand.list@gmail.com \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=pantelis.antoniou@konsulko.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.