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