]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/tty/serial/8250/serial_cs.c
8250: use the 8250 register interface not the legacy one
[mirror_ubuntu-zesty-kernel.git] / drivers / tty / serial / 8250 / serial_cs.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A driver for PCMCIA serial devices
4
5 serial_cs.c 1.134 2002/05/04 05:48:53
6
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
11
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
16
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
20
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in which
23 case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
31
32======================================================================*/
33
34#include <linux/module.h>
35#include <linux/moduleparam.h>
36#include <linux/kernel.h>
37#include <linux/init.h>
1da177e4
LT
38#include <linux/ptrace.h>
39#include <linux/slab.h>
40#include <linux/string.h>
41#include <linux/timer.h>
42#include <linux/serial_core.h>
30bac7aa 43#include <linux/delay.h>
1da177e4
LT
44#include <linux/major.h>
45#include <asm/io.h>
1da177e4 46
1da177e4
LT
47#include <pcmcia/cistpl.h>
48#include <pcmcia/ciscode.h>
49#include <pcmcia/ds.h>
50#include <pcmcia/cisreg.h>
51
52#include "8250.h"
53
1da177e4
LT
54
55/*====================================================================*/
56
57/* Parameters that can be set with 'insmod' */
58
59/* Enable the speaker? */
60static int do_sound = 1;
61/* Skip strict UART tests? */
62static int buggy_uart;
63
64module_param(do_sound, int, 0444);
65module_param(buggy_uart, int, 0444);
66
67/*====================================================================*/
68
69/* Table of multi-port card ID's */
70
1fbbac4b 71struct serial_quirk {
a8244b56
RK
72 unsigned int manfid;
73 unsigned int prodid;
1da177e4 74 int multi; /* 1 = multifunction, > 1 = # ports */
efd92dfa 75 void (*config)(struct pcmcia_device *);
2655a2c7 76 void (*setup)(struct pcmcia_device *, struct uart_8250_port *);
7ef057fa 77 void (*wakeup)(struct pcmcia_device *);
eee3a883 78 int (*post)(struct pcmcia_device *);
1da177e4
LT
79};
80
eee3a883
RK
81struct serial_info {
82 struct pcmcia_device *p_dev;
83 int ndev;
84 int multi;
85 int slave;
86 int manfid;
87 int prodid;
88 int c950ctrl;
eee3a883
RK
89 int line[4];
90 const struct serial_quirk *quirk;
91};
92
93struct serial_cfg_mem {
94 tuple_t tuple;
95 cisparse_t parse;
96 u_char buf[256];
97};
98
f3d10688
RK
99/*
100 * vers_1 5.0, "Brain Boxes", "2-Port RS232 card", "r6"
101 * manfid 0x0160, 0x0104
102 * This card appears to have a 14.7456MHz clock.
103 */
6f4567c8
TM
104/* Generic Modem: MD55x (GPRS/EDGE) have
105 * Elan VPU16551 UART with 14.7456MHz oscillator
106 * manfid 0x015D, 0x4C45
107 */
2655a2c7 108static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart)
f3d10688 109{
2655a2c7 110 uart->port.uartclk = 14745600;
f3d10688
RK
111}
112
eee3a883
RK
113static int quirk_post_ibm(struct pcmcia_device *link)
114{
1d5cc192 115 u8 val;
9ec0bf41
DB
116 int ret;
117
1d5cc192 118 ret = pcmcia_read_config_byte(link, 0x800, &val);
9ec0bf41
DB
119 if (ret)
120 goto failed;
eee3a883 121
1d5cc192 122 ret = pcmcia_write_config_byte(link, 0x800, val | 1);
9ec0bf41
DB
123 if (ret)
124 goto failed;
eee3a883
RK
125 return 0;
126
9ec0bf41 127 failed:
eee3a883
RK
128 return -ENODEV;
129}
130
20f13049
RK
131/*
132 * Nokia cards are not really multiport cards. Shouldn't this
133 * be handled by setting the quirk entry .multi = 0 | 1 ?
134 */
135static void quirk_config_nokia(struct pcmcia_device *link)
136{
137 struct serial_info *info = link->priv;
138
139 if (info->multi > 1)
140 info->multi = 1;
141}
142
7ef057fa
RK
143static void quirk_wakeup_oxsemi(struct pcmcia_device *link)
144{
145 struct serial_info *info = link->priv;
146
18c576f9
PM
147 if (info->c950ctrl)
148 outb(12, info->c950ctrl + 1);
7ef057fa
RK
149}
150
151/* request_region? oxsemi branch does no request_region too... */
152/*
153 * This sequence is needed to properly initialize MC45 attached to OXCF950.
154 * I tried decreasing these msleep()s, but it worked properly (survived
155 * 1000 stop/start operations) with these timeouts (or bigger).
156 */
157static void quirk_wakeup_possio_gcc(struct pcmcia_device *link)
158{
159 struct serial_info *info = link->priv;
160 unsigned int ctrl = info->c950ctrl;
161
162 outb(0xA, ctrl + 1);
163 msleep(100);
164 outb(0xE, ctrl + 1);
165 msleep(300);
166 outb(0xC, ctrl + 1);
167 msleep(100);
168 outb(0xE, ctrl + 1);
169 msleep(200);
170 outb(0xF, ctrl + 1);
171 msleep(100);
172 outb(0xE, ctrl + 1);
173 msleep(100);
174 outb(0xC, ctrl + 1);
175}
176
efd92dfa
RK
177/*
178 * Socket Dual IO: this enables irq's for second port
179 */
180static void quirk_config_socket(struct pcmcia_device *link)
181{
182 struct serial_info *info = link->priv;
183
fc301101 184 if (info->multi)
1ac71e5a 185 link->config_flags |= CONF_ENABLE_ESR;
efd92dfa
RK
186}
187
1fbbac4b
RK
188static const struct serial_quirk quirks[] = {
189 {
f3d10688
RK
190 .manfid = 0x0160,
191 .prodid = 0x0104,
192 .multi = -1,
193 .setup = quirk_setup_brainboxes_0104,
6f4567c8
TM
194 }, {
195 .manfid = 0x015D,
196 .prodid = 0x4C45,
197 .multi = -1,
198 .setup = quirk_setup_brainboxes_0104,
f3d10688 199 }, {
eee3a883
RK
200 .manfid = MANFID_IBM,
201 .prodid = ~0,
202 .multi = -1,
203 .post = quirk_post_ibm,
7ef057fa
RK
204 }, {
205 .manfid = MANFID_INTEL,
206 .prodid = PRODID_INTEL_DUAL_RS232,
207 .multi = 2,
208 }, {
209 .manfid = MANFID_NATINST,
210 .prodid = PRODID_NATINST_QUAD_RS232,
211 .multi = 4,
20f13049
RK
212 }, {
213 .manfid = MANFID_NOKIA,
214 .prodid = ~0,
215 .multi = -1,
216 .config = quirk_config_nokia,
eee3a883 217 }, {
1fbbac4b
RK
218 .manfid = MANFID_OMEGA,
219 .prodid = PRODID_OMEGA_QSP_100,
220 .multi = 4,
7ef057fa
RK
221 }, {
222 .manfid = MANFID_OXSEMI,
223 .prodid = ~0,
224 .multi = -1,
225 .wakeup = quirk_wakeup_oxsemi,
226 }, {
227 .manfid = MANFID_POSSIO,
228 .prodid = PRODID_POSSIO_GCC,
229 .multi = -1,
230 .wakeup = quirk_wakeup_possio_gcc,
1fbbac4b
RK
231 }, {
232 .manfid = MANFID_QUATECH,
233 .prodid = PRODID_QUATECH_DUAL_RS232,
234 .multi = 2,
235 }, {
236 .manfid = MANFID_QUATECH,
237 .prodid = PRODID_QUATECH_DUAL_RS232_D1,
238 .multi = 2,
bb289bc4
SO
239 }, {
240 .manfid = MANFID_QUATECH,
241 .prodid = PRODID_QUATECH_DUAL_RS232_G,
242 .multi = 2,
1fbbac4b
RK
243 }, {
244 .manfid = MANFID_QUATECH,
245 .prodid = PRODID_QUATECH_QUAD_RS232,
246 .multi = 4,
247 }, {
248 .manfid = MANFID_SOCKET,
249 .prodid = PRODID_SOCKET_DUAL_RS232,
250 .multi = 2,
efd92dfa
RK
251 .config = quirk_config_socket,
252 }, {
253 .manfid = MANFID_SOCKET,
254 .prodid = ~0,
255 .multi = -1,
256 .config = quirk_config_socket,
1fbbac4b 257 }
1da177e4 258};
1da177e4 259
16f31113 260
15b99ac1 261static int serial_config(struct pcmcia_device * link);
1da177e4 262
1da177e4 263
fba395ee 264static void serial_remove(struct pcmcia_device *link)
1da177e4
LT
265{
266 struct serial_info *info = link->priv;
267 int i;
268
9ec0bf41 269 dev_dbg(&link->dev, "serial_release\n");
1da177e4
LT
270
271 /*
272 * Recheck to see if the device is still configured.
273 */
e2d40963
DB
274 for (i = 0; i < info->ndev; i++)
275 serial8250_unregister_port(info->line[i]);
1da177e4 276
e2d40963
DB
277 if (!info->slave)
278 pcmcia_disable_device(link);
1da177e4
LT
279}
280
fba395ee 281static int serial_suspend(struct pcmcia_device *link)
1da177e4 282{
e2d40963
DB
283 struct serial_info *info = link->priv;
284 int i;
1da177e4 285
e2d40963
DB
286 for (i = 0; i < info->ndev; i++)
287 serial8250_suspend_port(info->line[i]);
98e4c28b
DB
288
289 return 0;
1da177e4
LT
290}
291
fba395ee 292static int serial_resume(struct pcmcia_device *link)
1da177e4 293{
fe59d537
RK
294 struct serial_info *info = link->priv;
295 int i;
1da177e4 296
fe59d537
RK
297 for (i = 0; i < info->ndev; i++)
298 serial8250_resume_port(info->line[i]);
7ef057fa 299
fe59d537
RK
300 if (info->quirk && info->quirk->wakeup)
301 info->quirk->wakeup(link);
98e4c28b
DB
302
303 return 0;
1da177e4
LT
304}
305
fba395ee 306static int serial_probe(struct pcmcia_device *link)
1da177e4
LT
307{
308 struct serial_info *info;
1da177e4 309
9ec0bf41 310 dev_dbg(&link->dev, "serial_attach()\n");
1da177e4
LT
311
312 /* Create new serial device */
8f31bb39 313 info = kzalloc(sizeof (*info), GFP_KERNEL);
1da177e4 314 if (!info)
f8cfa618 315 return -ENOMEM;
fba395ee 316 info->p_dev = link;
1da177e4
LT
317 link->priv = info;
318
7f97c000 319 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
fc301101 320 if (do_sound)
1ac71e5a 321 link->config_flags |= CONF_ENABLE_SPKR;
fc301101 322
15b99ac1 323 return serial_config(link);
1da177e4
LT
324}
325
fba395ee 326static void serial_detach(struct pcmcia_device *link)
1da177e4
LT
327{
328 struct serial_info *info = link->priv;
1da177e4 329
9ec0bf41 330 dev_dbg(&link->dev, "serial_detach\n");
1da177e4 331
1da177e4
LT
332 /*
333 * Ensure that the ports have been released.
334 */
335 serial_remove(link);
336
b4635811 337 /* free bits */
1da177e4
LT
338 kfree(info);
339}
340
341/*====================================================================*/
342
fba395ee 343static int setup_serial(struct pcmcia_device *handle, struct serial_info * info,
906da809 344 unsigned int iobase, int irq)
1da177e4 345{
2655a2c7 346 struct uart_8250_port uart;
1da177e4
LT
347 int line;
348
2655a2c7
AC
349 memset(&uart, 0, sizeof(uart));
350 uart.port.iobase = iobase;
351 uart.port.irq = irq;
352 uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
353 uart.port.uartclk = 1843200;
354 uart.port.dev = &handle->dev;
1da177e4 355 if (buggy_uart)
2655a2c7 356 uart.port.flags |= UPF_BUGGY_UART;
f3d10688
RK
357
358 if (info->quirk && info->quirk->setup)
2655a2c7 359 info->quirk->setup(handle, &uart);
f3d10688 360
2655a2c7 361 line = serial8250_register_8250_port(&uart);
1da177e4 362 if (line < 0) {
2655a2c7
AC
363 pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n",
364 (unsigned long)iobase, irq);
1da177e4
LT
365 return -EINVAL;
366 }
367
368 info->line[info->ndev] = line;
1da177e4
LT
369 info->ndev++;
370
371 return 0;
372}
373
374/*====================================================================*/
375
c494bc6c
DB
376static int pfc_config(struct pcmcia_device *p_dev)
377{
378 unsigned int port = 0;
379 struct serial_info *info = p_dev->priv;
380
381 if ((p_dev->resource[1]->end != 0) &&
382 (resource_size(p_dev->resource[1]) == 8)) {
383 port = p_dev->resource[1]->start;
384 info->slave = 1;
385 } else if ((info->manfid == MANFID_OSITECH) &&
386 (resource_size(p_dev->resource[0]) == 0x40)) {
387 port = p_dev->resource[0]->start + 0x28;
388 info->slave = 1;
389 }
390 if (info->slave)
391 return setup_serial(p_dev, info, port, p_dev->irq);
392
393 dev_warn(&p_dev->dev, "no usable port range found, giving up\n");
394 return -ENODEV;
395}
396
00990e7c 397static int simple_config_check(struct pcmcia_device *p_dev, void *priv_data)
1da177e4 398{
84e2d340
DB
399 static const int size_table[2] = { 8, 16 };
400 int *try = priv_data;
401
00990e7c
DB
402 if (p_dev->resource[0]->start == 0)
403 return -ENODEV;
90abdc3b 404
00990e7c
DB
405 if ((*try & 0x1) == 0)
406 p_dev->io_lines = 16;
407
408 if (p_dev->resource[0]->end != size_table[(*try >> 1)])
409 return -ENODEV;
410
411 p_dev->resource[0]->end = 8;
412 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
413 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
414
415 return pcmcia_request_io(p_dev);
1da177e4
LT
416}
417
84e2d340 418static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
84e2d340
DB
419 void *priv_data)
420{
421 static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
422 int j;
423
00990e7c
DB
424 if (p_dev->io_lines > 3)
425 return -ENODEV;
426
427 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
428 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
429 p_dev->resource[0]->end = 8;
430
431 for (j = 0; j < 5; j++) {
432 p_dev->resource[0]->start = base[j];
433 p_dev->io_lines = base[j] ? 16 : 3;
434 if (!pcmcia_request_io(p_dev))
435 return 0;
84e2d340
DB
436 }
437 return -ENODEV;
438}
1da177e4 439
fba395ee 440static int simple_config(struct pcmcia_device *link)
1da177e4 441{
1da177e4 442 struct serial_info *info = link->priv;
ef313e36 443 int i = -ENODEV, try;
16f31113 444
84e2d340
DB
445 /* First pass: look for a config entry that looks normal.
446 * Two tries: without IO aliases, then with aliases */
7f97c000 447 link->config_flags |= CONF_AUTO_SET_VPP;
84e2d340
DB
448 for (try = 0; try < 4; try++)
449 if (!pcmcia_loop_config(link, simple_config_check, &try))
450 goto found_port;
451
1da177e4
LT
452 /* Second pass: try to find an entry that isn't picky about
453 its base address, then try to grab any standard serial port
454 address, and finally try to get any free port. */
84e2d340
DB
455 if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL))
456 goto found_port;
1da177e4 457
c494bc6c 458 dev_warn(&link->dev, "no usable port range found, giving up\n");
84e2d340 459 return -1;
1da177e4 460
84e2d340 461found_port:
1da177e4 462 if (info->multi && (info->manfid == MANFID_3COM))
7feabb64 463 link->config_index &= ~(0x08);
efd92dfa
RK
464
465 /*
466 * Apply any configuration quirks.
467 */
468 if (info->quirk && info->quirk->config)
469 info->quirk->config(link);
470
1ac71e5a 471 i = pcmcia_enable_device(link);
9ec0bf41 472 if (i != 0)
1da177e4 473 return -1;
9a017a91 474 return setup_serial(link, info, link->resource[0]->start, link->irq);
1da177e4
LT
475}
476
00990e7c 477static int multi_config_check(struct pcmcia_device *p_dev, void *priv_data)
1da177e4 478{
00990e7c
DB
479 int *multi = priv_data;
480
481 if (p_dev->resource[1]->end)
482 return -EINVAL;
84e2d340
DB
483
484 /* The quad port cards have bad CIS's, so just look for a
485 window larger than 8 ports and assume it will be right */
00990e7c
DB
486 if (p_dev->resource[0]->end <= 8)
487 return -EINVAL;
488
489 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
490 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
491 p_dev->resource[0]->end = *multi * 8;
492
493 if (pcmcia_request_io(p_dev))
494 return -ENODEV;
495 return 0;
84e2d340 496}
16f31113 497
84e2d340 498static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
84e2d340
DB
499 void *priv_data)
500{
501 int *base2 = priv_data;
502
7f97c000
MS
503 if (!p_dev->resource[0]->end || !p_dev->resource[1]->end ||
504 p_dev->resource[0]->start + 8 != p_dev->resource[1]->start)
00990e7c
DB
505 return -ENODEV;
506
507 p_dev->resource[0]->end = p_dev->resource[1]->end = 8;
508 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
509 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
510
511 if (pcmcia_request_io(p_dev))
512 return -ENODEV;
513
514 *base2 = p_dev->resource[0]->start + 8;
515 return 0;
84e2d340 516}
1da177e4 517
84e2d340
DB
518static int multi_config(struct pcmcia_device *link)
519{
520 struct serial_info *info = link->priv;
521 int i, base2 = 0;
1da177e4
LT
522
523 /* First, look for a generic full-sized window */
00990e7c
DB
524 if (!pcmcia_loop_config(link, multi_config_check, &info->multi))
525 base2 = link->resource[0]->start + 8;
526 else {
84e2d340 527 /* If that didn't work, look for two windows */
1da177e4 528 info->multi = 2;
84e2d340
DB
529 if (pcmcia_loop_config(link, multi_config_check_notpicky,
530 &base2)) {
c494bc6c 531 dev_warn(&link->dev, "no usable port range "
84e2d340
DB
532 "found, giving up\n");
533 return -ENODEV;
1da177e4
LT
534 }
535 }
536
eb14120f 537 if (!link->irq)
c494bc6c 538 dev_warn(&link->dev, "no usable IRQ found, continuing...\n");
efd92dfa
RK
539
540 /*
541 * Apply any configuration quirks.
542 */
543 if (info->quirk && info->quirk->config)
544 info->quirk->config(link);
545
1ac71e5a 546 i = pcmcia_enable_device(link);
9ec0bf41 547 if (i != 0)
84e2d340 548 return -ENODEV;
1da177e4
LT
549
550 /* The Oxford Semiconductor OXCF950 cards are in fact single-port:
30bac7aa
PV
551 * 8 registers are for the UART, the others are extra registers.
552 * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too.
553 */
554 if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO &&
555 info->prodid == PRODID_POSSIO_GCC)) {
556 int err;
557
7feabb64
DB
558 if (link->config_index == 1 ||
559 link->config_index == 3) {
30bac7aa 560 err = setup_serial(link, info, base2,
eb14120f 561 link->irq);
00990e7c 562 base2 = link->resource[0]->start;
1da177e4 563 } else {
9a017a91 564 err = setup_serial(link, info, link->resource[0]->start,
eb14120f 565 link->irq);
1da177e4 566 }
30bac7aa 567 info->c950ctrl = base2;
7ef057fa
RK
568
569 /*
570 * FIXME: We really should wake up the port prior to
571 * handing it over to the serial layer.
572 */
573 if (info->quirk && info->quirk->wakeup)
574 info->quirk->wakeup(link);
575
84e2d340 576 return 0;
1da177e4
LT
577 }
578
9a017a91 579 setup_serial(link, info, link->resource[0]->start, link->irq);
1da177e4 580 for (i = 0; i < info->multi - 1; i++)
fba395ee 581 setup_serial(link, info, base2 + (8 * i),
eb14120f 582 link->irq);
84e2d340 583 return 0;
1da177e4
LT
584}
585
00990e7c 586static int serial_check_for_multi(struct pcmcia_device *p_dev, void *priv_data)
6ae3b84d
DB
587{
588 struct serial_info *info = p_dev->priv;
589
00990e7c
DB
590 if (!p_dev->resource[0]->end)
591 return -EINVAL;
592
593 if ((!p_dev->resource[1]->end) && (p_dev->resource[0]->end % 8 == 0))
594 info->multi = p_dev->resource[0]->end >> 3;
6ae3b84d 595
00990e7c
DB
596 if ((p_dev->resource[1]->end) && (p_dev->resource[0]->end == 8)
597 && (p_dev->resource[1]->end == 8))
6ae3b84d
DB
598 info->multi = 2;
599
600 return 0; /* break */
601}
602
603
15b99ac1 604static int serial_config(struct pcmcia_device * link)
1da177e4 605{
1da177e4 606 struct serial_info *info = link->priv;
6ae3b84d 607 int i;
16f31113 608
9ec0bf41 609 dev_dbg(&link->dev, "serial_config\n");
f0a3a153 610
1da177e4 611 /* Is this a compliant multifunction card? */
6ae3b84d 612 info->multi = (link->socket->functions > 1);
1da177e4
LT
613
614 /* Is this a multiport card? */
efd50585
DB
615 info->manfid = link->manf_id;
616 info->prodid = link->card_id;
617
618 for (i = 0; i < ARRAY_SIZE(quirks); i++)
619 if ((quirks[i].manfid == ~0 ||
620 quirks[i].manfid == info->manfid) &&
621 (quirks[i].prodid == ~0 ||
622 quirks[i].prodid == info->prodid)) {
623 info->quirk = &quirks[i];
624 break;
625 }
1da177e4
LT
626
627 /* Another check for dual-serial cards: look for either serial or
628 multifunction cards that ask for appropriate IO port ranges */
1da177e4 629 if ((info->multi == 0) &&
efd50585 630 (link->has_func_id) &&
c494bc6c 631 (link->socket->pcmcia_pfc == 0) &&
efd50585 632 ((link->func_id == CISTPL_FUNCID_MULTI) ||
6ae3b84d
DB
633 (link->func_id == CISTPL_FUNCID_SERIAL)))
634 pcmcia_loop_config(link, serial_check_for_multi, info);
1da177e4 635
1fbbac4b
RK
636 /*
637 * Apply any multi-port quirk.
638 */
639 if (info->quirk && info->quirk->multi != -1)
640 info->multi = info->quirk->multi;
641
c494bc6c
DB
642 dev_info(&link->dev,
643 "trying to set up [0x%04x:0x%04x] (pfc: %d, multi: %d, quirk: %p)\n",
644 link->manf_id, link->card_id,
645 link->socket->pcmcia_pfc, info->multi, info->quirk);
646 if (link->socket->pcmcia_pfc)
647 i = pfc_config(link);
648 else if (info->multi > 1)
a78621bb 649 i = multi_config(link);
1da177e4 650 else
a78621bb 651 i = simple_config(link);
1da177e4 652
a78621bb 653 if (i || info->ndev == 0)
1da177e4
LT
654 goto failed;
655
eee3a883
RK
656 /*
657 * Apply any post-init quirk. FIXME: This should really happen
658 * before we register the port, since it might already be in use.
659 */
660 if (info->quirk && info->quirk->post)
661 if (info->quirk->post(link))
662 goto failed;
1da177e4 663
15b99ac1 664 return 0;
1da177e4 665
f0a3a153 666failed:
c494bc6c 667 dev_warn(&link->dev, "failed to initialize\n");
1da177e4 668 serial_remove(link);
15b99ac1 669 return -ENODEV;
1da177e4
LT
670}
671
25f8f54f 672static const struct pcmcia_device_id serial_ids[] = {
325aa29f
DB
673 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021),
674 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a),
675 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a),
99ec88f3
AK
676 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a),
677 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a),
325aa29f
DB
678 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15),
679 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501),
680 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a),
681 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a),
682 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341),
683 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab),
684 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081),
685 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101),
686 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab),
687 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
688 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
689 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
690 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
691 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
692 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
693 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
694 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
695 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
d277ad0e 696 PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
1546a713 697 PCMCIA_PFC_DEVICE_PROD_ID12(1, "ATKK", "LM33-PCM-T", 0xba9eb7e2, 0x077c174e),
325aa29f
DB
698 PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
699 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
700 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
701 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
702 PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
703 PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
40738f3f
K
704 PCMCIA_PFC_DEVICE_PROD_ID12(1, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555),
705 PCMCIA_PFC_DEVICE_PROD_ID12(1, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
d277ad0e
K
706 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
707 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
325aa29f
DB
708 PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
709 PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
710 PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
d277ad0e 711 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
33d7959a 712 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),
40738f3f 713 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05),
27aadb61 714 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05),
40738f3f 715 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),
325aa29f
DB
716 PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
717 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562),
718 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070),
719 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020),
720 PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
721 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c),
722 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
723 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
724 PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77),
725 PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
726 PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301),
1de9cedf 727 PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276),
325aa29f
DB
728 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039),
729 PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006),
99ec88f3
AK
730 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0101), /* TDK DF2814 */
731 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x100a), /* Xircom CM-56G */
732 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x3e0a), /* TDK DF5660 */
325aa29f 733 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a),
99ec88f3 734 PCMCIA_DEVICE_MANF_CARD(0x0107, 0x0002), /* USRobotics 14,400 */
325aa29f
DB
735 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50),
736 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51),
737 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52),
738 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53),
739 PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180),
99ec88f3
AK
740 PCMCIA_DEVICE_MANF_CARD(0x0115, 0x3330), /* USRobotics/SUN 14,400 */
741 PCMCIA_DEVICE_MANF_CARD(0x0124, 0x0100), /* Nokia DTP-2 ver II */
742 PCMCIA_DEVICE_MANF_CARD(0x0134, 0x5600), /* LASAT COMMUNICATIONS A/S */
325aa29f
DB
743 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e),
744 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b),
745 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025),
746 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045),
747 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052),
99ec88f3
AK
748 PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0006), /* Psion 56K+Fax */
749 PCMCIA_DEVICE_MANF_CARD(0x0200, 0x0001), /* MultiMobile */
325aa29f
DB
750 PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae),
751 PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef),
752 PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef),
753 PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef),
754 PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0),
1de9cedf 755 PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e),
325aa29f
DB
756 PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a),
757 PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02),
758 PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa),
759 PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76),
760 PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95),
761 PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed),
762 PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65),
99ec88f3 763 PCMCIA_DEVICE_PROD_ID12("IBM", "ISDN/56K/GSM", 0xb569a6e5, 0xfee5297b),
325aa29f 764 PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6),
d277ad0e 765 PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb),
99ec88f3 766 PCMCIA_DEVICE_PROD_ID12("Intertex", "IX34-PCMCIA", 0xf8a097e3, 0x97880447),
325aa29f
DB
767 PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f),
768 PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f),
769 PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383),
770 PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
771 PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a),
99ec88f3 772 PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
325aa29f
DB
773 PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
774 PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
bb289bc4 775 PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
99ec88f3
AK
776 PCMCIA_DEVICE_PROD_ID12("Telia", "SurfinBird 560P/A+", 0xe2cdd5e, 0xc9314b38),
777 PCMCIA_DEVICE_PROD_ID1("Smart Serial Port", 0x2d8ce292),
531afd64
KK
778 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
779 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
780 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
781 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
782 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
8b1d920f 783 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"),
bf6fda63
KK
784 PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
785 PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
f0a3a153 786 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
bf6fda63 787 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
f0a3a153
KK
788 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
789 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
63ca2d74 790 PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
abe88069 791 PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC860", 0xd85f6206, 0x698f93db, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC860 3G Network Adapter R1 */
63ca2d74
KK
792 PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
793 PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
794 PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
531afd64 795 PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
bf6fda63
KK
796 PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
797 PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
798 PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
531afd64 799 PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
abe88069 800 PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"),
44e5e33e
TO
801 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b),
802 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83),
803 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232 1.00.",0x19ca78af,0x69fb7490),
804 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232",0x19ca78af,0xb6bc0235),
805 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232",0x63f2e0bd,0xb9e175d3),
806 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232-5",0x63f2e0bd,0xfce33442),
807 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232",0x3beb8cf2,0x171e7190),
808 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232-5",0x3beb8cf2,0x20da4262),
809 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF428",0x3beb8cf2,0xea5dd57d),
810 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF500",0x3beb8cf2,0xd77255fa),
811 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: IC232",0x3beb8cf2,0x6a709903),
812 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: SL232",0x3beb8cf2,0x18430676),
813 PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: XL232",0x3beb8cf2,0x6f933767),
814 PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7),
815 PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41),
816 PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029),
817 PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
818 PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc),
819 PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7),
820 PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41),
821 PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029),
822 PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
823 PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
824 PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
9d9b7ad7 825 PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b),
325aa29f
DB
826 /* too generic */
827 /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */
828 /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */
829 PCMCIA_DEVICE_FUNC_ID(2),
830 PCMCIA_DEVICE_NULL,
831};
832MODULE_DEVICE_TABLE(pcmcia, serial_ids);
833
abe88069
KK
834MODULE_FIRMWARE("cis/PCMLM28.cis");
835MODULE_FIRMWARE("cis/DP83903.cis");
836MODULE_FIRMWARE("cis/3CCFEM556.cis");
837MODULE_FIRMWARE("cis/3CXEM556.cis");
838MODULE_FIRMWARE("cis/SW_8xx_SER.cis");
839MODULE_FIRMWARE("cis/SW_7xx_SER.cis");
840MODULE_FIRMWARE("cis/SW_555_SER.cis");
841MODULE_FIRMWARE("cis/MT5634ZLX.cis");
842MODULE_FIRMWARE("cis/COMpad2.cis");
843MODULE_FIRMWARE("cis/COMpad4.cis");
844MODULE_FIRMWARE("cis/RS-COM-2P.cis");
845
1da177e4
LT
846static struct pcmcia_driver serial_cs_driver = {
847 .owner = THIS_MODULE,
2e9b981a 848 .name = "serial_cs",
f8cfa618 849 .probe = serial_probe,
cc3b4866 850 .remove = serial_detach,
325aa29f 851 .id_table = serial_ids,
98e4c28b
DB
852 .suspend = serial_suspend,
853 .resume = serial_resume,
1da177e4
LT
854};
855
856static int __init init_serial_cs(void)
857{
858 return pcmcia_register_driver(&serial_cs_driver);
859}
860
861static void __exit exit_serial_cs(void)
862{
863 pcmcia_unregister_driver(&serial_cs_driver);
1da177e4
LT
864}
865
866module_init(init_serial_cs);
867module_exit(exit_serial_cs);
868
869MODULE_LICENSE("GPL");