fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / serial / 8250_pnp.c
index abbbe3f..d3d6b82 100644 (file)
 #include <linux/pnp.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
-#include <linux/tty.h>
-#include <linux/serial.h>
-#include <linux/serialP.h>
 #include <linux/serial_core.h>
+#include <linux/bitops.h>
 
-#include <asm/bitops.h>
 #include <asm/byteorder.h>
-#include <asm/serial.h>
 
 #include "8250.h"
 
@@ -49,7 +45,7 @@ static const struct pnp_device_id pnp_dev_table[] = {
        /* Actiontec ISA PNP 56K X2 Fax Modem */
        {       "AEI1240",              0       },
        /* Rockwell 56K ACF II Fax+Data+Voice Modem */
-       {       "AKY1021",              SPCI_FL_NO_SHIRQ        },
+       {       "AKY1021",              0 /*SPCI_FL_NO_SHIRQ*/  },
        /* AZT3005 PnP SOUND DEVICE */
        {       "AZT4001",              0       },
        /* Best Data Products Inc. Smart One 336F PnP Modem */
@@ -254,6 +250,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
        /* Kortex International */
        /* KORTEX 14400 Externe PnP */
        {       "ROK0100",              0       },
+       /* Rockwell 28.8 */
+       {       "ROK4120",              0       },
        /* Viking Components, Inc */
        /* Viking 28.8 INTERNAL Fax+Data+Voice PnP */
        {       "ROK4920",              0       },
@@ -274,8 +272,12 @@ static const struct pnp_device_id pnp_dev_table[] = {
        {       "SUP1421",              0       },
        /* SupraExpress 33.6 Data/Fax PnP modem */
        {       "SUP1590",              0       },
+       /* SupraExpress 336i Sp ASVD */
+       {       "SUP1620",              0       },
        /* SupraExpress 33.6 Data/Fax PnP modem */
        {       "SUP1760",              0       },
+       /* SupraExpress 56i Sp Intl */
+       {       "SUP2171",              0       },
        /* Phoebe Micro */
        /* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */
        {       "TEX0011",              0       },
@@ -293,6 +295,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
        {       "USR0006",              0       },
        /* U.S. Robotics 33.6K Voice EXT PnP */
        {       "USR0007",              0       },
+       /* U.S. Robotics Courier V.Everything INT PnP */
+       {       "USR0009",              0       },
        /* U.S. Robotics 33.6K Voice INT PnP */
        {       "USR2002",              0       },
        /* U.S. Robotics 56K Voice INT PnP */
@@ -319,6 +323,23 @@ static const struct pnp_device_id pnp_dev_table[] = {
        {       "USR9180",              0       },
        /* U.S. Robotics 56K Voice INT PnP*/
        {       "USR9190",              0       },
+       /* Wacom tablets */
+       {       "WACF004",              0       },
+       {       "WACF005",              0       },
+       {       "WACF006",              0       },
+       /* Compaq touchscreen */
+       {       "FPI2002",              0 },
+       /* Fujitsu Stylistic touchscreens */
+       {       "FUJ02B2",              0 },
+       {       "FUJ02B3",              0 },
+       /* Fujitsu Stylistic LT touchscreens */
+       {       "FUJ02B4",              0 },
+       /* Passive Fujitsu Stylistic touchscreens */
+       {       "FUJ02B6",              0 },
+       {       "FUJ02B7",              0 },
+       {       "FUJ02B8",              0 },
+       {       "FUJ02B9",              0 },
+       {       "FUJ02BC",              0 },
        /* Rockwell's (PORALiNK) 33600 INT PNP */
        {       "WCI0003",              0       },
        /* Unkown PnP modems */
@@ -334,7 +355,7 @@ static char *modem_names[] __devinitdata = {
        "MODEM", "Modem", "modem", "FAX", "Fax", "fax",
        "56K", "56k", "K56", "33.6", "28.8", "14.4",
        "33,600", "28,800", "14,400", "33.600", "28.800", "14.400",
-       "33600", "28800", "14400", "V.90", "V.34", "V.32", 0
+       "33600", "28800", "14400", "V.90", "V.34", "V.32", NULL
 };
 
 static int __devinit check_name(char *name)
@@ -361,9 +382,6 @@ static int __devinit check_resources(struct pnp_option *option)
                            ((port->min == 0x2f8) ||
                             (port->min == 0x3f8) ||
                             (port->min == 0x2e8) ||
-#ifdef CONFIG_X86_PC9800
-                            (port->min == 0x8b0) ||
-#endif
                             (port->min == 0x3e8)))
                                return 1;
        }
@@ -397,47 +415,87 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags)
 }
 
 static int __devinit
