of_graph: add of_graph_get_port_parent()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 20 Apr 2017 01:32:17 +0000 (01:32 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 17 May 2017 09:21:12 +0000 (10:21 +0100)
Linux kernel already has of_graph_get_remote_port_parent(),
but, sometimes we want to get own port parent.
This patch adds of_graph_get_port_parent()

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/of/base.c
include/linux/of_graph.h

index b169508a9b56c723fd67d282897cb97761bade4a..4c305599a664dde0e9ccb880641d1fa4f4892496 100644 (file)
@@ -2500,6 +2500,27 @@ struct device_node *of_graph_get_remote_endpoint(const struct device_node *node)
 }
 EXPORT_SYMBOL(of_graph_get_remote_endpoint);
 
+/**
+ * of_graph_get_port_parent() - get port's parent node
+ * @node: pointer to a local endpoint device_node
+ *
+ * Return: device node associated with endpoint node linked
+ *        to @node. Use of_node_put() on it when done.
+ */
+struct device_node *of_graph_get_port_parent(struct device_node *node)
+{
+       unsigned int depth;
+
+       /* Walk 3 levels up only if there is 'ports' node. */
+       for (depth = 3; depth && node; depth--) {
+               node = of_get_next_parent(node);
+               if (depth == 2 && of_node_cmp(node->name, "ports"))
+                       break;
+       }
+       return node;
+}
+EXPORT_SYMBOL(of_graph_get_port_parent);
+
 /**
  * of_graph_get_remote_port_parent() - get remote port's parent node
  * @node: pointer to a local endpoint device_node
@@ -2511,18 +2532,11 @@ struct device_node *of_graph_get_remote_port_parent(
                               const struct device_node *node)
 {
        struct device_node *np;
-       unsigned int depth;
 
        /* Get remote endpoint node. */
        np = of_graph_get_remote_endpoint(node);
 
-       /* Walk 3 levels up only if there is 'ports' node. */
-       for (depth = 3; depth && np; depth--) {
-               np = of_get_next_parent(np);
-               if (depth == 2 && of_node_cmp(np->name, "ports"))
-                       break;
-       }
-       return np;
+       return of_graph_get_port_parent(np);
 }
 EXPORT_SYMBOL(of_graph_get_remote_port_parent);
 
index 0c9473a169dd5c5631bb7c69aa2654936ceeee2a..9db632d16cbcb0199019e3ae88ed309d62122b3c 100644 (file)
@@ -50,6 +50,7 @@ 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_endpoint(
                                        const struct device_node *node);
+struct device_node *of_graph_get_port_parent(struct device_node *node);
 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);
@@ -88,6 +89,12 @@ static inline struct device_node *of_graph_get_remote_endpoint(
        return NULL;
 }
 
+static inline struct device_node *of_graph_get_port_parent(
+       struct device_node *node)
+{
+       return NULL;
+}
+
 static inline struct device_node *of_graph_get_remote_port_parent(
                                        const struct device_node *node)
 {