device property: Move fwnode graph ops to firmware specific locations
authorSakari Ailus <sakari.ailus@linux.intel.com>
Tue, 6 Jun 2017 09:37:38 +0000 (12:37 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 22 Jun 2017 00:55:34 +0000 (02:55 +0200)
Move firmware specific implementations of the fwnode graph operations to
firmware specific locations.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/property.c
drivers/base/property.c
drivers/of/property.c
include/linux/fwnode.h

index 14013f635db61768258ab95975b2bccbd6e7a6ba..a24ca61294eb5b30b32a72ffc431151dc8e44fa1 100644 (file)
@@ -1179,6 +1179,42 @@ acpi_fwnode_get_named_child_node(struct fwnode_handle *fwnode,
        return NULL;
 }
 
+static struct fwnode_handle *
+acpi_fwnode_graph_get_next_endpoint(struct fwnode_handle *fwnode,
+                                   struct fwnode_handle *prev)
+{
+       struct fwnode_handle *endpoint;
+
+       endpoint = acpi_graph_get_next_endpoint(fwnode, prev);
+       if (IS_ERR(endpoint))
+               return NULL;
+
+       return endpoint;
+}
+
+static struct fwnode_handle *
+acpi_fwnode_graph_get_remote_endpoint(struct fwnode_handle *fwnode)
+{
+       struct fwnode_handle *endpoint = NULL;
+
+       acpi_graph_get_remote_endpoint(fwnode, NULL, NULL, &endpoint);
+
+       return endpoint;
+}
+
+static int acpi_fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
+                                           struct fwnode_endpoint *endpoint)
+{
+       struct fwnode_handle *port_fwnode = fwnode_get_parent(fwnode);
+
+       endpoint->local_fwnode = fwnode;
+
+       fwnode_property_read_u32(port_fwnode, "port", &endpoint->port);
+       fwnode_property_read_u32(fwnode, "endpoint", &endpoint->id);
+
+       return 0;
+}
+
 const struct fwnode_operations acpi_fwnode_ops = {
        .property_present = acpi_fwnode_property_present,
        .property_read_int_array = acpi_fwnode_property_read_int_array,
@@ -1186,4 +1222,8 @@ const struct fwnode_operations acpi_fwnode_ops = {
        .get_parent = acpi_node_get_parent,
        .get_next_child_node = acpi_get_next_subnode,
        .get_named_child_node = acpi_fwnode_get_named_child_node,
+       .graph_get_next_endpoint = acpi_fwnode_graph_get_next_endpoint,
+       .graph_get_remote_endpoint = acpi_fwnode_graph_get_remote_endpoint,
+       .graph_get_port_parent = acpi_node_get_parent,
+       .graph_parse_endpoint = acpi_fwnode_graph_parse_endpoint,
 };
index fee0705e40e9eda799a1b669480108fe9e8d71d0..e1a58ac8840ea8d0d345a7607c9503a06cb75796 100644 (file)
@@ -1156,24 +1156,7 @@ struct fwnode_handle *
 fwnode_graph_get_next_endpoint(struct fwnode_handle *fwnode,
                               struct fwnode_handle *prev)
 {
-       struct fwnode_handle *endpoint = NULL;
-
-       if (is_of_node(fwnode)) {
-               struct device_node *node;
-
-               node = of_graph_get_next_endpoint(to_of_node(fwnode),
-                                                 to_of_node(prev));
-
-               if (node)
-                       endpoint = &node->fwnode;
-       } else if (is_acpi_node(fwnode)) {
-               endpoint = acpi_graph_get_next_endpoint(fwnode, prev);
-               if (IS_ERR(endpoint))
-                       endpoint = NULL;
-       }
-
-       return endpoint;
-
+       return fwnode_call_ptr_op(fwnode, graph_get_next_endpoint, prev);
 }
 EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
 
@@ -1186,22 +1169,12 @@ EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
 struct fwnode_handle *
 fwnode_graph_get_remote_port_parent(struct fwnode_handle *fwnode)
 {
-       struct fwnode_handle *parent = NULL;
+       struct fwnode_handle *port, *parent;
 
-       if (is_of_node(fwnode)) {
-               struct device_node *node;
+       port = fwnode_graph_get_remote_port(fwnode);
+       parent = fwnode_call_ptr_op(port, graph_get_port_parent);
 
-               node = of_graph_get_remote_port_parent(to_of_node(fwnode));
-               if (node)
-                       parent = &node->fwnode;
-       } else if (is_acpi_node(fwnode)) {
-               int ret;
-
-               ret = acpi_graph_get_remote_endpoint(fwnode, &parent, NULL,
-                                                    NULL);
-               if (ret)
-                       return NULL;
-       }
+       fwnode_handle_put(port);
 
        return parent;
 }
@@ -1215,23 +1188,7 @@ EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent);
  */
 struct fwnode_handle *fwnode_graph_get_remote_port(struct fwnode_handle *fwnode)
 {
-       struct fwnode_handle *port = NULL;
-
-       if (is_of_node(fwnode)) {
-               struct device_node *node;
-
-               node = of_graph_get_remote_port(to_of_node(fwnode));
-               if (node)
-                       port = &node->fwnode;
-       } else if (is_acpi_node(fwnode)) {
-               int ret;
-
-               ret = acpi_graph_get_remote_endpoint(fwnode, NULL, &port, NULL);
-               if (ret)
-                       return NULL;
-       }
-
-       return port;
+       return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode));
 }
 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port);
 