-serial_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id)
+serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
 {
-       struct serial_struct serial_req;
+       struct uart_port port;
        int ret, line, flags = dev_id->driver_data;
+
        if (flags & UNKNOWN_DEV) {
                ret = serial_pnp_guess_board(dev, &flags);
                if (ret < 0)
                        return ret;
        }
-       memset(&serial_req, 0, sizeof(serial_req));
-       serial_req.irq = pnp_irq(dev,0);
-       serial_req.port = pnp_port_start(dev, 0);
-       if (HIGH_BITS_OFFSET)
-               serial_req.port = pnp_port_start(dev, 0) >> HIGH_BITS_OFFSET;
+
+       memset(&port, 0, sizeof(struct uart_port));
+       port.irq = pnp_irq(dev, 0);
+       if (pnp_port_valid(dev, 0)) {
+               port.iobase = pnp_port_start(dev, 0);
+               port.iotype = UPIO_PORT;
+       } else if (pnp_mem_valid(dev, 0)) {
+               port.mapbase = pnp_mem_start(dev, 0);
+               port.iotype = UPIO_MEM;
+               port.flags = UPF_IOREMAP;
+       } else
+               return -ENODEV;
+
 #ifdef SERIAL_DEBUG_PNP
-       printk("Setup PNP port: port %x, irq %d, type %d\n",
-              serial_req.port, serial_req.irq, serial_req.io_type);
+       printk("Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
+              port.iobase, port.mapbase, port.irq, port.iotype);
 #endif
 
-       serial_req.flags = UPF_SKIP_TEST | UPF_AUTOPROBE  | UPF_RESOURCES;
-       serial_req.baud_base = 115200;
-       line = register_serial(&serial_req);
+       port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
+       if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
+               port.flags |= UPF_SHARE_IRQ;
+       port.uartclk = 1843200;
+       port.dev = &dev->dev;
+
+       line = serial8250_register_port(&port);
 
        if (line >= 0)
-               pnp_set_drvdata(dev, (void *)(line + 1));
+               pnp_set_drvdata(dev, (void *)((long)line + 1));
        return line >= 0 ? 0 : -ENODEV;
 
 }
 
-static void __devexit serial_pnp_remove(struct pnp_dev * dev)
+static void __devexit serial_pnp_remove(struct pnp_dev *dev)
 {
-       int line = (int)pnp_get_drvdata(dev);
+       long line = (long)pnp_get_drvdata(dev);
        if (line)
-               unregister_serial(line - 1);
+               serial8250_unregister_port(line - 1);
+}
+
+#ifdef CONFIG_PM
+static int serial_pnp_suspend(struct pnp_dev *dev, pm_message_t state)
+{
+       long line = (long)pnp_get_drvdata(dev);
+
+       if (!line)
+               return -ENODEV;
+       serial8250_suspend_port(line - 1);
+       return 0;
+}
+
+static int serial_pnp_resume(struct pnp_dev *dev)
+{
+       long line = (long)pnp_get_drvdata(dev);
+
+       if (!line)
+               return -ENODEV;
+       serial8250_resume_port(line - 1);
+       return 0;
 }
+#else
+#define serial_pnp_suspend NULL
+#define serial_pnp_resume NULL
+#endif /* CONFIG_PM */
 
 static struct pnp_driver serial_pnp_driver = {
        .name           = "serial",
-       .id_table       = pnp_dev_table,
        .probe          = serial_pnp_probe,
        .remove         = __devexit_p(serial_pnp_remove),
+       .suspend        = serial_pnp_suspend,
+       .resume         = serial_pnp_resume,
+       .id_table       = pnp_dev_table,
 };
 
 static int __init serial8250_pnp_init(void)