#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"
/* 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 */
/* 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 },
{ "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 },
{ "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 */
{ "USR9180", 0 },
/* U.S. Robotics 56K Voice INT PnP*/
{ "USR9190", 0 },
+ /* HP Compaq Tablet PC tc1100 Wacom tablet */
+ { "WACF005", 0 },
/* Rockwell's (PORALiNK) 33600 INT PNP */
{ "WCI0003", 0 },
/* Unkown PnP modems */
}
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;
- serial_req.baud_base = 115200;
- line = register_serial(&serial_req);
+ port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
+ 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);
}
static struct pnp_driver serial_pnp_driver = {