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> --- drivers/of/base.c | 30 ++++++++++++++++++++++++++++++ include/linux/of_graph.h | 7 +++++++ 2 files changed, 37 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index a49b5628..6044c15 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2053,6 +2053,36 @@ 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, int id) +{ + struct device_node *port = NULL; + int port_id; + + while (true) { + port = of_get_next_child(node, port); + if (!port) + return NULL; + if (of_node_cmp(port->name, "port") != 0) + continue; + if (of_property_read_u32(port, "reg", &port_id)) { + if (!id) + return port; + } else { + 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 2890a4c..24ceb4b 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -33,6 +33,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, int 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( @@ -46,6 +47,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) +{ + return NULL; +} + static inline struct device_node *of_graph_get_next_endpoint( const struct device_node *parent, struct device_node *previous) -- 2.1.0.rc1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel