diff --git a/drivers/base/platform.c b/drivers/base/platform.c index e0dd9ea58..82d2521a2 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 c74f245b4..40b76c18a 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 */