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

Reply via email to