]> git.karo-electronics.de Git - linux-beck.git/commitdiff
of: add helper for getting endpoint node of specific identifiers
authorHyungwon Hwang <human.hwang@samsung.com>
Fri, 12 Jun 2015 12:59:01 +0000 (21:59 +0900)
committerInki Dae <inki.dae@samsung.com>
Mon, 22 Jun 2015 10:56:51 +0000 (19:56 +0900)
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 <human.hwang@samsung.com>
Acked-by: Rob Herring <robh+dt@kernel.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/of/base.c
include/linux/of_graph.h

index 99764db0875aa0e1b34ca348ca1606c2a8990258..f3b583b811059a13d47ed11dc590ae92982ecc75 100644 (file)
@@ -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
index 7bc92e0506087d0b97995a9aa74cc56060c12fa8..1c1d5b901a72f2d458bf00ef47d3ea6b0d1c57eb 100644 (file)
@@ -45,6 +45,8 @@ int of_graph_parse_endpoint(const struct device_node *node,
 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_endpoint_by_regs(
+               const struct device_node *parent, int port_reg, int reg);
 struct device_node *of_graph_get_remote_port_parent(
                                        const struct device_node *node);
 struct device_node *of_graph_get_remote_port(const struct device_node *node);
@@ -69,6 +71,12 @@ static inline struct device_node *of_graph_get_next_endpoint(
        return NULL;
 }
 
+struct device_node *of_graph_get_endpoint_by_regs(
+               const struct device_node *parent, int port_reg, int reg)
+{
+       return NULL;
+}
+
 static inline struct device_node *of_graph_get_remote_port_parent(
                                        const struct device_node *node)
 {