From de6cc84f723ab4373d1f83e64771392d6f784c81 Mon Sep 17 00:00:00 2001 From: Russell King Date: Wed, 30 Aug 2006 15:30:39 +0100 Subject: [SERIAL] Remove m32r_sio dependency on asm/serial.h m32r_sio re-uses a custom defined BASE_BAUD from asm/serial.h, and replaces SERIAL_PORT_DFNS with its own driver private copy. Since asm/serial.h is supposed to define 8250-based ports using these symbols, this isn't a sane idea. Hence, eliminate asm/serial.h from m32r_sio.c. Acked-by: Hirokazu Takata Signed-off-by: Russell King --- drivers/serial/m32r_sio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/m32r_sio.c b/drivers/serial/m32r_sio.c index e7fe4bb46eca..28c9ce6f0bdc 100644 --- a/drivers/serial/m32r_sio.c +++ b/drivers/serial/m32r_sio.c @@ -76,7 +76,7 @@ */ #define is_real_interrupt(irq) ((irq) != 0) -#include +#define BASE_BAUD 115200 /* Standard COM flags */ #define STD_COM_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST) @@ -86,7 +86,6 @@ * standard enumeration mechanism. Platforms that can find all * serial ports via mechanisms like ACPI or PCI need not supply it. */ -#undef SERIAL_PORT_DFNS #if defined(CONFIG_PLAT_USRV) #define SERIAL_PORT_DFNS \ @@ -109,7 +108,7 @@ #endif /* !CONFIG_PLAT_USRV */ static struct old_serial_port old_serial_port[] = { - SERIAL_PORT_DFNS /* defined in asm/serial.h */ + SERIAL_PORT_DFNS }; #define UART_NR ARRAY_SIZE(old_serial_port) -- cgit v1.2.3 From 43549ad7a74e33947f3ba1756a7713086d32e97c Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 20:53:05 +0100 Subject: [SERIAL] serial_cs: Use clean up multiport card detection - Use ARRAY_SIZE() instead of home grown based version. - use parse->manfid.card rather than le16_to_cpu(buf[1]) - manfid.card is already converted to this format. - use info->prodid in subsequent tests rather than parse->manfid.card. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index cbf260bc225d..82bb603fc1ae 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -95,7 +95,6 @@ static const struct multi_id multi_id[] = { { MANFID_INTEL, PRODID_INTEL_DUAL_RS232, 2 }, { MANFID_NATINST, PRODID_NATINST_QUAD_RS232, 4 } }; -#define MULTI_COUNT (sizeof(multi_id)/sizeof(struct multi_id)) struct serial_info { struct pcmcia_device *p_dev; @@ -622,13 +621,13 @@ static int serial_config(struct pcmcia_device * link) tuple->DesiredTuple = CISTPL_MANFID; if (first_tuple(link, tuple, parse) == CS_SUCCESS) { info->manfid = parse->manfid.manf; - info->prodid = le16_to_cpu(buf[1]); - for (i = 0; i < MULTI_COUNT; i++) + info->prodid = parse->manfid.card; + for (i = 0; i < ARRAY_SIZE(multi_id); i++) if ((info->manfid == multi_id[i].manfid) && - (parse->manfid.card == multi_id[i].prodid)) + (info->prodid == multi_id[i].prodid)) { + info->multi = multi_id[i].multi; break; - if (i < MULTI_COUNT) - info->multi = multi_id[i].multi; + } } /* Another check for dual-serial cards: look for either serial or -- cgit v1.2.3 From 1fbbac4bcb03033d325c71fc7273aa0b9c1d9a03 Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 21:09:41 +0100 Subject: [SERIAL] serial_cs: convert multi-port table to quirk table - rename multi_id table to serial_quirk / quirks[] - use named initialisers - store a pointer to the quirk table in the serial_info structure so we can use the quirk table entry later. - apply multi-port quirk after the multi-port guessing code, but only if it's != -1. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 55 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 82bb603fc1ae..2e3a39d38f08 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -80,20 +80,42 @@ module_param(buggy_uart, int, 0444); /* Table of multi-port card ID's */ -struct multi_id { +struct serial_quirk { u_short manfid; u_short prodid; int multi; /* 1 = multifunction, > 1 = # ports */ }; -static const struct multi_id multi_id[] = { - { MANFID_OMEGA, PRODID_OMEGA_QSP_100, 4 }, - { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232, 2 }, - { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232_D1, 2 }, - { MANFID_QUATECH, PRODID_QUATECH_QUAD_RS232, 4 }, - { MANFID_SOCKET, PRODID_SOCKET_DUAL_RS232, 2 }, - { MANFID_INTEL, PRODID_INTEL_DUAL_RS232, 2 }, - { MANFID_NATINST, PRODID_NATINST_QUAD_RS232, 4 } +static const struct serial_quirk quirks[] = { + { + .manfid = MANFID_OMEGA, + .prodid = PRODID_OMEGA_QSP_100, + .multi = 4, + }, { + .manfid = MANFID_QUATECH, + .prodid = PRODID_QUATECH_DUAL_RS232, + .multi = 2, + }, { + .manfid = MANFID_QUATECH, + .prodid = PRODID_QUATECH_DUAL_RS232_D1, + .multi = 2, + }, { + .manfid = MANFID_QUATECH, + .prodid = PRODID_QUATECH_QUAD_RS232, + .multi = 4, + }, { + .manfid = MANFID_SOCKET, + .prodid = PRODID_SOCKET_DUAL_RS232, + .multi = 2, + }, { + .manfid = MANFID_INTEL, + .prodid = PRODID_INTEL_DUAL_RS232, + .multi = 2, + }, { + .manfid = MANFID_NATINST, + .prodid = PRODID_NATINST_QUAD_RS232, + .multi = 4, + } }; struct serial_info { @@ -106,6 +128,7 @@ struct serial_info { int c950ctrl; dev_node_t node[4]; int line[4]; + const struct serial_quirk *quirk; }; struct serial_cfg_mem { @@ -622,10 +645,10 @@ static int serial_config(struct pcmcia_device * link) if (first_tuple(link, tuple, parse) == CS_SUCCESS) { info->manfid = parse->manfid.manf; info->prodid = parse->manfid.card; - for (i = 0; i < ARRAY_SIZE(multi_id); i++) - if ((info->manfid == multi_id[i].manfid) && - (info->prodid == multi_id[i].prodid)) { - info->multi = multi_id[i].multi; + for (i = 0; i < ARRAY_SIZE(quirks); i++) + if ((info->manfid == quirks[i].manfid) && + (info->prodid == quirks[i].prodid)) { + info->quirk = &quirks[i]; break; } } @@ -647,6 +670,12 @@ static int serial_config(struct pcmcia_device * link) } } + /* + * Apply any multi-port quirk. + */ + if (info->quirk && info->quirk->multi != -1) + info->multi = info->quirk->multi; + if (info->multi > 1) multi_config(link); else -- cgit v1.2.3 From a8244b564ccc46dabf2367008aecf2b380a9be8d Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 21:26:16 +0100 Subject: [SERIAL] serial_cs: allow wildcarded quirks Some quirks we will introduce next apply to (eg) all cards of one manufacturer. Therefore, we need a way to list these in the quirk table - use ~0 - this is not a possible device ID value. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 2e3a39d38f08..82d42f30725e 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -81,8 +81,8 @@ module_param(buggy_uart, int, 0444); /* Table of multi-port card ID's */ struct serial_quirk { - u_short manfid; - u_short prodid; + unsigned int manfid; + unsigned int prodid; int multi; /* 1 = multifunction, > 1 = # ports */ }; @@ -645,9 +645,12 @@ static int serial_config(struct pcmcia_device * link) if (first_tuple(link, tuple, parse) == CS_SUCCESS) { info->manfid = parse->manfid.manf; info->prodid = parse->manfid.card; + for (i = 0; i < ARRAY_SIZE(quirks); i++) - if ((info->manfid == quirks[i].manfid) && - (info->prodid == quirks[i].prodid)) { + if ((quirks[i].manfid == ~0 || + quirks[i].manfid == info->manfid) && + (quirks[i].prodid == ~0 || + quirks[i].prodid == info->prodid)) { info->quirk = &quirks[i]; break; } -- cgit v1.2.3 From eee3a883cebefca6c450c3c1c18a996e23001c2c Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 21:34:11 +0100 Subject: [SERIAL] serial_cs: convert IBM post-init handling to a quirk Move IBM quirk handling into its own quirk entry. Note that doing quirk handling after we've registered the ports is racy, but since I don't know if moving this will have an undesired effect, it's probably better to leave where it is. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 90 ++++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 34 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 82d42f30725e..ac4571a25b30 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -84,10 +84,59 @@ struct serial_quirk { unsigned int manfid; unsigned int prodid; int multi; /* 1 = multifunction, > 1 = # ports */ + int (*post)(struct pcmcia_device *); }; +struct serial_info { + struct pcmcia_device *p_dev; + int ndev; + int multi; + int slave; + int manfid; + int prodid; + int c950ctrl; + dev_node_t node[4]; + int line[4]; + const struct serial_quirk *quirk; +}; + +struct serial_cfg_mem { + tuple_t tuple; + cisparse_t parse; + u_char buf[256]; +}; + +static int quirk_post_ibm(struct pcmcia_device *link) +{ + conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; + int last_ret, last_fn; + + last_ret = pcmcia_access_configuration_register(link, ®); + if (last_ret) { + last_fn = AccessConfigurationRegister; + goto cs_failed; + } + reg.Action = CS_WRITE; + reg.Value = reg.Value | 1; + last_ret = pcmcia_access_configuration_register(link, ®); + if (last_ret) { + last_fn = AccessConfigurationRegister; + goto cs_failed; + } + return 0; + + cs_failed: + cs_error(link, last_fn, last_ret); + return -ENODEV; +} + static const struct serial_quirk quirks[] = { { + .manfid = MANFID_IBM, + .prodid = ~0, + .multi = -1, + .post = quirk_post_ibm, + }, { .manfid = MANFID_OMEGA, .prodid = PRODID_OMEGA_QSP_100, .multi = 4, @@ -118,25 +167,6 @@ static const struct serial_quirk quirks[] = { } }; -struct serial_info { - struct pcmcia_device *p_dev; - int ndev; - int multi; - int slave; - int manfid; - int prodid; - int c950ctrl; - dev_node_t node[4]; - int line[4]; - const struct serial_quirk *quirk; -}; - -struct serial_cfg_mem { - tuple_t tuple; - cisparse_t parse; - u_char buf[256]; -}; - static int serial_config(struct pcmcia_device * link); @@ -687,21 +717,13 @@ static int serial_config(struct pcmcia_device * link) if (info->ndev == 0) goto failed; - if (info->manfid == MANFID_IBM) { - conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; - last_ret = pcmcia_access_configuration_register(link, ®); - if (last_ret) { - last_fn = AccessConfigurationRegister; - goto cs_failed; - } - reg.Action = CS_WRITE; - reg.Value = reg.Value | 1; - last_ret = pcmcia_access_configuration_register(link, ®); - if (last_ret) { - last_fn = AccessConfigurationRegister; - goto cs_failed; - } - } + /* + * Apply any post-init quirk. FIXME: This should really happen + * before we register the port, since it might already be in use. + */ + if (info->quirk && info->quirk->post) + if (info->quirk->post(link)) + goto failed; link->dev_node = &info->node[0]; kfree(cfg_mem); -- cgit v1.2.3 From 7ef057fa707897c19725d7e07123e57f6aea79db Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 22:45:41 +0100 Subject: [SERIAL] serial_cs: Convert Oxford 950 / Possio GCC wakeup quirk Move the Oxford Semi OX950 / Possio GCC wakeup handling to a quirk wakeup handler. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 100 ++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 37 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index ac4571a25b30..8e48cb659b3d 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -84,6 +84,7 @@ struct serial_quirk { unsigned int manfid; unsigned int prodid; int multi; /* 1 = multifunction, > 1 = # ports */ + void (*wakeup)(struct pcmcia_device *); int (*post)(struct pcmcia_device *); }; @@ -130,16 +131,67 @@ static int quirk_post_ibm(struct pcmcia_device *link) return -ENODEV; } +static void quirk_wakeup_oxsemi(struct pcmcia_device *link) +{ + struct serial_info *info = link->priv; + + outb(12, info->c950ctrl + 1); +} + +/* request_region? oxsemi branch does no request_region too... */ +/* + * This sequence is needed to properly initialize MC45 attached to OXCF950. + * I tried decreasing these msleep()s, but it worked properly (survived + * 1000 stop/start operations) with these timeouts (or bigger). + */ +static void quirk_wakeup_possio_gcc(struct pcmcia_device *link) +{ + struct serial_info *info = link->priv; + unsigned int ctrl = info->c950ctrl; + + outb(0xA, ctrl + 1); + msleep(100); + outb(0xE, ctrl + 1); + msleep(300); + outb(0xC, ctrl + 1); + msleep(100); + outb(0xE, ctrl + 1); + msleep(200); + outb(0xF, ctrl + 1); + msleep(100); + outb(0xE, ctrl + 1); + msleep(100); + outb(0xC, ctrl + 1); +} + static const struct serial_quirk quirks[] = { { .manfid = MANFID_IBM, .prodid = ~0, .multi = -1, .post = quirk_post_ibm, + }, { + .manfid = MANFID_INTEL, + .prodid = PRODID_INTEL_DUAL_RS232, + .multi = 2, + }, { + .manfid = MANFID_NATINST, + .prodid = PRODID_NATINST_QUAD_RS232, + .multi = 4, }, { .manfid = MANFID_OMEGA, .prodid = PRODID_OMEGA_QSP_100, .multi = 4, + }, { + .manfid = MANFID_OXSEMI, + .prodid = ~0, + .multi = -1, + .wakeup = quirk_wakeup_oxsemi, + }, { + .manfid = MANFID_POSSIO, + .prodid = PRODID_POSSIO_GCC, + .multi = -1, + .wakeup = quirk_wakeup_possio_gcc, }, { .manfid = MANFID_QUATECH, .prodid = PRODID_QUATECH_DUAL_RS232, @@ -156,14 +208,6 @@ static const struct serial_quirk quirks[] = { .manfid = MANFID_SOCKET, .prodid = PRODID_SOCKET_DUAL_RS232, .multi = 2, - }, { - .manfid = MANFID_INTEL, - .prodid = PRODID_INTEL_DUAL_RS232, - .multi = 2, - }, { - .manfid = MANFID_NATINST, - .prodid = PRODID_NATINST_QUAD_RS232, - .multi = 4, } }; @@ -171,33 +215,6 @@ static const struct serial_quirk quirks[] = { static int serial_config(struct pcmcia_device * link); -static void wakeup_card(struct serial_info *info) -{ - int ctrl = info->c950ctrl; - - if (info->manfid == MANFID_OXSEMI) { - outb(12, ctrl + 1); - } else if (info->manfid == MANFID_POSSIO && info->prodid == PRODID_POSSIO_GCC) { - /* request_region? oxsemi branch does no request_region too... */ - /* This sequence is needed to properly initialize MC45 attached to OXCF950. - * I tried decreasing these msleep()s, but it worked properly (survived - * 1000 stop/start operations) with these timeouts (or bigger). */ - outb(0xA, ctrl + 1); - msleep(100); - outb(0xE, ctrl + 1); - msleep(300); - outb(0xC, ctrl + 1); - msleep(100); - outb(0xE, ctrl + 1); - msleep(200); - outb(0xF, ctrl + 1); - msleep(100); - outb(0xE, ctrl + 1); - msleep(100); - outb(0xC, ctrl + 1); - } -} - /*====================================================================== After a card is removed, serial_remove() will unregister @@ -243,7 +260,9 @@ static int serial_resume(struct pcmcia_device *link) for (i = 0; i < info->ndev; i++) serial8250_resume_port(info->line[i]); - wakeup_card(info); + + if (info->quirk && info->quirk->wakeup) + info->quirk->wakeup(link); } return 0; @@ -602,7 +621,14 @@ static int multi_config(struct pcmcia_device * link) link->irq.AssignedIRQ); } info->c950ctrl = base2; - wakeup_card(info); + + /* + * FIXME: We really should wake up the port prior to + * handing it over to the serial layer. + */ + if (info->quirk && info->quirk->wakeup) + info->quirk->wakeup(link); + rc = 0; goto free_cfg_mem; } -- cgit v1.2.3 From efd92dfaad962c4fbaf4251b28578c97bd3aa85f Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 23:00:54 +0100 Subject: [SERIAL] serial_cs: add configuration quirk Add a quirk primerily to handle tweaks to the link->conf structure, eg as required for Socket cards. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 8e48cb659b3d..788ba404efc6 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -84,6 +84,7 @@ struct serial_quirk { unsigned int manfid; unsigned int prodid; int multi; /* 1 = multifunction, > 1 = # ports */ + void (*config)(struct pcmcia_device *); void (*wakeup)(struct pcmcia_device *); int (*post)(struct pcmcia_device *); }; @@ -164,6 +165,19 @@ static void quirk_wakeup_possio_gcc(struct pcmcia_device *link) outb(0xC, ctrl + 1); } +/* + * Socket Dual IO: this enables irq's for second port + */ +static void quirk_config_socket(struct pcmcia_device *link) +{ + struct serial_info *info = link->priv; + + if (info->multi) { + link->conf.Present |= PRESENT_EXT_STATUS; + link->conf.ExtStatus = ESR_REQ_ATTN_ENA; + } +} + static const struct serial_quirk quirks[] = { { .manfid = MANFID_IBM, @@ -208,6 +222,12 @@ static const struct serial_quirk quirks[] = { .manfid = MANFID_SOCKET, .prodid = PRODID_SOCKET_DUAL_RS232, .multi = 2, + .config = quirk_config_socket, + }, { + .manfid = MANFID_SOCKET, + .prodid = ~0, + .multi = -1, + .config = quirk_config_socket, } }; @@ -504,6 +524,13 @@ next_entry: } if (info->multi && (info->manfid == MANFID_3COM)) link->conf.ConfigIndex &= ~(0x08); + + /* + * Apply any configuration quirks. + */ + if (info->quirk && info->quirk->config) + info->quirk->config(link); + i = pcmcia_request_configuration(link, &link->conf); if (i != CS_SUCCESS) { cs_error(link, RequestConfiguration, i); @@ -592,11 +619,13 @@ static int multi_config(struct pcmcia_device * link) cs_error(link, RequestIRQ, i); link->irq.AssignedIRQ = 0; } - /* Socket Dual IO: this enables irq's for second port */ - if (info->multi && (info->manfid == MANFID_SOCKET)) { - link->conf.Present |= PRESENT_EXT_STATUS; - link->conf.ExtStatus = ESR_REQ_ATTN_ENA; - } + + /* + * Apply any configuration quirks. + */ + if (info->quirk && info->quirk->config) + info->quirk->config(link); + i = pcmcia_request_configuration(link, &link->conf); if (i != CS_SUCCESS) { cs_error(link, RequestConfiguration, i); -- cgit v1.2.3 From 20f130495c07cd01fb423c3dec7f045038118dec Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 23:04:37 +0100 Subject: [SERIAL] serial_cs: handle Nokia multi->single port bodge via config quirk According to the existing code, Nokia only make single-port cards, but are detected as multi-port cards. Handle this in roughly the same way via the config quirk - forcing it to be a real single port card (info->multi=0) changes the way we allocate the IO memory, which might stop the card working. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 788ba404efc6..704922073bbf 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -132,6 +132,18 @@ static int quirk_post_ibm(struct pcmcia_device *link) return -ENODEV; } +/* + * Nokia cards are not really multiport cards. Shouldn't this + * be handled by setting the quirk entry .multi = 0 | 1 ? + */ +static void quirk_config_nokia(struct pcmcia_device *link) +{ + struct serial_info *info = link->priv; + + if (info->multi > 1) + info->multi = 1; +} + static void quirk_wakeup_oxsemi(struct pcmcia_device *link) { struct serial_info *info = link->priv; @@ -192,6 +204,11 @@ static const struct serial_quirk quirks[] = { .manfid = MANFID_NATINST, .prodid = PRODID_NATINST_QUAD_RS232, .multi = 4, + }, { + .manfid = MANFID_NOKIA, + .prodid = ~0, + .multi = -1, + .config = quirk_config_nokia, }, { .manfid = MANFID_OMEGA, .prodid = PRODID_OMEGA_QSP_100, @@ -663,11 +680,6 @@ static int multi_config(struct pcmcia_device * link) } setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); - /* The Nokia cards are not really multiport cards */ - if (info->manfid == MANFID_NOKIA) { - rc = 0; - goto free_cfg_mem; - } for (i = 0; i < info->multi - 1; i++) setup_serial(link, info, base2 + (8 * i), link->irq.AssignedIRQ); -- cgit v1.2.3 From f3d106881b06a423455f95916e666acebe6503f2 Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 16 Sep 2006 23:07:46 +0100 Subject: [SERIAL] serial_cs: Add quirk for brainboxes 2-port RS232 card Mauro Ziliani reports that this card has a higher clock rate. Rather than tweak the 8250 driver to handle this, add a quirk to pass the correct clock rate to the driver. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 704922073bbf..1267cbed52f5 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -85,6 +85,7 @@ struct serial_quirk { unsigned int prodid; int multi; /* 1 = multifunction, > 1 = # ports */ void (*config)(struct pcmcia_device *); + void (*setup)(struct pcmcia_device *, struct uart_port *); void (*wakeup)(struct pcmcia_device *); int (*post)(struct pcmcia_device *); }; @@ -108,6 +109,16 @@ struct serial_cfg_mem { u_char buf[256]; }; +/* + * vers_1 5.0, "Brain Boxes", "2-Port RS232 card", "r6" + * manfid 0x0160, 0x0104 + * This card appears to have a 14.7456MHz clock. + */ +static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) +{ + port->uartclk = 14745600; +} + static int quirk_post_ibm(struct pcmcia_device *link) { conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; @@ -192,6 +203,11 @@ static void quirk_config_socket(struct pcmcia_device *link) static const struct serial_quirk quirks[] = { { + .manfid = 0x0160, + .prodid = 0x0104, + .multi = -1, + .setup = quirk_setup_brainboxes_0104, + }, { .manfid = MANFID_IBM, .prodid = ~0, .multi = -1, @@ -386,6 +402,10 @@ static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, port.dev = &handle_to_dev(handle); if (buggy_uart) port.flags |= UPF_BUGGY_UART; + + if (info->quirk && info->quirk->setup) + info->quirk->setup(handle, &port); + line = serial8250_register_port(&port); if (line < 0) { printk(KERN_NOTICE "serial_cs: serial8250_register_port() at " -- cgit v1.2.3 From 0b30d668a20acd2ffd4268f7bbe799b0dd73d5cf Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Sat, 9 Sep 2006 22:23:56 +0400 Subject: [SERIAL] 8250 resourse management fixes I think register ranges obviously need to be claimed/released for all UARTs including those with UPIO_MEM32 and UPIO_TSI iotype. Also, serial8250_request_rsa_resources() returns false positives with UPIO_MEM32, UPIO_AU, and UPIO_TSI iotype -- I don't think this makes any sense. Signed-off-by: Sergei Shtylyov Signed-off-by: Russell King --- drivers/serial/8250.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 0ae9ced00ed4..8d7ef69312a5 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -1949,6 +1949,8 @@ static int serial8250_request_std_resource(struct uart_8250_port *up) case UPIO_AU: size = 0x100000; /* fall thru */ + case UPIO_TSI: + case UPIO_MEM32: case UPIO_MEM: if (!up->port.mapbase) break; @@ -1984,6 +1986,8 @@ static void serial8250_release_std_resource(struct uart_8250_port *up) case UPIO_AU: size = 0x100000; /* fall thru */ + case UPIO_TSI: + case UPIO_MEM32: case UPIO_MEM: if (!up->port.mapbase) break; @@ -2007,17 +2011,15 @@ static int serial8250_request_rsa_resource(struct uart_8250_port *up) { unsigned long start = UART_RSA_BASE << up->port.regshift; unsigned int size = 8 << up->port.regshift; - int ret = 0; + int ret = -EINVAL; switch (up->port.iotype) { - case UPIO_MEM: - ret = -EINVAL; - break; - case UPIO_HUB6: case UPIO_PORT: start += up->port.iobase; - if (!request_region(start, size, "serial-rsa")) + if (request_region(start, size, "serial-rsa")) + ret = 0; + else ret = -EBUSY; break; } @@ -2031,9 +2033,6 @@ static void serial8250_release_rsa_resource(struct uart_8250_port *up) unsigned int size = 8 << up->port.regshift; switch (up->port.iotype) { - case UPIO_MEM: - break; - case UPIO_HUB6: case UPIO_PORT: release_region(up->port.iobase + offset, size); -- cgit v1.2.3 From a4b775735c0dff5a8d59a877ff0033526b469116 Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Mon, 11 Sep 2006 20:32:58 +0400 Subject: [SERIAL] suspend/resume handlers don't have level arg anymore 8250.c and serial_txx9.c port suspend/resume handler still have this obsolete argument documented... Signed-off-by: Sergei Shtylyov Signed-off-by: Russell King --- drivers/serial/8250.c | 2 -- drivers/serial/serial_txx9.c | 2 -- 2 files changed, 4 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 8d7ef69312a5..cef03e68771b 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -2396,7 +2396,6 @@ int __init early_serial_setup(struct uart_port *port) /** * serial8250_suspend_port - suspend one serial port * @line: serial line number - * @level: the level of port suspension, as per uart_suspend_port * * Suspend one serial port. */ @@ -2408,7 +2407,6 @@ void serial8250_suspend_port(int line) /** * serial8250_resume_port - resume one serial port * @line: serial line number - * @level: the level of port resumption, as per uart_resume_port * * Resume one serial port. */ diff --git a/drivers/serial/serial_txx9.c b/drivers/serial/serial_txx9.c index b361669f85a1..ebd8d2bb17fd 100644 --- a/drivers/serial/serial_txx9.c +++ b/drivers/serial/serial_txx9.c @@ -990,7 +990,6 @@ int __init early_serial_txx9_setup(struct uart_port *port) /** * serial_txx9_suspend_port - suspend one serial port * @line: serial line number - * @level: the level of port suspension, as per uart_suspend_port * * Suspend one serial port. */ @@ -1002,7 +1001,6 @@ static void serial_txx9_suspend_port(int line) /** * serial_txx9_resume_port - resume one serial port * @line: serial line number - * @level: the level of port resumption, as per uart_resume_port * * Resume one serial port. */ -- cgit v1.2.3 From 6c6a2334a1e8af7c3eaab992732825fa9ade77cf Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Mon, 4 Sep 2006 00:04:20 +0400 Subject: [SERIAL] Make uart_line_info() correctly tell MMIO from I/O port /proc/tty/driver/serial incorrectly claims that UARTs having iotype of UPIO_MEM32, UPIO_AU, or UPIO_TSI are I/O mapped. Signed-off-by: Sergei Shtylyov Signed-off-by: Russell King --- drivers/serial/serial_core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 5f7ba1adb309..d7e28ab4c313 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -1662,16 +1662,16 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i) struct uart_port *port = state->port; char stat_buf[32]; unsigned int status; - int ret; + int mmio, ret; if (!port) return 0; + mmio = port->iotype >= UPIO_MEM; ret = sprintf(buf, "%d: uart:%s %s%08lX irq:%d", port->line, uart_type(port), - port->iotype == UPIO_MEM ? "mmio:0x" : "port:", - port->iotype == UPIO_MEM ? port->mapbase : - (unsigned long) port->iobase, + mmio ? "mmio:0x" : "port:", + mmio ? port->mapbase : (unsigned long) port->iobase, port->irq); if (port->type == PORT_UNKNOWN) { -- cgit v1.2.3 From 80e3c2b659515ef236f33f691ff5b22ae90ae8e4 Mon Sep 17 00:00:00 2001 From: Ram Gupta Date: Mon, 14 Aug 2006 23:05:29 -0700 Subject: [SERIAL] returning proper error from serial core driver Fix the issue of returning 0 even in case of error from uart_set_info function. Now it returns the error EBUSY when it can not set new port. Signed-off-by: Ram Gupta Signed-off-by: Andrew Morton Signed-off-by: Russell King --- drivers/serial/serial_core.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers') diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index d7e28ab4c313..d814bb1dcb05 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -792,6 +792,7 @@ static int uart_set_info(struct uart_state *state, * We failed anyway. */ retval = -EBUSY; + goto exit; // Added to return the correct error -Ram Gupta } } -- cgit v1.2.3 From 255341c6fded73204b1ee6feb5fe16e125b27f62 Mon Sep 17 00:00:00 2001 From: Jonathan McDowell Date: Mon, 14 Aug 2006 23:05:32 -0700 Subject: [SERIAL] OMAP1510 serial fix for 115200 baud The patch below is necessary for 115200 baud on an OMAP1510 internal UART. It's been in the linux-omap tree for some time and with it applied to a vanilla Linus git tree the serial console on the Amstrad Delta (which is OMAP1510 based and whose initial bootloader runs at 115200) works fine (it doesn't without it). Signed-off-by: Jonathan McDowell Signed-off-by: Andrew Morton Signed-off-by: Russell King --- drivers/serial/8250.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'drivers') diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index cef03e68771b..a07442ffefbd 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -1896,6 +1896,17 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, serial_outp(up, UART_EFR, efr); } +#ifdef CONFIG_ARCH_OMAP15XX + /* Workaround to enable 115200 baud on OMAP1510 internal ports */ + if (cpu_is_omap1510() && is_omap_port((unsigned int)up->port.membase)) { + if (baud == 115200) { + quot = 1; + serial_out(up, UART_OMAP_OSC_12M_SEL, 1); + } else + serial_out(up, UART_OMAP_OSC_12M_SEL, 0); + } +#endif + if (up->capabilities & UART_NATSEMI) { /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */ serial_outp(up, UART_LCR, 0xe0); -- cgit v1.2.3 From 1d5e799663046917a0eb085e716d818af20050b2 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Mon, 25 Sep 2006 16:51:27 -0700 Subject: [SERIAL] CONFIG_PM=n slim: drivers/serial/8250_pci.c Remove some code which is unneeded if CONFIG_PM=n. Signed-off-by: Alexey Dobriyan Signed-off-by: Andrew Morton Signed-off-by: Russell King --- drivers/serial/8250_pci.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers') diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index 851e4839d6d9..4d0ff8f4a01b 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c @@ -1789,6 +1789,7 @@ static void __devexit pciserial_remove_one(struct pci_dev *dev) pci_disable_device(dev); } +#ifdef CONFIG_PM static int pciserial_suspend_one(struct pci_dev *dev, pm_message_t state) { struct serial_private *priv = pci_get_drvdata(dev); @@ -1818,6 +1819,7 @@ static int pciserial_resume_one(struct pci_dev *dev) } return 0; } +#endif static struct pci_device_id serial_pci_tbl[] = { { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, @@ -2375,8 +2377,10 @@ static struct pci_driver serial_pci_driver = { .name = "serial", .probe = pciserial_init_one, .remove = __devexit_p(pciserial_remove_one), +#ifdef CONFIG_PM .suspend = pciserial_suspend_one, .resume = pciserial_resume_one, +#endif .id_table = serial_pci_tbl, }; -- cgit v1.2.3 From bcf5111a58c7db968c3fb9cd77e340a5e076f549 Mon Sep 17 00:00:00 2001 From: Russell King Date: Wed, 30 Aug 2006 10:27:15 +0100 Subject: [SERIAL] Remove wrong asm/serial.h inclusions asm/serial.h is supposed to contain the definitions for the architecture specific 8250 ports for the 8250 driver. It may also define BASE_BAUD, but this is the base baud for the architecture specific ports _only_. Therefore, nothing other than the 8250 driver should be including this header file. In order to move towards this goal, here is a patch which removes some of the more obvious incorrect includes of the file. Acked-by: Paul Fulghum Acked-by: Tony Luck Acked-by: Ralf Baechle Acked-by: David Howells Signed-off-by: Russell King --- arch/frv/kernel/setup.c | 1 - arch/ia64/kernel/setup.c | 1 - arch/mips/cobalt/setup.c | 1 - arch/mips/lasat/setup.c | 1 - drivers/char/pcmcia/synclink_cs.c | 1 - drivers/char/synclink.c | 1 - 6 files changed, 6 deletions(-) (limited to 'drivers') diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c index d96a57e5f030..a8c61dac1cee 100644 --- a/arch/frv/kernel/setup.c +++ b/arch/frv/kernel/setup.c @@ -31,7 +31,6 @@ #include #include -#include #include #include #include diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 84f93c0f2c66..c4caa8003492 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c @@ -54,7 +54,6 @@ #include #include #include -#include #include #include #include diff --git a/arch/mips/cobalt/setup.c b/arch/mips/cobalt/setup.c index c01a0170e590..0b347cffc768 100644 --- a/arch/mips/cobalt/setup.c +++ b/arch/mips/cobalt/setup.c @@ -23,7 +23,6 @@ #include #include #include -#include #include diff --git a/arch/mips/lasat/setup.c b/arch/mips/lasat/setup.c index 0ffc43c600d9..14c55168f1ff 100644 --- a/arch/mips/lasat/setup.c +++ b/arch/mips/lasat/setup.c @@ -34,7 +34,6 @@ #include #include #include -#include #include #include diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 00f574cbb0d4..539efe782618 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c @@ -57,7 +57,6 @@ #include #include #include -#include #include #include diff --git a/drivers/char/synclink.c b/drivers/char/synclink.c index 78b1b1a2732b..c53f4579a59f 100644 --- a/drivers/char/synclink.c +++ b/drivers/char/synclink.c @@ -87,7 +87,6 @@ #include #include -#include #include #include -- cgit v1.2.3 From fe59d5372ae719ca4550958f1e5bb4dd6eeac9cd Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 1 Oct 2006 17:14:07 +0100 Subject: [SERIAL] Fix resume handling bug Unfortunately, pcmcia_dev_present() returns false when a device is suspended, so checking this on resume does not work too well. Omit this test. Signed-off-by: Russell King --- drivers/serial/serial_cs.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 1267cbed52f5..00f9ffd69489 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -307,16 +307,14 @@ static int serial_suspend(struct pcmcia_device *link) static int serial_resume(struct pcmcia_device *link) { - if (pcmcia_dev_present(link)) { - struct serial_info *info = link->priv; - int i; + struct serial_info *info = link->priv; + int i; - for (i = 0; i < info->ndev; i++) - serial8250_resume_port(info->line[i]); + for (i = 0; i < info->ndev; i++) + serial8250_resume_port(info->line[i]); - if (info->quirk && info->quirk->wakeup) - info->quirk->wakeup(link); - } + if (info->quirk && info->quirk->wakeup) + info->quirk->wakeup(link); return 0; } -- cgit v1.2.3 From a6b93a908508810c5d51dd9b390283345af6f2d9 Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 1 Oct 2006 17:17:40 +0100 Subject: [SERIAL] Fix oops when removing suspended serial port A serial card might have been removed when the system is resumed. This results in a suspended port being shut down, which results in the ports shutdown method being called twice in a row. This causes BUGs. Avoid this by tracking the suspended state separately from the initialised state. Signed-off-by: Russell King --- drivers/serial/serial_core.c | 9 +++++++-- include/linux/serial_core.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index d814bb1dcb05..397147a7054f 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -1940,6 +1940,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) if (state->info && state->info->flags & UIF_INITIALIZED) { const struct uart_ops *ops = port->ops; + state->info->flags = (state->info->flags & ~UIF_INITIALIZED) + | UIF_SUSPENDED; + spin_lock_irq(&port->lock); ops->stop_tx(port); ops->set_mctrl(port, 0); @@ -2006,7 +2009,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) console_start(port->cons); } - if (state->info && state->info->flags & UIF_INITIALIZED) { + if (state->info && state->info->flags & UIF_SUSPENDED) { const struct uart_ops *ops = port->ops; int ret; @@ -2018,15 +2021,17 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) ops->set_mctrl(port, port->mctrl); ops->start_tx(port); spin_unlock_irq(&port->lock); + state->info->flags |= UIF_INITIALIZED; } else { /* * Failed to resume - maybe hardware went away? * Clear the "initialized" flag so we won't try * to call the low level drivers shutdown method. */ - state->info->flags &= ~UIF_INITIALIZED; uart_shutdown(state); } + + state->info->flags &= ~UIF_SUSPENDED; } mutex_unlock(&state->mutex); diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 86501a3de2ac..f9fdf97506ea 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -319,6 +319,7 @@ struct uart_info { #define UIF_CTS_FLOW ((__force uif_t) (1 << 26)) #define UIF_NORMAL_ACTIVE ((__force uif_t) (1 << 29)) #define UIF_INITIALIZED ((__force uif_t) (1 << 31)) +#define UIF_SUSPENDED ((__force uif_t) (1 << 30)) int blocked_open; -- cgit v1.2.3 From e480af09c49736848f749a43dff2c902104f6691 Mon Sep 17 00:00:00 2001 From: Dave Jones Date: Mon, 25 Sep 2006 16:51:26 -0700 Subject: [SERIAL] tickle NMI watchdog on serial output. Serial is _slow_ sometimes. So slow, that the NMI watchdog kicks in. NMI Watchdog detected LOCKUP on CPU2CPU 2 Modules linked in: loop usb_storage md5 ipv6 parport_pc lp parport autofs4 i2c_dev i2c_core rfcomm l2cap bluetooth sunrpc pcdPid: 3138, comm: gpm Not tainted 2.6.11-1.1290_FC4smp RIP: 0010:[] {serial_in+106} RSP: 0018:ffff81003afc3d50 EFLAGS: 00000002 RAX: 0000000000000020 RBX: 0000000000000020 RCX: 0000000000000000 RDX: 00000000000003fd RSI: 0000000000000005 RDI: ffffffff804dcd60 RBP: 00000000000024fc R08: 000000000000000a R09: 0000000000000033 R10: ffff81001beb7c20 R11: 0000000000000020 R12: ffffffff804dcd60 R13: ffffffff804ade76 R14: 000000000000002b R15: 000000000000002c FS: 00002aaaaaac4920(0000) GS:ffffffff804fca00(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 00002aaaaabcb000 CR3: 000000003c0d0000 CR4: 00000000000006e0 Process gpm (pid: 3138, threadinfo ffff81003afc2000, task ffff81003eb63780) Stack: ffffffff80275f2e 0000000000000000 ffffffff80448380 0000000000007d6b 000000000000002c fffffffffffffbbf 0000000000000292 0000000000008000 ffffffff80138e8c 0000000000007d97 Call Trace:{serial8250_console_write+270} {__call_console_drivers+76} {release_console_sem+315} {con_open+149} {tty_open+537} {chrdev_open+387} {dentry_open+260} {filp_open+68} {get_unused_fd+227} {sys_open+76} {tracesys+209} Code: 0f b6 c0 c3 66 90 41 57 49 89 f7 41 56 41 be 00 01 00 00 41 console shuts up ... I initially did the patch below a year ago for the Fedora kernel, and have been keeping it up to date since. I recently got the same thing happening on a vanilla kernel, so figured it was time to repost this. Signed-off-by: Dave Jones Acked-by: Alan Cox Signed-off-by: Andrew Morton Signed-off-by: Russell King --- drivers/serial/8250.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index a07442ffefbd..0ede0ee64243 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -2232,9 +2232,10 @@ static inline void wait_for_xmitr(struct uart_8250_port *up, int bits) /* Wait up to 1s for flow control if necessary */ if (up->port.flags & UPF_CONS_FLOW) { tmout = 1000000; - while (--tmout && - ((serial_in(up, UART_MSR) & UART_MSR_CTS) == 0)) + while (!(serial_in(up, UART_MSR) & UART_MSR_CTS) && --tmout) { udelay(1); + touch_nmi_watchdog(); + } } } -- cgit v1.2.3 From 75fde2eddcfcd1dcc87a72dc6cd3c859420b6148 Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Sun, 1 Oct 2006 19:27:38 +0100 Subject: [SERIAL] add PNP IDs for FPI based touchscreens The Compaq TC1000 and Fujitsu Stylistic range of tablet machines use touchscreens from FPI. These are implemented as serial interfaces, generally exposed in the ACPIPNP information on the system. This patch adds them to the 8250_pnp driver tables, avoiding the need to mess around with setserial to set them up. I haven't been able to confirm what FUJ02B5, FUJ02BA and FUJ02BB are. FUJ02B1 refers to the controller for the system hotkeys. FUJ02BC appears to be the last in the range - after this, they moved to Wacom-based systems. Signed-off-by: Matthew Garrett Signed-off-by: Russell King --- drivers/serial/8250_pnp.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'drivers') diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c index 632f62d6ec7e..71d907c8288b 100644 --- a/drivers/serial/8250_pnp.c +++ b/drivers/serial/8250_pnp.c @@ -327,6 +327,19 @@ static const struct pnp_device_id pnp_dev_table[] = { { "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 */ -- cgit v1.2.3