]> err.no Git - linux-2.6/commitdiff
[SERIAL] serial_cs: convert multi-port table to quirk table
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Sat, 16 Sep 2006 20:09:41 +0000 (21:09 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 1 Oct 2006 16:06:23 +0000 (17:06 +0100)
- 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>
drivers/serial/serial_cs.c

index 82bb603fc1ae4089e2d772542ac24faf39f34da5..2e3a39d38f0863e9338ba063f0259dcdbea3bbf5 100644 (file)
@@ -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