From 47154195c05dc7c8b3373de9603b06c2f435588a Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 17 Apr 2019 17:58:17 +0200 Subject: [PATCH v2] FIXUP: "usb: typec: Registering real device entries for the muxes" Check the dev_name suffix so that we do not return the first registered device when a mux and switch share the same parent and fwnode. Signed-off-by: Hans de Goede --- drivers/usb/typec/mux.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/usb/typec/mux.c b/drivers/usb/typec/mux.c index c7d4a2dd454e..a28803544301 100644 --- a/drivers/usb/typec/mux.c +++ b/drivers/usb/typec/mux.c @@ -22,9 +22,21 @@ static int name_match(struct device *dev, const void *name) return !strcmp((const char *)name, dev_name(dev)); } -static int fwnode_match(struct device *dev, const void *fwnode) +static bool dev_name_ends_with(struct device *dev, const char *suffix) { - return dev_fwnode(dev) == fwnode; + const char *name = dev_name(dev); + const int name_len = strlen(name); + const int suffix_len = strlen(suffix); + + if (suffix_len > name_len) + return false; + + return strcmp(name + (name_len - suffix_len), suffix) == 0; +} + +static int switch_fwnode_match(struct device *dev, const void *fwnode) +{ + return dev_fwnode(dev) == fwnode && dev_name_ends_with(dev, "-switch"); } static void *typec_switch_match(struct device_connection *con, int ep, @@ -37,7 +49,7 @@ static void *typec_switch_match(struct device_connection *con, int ep, return NULL; dev = class_find_device(&typec_mux_class, NULL, con->fwnode, - fwnode_match); + switch_fwnode_match); } else { dev = class_find_device(&typec_mux_class, NULL, con->endpoint[ep], name_match); @@ -167,6 +179,11 @@ EXPORT_SYMBOL_GPL(typec_switch_get_drvdata); /* ------------------------------------------------------------------------- */ +static int mux_fwnode_match(struct device *dev, const void *fwnode) +{ + return dev_fwnode(dev) == fwnode && dev_name_ends_with(dev, "-mux"); +} + static void *typec_mux_match(struct device_connection *con, int ep, void *data) { const struct typec_altmode_desc *desc = data; @@ -226,7 +243,7 @@ static void *typec_mux_match(struct device_connection *con, int ep, void *data) find_mux: dev = class_find_device(&typec_mux_class, NULL, con->fwnode, - fwnode_match); + mux_fwnode_match); return dev ? to_typec_switch(dev) : ERR_PTR(-EPROBE_DEFER); } -- 2.21.0