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