From 8ccd0d0ca04147e91890c373677f1e741dda2631 Mon Sep 17 00:00:00 2001 From: Hyungwon Hwang Date: Fri, 12 Jun 2015 21:59:01 +0900 Subject: of: add helper for getting endpoint node of specific identifiers When there are multiple ports or multiple endpoints in a port, they have to be distinguished by the value of reg property. It is common. The drivers can get the specific endpoint in the specific port via this function. Now the drivers have to implement this code in themselves or have to force the order of dt nodes to get the right node. Signed-off-by: Hyungwon Hwang Acked-by: Rob Herring Signed-off-by: Inki Dae --- drivers/of/base.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'drivers/of') diff --git a/drivers/of/base.c b/drivers/of/base.c index 99764db0875a..f3b583b81105 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2232,6 +2232,39 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, } EXPORT_SYMBOL(of_graph_get_next_endpoint); +/** + * of_graph_get_endpoint_by_regs() - get endpoint node of specific identifiers + * @parent: pointer to the parent device node + * @port_reg: identifier (value of reg property) of the parent port node + * @reg: identifier (value of reg property) of the endpoint node + * + * Return: An 'endpoint' node pointer which is identified by reg and at the same + * is the child of a port node identified by port_reg. reg and port_reg are + * ignored when they are -1. + */ +struct device_node *of_graph_get_endpoint_by_regs( + const struct device_node *parent, int port_reg, int reg) +{ + struct of_endpoint endpoint; + struct device_node *node, *prev_node = NULL; + + while (1) { + node = of_graph_get_next_endpoint(parent, prev_node); + of_node_put(prev_node); + if (!node) + break; + + of_graph_parse_endpoint(node, &endpoint); + if (((port_reg == -1) || (endpoint.port == port_reg)) && + ((reg == -1) || (endpoint.id == reg))) + return node; + + prev_node = node; + } + + return NULL; +} + /** * of_graph_get_remote_port_parent() - get remote port's parent node * @node: pointer to a local endpoint device_node -- cgit v1.2.3 From 8ffaa90347d80cc20d08c5dd2cdd27dc3fb51b8d Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 23 Jun 2015 10:19:10 +1000 Subject: of: add EXPORT_SYMBOL for of_graph_get_endpoint_by_regs This symbol came via exynos-next, but modular builds are broken so just fix it up now. Signed-off-by: Dave Airlie --- drivers/of/base.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/of') diff --git a/drivers/of/base.c b/drivers/of/base.c index f3b583b81105..62bb4ef96c0c 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2264,6 +2264,7 @@ struct device_node *of_graph_get_endpoint_by_regs( return NULL; } +EXPORT_SYMBOL(of_graph_get_endpoint_by_regs); /** * of_graph_get_remote_port_parent() - get remote port's parent node -- cgit v1.2.3