[PATCH 2/7] drivers: bus: Match against id_table first

Andrey Smirnov andrew.smirnov at gmail.com
Sun Dec 6 23:52:38 PST 2015


Matching against driver's name before looking throught its id_table
can lead to a somewhat strange and unintuitive behaviour where a
device whose driver's name matches one of the lines in id_table (which
is not unheard of in Linux kernel) will be probed against said driver
with 'id_table' field set to NULL which in turn will result in
dev_get_drvdata erroring out with -ENODEV.

This patch changes the behaviour such that device_match() only tries
to match against driver's name only if id_table of that driver is not
present.

Signed-off-by: Andrey Smirnov <andrew.smirnov at gmail.com>
---
 drivers/base/bus.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 1264e40..b889a48 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -54,9 +54,6 @@ int device_match(struct device_d *dev, struct driver_d *drv)
 	    drv->of_compatible)
 		return of_match(dev, drv);

-	if (!strcmp(dev->name, drv->name))
-		return 0;
-
 	if (drv->id_table) {
 		const struct platform_device_id *id = drv->id_table;

@@ -67,6 +64,8 @@ int device_match(struct device_d *dev, struct driver_d *drv)
 			}
 			id++;
 		}
+	} else if (!strcmp(dev->name, drv->name)) {
+		return 0;
 	}

 	return -1;
--
2.5.0



More information about the barebox mailing list