device property: Add support for fwnode endpoints
authorSakari Ailus <sakari.ailus@linux.intel.com>
Tue, 28 Mar 2017 07:52:25 +0000 (10:52 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 28 Mar 2017 22:00:29 +0000 (00:00 +0200)
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>
drivers/base/property.c
include/linux/fwnode.h
include/linux/property.h

index 22849a89a8b57afcbc4cb0ede9342cb13194e902..8a53b8f1db662f81e05e9fb98b7e62212eb6408e 100644 (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);
index 8bd28ce6d76e2491d10942f60ad77cc15e1edea0..3dff2398a5f0beb8cf0e5f4dd1d139bb727bf480 100644 (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
index 6e20a12a2eecbdb05869dd873de3f59014756bb5..3a4e43599e0196410635c94210f81041a90d10e9 100644 (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_ */