diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-09-09 16:28:59 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-09-14 11:47:42 +0200 |
commit | 420815465ee3e09c853d9491e546666d4a867e9c (patch) | |
tree | 020954f37e9aa52a26bb6c0ada76f13f0b0d6b68 | |
parent | 08a7d5a6251ba433c9443ad9e439af96ee4eed40 (diff) | |
download | barebox-420815465ee3e09c853d9491e546666d4a867e9c.tar.gz barebox-420815465ee3e09c853d9491e546666d4a867e9c.tar.xz |
driver: Add platform_device_id mechanism
It is common for drivers to handle multiple similar devices. On
Linux the driver can distinguish between the devices using the
platform_device_id mechanism. Introduce the same for barebox.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/base/platform.c | 17 | ||||
-rw-r--r-- | include/driver.h | 9 |
2 files changed, 25 insertions, 1 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index e0dd9ea58e..82d2521a2e 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -24,7 +24,22 @@ static int platform_match(struct device_d *dev, struct driver_d *drv) { - return strcmp(dev->name, drv->name) ? -1 : 0; + if (!strcmp(dev->name, drv->name)) + return 0; + + if (drv->id_table) { + struct platform_device_id *id = drv->id_table; + + while (id->name) { + if (!strcmp(id->name, dev->name)) { + dev->id_entry = id; + return 0; + } + id++; + } + } + + return -1; } static int platform_probe(struct device_d *dev) diff --git a/include/driver.h b/include/driver.h index c74f245b4c..40b76c18a0 100644 --- a/include/driver.h +++ b/include/driver.h @@ -60,6 +60,11 @@ struct filep; struct bus_type; +struct platform_device_id { + const char *name; + unsigned long driver_data; +}; + /** @brief Describes a particular device present in the system */ struct device_d { /*! This member (and 'type' described below) is used to match with a @@ -99,6 +104,8 @@ struct device_d { struct list_head parameters; struct list_head cdevs; + + struct platform_device_id *id_entry; }; /** @brief Describes a driver present in the system */ @@ -119,6 +126,8 @@ struct driver_d { void (*shortinfo) (struct device_d *); struct bus_type *bus; + + struct platform_device_id *id_table; }; /*@}*/ /* do not delete, doxygen relevant */ |