summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/driver.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 24cb5bc62b..338bea1280 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -113,14 +113,29 @@ int device_detect(struct device_d *dev)
return dev->detect(dev);
}
-int device_detect_by_name(const char *devname)
+int device_detect_by_name(const char *__devname)
{
- struct device_d *dev = get_device_by_name(devname);
+ char *devname = xstrdup(__devname);
+ char *str = devname;
+ struct device_d *dev;
+ int ret = -ENODEV;
+
+ while (1) {
+ strsep(&str, ".");
+
+ dev = get_device_by_name(devname);
+ if (dev)
+ ret = device_detect(dev);
- if (!dev)
- return -ENODEV;
+ if (!str)
+ break;
+ else
+ *(str - 1) = '.';
+ }
- return device_detect(dev);
+ free(devname);
+
+ return ret;
}
static int match(struct driver_d *drv, struct device_d *dev)