linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Rob Herring <robh+dt@kernel.org>,
	Daniel Scally <djrscally@gmail.com>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Hans de Goede <hdegoede@redhat.com>,
	linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Subject: Re: [PATCH v3 1/6] device property: Helper to match multiple connections
Date: Sun, 6 Mar 2022 20:09:39 -0600	[thread overview]
Message-ID: <YiVpY4ikOHwDwtZo@yoga> (raw)
In-Reply-To: <YiIL/ejgxhfRhTDP@smile.fi.intel.com>

On Fri 04 Mar 06:54 CST 2022, Andy Shevchenko wrote:

> On Thu, Mar 03, 2022 at 02:33:46PM -0800, Bjorn Andersson wrote:
> > In some cases multiple connections with the same connection id
> > needs to be resolved from a fwnode graph.
> > 
> > One such example is when separate hardware is used for performing muxing
> > and/or orientation switching of the SuperSpeed and SBU lines in a USB
> > Type-C connector. In this case the connector needs to belong to a graph
> > with multiple matching remote endpoints, and the Type-C controller needs
> > to be able to resolve them both.
> > 
> > Add a new API that allows this kind of lookup.
> 
> ...
> 
> > +static unsigned int fwnode_graph_devcon_matches(struct fwnode_handle *fwnode,
> > +						const char *con_id, void *data,
> > +						devcon_match_fn_t match,
> > +						void **matches,
> > +						unsigned int matches_len)
> > +{
> > +	struct fwnode_handle *node;
> > +	struct fwnode_handle *ep;
> > +	unsigned int count = 0;
> > +	void *ret;
> > +
> > +	fwnode_graph_for_each_endpoint(fwnode, ep) {
> 
> > +		if (count >= matches_len && matches) {
> > +			fwnode_handle_put(ep);
> > +			return count;
> > +		}
> 
> Wouldn't be the same as
> 
> 		if (count >= matches_len) {

This would cause the return value to be at most matches_len, seems
relevant to ignore (or perhaps require it to be 0) when matches is NULL.

But flipping the order of the expression seems better to me, now that
this has been sitting for a while.

> 			fwnode_handle_put(ep);
> 			break;

Right, this isn't an "early return", so nicer to have a single return at
the bottom.

> 		}
> 
> ?
> 
> > +		node = fwnode_graph_get_remote_port_parent(ep);
> > +		if (!fwnode_device_is_available(node)) {
> > +			fwnode_handle_put(node);
> > +			continue;
> > +		}
> > +
> > +		ret = match(node, con_id, data);
> > +		fwnode_handle_put(node);
> > +		if (ret) {
> > +			if (matches)
> > +				matches[count] = ret;
> > +			count++;
> > +		}
> > +	}
> > +	return count;
> > +}
> 
> ...
> 
> > +static unsigned int fwnode_devcon_matches(struct fwnode_handle *fwnode,
> > +					  const char *con_id, void *data,
> > +					  devcon_match_fn_t match,
> > +					  void **matches,
> > +					  unsigned int matches_len)
> > +{
> > +	struct fwnode_handle *node;
> > +	unsigned int count = 0;
> > +	unsigned int i;
> > +	void *ret;
> > +
> > +	for (i = 0; ; i++) {
> 
> > +		if (count >= matches_len && matches)
> > +			return count;
> 
> Ditto.
> 
> > +		node = fwnode_find_reference(fwnode, con_id, i);
> > +		if (IS_ERR(node))
> > +			break;
> > +
> > +		ret = match(node, NULL, data);
> > +		fwnode_handle_put(node);
> > +		if (ret) {
> > +			if (matches)
> > +				matches[count] = ret;
> > +			count++;
> > +		}
> > +	}
> > +
> > +	return count;
> > +}
> 
> ...
> 
> > +int fwnode_connection_find_matches(struct fwnode_handle *fwnode,
> > +				   const char *con_id, void *data,
> > +				   devcon_match_fn_t match,
> > +				   void **matches, unsigned int matches_len)
> > +{
> > +	unsigned int count_graph;
> > +	unsigned int count_ref;
> > +
> > +	if (!fwnode || !match)
> > +		return -EINVAL;
> 
> > +	count_graph = fwnode_graph_devcon_matches(fwnode, con_id, data, match,
> > +						  matches, matches_len);
> 
> > +	matches += count_graph;
> > +	matches_len -= count_graph;
> 
> No, won't work when matches == NULL.
> 

Sorry about that, you're obviously correct.

> Also, matches_len is expected to be 0 in that case (or at least being ignored,
> check with vsnprintf() behaviour in similar case).
> 
> So, something like this, perhaps
> 
> 	if (matches && matches_len) {
> 		matches += count_graph;
> 		matches_len -= count_graph;
> 	}

Seems reasonable.

Thanks,
Bjorn

> 
> > +	count_ref = fwnode_devcon_matches(fwnode, con_id, data, match,
> > +					  matches, matches_len);
> > +
> > +	return count_graph + count_ref;
> > +}
> 
> 
> -- 
> With Best Regards,
> Andy Shevchenko
> 
> 

      parent reply	other threads:[~2022-03-07  2:09 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-03 22:33 [PATCH v3 1/6] device property: Helper to match multiple connections Bjorn Andersson
2022-03-03 22:33 ` [PATCH v3 2/6] device property: Use multi-connection matchers for single case Bjorn Andersson
2022-03-04 12:54   ` Andy Shevchenko
2022-03-03 22:33 ` [PATCH v3 3/6] typec: mux: Introduce indirection Bjorn Andersson
2022-03-04 12:58   ` Andy Shevchenko
2022-03-03 22:33 ` [PATCH v3 4/6] typec: mux: Allow multiple mux_devs per mux Bjorn Andersson
2022-03-04 13:54   ` Andy Shevchenko
2022-03-07  3:09     ` Bjorn Andersson
2022-03-03 22:33 ` [PATCH v3 5/6] dt-bindings: usb: Add binding for fcs,fsa4480 Bjorn Andersson
2022-03-03 22:33 ` [PATCH v3 6/6] usb: typec: mux: Add On Semi fsa4480 driver Bjorn Andersson
2022-03-04 12:54 ` [PATCH v3 1/6] device property: Helper to match multiple connections Andy Shevchenko
2022-03-04 13:41   ` Sakari Ailus
2022-03-04 13:52     ` Andy Shevchenko
2022-03-07  2:18       ` Bjorn Andersson
2022-03-07  9:31         ` Andy Shevchenko
2022-03-07  2:09   ` Bjorn Andersson [this message]

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=YiVpY4ikOHwDwtZo@yoga \
    --to=bjorn.andersson@linaro.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=djrscally@gmail.com \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=hdegoede@redhat.com \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=sakari.ailus@linux.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;
as well as URLs for NNTP newsgroup(s).