Hi Philipp, Thank you for the patch. On Wednesday 10 September 2014 12:58:25 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@xxxxxxxxxxxxxx> > --- > Changes since v1: > - Fixed whitespace in comment > - Changed id parameter to of_graph_get_port_by_id to u32 > - Simplified of_graph_get_port_by_id as suggested by Laurent, > making use of port id defaulting to 0 if no "reg" property is given. > --- > 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 a49b5628..b282474 100644 > --- a/drivers/of/base.c > +++ b/drivers/of/base.c > @@ -2053,6 +2053,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 = NULL; No need to initialize port to NULL. > + u32 port_id = 0; > + > + while (true) { > + port = of_get_next_child(node, port); > + if (!port) > + return NULL; How about using for_each_child_of_node() ? > + if (of_node_cmp(port->name, "port") != 0) > + continue; > + of_property_read_u32(port, "reg", &port_id); A port with no reg property will be treated as having the id of the previous port. You can fix this by moving the port_id variable declaration inside the loop. > + if (id == port_id) > + return port; > + } > +} > +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..e028e49 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, int id) id should be u32 here. > +{ > + return NULL; > +} > + > static inline struct device_node *of_graph_get_next_endpoint( > const struct device_node *parent, > struct device_node *previous) -- Regards, Laurent Pinchart -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html