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  */
quirk_setup_brainboxes_0104(struct pcmcia_device * link,struct uart_port * port)109 static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port)
110 {
111 	port->uartclk = 14745600;
112 }
113 
quirk_post_ibm(struct pcmcia_device * link)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  */
quirk_config_nokia(struct pcmcia_device * link)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 
quirk_wakeup_oxsemi(struct pcmcia_device * link)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  */
quirk_wakeup_possio_gcc(struct pcmcia_device * link)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  */
quirk_config_socket(struct pcmcia_device * link)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 
serial_remove(struct pcmcia_device * link)265 static void serial_remove(struct pcmcia_device *link)
266 {
267 	struct serial_info *info = link->priv;
268 	int i;
269 
270 	dev_dbg(&link->dev, "serial_release\n");
271 
272 	/*
273 	 * Recheck to see if the device is still configured.
274 	 */
275 	for (i = 0; i < info->ndev; i++)
276 		serial8250_unregister_port(info->line[i]);
277 
278 	if (!info->slave)
279 		pcmcia_disable_device(link);
280 }
281 
serial_suspend(struct pcmcia_device * link)282 static int serial_suspend(struct pcmcia_device *link)
283 {
284 	struct serial_info *info = link->priv;
285 	int i;
286 
287 	for (i = 0; i < info->ndev; i++)
288 		serial8250_suspend_port(info->line[i]);
289 
290 	return 0;
291 }
292 
serial_resume(struct pcmcia_device * link)293 static int serial_resume(struct pcmcia_device *link)
294 {
295 	struct serial_info *info = link->priv;
296 	int i;
297 
298 	for (i = 0; i < info->ndev; i++)
299 		serial8250_resume_port(info->line[i]);
300 
301 	if (info->quirk && info->quirk->wakeup)
302 		info->quirk->wakeup(link);
303 
304 	return 0;
305 }
306 
serial_probe(struct pcmcia_device * link)307 static int serial_probe(struct pcmcia_device *link)
308 {
309 	struct serial_info *info;
310 
311 	dev_dbg(&link->dev, "serial_attach()\n");
312 
313 	/* Create new serial device */
314 	info = kzalloc(sizeof (*info), GFP_KERNEL);
315 	if (!info)
316 		return -ENOMEM;
317 	info->p_dev = link;
318 	link->priv = info;
319 
320 	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
321 	if (do_sound)
322 		link->config_flags |= CONF_ENABLE_SPKR;
323 
324 	return serial_config(link);
325 }
326 
serial_detach(struct pcmcia_device * link)327 static void serial_detach(struct pcmcia_device *link)
328 {
329 	struct serial_info *info = link->priv;
330 
331 	dev_dbg(&link->dev, "serial_detach\n");
332 
333 	/*
334 	 * Ensure that the ports have been released.
335 	 */
336 	serial_remove(link);
337 
338 	/* free bits */
339 	kfree(info);
340 }
341 
342 /*====================================================================*/
343 
setup_serial(struct pcmcia_device * handle,struct serial_info * info,unsigned int iobase,int irq)344 static int setup_serial(struct pcmcia_device *handle, struct serial_info * info,
345 			unsigned int iobase, int irq)
346 {
347 	struct uart_port port;
348 	int line;
349 
350 	memset(&port, 0, sizeof (struct uart_port));
351 	port.iobase = iobase;
352 	port.irq = irq;
353 	port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
354 	port.uartclk = 1843200;
355 	port.dev = &handle->dev;
356 	if (buggy_uart)
357 		port.flags |= UPF_BUGGY_UART;
358 
359 	if (info->quirk && info->quirk->setup)
360 		info->quirk->setup(handle, &port);
361 
362 	line = serial8250_register_port(&port);
363 	if (line < 0) {
364 		printk(KERN_NOTICE "serial_cs: serial8250_register_port() at "
365 		       "0x%04lx, irq %d failed\n", (u_long)iobase, irq);
366 		return -EINVAL;
367 	}
368 
369 	info->line[info->ndev] = line;
370 	info->ndev++;
371 
372 	return 0;
373 }
374 
375 /*====================================================================*/
376 
pfc_config(struct pcmcia_device * p_dev)377 static int pfc_config(struct pcmcia_device *p_dev)
378 {
379 	unsigned int port = 0;
380 	struct serial_info *info = p_dev->priv;
381 
382 	if ((p_dev->resource[1]->end != 0) &&
383 		(resource_size(p_dev->resource[1]) == 8)) {
384 		port = p_dev->resource[1]->start;
385 		info->slave = 1;
386 	} else if ((info->manfid == MANFID_OSITECH) &&
387 		(resource_size(p_dev->resource[0]) == 0x40)) {
388 		port = p_dev->resource[0]->start + 0x28;
389 		info->slave = 1;
390 	}
391 	if (info->slave)
392 		return setup_serial(p_dev, info, port, p_dev->irq);
393 
394 	dev_warn(&p_dev->dev, "no usable port range found, giving up\n");
395 	return -ENODEV;
396 }
397 
simple_config_check(struct pcmcia_device * p_dev,void * priv_data)398 static int simple_config_check(struct pcmcia_device *p_dev, void *priv_data)
399 {
400 	static const int size_table[2] = { 8, 16 };
401 	int *try = priv_data;
402 
403 	if (p_dev->resource[0]->start == 0)
404 		return -ENODEV;
405 
406 	if ((*try & 0x1) == 0)
407 		p_dev->io_lines = 16;
408 
409 	if (p_dev->resource[0]->end != size_table[(*try >> 1)])
410 		return -ENODEV;
411 
412 	p_dev->resource[0]->end = 8;
413 	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
414 	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
415 
416 	return pcmcia_request_io(p_dev);
417 }
418 
simple_config_check_notpicky(struct pcmcia_device * p_dev,void * priv_data)419 static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
420 					void *priv_data)
421 {
422 	static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
423 	int j;
424 
425 	if (p_dev->io_lines > 3)
426 		return -ENODEV;
427 
428 	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
429 	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
430 	p_dev->resource[0]->end = 8;
431 
432 	for (j = 0; j < 5; j++) {
433 		p_dev->resource[0]->start = base[j];
434 		p_dev->io_lines = base[j] ? 16 : 3;
435 		if (!pcmcia_request_io(p_dev))
436 			return 0;
437 	}
438 	return -ENODEV;
439 }
440 
simple_config(struct pcmcia_device * link)441 static int simple_config(struct pcmcia_device *link)
442 {
443 	struct serial_info *info = link->priv;
444 	int i = -ENODEV, try;
445 
446 	/* First pass: look for a config entry that looks normal.
447 	 * Two tries: without IO aliases, then with aliases */
448 	link->config_flags |= CONF_AUTO_SET_VPP;
449 	for (try = 0; try < 4; try++)
450 		if (!pcmcia_loop_config(link, simple_config_check, &try))
451 			goto found_port;
452 
453 	/* Second pass: try to find an entry that isn't picky about
454 	   its base address, then try to grab any standard serial port
455 	   address, and finally try to get any free port. */
456 	if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL))
457 		goto found_port;
458 
459 	dev_warn(&link->dev, "no usable port range found, giving up\n");
460 	return -1;
461 
462 found_port:
463 	if (info->multi && (info->manfid == MANFID_3COM))
464 		link->config_index &= ~(0x08);
465 
466 	/*
467 	 * Apply any configuration quirks.
468 	 */
469 	if (info->quirk && info->quirk->config)
470 		info->quirk->config(link);
471 
472 	i = pcmcia_enable_device(link);
473 	if (i != 0)
474 		return -1;
475 	return setup_serial(link, info, link->resource[0]->start, link->irq);
476 }
477 
multi_config_check(struct pcmcia_device * p_dev,void * priv_data)478 static int multi_config_check(struct pcmcia_device *p_dev, void *priv_data)
479 {
480 	int *multi = priv_data;
481 
482 	if (p_dev->resource[1]->end)
483 		return -EINVAL;
484 
485 	/* The quad port cards have bad CIS's, so just look for a
486 	   window larger than 8 ports and assume it will be right */
487 	if (p_dev->resource[0]->end <= 8)
488 		return -EINVAL;
489 
490 	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
491 	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
492 	p_dev->resource[0]->end = *multi * 8;
493 
494 	if (pcmcia_request_io(p_dev))
495 		return -ENODEV;
496 	return 0;
497 }
498 
multi_config_check_notpicky(struct pcmcia_device * p_dev,void * priv_data)499 static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
500 				       void *priv_data)
501 {
502 	int *base2 = priv_data;
503 
504 	if (!p_dev->resource[0]->end || !p_dev->resource[1]->end ||
505 		p_dev->resource[0]->start + 8 != p_dev->resource[1]->start)
506 		return -ENODEV;
507 
508 	p_dev->resource[0]->end = p_dev->resource[1]->end = 8;
509 	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
510 	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
511 
512 	if (pcmcia_request_io(p_dev))
513 		return -ENODEV;
514 
515 	*base2 = p_dev->resource[0]->start + 8;
516 	return 0;
517 }
518 
multi_config(struct pcmcia_device * link)519 static int multi_config(struct pcmcia_device *link)
520 {
521 	struct serial_info *info = link->priv;
522 	int i, base2 = 0;
523 
524 	/* First, look for a generic full-sized window */
525 	if (!pcmcia_loop_config(link, multi_config_check, &info->multi))
526 		base2 = link->resource[0]->start + 8;
527 	else {
528 		/* If that didn't work, look for two windows */
529 		info->multi = 2;
530 		if (pcmcia_loop_config(link, multi_config_check_notpicky,
531 				       &base2)) {
532 			dev_warn(&link->dev, "no usable port range "
533 			       "found, giving up\n");
534 			return -ENODEV;
535 		}
536 	}
537 
538 	if (!link->irq)
539 		dev_warn(&link->dev, "no usable IRQ found, continuing...\n");
540 
541 	/*
542 	 * Apply any configuration quirks.
543 	 */
544 	if (info->quirk && info->quirk->config)
545 		info->quirk->config(link);
546 
547 	i = pcmcia_enable_device(link);
548 	if (i != 0)
549 		return -ENODEV;
550 
551 	/* The Oxford Semiconductor OXCF950 cards are in fact single-port:
552 	 * 8 registers are for the UART, the others are extra registers.
553 	 * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too.
554 	 */
555 	if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO &&
556 				info->prodid == PRODID_POSSIO_GCC)) {
557 		int err;
558 
559 		if (link->config_index == 1 ||
560 		    link->config_index == 3) {
561 			err = setup_serial(link, info, base2,
562 					link->irq);
563 			base2 = link->resource[0]->start;
564 		} else {
565 			err = setup_serial(link, info, link->resource[0]->start,
566 					link->irq);
567 		}
568 		info->c950ctrl = base2;
569 
570 		/*
571 		 * FIXME: We really should wake up the port prior to
572 		 * handing it over to the serial layer.
573 		 */
574 		if (info->quirk && info->quirk->wakeup)
575 			info->quirk->wakeup(link);
576 
577 		return 0;
578 	}
579 
580 	setup_serial(link, info, link->resource[0]->start, link->irq);
581 	for (i = 0; i < info->multi - 1; i++)
582 		setup_serial(link, info, base2 + (8 * i),
583 				link->irq);
584 	return 0;
585 }
586 
serial_check_for_multi(struct pcmcia_device * p_dev,void * priv_data)587 static int serial_check_for_multi(struct pcmcia_device *p_dev,  void *priv_data)
588 {
589 	struct serial_info *info = p_dev->priv;
590 
591 	if (!p_dev->resource[0]->end)
592 		return -EINVAL;
593 
594 	if ((!p_dev->resource[1]->end) && (p_dev->resource[0]->end % 8 == 0))
595 		info->multi = p_dev->resource[0]->end >> 3;
596 
597 	if ((p_dev->resource[1]->end) && (p_dev->resource[0]->end == 8)
598 		&& (p_dev->resource[1]->end == 8))
599 		info->multi = 2;
600 
601 	return 0; /* break */
602 }
603 
604 
serial_config(struct pcmcia_device * link)605 static int serial_config(struct pcmcia_device * link)
606 {
607 	struct serial_info *info = link->priv;
608 	int i;
609 
610 	dev_dbg(&link->dev, "serial_config\n");
611 
612 	/* Is this a compliant multifunction card? */
613 	info->multi = (link->socket->functions > 1);
614 
615 	/* Is this a multiport card? */
616 	info->manfid = link->manf_id;
617 	info->prodid = link->card_id;
618 
619 	for (i = 0; i < ARRAY_SIZE(quirks); i++)
620 		if ((quirks[i].manfid == ~0 ||
621 		     quirks[i].manfid == info->manfid) &&
622 		    (quirks[i].prodid == ~0 ||
623 		     quirks[i].prodid == info->prodid)) {
624 			info->quirk = &quirks[i];
625 			break;
626 		}
627 
628 	/* Another check for dual-serial cards: look for either serial or
629 	   multifunction cards that ask for appropriate IO port ranges */
630 	if ((info->multi == 0) &&
631 	    (link->has_func_id) &&
632 	    (link->socket->pcmcia_pfc == 0) &&
633 	    ((link->func_id == CISTPL_FUNCID_MULTI) ||
634 	     (link->func_id == CISTPL_FUNCID_SERIAL)))
635 		pcmcia_loop_config(link, serial_check_for_multi, info);
636 
637 	/*
638 	 * Apply any multi-port quirk.
639 	 */
640 	if (info->quirk && info->quirk->multi != -1)
641 		info->multi = info->quirk->multi;
642 
643 	dev_info(&link->dev,
644 		"trying to set up [0x%04x:0x%04x] (pfc: %d, multi: %d, quirk: %p)\n",
645 		link->manf_id, link->card_id,
646 		link->socket->pcmcia_pfc, info->multi, info->quirk);
647 	if (link->socket->pcmcia_pfc)
648 		i = pfc_config(link);
649 	else if (info->multi > 1)
650 		i = multi_config(link);
651 	else
652 		i = simple_config(link);
653 
654 	if (i || info->ndev == 0)
655 		goto failed;
656 
657 	/*
658 	 * Apply any post-init quirk.  FIXME: This should really happen
659 	 * before we register the port, since it might already be in use.
660 	 */
661 	if (info->quirk && info->quirk->post)
662 		if (info->quirk->post(link))
663 			goto failed;
664 
665 	return 0;
666 
667 failed:
668 	dev_warn(&link->dev, "failed to initialize\n");
669 	serial_remove(link);
670 	return -ENODEV;
671 }
672 
673 static const struct pcmcia_device_id serial_ids[] = {
674 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021),
675 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a),
676 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a),
677 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a),
678 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a),
679 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15),
680 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501),
681 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a),
682 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a),
683 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341),
684 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab),
685 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081),
686 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101),
687 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab),
688 	PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
689 	PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
690 	PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
691 	PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
692 	PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
693 	PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
694 	PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
695 	PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
696 	PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
697 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
698 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "ATKK", "LM33-PCM-T", 0xba9eb7e2, 0x077c174e),
699 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
700 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
701 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
702 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
703 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
704 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
705 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555),
706 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
707 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
708 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
709 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
710 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
711 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
712 	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
713 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),
714 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05),
715 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05),
716 	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),
717 	PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
718 	PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562),
719 	PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070),
720 	PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020),
721 	PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
722 	PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card       ", 0xb569a6e5, 0x5bd4ff2c),
723 	PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
724 	PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
725 	PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77),
726 	PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
727 	PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301),
728 	PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276),
729 	PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039),
730 	PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006),
731 	PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0101), /* TDK DF2814 */
732 	PCMCIA_DEVICE_MANF_CARD(0x0105, 0x100a), /* Xircom CM-56G */
733 	PCMCIA_DEVICE_MANF_CARD(0x0105, 0x3e0a), /* TDK DF5660 */
734 	PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a),
735 	PCMCIA_DEVICE_MANF_CARD(0x0107, 0x0002), /* USRobotics 14,400 */
736 	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50),
737 	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51),
738 	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52),
739 	PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53),
740 	PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180),
741 	PCMCIA_DEVICE_MANF_CARD(0x0115, 0x3330), /* USRobotics/SUN 14,400 */
742 	PCMCIA_DEVICE_MANF_CARD(0x0124, 0x0100), /* Nokia DTP-2 ver II */
743 	PCMCIA_DEVICE_MANF_CARD(0x0134, 0x5600), /* LASAT COMMUNICATIONS A/S */
744 	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e),
745 	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b),
746 	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025),
747 	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045),
748 	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052),
749 	PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0006), /* Psion 56K+Fax */
750 	PCMCIA_DEVICE_MANF_CARD(0x0200, 0x0001), /* MultiMobile */
751 	PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae),
752 	PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef),
753 	PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef),
754 	PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef),
755 	PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0),
756 	PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e),
757 	PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a),
758 	PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02),
759 	PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa),
760 	PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76),
761 	PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95),
762 	PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed),
763 	PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65),
764 	PCMCIA_DEVICE_PROD_ID12("IBM", "ISDN/56K/GSM", 0xb569a6e5, 0xfee5297b),
765 	PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6),
766 	PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb),
767 	PCMCIA_DEVICE_PROD_ID12("Intertex", "IX34-PCMCIA", 0xf8a097e3, 0x97880447),
768 	PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f),
769 	PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f),
770 	PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383),
771 	PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
772 	PCMCIA_DEVICE_PROD_ID12("OEM      ", "C288MX     ", 0xb572d360, 0xd2385b7a),
773 	PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
774 	PCMCIA_DEVICE_PROD_ID12("PCMCIA   ", "C336MX     ", 0x99bcafe9, 0xaa25bcab),
775 	PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
776 	PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
777 	PCMCIA_DEVICE_PROD_ID12("Telia", "SurfinBird 560P/A+", 0xe2cdd5e, 0xc9314b38),
778 	PCMCIA_DEVICE_PROD_ID1("Smart Serial Port", 0x2d8ce292),
779 	PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
780 	PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
781 	PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
782 	PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
783 	PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
784 	PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"),
785 	PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
786 	PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
787 	PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
788 	PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
789 	PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
790 	PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
791 	PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
792 	PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC860", 0xd85f6206, 0x698f93db, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC860 3G Network Adapter R1 */
793 	PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"),  /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
794 	PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"),  /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
795 	PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"),  /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
796 	PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
797 	PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
798 	PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
799 	PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
800 	PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
801 	PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"),
802 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100  1.00.",0x19ca78af,0xf964f42b),
803 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83),
804 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232  1.00.",0x19ca78af,0x69fb7490),
805 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232",0x19ca78af,0xb6bc0235),
806 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232",0x63f2e0bd,0xb9e175d3),
807 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232-5",0x63f2e0bd,0xfce33442),
808 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232",0x3beb8cf2,0x171e7190),
809 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232-5",0x3beb8cf2,0x20da4262),
810 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF428",0x3beb8cf2,0xea5dd57d),
811 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF500",0x3beb8cf2,0xd77255fa),
812 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: IC232",0x3beb8cf2,0x6a709903),
813 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: SL232",0x3beb8cf2,0x18430676),
814 	PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: XL232",0x3beb8cf2,0x6f933767),
815 	PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7),
816 	PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41),
817 	PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029),
818 	PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
819 	PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc),
820 	PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7),
821 	PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41),
822 	PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029),
823 	PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
824 	PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
825 	PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
826 	PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b),
827 	/* too generic */
828 	/* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */
829 	/* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */
830 	PCMCIA_DEVICE_FUNC_ID(2),
831 	PCMCIA_DEVICE_NULL,
832 };
833 MODULE_DEVICE_TABLE(pcmcia, serial_ids);
834 
835 MODULE_FIRMWARE("cis/PCMLM28.cis");
836 MODULE_FIRMWARE("cis/DP83903.cis");
837 MODULE_FIRMWARE("cis/3CCFEM556.cis");
838 MODULE_FIRMWARE("cis/3CXEM556.cis");
839 MODULE_FIRMWARE("cis/SW_8xx_SER.cis");
840 MODULE_FIRMWARE("cis/SW_7xx_SER.cis");
841 MODULE_FIRMWARE("cis/SW_555_SER.cis");
842 MODULE_FIRMWARE("cis/MT5634ZLX.cis");
843 MODULE_FIRMWARE("cis/COMpad2.cis");
844 MODULE_FIRMWARE("cis/COMpad4.cis");
845 MODULE_FIRMWARE("cis/RS-COM-2P.cis");
846 
847 static struct pcmcia_driver serial_cs_driver = {
848 	.owner		= THIS_MODULE,
849 	.name		= "serial_cs",
850 	.probe		= serial_probe,
851 	.remove		= serial_detach,
852 	.id_table	= serial_ids,
853 	.suspend	= serial_suspend,
854 	.resume		= serial_resume,
855 };
856 
init_serial_cs(void)857 static int __init init_serial_cs(void)
858 {
859 	return pcmcia_register_driver(&serial_cs_driver);
860 }
861 
exit_serial_cs(void)862 static void __exit exit_serial_cs(void)
863 {
864 	pcmcia_unregister_driver(&serial_cs_driver);
865 }
866 
867 module_init(init_serial_cs);
868 module_exit(exit_serial_cs);
869 
870 MODULE_LICENSE("GPL");
871