@@ -1289,6 +1289,7 @@ static unsigned int fwnode_graph_devcon_matches(const struct fwnode_handle *fwno
{
struct fwnode_handle *node;
struct fwnode_handle *ep;
+ struct fwnode_handle *remote_ep;
unsigned int count = 0;
void *ret;
@@ -1304,7 +1305,9 @@ static unsigned int fwnode_graph_devcon_matches(const struct fwnode_handle *fwno
continue;
}
- ret = match(node, con_id, data);
+ remote_ep = fwnode_graph_get_remote_endpoint(ep);
+ ret = match(node, remote_ep, con_id, data);
+ fwnode_handle_put(remote_ep);
fwnode_handle_put(node);
if (ret) {
if (matches)
@@ -1334,7 +1337,7 @@ static unsigned int fwnode_devcon_matches(const struct fwnode_handle *fwnode,
if (IS_ERR(node))
break;
- ret = match(node, NULL, data);
+ ret = match(node, NULL, NULL, data);
fwnode_handle_put(node);
if (ret) {
if (matches)
@@ -89,8 +89,8 @@ enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw)
}
EXPORT_SYMBOL_GPL(usb_role_switch_get_role);
-static void *usb_role_switch_match(const struct fwnode_handle *fwnode, const char *id,
- void *data)
+static void *usb_role_switch_match(const struct fwnode_handle *fwnode, const struct fwnode_handle *endpoint,
+ const char *id, void *data)
{
struct device *dev;
@@ -33,6 +33,7 @@ static int switch_fwnode_match(struct device *dev, const void *fwnode)
}
static void *typec_switch_match(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
const char *id, void *data)
{
struct device *dev;
@@ -55,6 +56,9 @@ static void *typec_switch_match(const struct fwnode_handle *fwnode,
*/
dev = class_find_device(&typec_mux_class, NULL, fwnode,
switch_fwnode_match);
+ if (!dev)
+ dev = class_find_device(&typec_mux_class, NULL, endpoint,
+ switch_fwnode_match);
return dev ? to_typec_switch_dev(dev) : ERR_PTR(-EPROBE_DEFER);
}
@@ -263,6 +267,7 @@ static int mux_fwnode_match(struct device *dev, const void *fwnode)
}
static void *typec_mux_match(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
const char *id, void *data)
{
struct device *dev;
@@ -280,6 +285,9 @@ static void *typec_mux_match(const struct fwnode_handle *fwnode,
dev = class_find_device(&typec_mux_class, NULL, fwnode,
mux_fwnode_match);
+ if (!dev)
+ dev = class_find_device(&typec_mux_class, NULL, endpoint,
+ mux_fwnode_match);
return dev ? to_typec_mux_dev(dev) : ERR_PTR(-EPROBE_DEFER);
}
@@ -22,7 +22,9 @@ static int retimer_fwnode_match(struct device *dev, const void *fwnode)
return is_typec_retimer(dev) && device_match_fwnode(dev, fwnode);
}
-static void *typec_retimer_match(const struct fwnode_handle *fwnode, const char *id, void *data)
+static void *typec_retimer_match(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
+ const char *id, void *data)
{
struct device *dev;
@@ -31,6 +33,9 @@ static void *typec_retimer_match(const struct fwnode_handle *fwnode, const char
dev = class_find_device(&retimer_class, NULL, fwnode,
retimer_fwnode_match);
+ if (!dev)
+ dev = class_find_device(&retimer_class, NULL, endpoint,
+ retimer_fwnode_match);
return dev ? to_typec_retimer(dev) : ERR_PTR(-EPROBE_DEFER);
}
@@ -455,8 +455,9 @@ unsigned int fwnode_graph_get_endpoint_count(const struct fwnode_handle *fwnode,
int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
struct fwnode_endpoint *endpoint);
-typedef void *(*devcon_match_fn_t)(const struct fwnode_handle *fwnode, const char *id,
- void *data);
+typedef void *(*devcon_match_fn_t)(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
+ const char *id, void *data);
void *fwnode_connection_find_match(const struct fwnode_handle *fwnode,
const char *con_id, void *data,