diff --git a/drivers/usb/typec/retimer.c b/drivers/usb/typec/retimer.c index 4a7d1b5c4d866..0eb7d7433cd63 100644 --- a/drivers/usb/typec/retimer.c +++ b/drivers/usb/typec/retimer.c @@ -19,7 +19,8 @@ static int retimer_fwnode_match(struct device *dev, const void *fwnode) { - return is_typec_retimer(dev) && device_match_fwnode(dev, fwnode); + return (is_typec_retimer(dev) || is_typec_redriver(dev)) && + device_match_fwnode(dev, fwnode); } static void *typec_retimer_match(const struct fwnode_handle *fwnode, const char *id, void *data) @@ -49,6 +50,8 @@ struct typec_retimer *fwnode_typec_retimer_get(struct fwnode_handle *fwnode) struct typec_retimer *retimer; retimer = fwnode_connection_find_match(fwnode, "retimer-switch", NULL, typec_retimer_match); + if (!retimer) + retimer = fwnode_connection_find_match(fwnode, "redriver-switch", NULL, typec_retimer_match); if (!IS_ERR_OR_NULL(retimer)) WARN_ON(!try_module_get(retimer->dev.parent->driver->owner)); @@ -90,6 +93,11 @@ const struct device_type typec_retimer_dev_type = { .release = typec_retimer_release, }; +const struct device_type typec_redriver_dev_type = { + .name = "typec_redriver", + .release = typec_retimer_release, +}; + /** * typec_retimer_register - Register a retimer device. * @parent: Parent device. @@ -120,10 +128,10 @@ typec_retimer_register(struct device *parent, const struct typec_retimer_desc *d retimer->dev.parent = parent; retimer->dev.fwnode = desc->fwnode; retimer->dev.class = &retimer_class; - retimer->dev.type = &typec_retimer_dev_type; + retimer->dev.type = desc->redriver ? &typec_redriver_dev_type : &typec_retimer_dev_type; retimer->dev.driver_data = desc->drvdata; - dev_set_name(&retimer->dev, "%s-retimer", - desc->name ? desc->name : dev_name(parent)); + dev_set_name(&retimer->dev, "%s-%s", desc->name ? desc->name : dev_name(parent), + desc->redriver ? "redriver" : "retimer"); ret = device_add(&retimer->dev); if (ret) { diff --git a/drivers/usb/typec/retimer.h b/drivers/usb/typec/retimer.h index d6a5ef9881e1f..b552cdb985724 100644 --- a/drivers/usb/typec/retimer.h +++ b/drivers/usb/typec/retimer.h @@ -13,7 +13,9 @@ struct typec_retimer { #define to_typec_retimer(_dev_) container_of(_dev_, struct typec_retimer, dev) extern const struct device_type typec_retimer_dev_type; +extern const struct device_type typec_redriver_dev_type; #define is_typec_retimer(dev) ((dev)->type == &typec_retimer_dev_type) +#define is_typec_redriver(dev) ((dev)->type == &typec_redriver_dev_type) #endif /* __USB_TYPEC_RETIMER__ */ diff --git a/include/linux/usb/typec_retimer.h b/include/linux/usb/typec_retimer.h index 5e036b3360e25..b2daf8e6caeb0 100644 --- a/include/linux/usb/typec_retimer.h +++ b/include/linux/usb/typec_retimer.h @@ -25,6 +25,7 @@ struct typec_retimer_desc { typec_retimer_set_fn_t set; const char *name; void *drvdata; + bool redriver; }; struct typec_retimer *fwnode_typec_retimer_get(struct fwnode_handle *fwnode);