@@ -1244,25 +1201,7 @@ EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port);
 struct fwnode_handle *
 fwnode_graph_get_remote_endpoint(struct fwnode_handle *fwnode)
 {
-       struct fwnode_handle *endpoint = NULL;
-
-       if (is_of_node(fwnode)) {
-               struct device_node *node;
-
-               node = of_parse_phandle(to_of_node(fwnode), "remote-endpoint",
-                                       0);
-               if (node)
-                       endpoint = &node->fwnode;
-       } else if (is_acpi_node(fwnode)) {
-               int ret;
-
-               ret = acpi_graph_get_remote_endpoint(fwnode, NULL, NULL,
-                                                    &endpoint);
-               if (ret)
-                       return NULL;
-       }
-
-       return endpoint;
+       return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint);
 }
 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint);
 
@@ -1278,22 +1217,8 @@ EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint);
 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;
+       return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint);
 }
 EXPORT_SYMBOL(fwnode_graph_parse_endpoint);
index 250859234fb02540aaeb51e54fb5ce74a5da0635..e859e41e33f3a4ac2c091999c154d79d2c914a52 100644 (file)
@@ -844,6 +844,54 @@ of_fwnode_get_named_child_node(struct fwnode_handle *fwnode,
        return NULL;
 }
 
+static struct fwnode_handle *
+of_fwnode_graph_get_next_endpoint(struct fwnode_handle *fwnode,
+                                 struct fwnode_handle *prev)
+{
+       return of_fwnode_handle(of_graph_get_next_endpoint(to_of_node(fwnode),
+                                                          to_of_node(prev)));
+}
+
+static struct fwnode_handle *
+of_fwnode_graph_get_remote_endpoint(struct fwnode_handle *fwnode)
+{
+       return of_fwnode_handle(of_parse_phandle(to_of_node(fwnode),
+                                                "remote-endpoint", 0));
+}
+
+static struct fwnode_handle *
+of_fwnode_graph_get_port_parent(struct fwnode_handle *fwnode)
+{
+       struct device_node *np;
+
+       /* Get the parent of the port */
+       np = of_get_next_parent(to_of_node(fwnode));
+       if (!np)
+               return NULL;
+
+       /* Is this the "ports" node? If not, it's the port parent. */
+       if (of_node_cmp(np->name, "ports"))
+               return of_fwnode_handle(np);
+
+       return of_fwnode_handle(of_get_next_parent(np));
+}
+
+static int of_fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
+                                         struct fwnode_endpoint *endpoint)
+{
+       struct device_node *node = to_of_node(fwnode);
+       struct device_node *port_node = of_get_parent(node);
+
+       endpoint->local_fwnode = fwnode;
+
+       of_property_read_u32(port_node, "reg", &endpoint->port);
+       of_property_read_u32(node, "reg", &endpoint->id);
+
+       of_node_put(port_node);
+
+       return 0;
+}
+
 const struct fwnode_operations of_fwnode_ops = {
        .get = of_fwnode_get,
        .put = of_fwnode_put,
@@ -853,4 +901,8 @@ const struct fwnode_operations of_fwnode_ops = {
        .get_parent = of_fwnode_get_parent,
        .get_next_child_node = of_fwnode_get_next_child_node,
        .get_named_child_node = of_fwnode_get_named_child_node,
+       .graph_get_next_endpoint = of_fwnode_graph_get_next_endpoint,
+       .graph_get_remote_endpoint = of_fwnode_graph_get_remote_endpoint,
+       .graph_get_port_parent = of_fwnode_graph_get_port_parent,
+       .graph_parse_endpoint = of_fwnode_graph_parse_endpoint,
 };
index 8f64b3ae9c579067179f369ea354a20dc9ee62f8..e315d867d631c584861c94921c92fcc5e5f73558 100644 (file)
@@ -57,6 +57,11 @@ struct fwnode_endpoint {
  * @get_parent: Return the parent of an fwnode.
  * @get_next_child_node: Return the next child node in an iteration.
  * @get_named_child_node: Return a child node with a given name.
+ * @graph_get_next_endpoint: Return an endpoint node in an iteration.
+ * @graph_get_remote_endpoint: Return the remote endpoint node of a local
+ *                            endpoint node.
+ * @graph_get_port_parent: Return the parent node of a port node.
+ * @graph_parse_endpoint: Parse endpoint for port and endpoint id.
  */
 struct fwnode_operations {
        void (*get)(struct fwnode_handle *fwnode);
@@ -76,6 +81,15 @@ struct fwnode_operations {
                               struct fwnode_handle *child);
        struct fwnode_handle *
        (*get_named_child_node)(struct fwnode_handle *fwnode, const char *name);
+       struct fwnode_handle *
+       (*graph_get_next_endpoint)(struct fwnode_handle *fwnode,
+                                  struct fwnode_handle *prev);
+       struct fwnode_handle *
+       (*graph_get_remote_endpoint)(struct fwnode_handle *fwnode);
+       struct fwnode_handle *
+       (*graph_get_port_parent)(struct fwnode_handle *fwnode);
+       int (*graph_parse_endpoint)(struct fwnode_handle *fwnode,
+                                   struct fwnode_endpoint *endpoint);
 };
 
 #define fwnode_has_op(fwnode, op)                              \