Message ID | 1419261091-29888-4-git-send-email-p.zabel@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Philipp, On 12/22/2014 04:11 PM, Philipp Zabel wrote: > This patch adds a function to get a port device tree node by port id, > or reg property value. > > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> > Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/of/base.c | 26 ++++++++++++++++++++++++++ > include/linux/of_graph.h | 7 +++++++ > 2 files changed, 33 insertions(+) > > diff --git a/drivers/of/base.c b/drivers/of/base.c > index aac66df..c816299 100644 > --- a/drivers/of/base.c > +++ b/drivers/of/base.c > @@ -2080,6 +2080,32 @@ int of_graph_parse_endpoint(const struct device_node *node, > EXPORT_SYMBOL(of_graph_parse_endpoint); > > /** > + * of_graph_get_port_by_id() - get the port matching a given id > + * @parent: pointer to the parent device node Here you have 'parent' and 'node' in the code. > + * @id: id of the port > + * > + * 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_port_by_id(struct device_node *node, u32 id) > +{ > + struct device_node *port; > + > + for_each_child_of_node(node, port) { > + u32 port_id = 0; > + > + if (of_node_cmp(port->name, "port") != 0) > + continue; > + of_property_read_u32(port, "reg", &port_id); > + if (id == port_id) > + return port; > + } > + > + return NULL; > +} Maybe I miss something but it does not handle optional 'ports' node. Regards Andrzej > +EXPORT_SYMBOL(of_graph_get_port_by_id); > + > +/** > * of_graph_get_next_endpoint() - get next endpoint node > * @parent: pointer to the parent device node > * @prev: previous endpoint node, or NULL to get first > diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h > index e43442e..3c1c95a 100644 > --- a/include/linux/of_graph.h > +++ b/include/linux/of_graph.h > @@ -40,6 +40,7 @@ struct of_endpoint { > #ifdef CONFIG_OF > 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, u32 id); > 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( > @@ -53,6 +54,12 @@ static inline int of_graph_parse_endpoint(const struct device_node *node, > return -ENOSYS; > } > > +static inline struct device_node *of_graph_get_port_by_id( > + struct device_node *node, u32 id) > +{ > + return NULL; > +} > + > static inline struct device_node *of_graph_get_next_endpoint( > const struct device_node *parent, > struct device_node *previous) >
Hi Andrzej, On Tue, Dec 23, 2014 at 12:10:00PM +0100, Andrzej Hajda wrote: [...] > > /** > > + * of_graph_get_port_by_id() - get the port matching a given id > > + * @parent: pointer to the parent device node > > Here you have 'parent' and 'node' in the code. [...] > Maybe I miss something but it does not handle optional 'ports' node. You missed nothing, thank you for the comments! I'll fix both issues like this: struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id) { struct device_node *node, *port; node = of_get_child_by_name(parent, "ports"); if (node) parent = node; for_each_child_of_node(parent, port) { u32 port_id = 0; if (of_node_cmp(port->name, "port") != 0) continue; of_property_read_u32(port, "reg", &port_id); if (id == port_id) break; } of_node_put(node); return port; } regards Philipp
diff --git a/drivers/of/base.c b/drivers/of/base.c index aac66df..c816299 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2080,6 +2080,32 @@ int of_graph_parse_endpoint(const struct device_node *node, EXPORT_SYMBOL(of_graph_parse_endpoint); /** + * of_graph_get_port_by_id() - get the port matching a given id + * @parent: pointer to the parent device node + * @id: id of the port + * + * 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_port_by_id(struct device_node *node, u32 id) +{ + struct device_node *port; + + for_each_child_of_node(node, port) { + u32 port_id = 0; + + if (of_node_cmp(port->name, "port") != 0) + continue; + of_property_read_u32(port, "reg", &port_id); + if (id == port_id) + return port; + } + + return NULL; +} +EXPORT_SYMBOL(of_graph_get_port_by_id); + +/** * of_graph_get_next_endpoint() - get next endpoint node * @parent: pointer to the parent device node * @prev: previous endpoint node, or NULL to get first diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index e43442e..3c1c95a 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -40,6 +40,7 @@ struct of_endpoint { #ifdef CONFIG_OF 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, u32 id); 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( @@ -53,6 +54,12 @@ static inline int of_graph_parse_endpoint(const struct device_node *node, return -ENOSYS; } +static inline struct device_node *of_graph_get_port_by_id( + struct device_node *node, u32 id) +{ + return NULL; +} + static inline struct device_node *of_graph_get_next_endpoint( const struct device_node *parent, struct device_node *previous)