X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fserial%2F8250_pnp.c;h=d3d6b82706b5edbb548211187e96e28956859a4a;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=abbbe3fc3d1dc0a93a14acab1c65f68ed33246d5;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c index abbbe3fc3..d3d6b8270 100644 --- a/drivers/serial/8250_pnp.c +++ b/drivers/serial/8250_pnp.c @@ -21,14 +21,10 @@ #include #include #include -#include -#include -#include #include +#include -#include #include -#include #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)