device property: Add support for fwnode endpoints

Similar to OF endpoints, endpoint type nodes can be also supported on
ACPI. In order to make it possible for drivers to ignore the matter,
add a type for fwnode_endpoint and a function to parse them.

On ACPI, find the child node index instead of relying on the "endpoint"
property.

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>
This commit is contained in:
Sakari Ailus 2017-03-28 10:52:25 +03:00 committed by Rafael J. Wysocki
parent e44bb0cbdc
commit 2bd5452d46
3 changed files with 47 additions and 0 deletions

View File

@ -1311,3 +1311,35 @@ fwnode_graph_get_remote_endpoint(struct fwnode_handle *fwnode)
return endpoint;
}
EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint);
/**
* fwnode_graph_parse_endpoint - parse common endpoint node properties
* @fwnode: pointer to endpoint fwnode_handle
* @endpoint: pointer to the fwnode endpoint data structure
*
* Parse @fwnode representing a graph endpoint node and store the
* information in @endpoint. The caller must hold a reference to
* @fwnode.
*/
int fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
struct fwnode_endpoint *endpoint)
{
struct fwnode_handle *port_fwnode = fwnode_get_parent(fwnode);
memset(endpoint, 0, sizeof(*endpoint));
endpoint->local_fwnode = fwnode;
if (is_acpi_node(port_fwnode)) {
fwnode_property_read_u32(port_fwnode, "port", &endpoint->port);
fwnode_property_read_u32(fwnode, "endpoint", &endpoint->id);
} else {
fwnode_property_read_u32(port_fwnode, "reg", &endpoint->port);
fwnode_property_read_u32(fwnode, "reg", &endpoint->id);
}
fwnode_handle_put(port_fwnode);
return 0;
}
EXPORT_SYMBOL(fwnode_graph_parse_endpoint);

View File

@ -27,4 +27,16 @@ struct fwnode_handle {
struct fwnode_handle *secondary;
};
/**
* struct fwnode_endpoint - Fwnode graph endpoint
* @port: Port number
* @id: Endpoint id
* @local_fwnode: reference to the related fwnode
*/
struct fwnode_endpoint {
unsigned int port;
unsigned int id;
const struct fwnode_handle *local_fwnode;
};
#endif

View File

@ -280,4 +280,7 @@ struct fwnode_handle *fwnode_graph_get_remote_port(
struct fwnode_handle *fwnode_graph_get_remote_endpoint(
struct fwnode_handle *fwnode);
int fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
struct fwnode_endpoint *endpoint);
#endif /* _LINUX_PROPERTY_H_ */