This driver used to register for multiple modem h/w by registering the driver multiple times
Replaced the multiple driver registration with id_table method to register for multiple devices Signed-off-by: Russ Gorby <russ.go...@intel.com> --- drivers/serial/ifx6x60.c | 64 +++++++++++++++++++++------------------------- drivers/serial/ifx6x60.h | 1 + 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/drivers/serial/ifx6x60.c b/drivers/serial/ifx6x60.c index d5bef6e..f84fd11 100644 --- a/drivers/serial/ifx6x60.c +++ b/drivers/serial/ifx6x60.c @@ -75,14 +75,16 @@ static int spi_b16 = 1; /* 8 or 16 bit word length */ static struct tty_driver *tty_drv; static struct ifx_spi_device *saved_ifx_dev; static struct lock_class_key ifx_spi_key; -static int is_6160; /* FIXME: should be in the spi_dev struct as we - might have both on one system in theory */ - static int tm_ignore_srdy; static int tm_ignore_spito; static unsigned int ignore_spito_stop = 10; static unsigned int ignore_srdy_start = 25; static unsigned int testmode; +enum ifx_mdm { + IFX_6160 = 1, + IFX_6260, +}; + #define TESTMODE_COMMON_MASK 0x00ff #define TESTMODE_PRIV_MASK 0xff00 #define TESTMODE_ENABLE_DMA 0x01 @@ -1055,18 +1057,21 @@ static void ifx_spi_io(unsigned long data) /* * setup dma pointers */ - if (is_6160) { + switch (ifx_dev->modem) { + case IFX_6160: ifx_dev->spi_msg.is_dma_mapped = 1; ifx_dev->tx_dma = virt_to_phys(ifx_dev->tx_buffer); ifx_dev->rx_dma = virt_to_phys(ifx_dev->rx_buffer); ifx_dev->spi_xfer.tx_dma = ifx_dev->tx_dma; ifx_dev->spi_xfer.rx_dma = ifx_dev->rx_dma; - } else { + break; + case IFX_6260: ifx_dev->spi_msg.is_dma_mapped = 0; ifx_dev->tx_dma = (dma_addr_t)0; ifx_dev->rx_dma = (dma_addr_t)0; ifx_dev->spi_xfer.tx_dma = (dma_addr_t)0; ifx_dev->spi_xfer.rx_dma = (dma_addr_t)0; + break; } spi_message_add_tail(&ifx_dev->spi_xfer, &ifx_dev->spi_msg); @@ -1329,6 +1334,7 @@ static int ifx_spi_spi_probe(struct spi_device *spi) { int ret; int srdy; + int modem; struct ifx_modem_platform_data *pl_data = NULL; struct ifx_spi_device *ifx_dev; char *drv_name = (char *)spi->dev.driver->name; @@ -1350,11 +1356,12 @@ static int ifx_spi_spi_probe(struct spi_device *spi) if (spi->mode & SPI_LOOP) dev_warn(&spi->dev, "SPI device in loop back"); - if (strncmp(drv_name, MODEMNAME_6260, strlen(drv_name)) == 0) - is_6160 = 0; - else if (strncmp(drv_name, MODEMNAME_6160, strlen(drv_name)) == 0) - is_6160 = 1; - else { + modem = spi_get_device_id(spi)->driver_data; + switch (modem) { + case IFX_6160: + case IFX_6260: + break; + default: dev_err(&spi->dev, "probed for unrecognized modem %s", drv_name); return -ENODEV; @@ -1381,6 +1388,7 @@ static int ifx_spi_spi_probe(struct spi_device *spi) return -ENOMEM; } saved_ifx_dev = ifx_dev; + ifx_dev->modem = modem; ifx_dev->spi_dev = spi; clear_bit(IFX_SPI_STATE_IO_IN_PROGRESS, &ifx_dev->flags); spin_lock_init(&ifx_dev->write_lock); @@ -1735,26 +1743,21 @@ static const struct dev_pm_ops ifx_spi_pm = { .runtime_idle = ifx_spi_pm_runtime_idle }; -/* spi operations */ -static const struct spi_driver ifx_spi_driver_6160 = { - .driver = { - .name = MODEMNAME_6160, - .bus = &spi_bus_type, - .pm = &ifx_spi_pm, - .owner = THIS_MODULE}, - .probe = ifx_spi_spi_probe, - .shutdown = ifx_spi_spi_shutdown, - .remove = __devexit_p(ifx_spi_spi_remove), - .suspend = ifx_spi_spi_suspend, - .resume = ifx_spi_spi_resume +static const struct spi_device_id ifx_spi_device_ids[] = { + { MODEMNAME_6160, IFX_6160 }, + { MODEMNAME_6260, IFX_6260 }, + {}, }; +MODULE_DEVICE_TABLE(spi, ifx_spi_device_ids); -static const struct spi_driver ifx_spi_driver_6260 = { +/* spi operations */ +static const struct spi_driver ifx_spi_driver = { .driver = { - .name = MODEMNAME_6260, + .name = DRVNAME, .bus = &spi_bus_type, .pm = &ifx_spi_pm, .owner = THIS_MODULE}, + .id_table = ifx_spi_device_ids, .probe = ifx_spi_spi_probe, .shutdown = ifx_spi_spi_shutdown, .remove = __devexit_p(ifx_spi_spi_remove), @@ -1794,8 +1797,7 @@ static void __exit ifx_spi_exit(void) /* unregister */ tty_unregister_driver(tty_drv); - spi_unregister_driver((void *)&ifx_spi_driver_6160); - spi_unregister_driver((void *)&ifx_spi_driver_6260); + spi_unregister_driver((void *)&ifx_spi_driver); pr_debug("ifx_spi driver removed"); } @@ -1842,18 +1844,10 @@ static int __init ifx_spi_init(void) return result; } - result = spi_register_driver((void *)&ifx_spi_driver_6160); - if (result) { - pr_err("%s: spi_register_driver failed(%d)", - DRVNAME, result); - tty_unregister_driver(tty_drv); - return result; - } - result = spi_register_driver((void *)&ifx_spi_driver_6260); + result = spi_register_driver((void *)&ifx_spi_driver); if (result) { pr_err("%s: spi_register_driver failed(%d)", DRVNAME, result); - spi_unregister_driver((void *)&ifx_spi_driver_6160); tty_unregister_driver(tty_drv); return result; } diff --git a/drivers/serial/ifx6x60.h b/drivers/serial/ifx6x60.h index 01c8883..fc8dd21 100644 --- a/drivers/serial/ifx6x60.h +++ b/drivers/serial/ifx6x60.h @@ -76,6 +76,7 @@ struct ifx_spi_device { struct tasklet_struct io_work_tasklet; struct work_struct write_wakeup_work; unsigned long flags; + int modem; dma_addr_t rx_dma; dma_addr_t tx_dma; -- 1.6.0.6 _______________________________________________ MeeGo-kernel mailing list MeeGo-kernel@lists.meego.com http://lists.meego.com/listinfo/meego-kernel