From: Daniel Scally <djrscally@gmail.com>
To: linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org,
linux-media@vger.kernel.org, devel@acpica.org,
gregkh@linuxfoundation.org, rjw@rjwysocki.net,
sergey.senozhatsky@gmail.com, mchehab@kernel.org
Cc: lenb@kernel.org, yong.zhi@intel.com,
sakari.ailus@linux.intel.com, bingbu.cao@intel.com,
tian.shu.qiu@intel.com, robert.moore@intel.com,
erik.kaneda@intel.com, pmladek@suse.com, rostedt@goodmis.org,
andriy.shevchenko@linux.intel.com, linux@rasmusvillemoes.dk,
laurent.pinchart+renesas@ideasonboard.com,
jacopo+renesas@jmondi.org,
kieran.bingham+renesas@ideasonboard.com,
hverkuil-cisco@xs4all.nl, m.felsch@pengutronix.de,
niklas.soderlund+renesas@ragnatech.se, slongerbeam@gmail.com,
heikki.krogerus@linux.intel.com, linus.walleij@linaro.org,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Andy Shevchenko <andy.shevchenko@gmail.com>
Subject: [PATCH v4 08/15] software_node: Add support for fwnode_graph*() family of functions
Date: Sun, 3 Jan 2021 23:12:28 +0000 [thread overview]
Message-ID: <20210103231235.792999-9-djrscally@gmail.com> (raw)
In-Reply-To: <20210103231235.792999-1-djrscally@gmail.com>
From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
This implements the remaining .graph_*() callbacks in the fwnode
operations structure for the software nodes. That makes the
fwnode_graph_*() functions available in the drivers also when software
nodes are used.
The implementation tries to mimic the "OF graph" as much as possible, but
there is no support for the "reg" device property. The ports will need to
have the index in their name which starts with "port@" (for example
"port@0", "port@1", ...) and endpoints will use the index of the software
node that is given to them during creation. The port nodes can also be
grouped under a specially named "ports" subnode, just like in DT, if
necessary.
The remote-endpoints are reference properties under the endpoint nodes
that are named "remote-endpoint".
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Co-developed-by: Daniel Scally <djrscally@gmail.com>
Signed-off-by: Daniel Scally <djrscally@gmail.com>
---
Changes in v4:
- Replaced the FWNODE_GRAPH_PORT_NAME_PREFIX_LEN macro with
strlen("port@") throughout
- Added a check to software_node_graph_parse_endpoint() to ensure
the name of the endpoint's parent matches the expected port@n
format
drivers/base/swnode.c | 116 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 115 insertions(+), 1 deletion(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 1f43c51b431e..82f9d6326110 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -540,6 +540,116 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
return 0;
}
+static struct fwnode_handle *
+swnode_graph_find_next_port(const struct fwnode_handle *parent,
+ struct fwnode_handle *port)
+{
+ struct fwnode_handle *old = port;
+
+ while ((port = software_node_get_next_child(parent, old))) {
+ /*
+ * fwnode ports have naming style "port@", so we search for any
+ * children that follow that convention.
+ */
+ if (!strncmp(to_swnode(port)->node->name, "port@",
+ strlen("port@")))
+ return port;
+ old = port;
+ }
+
+ return NULL;
+}
+
+static struct fwnode_handle *
+software_node_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
+ struct fwnode_handle *endpoint)
+{
+ struct swnode *swnode = to_swnode(fwnode);
+ struct fwnode_handle *parent;
+ struct fwnode_handle *port;
+
+ if (!swnode)
+ return NULL;
+
+ if (endpoint) {
+ port = software_node_get_parent(endpoint);
+ parent = software_node_get_parent(port);
+ } else {
+ parent = software_node_get_named_child_node(fwnode, "ports");
+ if (!parent)
+ parent = software_node_get(&swnode->fwnode);
+
+ port = swnode_graph_find_next_port(parent, NULL);
+ }
+
+ for (; port; port = swnode_graph_find_next_port(parent, port)) {
+ endpoint = software_node_get_next_child(port, endpoint);
+ if (endpoint) {
+ fwnode_handle_put(port);
+ break;
+ }
+ }
+
+ fwnode_handle_put(parent);
+
+ return endpoint;
+}
+
+static struct fwnode_handle *
+software_node_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
+{
+ struct swnode *swnode = to_swnode(fwnode);
+ const struct software_node_ref_args *ref;
+ const struct property_entry *prop;
+
+ if (!swnode)
+ return NULL;
+
+ prop = property_entry_get(swnode->node->properties, "remote-endpoint");
+ if (!prop || prop->type != DEV_PROP_REF || prop->is_inline)
+ return NULL;
+
+ ref = prop->pointer;
+
+ return software_node_get(software_node_fwnode(ref[0].node));
+}
+
+static struct fwnode_handle *
+software_node_graph_get_port_parent(struct fwnode_handle *fwnode)
+{
+ struct swnode *swnode = to_swnode(fwnode);
+
+ swnode = swnode->parent;
+ if (swnode && !strcmp(swnode->node->name, "ports"))
+ swnode = swnode->parent;
+
+ return swnode ? software_node_get(&swnode->fwnode) : NULL;
+}
+
+static int
+software_node_graph_parse_endpoint(const struct fwnode_handle *fwnode,
+ struct fwnode_endpoint *endpoint)
+{
+ struct swnode *swnode = to_swnode(fwnode);
+ const char *parent_name = swnode->parent->node->name;
+ int ret;
+
+ if (!(strlen(parent_name) > strlen("port@")) ||
+ strncmp(parent_name, "port@", strlen("port@")))
+ return -EINVAL;
+
+ /* Ports have naming style "port@n", we need to select the n */
+ ret = kstrtou32(parent_name + strlen("port@"),
+ 10, &endpoint->port);
+ if (ret)
+ return ret;
+
+ endpoint->id = swnode->id;
+ endpoint->local_fwnode = fwnode;
+
+ return 0;
+}
+
static const struct fwnode_operations software_node_ops = {
.get = software_node_get,
.put = software_node_put,
@@ -551,7 +661,11 @@ static const struct fwnode_operations software_node_ops = {
.get_parent = software_node_get_parent,
.get_next_child_node = software_node_get_next_child,
.get_named_child_node = software_node_get_named_child_node,
- .get_reference_args = software_node_get_reference_args
+ .get_reference_args = software_node_get_reference_args,
+ .graph_get_next_endpoint = software_node_graph_get_next_endpoint,
+ .graph_get_remote_endpoint = software_node_graph_get_remote_endpoint,
+ .graph_get_port_parent = software_node_graph_get_port_parent,
+ .graph_parse_endpoint = software_node_graph_parse_endpoint,
};
/* -------------------------------------------------------------------------- */
--
2.25.1
next prev parent reply other threads:[~2021-01-03 23:15 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-03 23:12 [PATCH v4 00/15] Add functionality to ipu3-cio2 driver allowing software_node connections to sensors on platforms designed for Windows Daniel Scally
2021-01-03 23:12 ` [PATCH v4 01/15] software_node: Fix refcounts in software_node_get_next_child() Daniel Scally
2021-01-03 23:12 ` [PATCH v4 02/15] media: ipu3-cio2: Add headers that ipu3-cio2.h is direct user of Daniel Scally
2021-01-03 23:12 ` [PATCH v4 03/15] property: Return true in fwnode_device_is_available for NULL ops Daniel Scally
2021-01-03 23:12 ` [PATCH v4 04/15] property: Call fwnode_graph_get_endpoint_by_id() for fwnode->secondary Daniel Scally
2021-01-03 23:12 ` [PATCH v4 05/15] software_node: Enforce parent before child ordering of nodes arrays Daniel Scally
2021-01-03 23:12 ` [PATCH v4 06/15] software_node: unregister software_nodes in reverse order Daniel Scally
2021-01-03 23:12 ` [PATCH v4 07/15] include: fwnode.h: Define format macros for ports and endpoints Daniel Scally
2021-01-04 14:24 ` Andy Shevchenko
2021-01-04 14:25 ` Daniel Scally
2021-01-03 23:12 ` Daniel Scally [this message]
2021-01-04 10:22 ` [PATCH v4 08/15] software_node: Add support for fwnode_graph*() family of functions Andy Shevchenko
2021-01-04 10:35 ` Daniel Scally
2021-01-03 23:12 ` [PATCH v4 09/15] lib/test_printf.c: Use helper function to unwind array of software_nodes Daniel Scally
2021-01-03 23:12 ` [PATCH v4 10/15] ipu3-cio2: Add T: entry to MAINTAINERS Daniel Scally
2021-01-03 23:12 ` [PATCH v4 11/15] ipu3-cio2: Rename ipu3-cio2.c Daniel Scally
2021-01-03 23:12 ` [PATCH v4 12/15] media: v4l2-core: v4l2-async: Check sd->fwnode->secondary in match_fwnode() Daniel Scally
2021-01-03 23:12 ` [PATCH v4 13/15] acpi: Add acpi_dev_get_next_match_dev() and helper macro Daniel Scally
2021-01-04 12:42 ` Andy Shevchenko
2021-01-04 12:57 ` Daniel Scally
2021-01-04 14:26 ` Andy Shevchenko
2021-01-03 23:12 ` [PATCH v4 14/15] include: media: v4l2-fwnode: Include v4l2_fwnode_bus_type Daniel Scally
2021-01-04 14:22 ` Andy Shevchenko
2021-01-03 23:12 ` [PATCH v4 15/15] ipu3-cio2: Add cio2-bridge to ipu3-cio2 driver Daniel Scally
2021-01-04 12:09 ` Andy Shevchenko
2021-01-04 13:00 ` Daniel Scally
2021-01-04 13:38 ` Andy Shevchenko
2021-01-04 13:56 ` Daniel Scally
2021-01-04 13:35 ` Kieran Bingham
2021-01-04 13:55 ` Daniel Scally
2021-01-04 14:12 ` Andy Shevchenko
2021-01-04 15:13 ` Kieran Bingham
2021-01-04 15:31 ` Daniel Scally
2021-01-04 16:13 ` Kieran Bingham
2021-01-04 22:02 ` Daniel Scally
2021-01-05 6:55 ` Kieran Bingham
2021-01-05 8:22 ` Daniel Scally
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210103231235.792999-9-djrscally@gmail.com \
--to=djrscally@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=andy.shevchenko@gmail.com \
--cc=bingbu.cao@intel.com \
--cc=devel@acpica.org \
--cc=erik.kaneda@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=heikki.krogerus@linux.intel.com \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jacopo+renesas@jmondi.org \
--cc=kieran.bingham+renesas@ideasonboard.com \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=lenb@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=m.felsch@pengutronix.de \
--cc=mchehab@kernel.org \
--cc=niklas.soderlund+renesas@ragnatech.se \
--cc=pmladek@suse.com \
--cc=rjw@rjwysocki.net \
--cc=robert.moore@intel.com \
--cc=rostedt@goodmis.org \
--cc=sakari.ailus@linux.intel.com \
--cc=sergey.senozhatsky@gmail.com \
--cc=slongerbeam@gmail.com \
--cc=tian.shu.qiu@intel.com \
--cc=yong.zhi@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox