[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <YujP1oOHojuB9iXa@kuha.fi.intel.com>
Date: Tue, 2 Aug 2022 10:18:46 +0300
From: Heikki Krogerus <heikki.krogerus@...ux.intel.com>
To: Nícolas F. R. A. Prado
<nfraprado@...labora.com>
Cc: kernel@...labora.com,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@...labora.com>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Prashant Malani <pmalani@...omium.org>,
linux-kernel@...r.kernel.org, linux-usb@...r.kernel.org
Subject: Re: [PATCH] usb: typec: retimer: Add missing id check in match
callback
On Mon, Jul 25, 2022 at 04:31:29PM -0400, Nícolas F. R. A. Prado wrote:
> The fwnode_connection_find_match() function handles two cases: named
> references and graph endpoints. In the second case, the match function
> passed in is called with the id to check for the match. However, the
> match function for the recently added type-c retimer class assumes the
> connection has already been matched (which is only true for the first
> case).
>
> The result is that with that change, all type-c nodes with graph
> endpoints defer probe indefinitely, independently of having a retimer
> connection or not.
>
> Add the missing check, like is done by the type-c mux and usb role
> switch code, to fix the issue.
>
> Fixes: ddaf8d96f93b ("usb: typec: Add support for retimers")
> Signed-off-by: Nícolas F. R. A. Prado <nfraprado@...labora.com>
Acked-by: Heikki Krogerus <heikki.krogerus@...ux.intel.com>
> ---
>
> drivers/usb/typec/retimer.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/typec/retimer.c b/drivers/usb/typec/retimer.c
> index 051eaa7d2899..2003731f1bee 100644
> --- a/drivers/usb/typec/retimer.c
> +++ b/drivers/usb/typec/retimer.c
> @@ -36,8 +36,13 @@ static int retimer_fwnode_match(struct device *dev, const void *fwnode)
>
> static void *typec_retimer_match(struct fwnode_handle *fwnode, const char *id, void *data)
> {
> - struct device *dev = class_find_device(&retimer_class, NULL, fwnode,
> - retimer_fwnode_match);
> + struct device *dev;
> +
> + if (id && !fwnode_property_present(fwnode, id))
> + return NULL;
> +
> + dev = class_find_device(&retimer_class, NULL, fwnode,
> + retimer_fwnode_match);
>
> return dev ? to_typec_retimer(dev) : ERR_PTR(-EPROBE_DEFER);
> }
thanks,
--
heikki
Powered by blists - more mailing lists