Skip to content

Commit

Permalink
of: introduce of_graph_get_remote_node
Browse files Browse the repository at this point in the history
The OF graph API leaves too much of the graph walking to clients when
in many cases the driver doesn't care about accessing the port or
endpoint nodes. The drivers typically just want the device connected via
a particular graph connection. of_graph_get_remote_node provides this
functionality.

Signed-off-by: Rob Herring <[email protected]>
Acked-by: Philipp Zabel <[email protected]>
  • Loading branch information
robherring committed Feb 15, 2017
1 parent bd0096d commit b85ad49
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
37 changes: 37 additions & 0 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -2472,3 +2472,40 @@ struct device_node *of_graph_get_remote_port(const struct device_node *node)
return of_get_next_parent(np);
}
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);
8 changes: 8 additions & 0 deletions include/linux/of_graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ struct device_node *of_graph_get_endpoint_by_regs(
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);
struct device_node *of_graph_get_remote_node(const struct device_node *node,
u32 port, u32 endpoint);
#else

static inline int of_graph_parse_endpoint(const struct device_node *node,
Expand Down Expand Up @@ -89,6 +91,12 @@ static inline struct device_node *of_graph_get_remote_port(
{
return NULL;
}
static inline struct device_node *of_graph_get_remote_node(
const struct device_node *node,
u32 port, u32 endpoint)
{
return NULL;
}

#endif /* CONFIG_OF */

Expand Down

0 comments on commit b85ad49

Please sign in to comment.