diff options
| author | Anton Vorontsov <[email protected]> | 2009-09-22 23:46:04 +0000 |
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2009-09-23 14:39:43 +0000 |
| commit | 75368bf6c2876d8f33abfe77aa3864869a3893eb (patch) | |
| tree | 97a543508a8aeb45646d059f8cdd561ae0a76ef2 /drivers/spi/spi.c | |
| parent | spi: add SPI driver for most known i.MX SoCs (diff) | |
| download | kernel-75368bf6c2876d8f33abfe77aa3864869a3893eb.tar.gz kernel-75368bf6c2876d8f33abfe77aa3864869a3893eb.zip | |
spi: add support for device table matching
With this patch spi drivers can use standard spi_driver.id_table and
MODULE_DEVICE_TABLE() mechanisms to bind against the devices. Just like
we do with I2C drivers.
This is useful when a single driver supports several variants of devices
but it is not possible to detect them in run-time (like non-JEDEC chips
probing in drivers/mtd/devices/m25p80.c), and when platform_data usage is
overkill.
This patch also makes life a lot easier on OpenFirmware platforms, since
with OF we extensively use proper device IDs in modaliases.
Signed-off-by: Anton Vorontsov <[email protected]>
Cc: David Brownell <[email protected]>
Cc: David Woodhouse <[email protected]>
Cc: Grant Likely <[email protected]>
Cc: Jean Delvare <[email protected]>
Cc: Ben Dooks <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'drivers/spi/spi.c')
| -rw-r--r-- | drivers/spi/spi.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 70845ccd85c3..8518a6eb63f3 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -59,9 +59,32 @@ static struct device_attribute spi_dev_attrs[] = { * and the sysfs version makes coldplug work too. */ +static const struct spi_device_id *spi_match_id(const struct spi_device_id *id, + const struct spi_device *sdev) +{ + while (id->name[0]) { + if (!strcmp(sdev->modalias, id->name)) + return id; + id++; + } + return NULL; +} + +const struct spi_device_id *spi_get_device_id(const struct spi_device *sdev) +{ + const struct spi_driver *sdrv = to_spi_driver(sdev->dev.driver); + + return spi_match_id(sdrv->id_table, sdev); +} +EXPORT_SYMBOL_GPL(spi_get_device_id); + static int spi_match_device(struct device *dev, struct device_driver *drv) { const struct spi_device *spi = to_spi_device(dev); + const struct spi_driver *sdrv = to_spi_driver(drv); + + if (sdrv->id_table) + return !!spi_match_id(sdrv->id_table, spi); return strcmp(spi->modalias, drv->name) == 0; } |
