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