From: Philipp Zabel <p.zabel@pengutronix.de>
To: linux-kernel@vger.kernel.org, kernel@pengutronix.de
Cc: Sylwester Nawrocki <s.nawrocki@samsung.com>,
Russell King - ARM Linux <linux@arm.linux.org.uk>,
Greg KH <gregkh@linuxfoundation.org>,
Mauro Carvalho Chehab <m.chehab@samsung.com>,
Tomi Valkeinen <tomi.valkeinen@ti.com>,
Guennadi Liakhovetski <g.liakhovetski@gmx.de>,
Rob Herring <robh+dt@kernel.org>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Kyungmin Park <kyungmin.park@samsung.com>,
devicetree@vger.kernel.org,
Philipp Zabel <p.zabel@pengutronix.de>
Subject: [RFC PATCH 3/3] of: Add OF graph helpers to iterate over ports
Date: Wed, 19 Mar 2014 16:12:04 +0100 [thread overview]
Message-ID: <1395241924-9675-4-git-send-email-p.zabel@pengutronix.de> (raw)
In-Reply-To: <1395241924-9675-1-git-send-email-p.zabel@pengutronix.de>
This patch adds the of_graph_get_next_port function and a for_each_port_of_node
macro using it. This allows to iterate over all ports of a given device node.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
drivers/of/base.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
include/linux/of_graph.h | 12 ++++++++++++
2 files changed, 59 insertions(+)
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 7ecffbe..364042b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -2128,6 +2128,53 @@ struct device_node *of_graph_get_port_by_id(struct device_node *node, int id)
EXPORT_SYMBOL(of_graph_get_port_by_id);
/**
+ * of_graph_get_next_port() - get next port node
+ *
+ * @parent: pointer to the parent device node
+ * @prev: previous port node, or NULL to get first
+ *
+ * Return: A 'port' node pointer with refcount incremented. The caller
+ * has to use of_node_put() on it when done.
+ */
+
+struct device_node *of_graph_get_next_port(const struct device_node *parent,
+ struct device_node *prev)
+{
+ struct of_graph_entity *entity;
+ struct of_graph_port *port;
+
+ if (!parent)
+ return NULL;
+
+ entity = __of_graph_lookup_entity(parent);
+ if (WARN_ONCE(!entity || list_empty(&entity->ports),
+ "%s(): no ports specified for %s\n",
+ __func__, parent->full_name))
+ return NULL;
+
+ if (!prev) {
+ /* It's the first call, we have to find the first port. */
+ port = list_first_entry(&entity->ports,
+ struct of_graph_port, list);
+
+ return of_node_get(port->of_node);
+ }
+
+ of_node_put(prev);
+
+ list_for_each_entry(port, &entity->ports, list) {
+ if (port->of_node == prev &&
+ port != list_last_entry(&entity->ports,
+ struct of_graph_port, list)) {
+ port = list_next_entry(port, list);
+ return of_node_get(port->of_node);
+ }
+ }
+
+ return NULL;
+}
+
+/**
* of_graph_get_next_endpoint() - get next endpoint node
*
* @parent: pointer to the parent device node
diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h
index 2701054..7ed0bfa 100644
--- a/include/linux/of_graph.h
+++ b/include/linux/of_graph.h
@@ -26,6 +26,9 @@ struct of_endpoint {
const struct device_node *local_node;
};
+#define for_each_port_of_node(dn, pp) \
+ for (pp = of_graph_get_next_port(dn, NULL); pp != NULL; \
+ pp = of_graph_get_next_port(dn, pp))
#define for_each_endpoint_of_node(dn, ep) \
for (ep = of_graph_get_next_endpoint(dn, NULL); ep != NULL; \
ep = of_graph_get_next_endpoint(dn, ep))
@@ -34,6 +37,8 @@ struct of_endpoint {
int of_graph_parse_endpoint(const struct device_node *node,
struct of_endpoint *endpoint);
struct device_node *of_graph_get_port_by_id(struct device_node *node, int id);
+struct device_node *of_graph_get_next_port(const struct device_node *parent,
+ struct device_node *previous);
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
struct device_node *previous);
struct device_node *of_graph_get_remote_port_parent(
@@ -56,6 +61,13 @@ static inline struct device_node *of_graph_get_port_by_id(struct device_node *no
return NULL;
}
+static inline struct device_node *of_graph_get_next_port(
+ const struct device_node *parent,
+ struct device_node *previous)
+{
+ return NULL;
+}
+
static inline struct device_node *of_graph_get_next_endpoint(
const struct device_node *parent,
struct device_node *previous)
--
1.9.0
next prev parent reply other threads:[~2014-03-19 15:12 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-19 15:12 [RFC PATCH 0/3] Parse OF graph and create backlinks internally Philipp Zabel
2014-03-19 15:12 ` Philipp Zabel
2014-03-19 15:12 ` [RFC PATCH 1/3] of: Parse OF graph into graph structure Philipp Zabel
2014-03-20 13:22 ` Laurent Pinchart
2014-03-20 13:22 ` Laurent Pinchart
2014-03-19 15:12 ` [RFC PATCH 2/3] of: Add OF graph helper to get a specific port by id Philipp Zabel
2014-03-19 15:12 ` Philipp Zabel [this message]
2014-03-20 22:09 ` [RFC PATCH 0/3] Parse OF graph and create backlinks internally Grant Likely
2014-03-20 22:09 ` Grant Likely
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=1395241924-9675-4-git-send-email-p.zabel@pengutronix.de \
--to=p.zabel@pengutronix.de \
--cc=devicetree@vger.kernel.org \
--cc=g.liakhovetski@gmx.de \
--cc=gregkh@linuxfoundation.org \
--cc=kernel@pengutronix.de \
--cc=kyungmin.park@samsung.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=m.chehab@samsung.com \
--cc=robh+dt@kernel.org \
--cc=s.nawrocki@samsung.com \
--cc=tomi.valkeinen@ti.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.