1 /*======================================================================
3 A driver for PCMCIA serial devices
5 serial_cs.c 1.134 2002/05/04 05:48:53
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/
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.
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.
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.
32 ======================================================================*/
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/kernel.h>
37 #include <linux/init.h>
38 #include <linux/sched.h>
39 #include <linux/ptrace.h>
40 #include <linux/slab.h>
41 #include <linux/string.h>
42 #include <linux/timer.h>
43 #include <linux/serial_core.h>
44 #include <linux/major.h>
46 #include <asm/system.h>
48 #include <pcmcia/version.h>
49 #include <pcmcia/cs_types.h>
50 #include <pcmcia/cs.h>
51 #include <pcmcia/cistpl.h>
52 #include <pcmcia/ciscode.h>
53 #include <pcmcia/ds.h>
54 #include <pcmcia/cisreg.h>
59 static int pc_debug = PCMCIA_DEBUG;
60 module_param(pc_debug, int, 0644);
61 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
62 static char *version = "serial_cs.c 1.134 2002/05/04 05:48:53 (David Hinds)";
64 #define DEBUG(n, args...)
67 /*====================================================================*/
69 /* Parameters that can be set with 'insmod' */
71 /* Bit map of interrupts to choose from */
72 static u_int irq_mask = 0xdeb8;
73 static int irq_list[4];
74 static unsigned int irq_list_count;
76 /* Enable the speaker? */
77 static int do_sound = 1;
78 /* Skip strict UART tests? */
79 static int buggy_uart;
81 module_param(irq_mask, uint, 0444);
82 module_param_array(irq_list, int, &irq_list_count, 0444);
83 module_param(do_sound, int, 0444);
84 module_param(buggy_uart, int, 0444);
86 /*====================================================================*/
88 /* Table of multi-port card ID's */
93 int multi; /* 1 = multifunction, > 1 = # ports */
96 static struct multi_id multi_id[] = {
97 { MANFID_OMEGA, PRODID_OMEGA_QSP_100, 4 },
98 { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232, 2 },
99 { MANFID_QUATECH, PRODID_QUATECH_DUAL_RS232_D1, 2 },
100 { MANFID_QUATECH, PRODID_QUATECH_QUAD_RS232, 4 },
101 { MANFID_SOCKET, PRODID_SOCKET_DUAL_RS232, 2 },
102 { MANFID_INTEL, PRODID_INTEL_DUAL_RS232, 2 },
103 { MANFID_NATINST, PRODID_NATINST_QUAD_RS232, 4 }
105 #define MULTI_COUNT (sizeof(multi_id)/sizeof(struct multi_id))
117 static void serial_config(dev_link_t * link);
118 static int serial_event(event_t event, int priority,
119 event_callback_args_t * args);
121 static dev_info_t dev_info = "serial_cs";
123 static dev_link_t *serial_attach(void);
124 static void serial_detach(dev_link_t *);
126 static dev_link_t *dev_list = NULL;
128 /*======================================================================
130 After a card is removed, serial_remove() will unregister
131 the serial device(s), and release the PCMCIA configuration.
133 ======================================================================*/
135 static void serial_remove(dev_link_t *link)
137 struct serial_info *info = link->priv;
140 link->state &= ~DEV_PRESENT;
142 DEBUG(0, "serial_release(0x%p)\n", link);
145 * Recheck to see if the device is still configured.
147 if (info->link.state & DEV_CONFIG) {
148 for (i = 0; i < info->ndev; i++)
149 serial8250_unregister_port(info->line[i]);
151 info->link.dev = NULL;
154 pcmcia_release_configuration(info->link.handle);
155 pcmcia_release_io(info->link.handle, &info->link.io);
156 pcmcia_release_irq(info->link.handle, &info->link.irq);
159 info->link.state &= ~DEV_CONFIG;
163 static void serial_suspend(dev_link_t *link)
165 link->state |= DEV_SUSPEND;
167 if (link->state & DEV_CONFIG) {
168 struct serial_info *info = link->priv;
171 for (i = 0; i < info->ndev; i++)
172 serial8250_suspend_port(info->line[i]);
175 pcmcia_release_configuration(link->handle);
179 static void serial_resume(dev_link_t *link)
181 link->state &= ~DEV_SUSPEND;
184 struct serial_info *info = link->priv;
188 pcmcia_request_configuration(link->handle, &link->conf);
190 for (i = 0; i < info->ndev; i++)
191 serial8250_resume_port(info->line[i]);
195 /*======================================================================
197 serial_attach() creates an "instance" of the driver, allocating
198 local data structures for one device. The device is registered
201 ======================================================================*/
203 static dev_link_t *serial_attach(void)
205 struct serial_info *info;
206 client_reg_t client_reg;
210 DEBUG(0, "serial_attach()\n");
212 /* Create new serial device */
213 info = kmalloc(sizeof (*info), GFP_KERNEL);
216 memset(info, 0, sizeof (*info));
220 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
221 link->io.NumPorts1 = 8;
222 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
223 link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID;
224 if (irq_list_count == 0)
225 link->irq.IRQInfo2 = irq_mask;
227 for (i = 0; i < irq_list_count; i++)
228 link->irq.IRQInfo2 |= 1 << irq_list[i];
229 link->conf.Attributes = CONF_ENABLE_IRQ;
231 link->conf.Attributes |= CONF_ENABLE_SPKR;
232 link->conf.Status = CCSR_AUDIO_ENA;
234 link->conf.IntType = INT_MEMORY_AND_IO;
236 /* Register with Card Services */
237 link->next = dev_list;
239 client_reg.dev_info = &dev_info;
240 client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
241 client_reg.EventMask =
242 CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
243 CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
244 CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
245 client_reg.event_handler = &serial_event;
246 client_reg.Version = 0x0210;
247 client_reg.event_callback_args.client_data = link;
248 ret = pcmcia_register_client(&link->handle, &client_reg);
249 if (ret != CS_SUCCESS) {
250 cs_error(link->handle, RegisterClient, ret);
258 /*======================================================================
260 This deletes a driver "instance". The device is de-registered
261 with Card Services. If it has been released, all local data
262 structures are freed. Otherwise, the structures will be freed
263 when the device is released.
265 ======================================================================*/
267 static void serial_detach(dev_link_t * link)
269 struct serial_info *info = link->priv;
273 DEBUG(0, "serial_detach(0x%p)\n", link);
275 /* Locate device structure */
276 for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
283 * Ensure any outstanding scheduled tasks are completed.
285 flush_scheduled_work();
288 * Ensure that the ports have been released.
293 ret = pcmcia_deregister_client(link->handle);
294 if (ret != CS_SUCCESS)
295 cs_error(link->handle, DeregisterClient, ret);
298 /* Unlink device structure, free bits */
303 /*====================================================================*/
305 static int setup_serial(struct serial_info * info, ioaddr_t iobase, int irq)
307 struct uart_port port;
310 memset(&port, 0, sizeof (struct uart_port));
311 port.iobase = iobase;
313 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
314 port.uartclk = 1843200;
316 port.flags |= UPF_BUGGY_UART;
317 line = serial8250_register_port(&port);
319 printk(KERN_NOTICE "serial_cs: serial8250_register_port() at "
320 "0x%04lx, irq %d failed\n", (u_long)iobase, irq);
324 info->line[info->ndev] = line;
325 sprintf(info->node[info->ndev].dev_name, "ttyS%d", line);
326 info->node[info->ndev].major = TTY_MAJOR;
327 info->node[info->ndev].minor = 0x40 + line;
329 info->node[info->ndev - 1].next = &info->node[info->ndev];
335 /*====================================================================*/
338 first_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse)
341 i = pcmcia_get_first_tuple(handle, tuple);
343 return CS_NO_MORE_ITEMS;
344 i = pcmcia_get_tuple_data(handle, tuple);
347 return pcmcia_parse_tuple(handle, tuple, parse);
351 next_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse)
354 i = pcmcia_get_next_tuple(handle, tuple);
356 return CS_NO_MORE_ITEMS;
357 i = pcmcia_get_tuple_data(handle, tuple);
360 return pcmcia_parse_tuple(handle, tuple, parse);
363 /*====================================================================*/
365 static int simple_config(dev_link_t *link)
367 static ioaddr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
368 static int size_table[2] = { 8, 16 };
369 client_handle_t handle = link->handle;
370 struct serial_info *info = link->priv;
374 cistpl_cftable_entry_t *cf = &parse.cftable_entry;
375 config_info_t config;
379 /* If the card is already configured, look up the port and irq */
380 i = pcmcia_get_configuration_info(handle, &config);
381 if ((i == CS_SUCCESS) && (config.Attributes & CONF_VALID_CLIENT)) {
383 if ((config.BasePort2 != 0) && (config.NumPorts2 == 8)) {
384 port = config.BasePort2;
386 } else if ((info->manfid == MANFID_OSITECH) &&
387 (config.NumPorts1 == 0x40)) {
388 port = config.BasePort1 + 0x28;
392 return setup_serial(info, port, config.AssignedIRQ);
394 link->conf.Vcc = config.Vcc;
396 /* First pass: look for a config entry that looks normal. */
397 tuple.TupleData = (cisdata_t *) buf;
398 tuple.TupleOffset = 0;
399 tuple.TupleDataMax = 255;
400 tuple.Attributes = 0;
401 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
402 /* Two tries: without IO aliases, then with aliases */
403 for (s = 0; s < 2; s++) {
404 for (try = 0; try < 2; try++) {
405 i = first_tuple(handle, &tuple, &parse);
406 while (i != CS_NO_MORE_ITEMS) {
409 if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
410 link->conf.Vpp1 = link->conf.Vpp2 =
411 cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
412 if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[s]) &&
413 (cf->io.win[0].base != 0)) {
414 link->conf.ConfigIndex = cf->index;
415 link->io.BasePort1 = cf->io.win[0].base;
416 link->io.IOAddrLines = (try == 0) ?
417 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
418 i = pcmcia_request_io(link->handle, &link->io);
423 i = next_tuple(handle, &tuple, &parse);
427 /* Second pass: try to find an entry that isn't picky about
428 its base address, then try to grab any standard serial port
429 address, and finally try to get any free port. */
430 i = first_tuple(handle, &tuple, &parse);
431 while (i != CS_NO_MORE_ITEMS) {
432 if ((i == CS_SUCCESS) && (cf->io.nwin > 0) &&
433 ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
434 link->conf.ConfigIndex = cf->index;
435 for (j = 0; j < 5; j++) {
436 link->io.BasePort1 = base[j];
437 link->io.IOAddrLines = base[j] ? 16 : 3;
438 i = pcmcia_request_io(link->handle, &link->io);
443 i = next_tuple(handle, &tuple, &parse);
447 if (i != CS_SUCCESS) {
449 "serial_cs: no usable port range found, giving up\n");
450 cs_error(link->handle, RequestIO, i);
454 i = pcmcia_request_irq(link->handle, &link->irq);
455 if (i != CS_SUCCESS) {
456 cs_error(link->handle, RequestIRQ, i);
457 link->irq.AssignedIRQ = 0;
459 if (info->multi && (info->manfid == MANFID_3COM))
460 link->conf.ConfigIndex &= ~(0x08);
461 i = pcmcia_request_configuration(link->handle, &link->conf);
462 if (i != CS_SUCCESS) {
463 cs_error(link->handle, RequestConfiguration, i);
467 return setup_serial(info, link->io.BasePort1, link->irq.AssignedIRQ);
470 static int multi_config(dev_link_t * link)
472 client_handle_t handle = link->handle;
473 struct serial_info *info = link->priv;
477 cistpl_cftable_entry_t *cf = &parse.cftable_entry;
478 config_info_t config;
481 i = pcmcia_get_configuration_info(handle, &config);
482 if (i != CS_SUCCESS) {
483 cs_error(handle, GetConfigurationInfo, i);
486 link->conf.Vcc = config.Vcc;
488 tuple.TupleData = (cisdata_t *) buf;
489 tuple.TupleOffset = 0;
490 tuple.TupleDataMax = 255;
491 tuple.Attributes = 0;
492 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
494 /* First, look for a generic full-sized window */
495 link->io.NumPorts1 = info->multi * 8;
496 i = first_tuple(handle, &tuple, &parse);
497 while (i != CS_NO_MORE_ITEMS) {
498 /* The quad port cards have bad CIS's, so just look for a
499 window larger than 8 ports and assume it will be right */
500 if ((i == CS_SUCCESS) && (cf->io.nwin == 1) &&
501 (cf->io.win[0].len > 8)) {
502 link->conf.ConfigIndex = cf->index;
503 link->io.BasePort1 = cf->io.win[0].base;
504 link->io.IOAddrLines =
505 cf->io.flags & CISTPL_IO_LINES_MASK;
506 i = pcmcia_request_io(link->handle, &link->io);
507 base2 = link->io.BasePort1 + 8;
511 i = next_tuple(handle, &tuple, &parse);
514 /* If that didn't work, look for two windows */
515 if (i != CS_SUCCESS) {
516 link->io.NumPorts1 = link->io.NumPorts2 = 8;
518 i = first_tuple(handle, &tuple, &parse);
519 while (i != CS_NO_MORE_ITEMS) {
520 if ((i == CS_SUCCESS) && (cf->io.nwin == 2)) {
521 link->conf.ConfigIndex = cf->index;
522 link->io.BasePort1 = cf->io.win[0].base;
523 link->io.BasePort2 = cf->io.win[1].base;
524 link->io.IOAddrLines =
525 cf->io.flags & CISTPL_IO_LINES_MASK;
526 i = pcmcia_request_io(link->handle, &link->io);
527 base2 = link->io.BasePort2;
531 i = next_tuple(handle, &tuple, &parse);
535 if (i != CS_SUCCESS) {
536 cs_error(link->handle, RequestIO, i);
540 i = pcmcia_request_irq(link->handle, &link->irq);
541 if (i != CS_SUCCESS) {
543 "serial_cs: no usable port range found, giving up\n");
544 cs_error(link->handle, RequestIRQ, i);
545 link->irq.AssignedIRQ = 0;
547 /* Socket Dual IO: this enables irq's for second port */
548 if (info->multi && (info->manfid == MANFID_SOCKET)) {
549 link->conf.Present |= PRESENT_EXT_STATUS;
550 link->conf.ExtStatus = ESR_REQ_ATTN_ENA;
552 i = pcmcia_request_configuration(link->handle, &link->conf);
553 if (i != CS_SUCCESS) {
554 cs_error(link->handle, RequestConfiguration, i);
558 /* The Oxford Semiconductor OXCF950 cards are in fact single-port:
559 8 registers are for the UART, the others are extra registers */
560 if (info->manfid == MANFID_OXSEMI) {
561 if (cf->index == 1 || cf->index == 3) {
562 setup_serial(info, base2, link->irq.AssignedIRQ);
563 outb(12, link->io.BasePort1 + 1);
565 setup_serial(info, link->io.BasePort1, link->irq.AssignedIRQ);
571 setup_serial(info, link->io.BasePort1, link->irq.AssignedIRQ);
572 /* The Nokia cards are not really multiport cards */
573 if (info->manfid == MANFID_NOKIA)
575 for (i = 0; i < info->multi - 1; i++)
576 setup_serial(info, base2 + (8 * i), link->irq.AssignedIRQ);
581 /*======================================================================
583 serial_config() is scheduled to run after a CARD_INSERTION event
584 is received, to configure the PCMCIA socket, and to make the
585 serial device available to the system.
587 ======================================================================*/
589 void serial_config(dev_link_t * link)
591 client_handle_t handle = link->handle;
592 struct serial_info *info = link->priv;
596 cistpl_cftable_entry_t *cf = &parse.cftable_entry;
597 int i, last_ret, last_fn;
599 DEBUG(0, "serial_config(0x%p)\n", link);
601 tuple.TupleData = (cisdata_t *) buf;
602 tuple.TupleOffset = 0;
603 tuple.TupleDataMax = 255;
604 tuple.Attributes = 0;
605 /* Get configuration register information */
606 tuple.DesiredTuple = CISTPL_CONFIG;
607 last_ret = first_tuple(handle, &tuple, &parse);
608 if (last_ret != CS_SUCCESS) {
609 last_fn = ParseTuple;
612 link->conf.ConfigBase = parse.config.base;
613 link->conf.Present = parse.config.rmask[0];
616 link->state |= DEV_CONFIG;
618 /* Is this a compliant multifunction card? */
619 tuple.DesiredTuple = CISTPL_LONGLINK_MFC;
620 tuple.Attributes = TUPLE_RETURN_COMMON | TUPLE_RETURN_LINK;
621 info->multi = (first_tuple(handle, &tuple, &parse) == CS_SUCCESS);
623 /* Is this a multiport card? */
624 tuple.DesiredTuple = CISTPL_MANFID;
625 if (first_tuple(handle, &tuple, &parse) == CS_SUCCESS) {
626 info->manfid = le16_to_cpu(buf[0]);
627 for (i = 0; i < MULTI_COUNT; i++)
628 if ((info->manfid == multi_id[i].manfid) &&
629 (le16_to_cpu(buf[1]) == multi_id[i].prodid))
632 info->multi = multi_id[i].multi;
635 /* Another check for dual-serial cards: look for either serial or
636 multifunction cards that ask for appropriate IO port ranges */
637 tuple.DesiredTuple = CISTPL_FUNCID;
638 if ((info->multi == 0) &&
639 ((first_tuple(handle, &tuple, &parse) != CS_SUCCESS) ||
640 (parse.funcid.func == CISTPL_FUNCID_MULTI) ||
641 (parse.funcid.func == CISTPL_FUNCID_SERIAL))) {
642 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
643 if (first_tuple(handle, &tuple, &parse) == CS_SUCCESS) {
644 if ((cf->io.nwin == 1) && (cf->io.win[0].len % 8 == 0))
645 info->multi = cf->io.win[0].len >> 3;
646 if ((cf->io.nwin == 2) && (cf->io.win[0].len == 8) &&
647 (cf->io.win[1].len == 8))
660 if (info->manfid == MANFID_IBM) {
661 conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
662 last_ret = pcmcia_access_configuration_register(link->handle, ®);
664 last_fn = AccessConfigurationRegister;
667 reg.Action = CS_WRITE;
668 reg.Value = reg.Value | 1;
669 last_ret = pcmcia_access_configuration_register(link->handle, ®);
671 last_fn = AccessConfigurationRegister;
676 link->dev = &info->node[0];
677 link->state &= ~DEV_CONFIG_PENDING;
681 cs_error(link->handle, last_fn, last_ret);
684 link->state &= ~DEV_CONFIG_PENDING;
687 /*======================================================================
689 The card status event handler. Mostly, this schedules other
690 stuff to run after an event is received. A CARD_REMOVAL event
691 also sets some flags to discourage the serial drivers from
692 talking to the ports.
694 ======================================================================*/
697 serial_event(event_t event, int priority, event_callback_args_t * args)
699 dev_link_t *link = args->client_data;
700 struct serial_info *info = link->priv;
702 DEBUG(1, "serial_event(0x%06x)\n", event);
705 case CS_EVENT_CARD_REMOVAL:
709 case CS_EVENT_CARD_INSERTION:
710 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
714 case CS_EVENT_PM_SUSPEND:
715 serial_suspend(link);
718 case CS_EVENT_RESET_PHYSICAL:
719 if ((link->state & DEV_CONFIG) && !info->slave)
720 pcmcia_release_configuration(link->handle);
723 case CS_EVENT_PM_RESUME:
727 case CS_EVENT_CARD_RESET:
728 if (DEV_OK(link) && !info->slave)
729 pcmcia_request_configuration(link->handle, &link->conf);
735 static struct pcmcia_driver serial_cs_driver = {
736 .owner = THIS_MODULE,
740 .attach = serial_attach,
741 .detach = serial_detach,
744 static int __init init_serial_cs(void)
746 return pcmcia_register_driver(&serial_cs_driver);
749 static void __exit exit_serial_cs(void)
751 pcmcia_unregister_driver(&serial_cs_driver);
753 /* XXX: this really needs to move into generic code.. */
754 while (dev_list != NULL)
755 serial_detach(dev_list);
758 module_init(init_serial_cs);
759 module_exit(exit_serial_cs);
761 MODULE_LICENSE("GPL");