aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/serial/serial_cs.c55
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);
80 80
81/* Table of multi-port card ID's */ 81/* Table of multi-port card ID's */
82 82
83struct multi_id { 83struct serial_quirk {
84 u_short manfid; 84 u_short manfid;
85 u_short prodid; 85 u_short prodid;
86 int multi; /* 1 = multifunction, > 1 = # ports */ 86 int multi; /* 1 = multifunction, > 1 = # ports */
87}; 87};
88 88
89static const struct multi_id multi_id[] = { 89static const struct serial_quirk quirks[] = {
90 { MANFID_OMEGA, PRODID_OMEGA_QSP_100, 4 }, 90 {
91 { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232, 2 }, 91 .manfid = MANFID_OMEGA,
92 { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232_D1, 2 }, 92 .prodid = PRODID_OMEGA_QSP_100,
93 { MANFID_QUATECH, PRODID_QUATECH_QUAD_RS232, 4 }, 93 .multi = 4,
94 { MANFID_SOCKET, PRODID_SOCKET_DUAL_RS232, 2 }, 94 }, {
95 { MANFID_INTEL, PRODID_INTEL_DUAL_RS232, 2 }, 95 .manfid = MANFID_QUATECH,
96 { MANFID_NATINST, PRODID_NATINST_QUAD_RS232, 4 } 96 .prodid = PRODID_QUATECH_DUAL_RS232,
97 .multi = 2,
98 }, {
99 .manfid = MANFID_QUATECH,
100 .prodid = PRODID_QUATECH_DUAL_RS232_D1,
101 .multi = 2,
102 }, {
103 .manfid = MANFID_QUATECH,
104 .prodid = PRODID_QUATECH_QUAD_RS232,
105 .multi = 4,
106 }, {
107 .manfid = MANFID_SOCKET,
108 .prodid = PRODID_SOCKET_DUAL_RS232,
109 .multi = 2,
110 }, {
111 .manfid = MANFID_INTEL,
112 .prodid = PRODID_INTEL_DUAL_RS232,
113 .multi = 2,
114 }, {
115 .manfid = MANFID_NATINST,
116 .prodid = PRODID_NATINST_QUAD_RS232,
117 .multi = 4,
118 }
97}; 119};
98 120
99struct serial_info { 121struct serial_info {
@@ -106,6 +128,7 @@ struct serial_info {
106 int c950ctrl; 128 int c950ctrl;
107 dev_node_t node[4]; 129 dev_node_t node[4];
108 int line[4]; 130 int line[4];
131 const struct serial_quirk *quirk;
109}; 132};
110 133
111struct serial_cfg_mem { 134struct serial_cfg_mem {
@@ -622,10 +645,10 @@ static int serial_config(struct pcmcia_device * link)
622 if (first_tuple(link, tuple, parse) == CS_SUCCESS) { 645 if (first_tuple(link, tuple, parse) == CS_SUCCESS) {
623 info->manfid = parse->manfid.manf; 646 info->manfid = parse->manfid.manf;
624 info->prodid = parse->manfid.card; 647 info->prodid = parse->manfid.card;
625 for (i = 0; i < ARRAY_SIZE(multi_id); i++) 648 for (i = 0; i < ARRAY_SIZE(quirks); i++)
626 if ((info->manfid == multi_id[i].manfid) && 649 if ((info->manfid == quirks[i].manfid) &&
627 (info->prodid == multi_id[i].prodid)) { 650 (info->prodid == quirks[i].prodid)) {
628 info->multi = multi_id[i].multi; 651 info->quirk = &quirks[i];
629 break; 652 break;
630 } 653 }
631 } 654 }
@@ -647,6 +670,12 @@ static int serial_config(struct pcmcia_device * link)
647 } 670 }
648 } 671 }
649 672
673 /*
674 * Apply any multi-port quirk.
675 */
676 if (info->quirk && info->quirk->multi != -1)
677 info->multi = info->quirk->multi;
678
650 if (info->multi > 1) 679 if (info->multi > 1)
651 multi_config(link); 680 multi_config(link);
652 else 681 else