diff options
author | Russell King | 2006-09-16 21:09:41 +0100 |
---|---|---|
committer | Russell King | 2006-10-01 17:06:23 +0100 |
commit | 1fbbac4bcb03033d325c71fc7273aa0b9c1d9a03 (patch) | |
tree | 55e38dd44ab03cd6b1c97f9939aaa829b68676c2 /drivers/serial | |
parent | 43549ad7a74e33947f3ba1756a7713086d32e97c (diff) |
[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 <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/serial_cs.c | 55 |
1 files changed, 42 insertions, 13 deletions
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 |