diff options
author | Sakari Ailus <sakari.ailus@linux.intel.com> | 2017-06-06 12:37:40 +0300 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-06-22 02:55:34 +0200 |
commit | 125ee6b3b0fa920c730b0991e6f083a9f5b1e4c3 (patch) | |
tree | 92bdb7f5078385f1b2d19fccc49ddb124793bd95 /drivers/base/property.c | |
parent | 2294b3af05e9b3fe0b84a78971e709037bd7593c (diff) | |
download | linux-stable-125ee6b3b0fa920c730b0991e6f083a9f5b1e4c3.tar.gz linux-stable-125ee6b3b0fa920c730b0991e6f083a9f5b1e4c3.tar.bz2 linux-stable-125ee6b3b0fa920c730b0991e6f083a9f5b1e4c3.zip |
device property: Add FW type agnostic fwnode_graph_get_remote_node
Add fwnode_graph_get_remote_node() function which is equivalent to
of_graph_get_remote_node() on OF.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base/property.c')
-rw-r--r-- | drivers/base/property.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/base/property.c b/drivers/base/property.c index b979f8a2f4fb..ac3590b1f93d 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -1216,6 +1216,43 @@ fwnode_graph_get_remote_endpoint(struct fwnode_handle *fwnode) EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint); /** + * fwnode_graph_get_remote_node - get remote parent node for given port/endpoint + * @fwnode: pointer to parent fwnode_handle containing graph port/endpoint + * @port_id: identifier of the parent port node + * @endpoint_id: identifier of the endpoint node + * + * Return: Remote fwnode handle associated with remote endpoint node linked + * to @node. Use fwnode_node_put() on it when done. + */ +struct fwnode_handle *fwnode_graph_get_remote_node(struct fwnode_handle *fwnode, + u32 port_id, u32 endpoint_id) +{ + struct fwnode_handle *endpoint = NULL; + + while ((endpoint = fwnode_graph_get_next_endpoint(fwnode, endpoint))) { + struct fwnode_endpoint fwnode_ep; + struct fwnode_handle *remote; + int ret; + + ret = fwnode_graph_parse_endpoint(endpoint, &fwnode_ep); + if (ret < 0) + continue; + + if (fwnode_ep.port != port_id || fwnode_ep.id != endpoint_id) + continue; + + remote = fwnode_graph_get_remote_port_parent(endpoint); + if (!remote) + return NULL; + + return fwnode_device_is_available(remote) ? remote : NULL; + } + + return NULL; +} +EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node); + +/** * fwnode_graph_parse_endpoint - parse common endpoint node properties * @fwnode: pointer to endpoint fwnode_handle * @endpoint: pointer to the fwnode endpoint data structure |