Signed-off-by: Russ Gorby <[email protected]>
Replaced the multiple driver registration with id_table method to register for
multiple devices
---
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
[email protected]
http://lists.meego.com/listinfo/meego-kernel