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