|
@@ -2472,3 +2472,40 @@ struct device_node *of_graph_get_remote_port(const struct device_node *node)
|
|
|
return of_get_next_parent(np);
|
|
return of_get_next_parent(np);
|
|
|
}
|
|
}
|
|
|
EXPORT_SYMBOL(of_graph_get_remote_port);
|
|
EXPORT_SYMBOL(of_graph_get_remote_port);
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * of_graph_get_remote_node() - get remote parent device_node for given port/endpoint
|
|
|
|
|
+ * @node: pointer to parent device_node containing graph port/endpoint
|
|
|
|
|
+ * @port: identifier (value of reg property) of the parent port node
|
|
|
|
|
+ * @endpoint: identifier (value of reg property) of the endpoint node
|
|
|
|
|
+ *
|
|
|
|
|
+ * Return: Remote device node associated with remote endpoint node linked
|
|
|
|
|
+ * to @node. Use of_node_put() on it when done.
|
|
|
|
|
+ */
|
|
|
|
|
+struct device_node *of_graph_get_remote_node(const struct device_node *node,
|
|
|
|
|
+ u32 port, u32 endpoint)
|
|
|
|
|
+{
|
|
|
|
|
+ struct device_node *endpoint_node, *remote;
|
|
|
|
|
+
|
|
|
|
|
+ endpoint_node = of_graph_get_endpoint_by_regs(node, port, endpoint);
|
|
|
|
|
+ if (!endpoint_node) {
|
|
|
|
|
+ pr_debug("no valid endpoint (%d, %d) for node %s\n",
|
|
|
|
|
+ port, endpoint, node->full_name);
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ remote = of_graph_get_remote_port_parent(endpoint_node);
|
|
|
|
|
+ of_node_put(endpoint_node);
|
|
|
|
|
+ if (!remote) {
|
|
|
|
|
+ pr_debug("no valid remote node\n");
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!of_device_is_available(remote)) {
|
|
|
|
|
+ pr_debug("not available for remote node\n");
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return remote;
|
|
|
|
|
+}
|
|
|
|
|
+EXPORT_SYMBOL(of_graph_get_remote_node);
|