Re: [PATCH] usb: typec: retimer: Add missing id check in match callback

From: Heikki Krogerus
Date: Tue Aug 02 2022 - 03:18:58 EST


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@xxxxxxxxxxxxx>

Acked-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>

> ---
>
> 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