From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Daniel Scally <djrscally@gmail.com>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
Linux Media Mailing List <linux-media@vger.kernel.org>,
devel@acpica.org, "Rafael J. Wysocki" <rjw@rjwysocki.net>,
Len Brown <lenb@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Yong Zhi <yong.zhi@intel.com>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
Bingbu Cao <bingbu.cao@intel.com>,
Tian Shu Qiu <tian.shu.qiu@intel.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Robert Moore <robert.moore@intel.com>,
Erik Kaneda <erik.kaneda@intel.com>,
Petr Mladek <pmladek@suse.com>,
Steven Rostedt <rostedt@goodmis.org>,
Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
Jacopo Mondi <jacopo+renesas@jmondi.org>,
kieran.bingham+renesas@ideasonboard.com,
Hans Verkuil <hverkuil-cisco@xs4all.nl>,
Marco Felsch <m.felsch@pengutronix.de>,
niklas.soderlund+renesas@ragnatech.se,
Steve Longerbeam <slongerbeam@gmail.com>,
"Krogerus, Heikki" <heikki.krogerus@linux.intel.com>,
Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH v3 07/14] software_node: Add support for fwnode_graph*() family of functions
Date: Thu, 24 Dec 2020 14:55:14 +0200 [thread overview]
Message-ID: <X+SPsks5itN9OFqB@pendragon.ideasonboard.com> (raw)
In-Reply-To: <CAHp75Vft7gg1AcKCEU+E74eB_ZMouHFd-8uZ7pcVj5CoJzZpvQ@mail.gmail.com>
Hi Andy,
On Thu, Dec 24, 2020 at 02:24:12PM +0200, Andy Shevchenko wrote:
> On Thu, Dec 24, 2020 at 3:14 AM Daniel Scally wrote:
> >
> > From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> >
> > This implements the remaining .graph_* callbacks in the
>
> .graph_* ==> ->graph_*() ?
>
> > fwnode operations structure for the software nodes. That makes
> > the fwnode_graph*() functions available in the drivers also
>
> graph*() -> graph_*() ?
>
> > 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",
>
> > ...)
>
> Looks not good, perhaps move to the previous line, or move port@1 example here?
>
> > 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".
>
> Few nitpicks here and there, after addressing them,
> 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 v3
> > - Changed software_node_get_next_endpoint() to drop the variable
> > named "old"
> > - Used the macros defined in 06/14 instead of magic numbers
> > - Added some comments to explain behaviour a little where it's unclear
> >
> > drivers/base/swnode.c | 112 +++++++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 111 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
> > index 2d07eb04c6c8..ff690029060d 100644
> > --- a/drivers/base/swnode.c
> > +++ b/drivers/base/swnode.c
> > @@ -540,6 +540,112 @@ 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))) {
> > + /*
> > + * ports have naming style "port@n", so we search for children
> > + * that follow that convention (but without assuming anything
> > + * about the index number)
> > + */
>
> > + if (!strncmp(to_swnode(port)->node->name, "port@",
>
> You may use here corresponding _FMT macro.
>
> > + FWNODE_GRAPH_PORT_NAME_PREFIX_LEN))
> > + 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);
> > + int ret;
> > +
> > + /* Ports have naming style "port@n", we need to select the n */
>
> > + ret = kstrtou32(swnode->parent->node->name + FWNODE_GRAPH_PORT_NAME_PREFIX_LEN,
>
> Maybe a temporary variable?
>
> unsigned int prefix_len = FWNODE_GRAPH_PORT_NAME_PREFIX_LEN;
> ...
> ret = kstrtou32(swnode->parent->node->name + prefix_len,
Honestly I'm wondering if those macros don't hinder readability. I'd
rather write
+ strlen("port@")
and let the compiler optimize this to a compile-time constant.
> > + 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 +657,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,
> > };
> >
> > /* -------------------------------------------------------------------------- */
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2020-12-24 12:56 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-24 1:08 [PATCH v3 00/14] Add functionality to ipu3-cio2 driver allowing software_node connections to sensors on platforms designed for Windows Daniel Scally
2020-12-24 1:08 ` [PATCH v3 01/14] software_node: Fix refcounts in software_node_get_next_child() Daniel Scally
2020-12-24 1:08 ` [PATCH v3 02/14] property: Return true in fwnode_device_is_available for NULL ops Daniel Scally
2020-12-24 1:08 ` [PATCH v3 03/14] property: Call fwnode_graph_get_endpoint_by_id() for fwnode->secondary Daniel Scally
2020-12-24 1:08 ` [PATCH v3 04/14] software_node: Enforce parent before child ordering of nodes arrays Daniel Scally
2020-12-24 1:08 ` [PATCH v3 05/14] software_node: unregister software_nodes in reverse order Daniel Scally
2020-12-24 12:13 ` [Devel] " Andy Shevchenko
2020-12-24 12:13 ` Andy Shevchenko
2020-12-24 14:00 ` Daniel Scally
2020-12-24 14:12 ` [Devel] " Andy Shevchenko
2020-12-24 14:12 ` Andy Shevchenko
2020-12-24 14:14 ` Daniel Scally
2020-12-24 18:36 ` David Laight
2020-12-28 10:15 ` [Devel] " Andy Shevchenko
2020-12-28 10:15 ` Andy Shevchenko
2020-12-28 21:17 ` Daniel Scally
2020-12-28 16:34 ` Sakari Ailus
2020-12-28 17:47 ` Andy Shevchenko
2020-12-24 1:08 ` [PATCH v3 06/14] include: fwnode.h: Define format macros for ports and endpoints Daniel Scally
2020-12-24 12:17 ` [Devel] " Andy Shevchenko
2020-12-24 12:17 ` Andy Shevchenko
2020-12-24 12:41 ` Laurent Pinchart
2020-12-28 16:30 ` Sakari Ailus
2020-12-28 17:11 ` Sakari Ailus
2020-12-28 21:36 ` Daniel Scally
2020-12-24 1:09 ` [PATCH v3 07/14] software_node: Add support for fwnode_graph*() family of functions Daniel Scally
2020-12-24 12:24 ` [Devel] " Andy Shevchenko
2020-12-24 12:24 ` Andy Shevchenko
2020-12-24 12:55 ` Laurent Pinchart [this message]
2020-12-24 13:03 ` [Devel] " Andy Shevchenko
2020-12-24 13:03 ` Andy Shevchenko
2020-12-24 14:21 ` Daniel Scally
2020-12-28 16:41 ` Sakari Ailus
2020-12-28 21:37 ` Daniel Scally
2020-12-26 23:47 ` Daniel Scally
2020-12-24 12:53 ` Laurent Pinchart
2020-12-24 14:24 ` Daniel Scally
2020-12-24 1:09 ` [PATCH v3 08/14] lib/test_printf.c: Use helper function to unwind array of software_nodes Daniel Scally
2020-12-24 1:09 ` [PATCH v3 09/14] ipu3-cio2: Add T: entry to MAINTAINERS Daniel Scally
2020-12-24 1:09 ` [PATCH v3 10/14] ipu3-cio2: Rename ipu3-cio2.c Daniel Scally
2020-12-24 1:09 ` [PATCH v3 11/14] media: v4l2-core: v4l2-async: Check sd->fwnode->secondary in match_fwnode() Daniel Scally
2020-12-24 1:09 ` [PATCH v3 12/14] acpi: Add acpi_dev_get_next_match_dev() and helper macro Daniel Scally
2020-12-24 1:09 ` [PATCH v3 13/14] include: media: v4l2-fwnode: Include v4l2_fwnode_bus_type Daniel Scally
2020-12-24 12:32 ` [Devel] " Andy Shevchenko
2020-12-24 12:32 ` Andy Shevchenko
2020-12-26 23:14 ` Daniel Scally
2020-12-24 12:58 ` Laurent Pinchart
2020-12-24 1:09 ` [PATCH v3 14/14] ipu3-cio2: Add cio2-bridge to ipu3-cio2 driver Daniel Scally
2020-12-24 12:54 ` [Devel] " Andy Shevchenko
2020-12-24 12:54 ` Andy Shevchenko
2020-12-26 23:23 ` Daniel Scally
2020-12-28 17:05 ` Sakari Ailus
2020-12-28 22:37 ` Daniel Scally
2020-12-28 22:54 ` [Devel] " Andy Shevchenko
2020-12-28 22:55 ` Andy Shevchenko
2020-12-28 23:07 ` Laurent Pinchart
2020-12-28 23:54 ` Andy Shevchenko
2020-12-28 23:55 ` [Devel] " Andy Shevchenko
2020-12-29 0:07 ` Laurent Pinchart
2020-12-30 20:47 ` Andy Shevchenko
2020-12-30 20:48 ` [Devel] " Andy Shevchenko
2020-12-28 23:30 ` Daniel Scally
2020-12-28 23:47 ` Andy Shevchenko
2020-12-28 23:47 ` [Devel] " Andy Shevchenko
2021-01-02 17:07 ` Sakari Ailus
2021-01-02 17:12 ` Daniel Scally
2021-01-02 17:21 ` Sakari Ailus
2021-01-02 17:24 ` Sakari Ailus
2021-01-02 21:23 ` Daniel Scally
-- strict thread matches above, loose matches on Subject: below --
2020-12-28 22:55 [Devel] " Andy Shevchenko
2020-12-28 22:56 ` Andy Shevchenko
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=X+SPsks5itN9OFqB@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=andy.shevchenko@gmail.com \
--cc=bingbu.cao@intel.com \
--cc=devel@acpica.org \
--cc=djrscally@gmail.com \
--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=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.