Lines Matching +full:interrupt +full:- +full:map +full:- +full:mask

2  * Driver for the Cirrus PD6729 PCI-PCMCIA bridge.
16 #include <linux/interrupt.h>
29 MODULE_DESCRIPTION("Driver for the Cirrus PD6729 PCI-PCMCIA bridge");
30 MODULE_AUTHOR("Jun Komuro <komurojun-mbn@nifty.com>");
47 * Specifies the interrupt delivery mode. The default (1) is to use PCI
52 static int irq_mode = 1; /* 0 = ISA interrupt, 1 = PCI interrupt */
56 "interrupt delivery mode. 0 = ISA, 1 = PCI. default is 1");
70 reg += socket->number * 0x40; in indirect_read()
71 port = socket->io_base; in indirect_read()
87 reg = reg + socket->number * 0x40; in indirect_read16()
88 port = socket->io_base; in indirect_read16()
106 reg = reg + socket->number * 0x40; in indirect_write()
107 port = socket->io_base; in indirect_write()
114 unsigned char mask) in indirect_setbit() argument
121 reg = reg + socket->number * 0x40; in indirect_setbit()
122 port = socket->io_base; in indirect_setbit()
125 val |= mask; in indirect_setbit()
132 unsigned char mask) in indirect_resetbit() argument
139 reg = reg + socket->number * 0x40; in indirect_resetbit()
140 port = socket->io_base; in indirect_resetbit()
143 val &= ~mask; in indirect_resetbit()
157 reg = reg + socket->number * 0x40; in indirect_write16()
158 port = socket->io_base; in indirect_write16()
172 /* Interrupt handler functionality */
186 "in interrupt\n"); in pd6729_interrupt()
243 mod_timer(&socket->poll_timer, jiffies + HZ); in pd6729_interrupt_wrapper()
263 * Also notice the inverse-logic on the bits in pd6729_get_status()
286 t = (socket->number) ? socket : socket + 1; in pd6729_get_status()
289 *value |= (data & PD67_EXD_VS1(socket->number)) ? 0 : SS_3VCARD; in pd6729_get_status()
306 socket->card_irq = state->io_irq; in pd6729_set_socket()
310 if (!(state->flags & SS_RESET)) in pd6729_set_socket()
312 if (state->flags & SS_IOCARD) in pd6729_set_socket()
315 /* IGENC, Interrupt and General Control Register */ in pd6729_set_socket()
322 if (state->flags & SS_PWR_AUTO) { in pd6729_set_socket()
323 dev_dbg(&sock->dev, "Auto power\n"); in pd6729_set_socket()
326 if (state->flags & SS_OUTPUT_ENA) { in pd6729_set_socket()
327 dev_dbg(&sock->dev, "Power Enabled\n"); in pd6729_set_socket()
331 switch (state->Vcc) { in pd6729_set_socket()
335 dev_dbg(&sock->dev, in pd6729_set_socket()
337 socket->number); in pd6729_set_socket()
342 dev_dbg(&sock->dev, in pd6729_set_socket()
344 socket->number); in pd6729_set_socket()
349 dev_dbg(&sock->dev, in pd6729_set_socket()
351 "value: %i\n", state->Vcc); in pd6729_set_socket()
352 return -EINVAL; in pd6729_set_socket()
355 switch (state->Vpp) { in pd6729_set_socket()
357 dev_dbg(&sock->dev, "not setting Vpp on socket %i\n", in pd6729_set_socket()
358 socket->number); in pd6729_set_socket()
362 dev_dbg(&sock->dev, "setting Vpp to Vcc for socket %i\n", in pd6729_set_socket()
363 socket->number); in pd6729_set_socket()
367 dev_dbg(&sock->dev, "setting Vpp to 12.0\n"); in pd6729_set_socket()
371 dev_dbg(&sock->dev, "pd6729: pd6729_set_socket called with " in pd6729_set_socket()
372 "invalid VPP power value: %i\n", state->Vpp); in pd6729_set_socket()
373 return -EINVAL; in pd6729_set_socket()
389 /* Enable specific interrupt events */ in pd6729_set_socket()
392 if (state->csc_mask & SS_DETECT) in pd6729_set_socket()
395 if (state->flags & SS_IOCARD) { in pd6729_set_socket()
396 if (state->csc_mask & SS_STSCHG) in pd6729_set_socket()
399 if (state->csc_mask & SS_BATDEAD) in pd6729_set_socket()
401 if (state->csc_mask & SS_BATWARN) in pd6729_set_socket()
403 if (state->csc_mask & SS_READY) in pd6729_set_socket()
414 reg |= socket->card_irq; in pd6729_set_socket()
428 unsigned char map, ioctl; in pd6729_set_io_map() local
430 map = io->map; in pd6729_set_io_map()
433 if (map > 1) { in pd6729_set_io_map()
434 dev_dbg(&sock->dev, "pd6729_set_io_map with invalid map\n"); in pd6729_set_io_map()
435 return -EINVAL; in pd6729_set_io_map()
439 if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_IO(map)) in pd6729_set_io_map()
440 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_IO(map)); in pd6729_set_io_map()
442 /* dev_dbg(&sock->dev, "set_io_map: Setting range to %x - %x\n", in pd6729_set_io_map()
443 io->start, io->stop);*/ in pd6729_set_io_map()
446 indirect_write16(socket, I365_IO(map)+I365_W_START, io->start); in pd6729_set_io_map()
447 indirect_write16(socket, I365_IO(map)+I365_W_STOP, io->stop); in pd6729_set_io_map()
449 ioctl = indirect_read(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map); in pd6729_set_io_map()
451 if (io->flags & MAP_0WS) in pd6729_set_io_map()
452 ioctl |= I365_IOCTL_0WS(map); in pd6729_set_io_map()
453 if (io->flags & MAP_16BIT) in pd6729_set_io_map()
454 ioctl |= I365_IOCTL_16BIT(map); in pd6729_set_io_map()
455 if (io->flags & MAP_AUTOSZ) in pd6729_set_io_map()
456 ioctl |= I365_IOCTL_IOCS16(map); in pd6729_set_io_map()
461 if (io->flags & MAP_ACTIVE) in pd6729_set_io_map()
462 indirect_setbit(socket, I365_ADDRWIN, I365_ENA_IO(map)); in pd6729_set_io_map()
473 unsigned char map; in pd6729_set_mem_map() local
475 map = mem->map; in pd6729_set_mem_map()
476 if (map > 4) { in pd6729_set_mem_map()
477 dev_warn(&sock->dev, "invalid map requested\n"); in pd6729_set_mem_map()
478 return -EINVAL; in pd6729_set_mem_map()
481 if ((mem->res->start > mem->res->end) || (mem->speed > 1000)) { in pd6729_set_mem_map()
482 dev_warn(&sock->dev, "invalid invalid address / speed\n"); in pd6729_set_mem_map()
483 return -EINVAL; in pd6729_set_mem_map()
487 if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_MEM(map)) in pd6729_set_mem_map()
488 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_MEM(map)); in pd6729_set_mem_map()
491 base = I365_MEM(map); in pd6729_set_mem_map()
492 i = (mem->res->start >> 12) & 0x0fff; in pd6729_set_mem_map()
493 if (mem->flags & MAP_16BIT) in pd6729_set_mem_map()
495 if (mem->flags & MAP_0WS) in pd6729_set_mem_map()
501 i = (mem->res->end >> 12) & 0x0fff; in pd6729_set_mem_map()
502 switch (to_cycles(mem->speed)) { in pd6729_set_mem_map()
519 indirect_write(socket, PD67_EXT_INDEX, PD67_MEM_PAGE(map)); in pd6729_set_mem_map()
520 indirect_write(socket, PD67_EXT_DATA, mem->res->start >> 24); in pd6729_set_mem_map()
524 i = ((mem->card_start - mem->res->start) >> 12) & 0x3fff; in pd6729_set_mem_map()
525 if (mem->flags & MAP_WRPROT) in pd6729_set_mem_map()
527 if (mem->flags & MAP_ATTRIB) { in pd6729_set_mem_map()
528 /* dev_dbg(&sock->dev, "requesting attribute memory for " in pd6729_set_mem_map()
529 "socket %i\n", socket->number);*/ in pd6729_set_mem_map()
532 /* dev_dbg(&sock->dev, "requesting normal memory for " in pd6729_set_mem_map()
533 "socket %i\n", socket->number);*/ in pd6729_set_mem_map()
538 if (mem->flags & MAP_ACTIVE) in pd6729_set_mem_map()
539 indirect_setbit(socket, I365_ADDRWIN, I365_ENA_MEM(map)); in pd6729_set_mem_map()
553 io.map = i; in pd6729_init()
557 mem.map = i; in pd6729_init()
576 pr_devel("-> hit on irq %d\n", irq); in pd6729_test()
587 return -1; in pd6729_check_irq()
595 u_int mask0, mask = 0; in pd6729_isa_scan() local
609 mask |= (1 << i); in pd6729_isa_scan()
613 if (mask & (1<<i)) in pd6729_isa_scan()
614 printk("%s%d", ((mask & ((1<<i)-1)) ? "," : ""), i); in pd6729_isa_scan()
616 if (mask == 0) in pd6729_isa_scan()
621 return mask; in pd6729_isa_scan()
628 u_int mask; in pd6729_pci_probe() local
635 dev_warn(&dev->dev, "failed to kzalloc socket.\n"); in pd6729_pci_probe()
636 return -ENOMEM; in pd6729_pci_probe()
641 dev_warn(&dev->dev, "failed to enable pci_device.\n"); in pd6729_pci_probe()
646 dev_warn(&dev->dev, "refusing to load the driver as the " in pd6729_pci_probe()
651 dev_info(&dev->dev, "Cirrus PD6729 PCI to PCMCIA Bridge at 0x%llx " in pd6729_pci_probe()
653 (unsigned long long)pci_resource_start(dev, 0), dev->irq); in pd6729_pci_probe()
660 dev_dbg(&dev->dev, "pd6729: Enabling PCI_COMMAND_MEMORY.\n"); in pd6729_pci_probe()
667 dev_warn(&dev->dev, "pci request region failed.\n"); in pd6729_pci_probe()
671 if (dev->irq == NO_IRQ) in pd6729_pci_probe()
672 irq_mode = 0; /* fall back to ISA interrupt mode */ in pd6729_pci_probe()
674 mask = pd6729_isa_scan(); in pd6729_pci_probe()
675 if (irq_mode == 0 && mask == 0) { in pd6729_pci_probe()
676 dev_warn(&dev->dev, "no ISA interrupt is available.\n"); in pd6729_pci_probe()
684 socket[i].socket.irq_mask = mask; in pd6729_pci_probe()
685 socket[i].socket.pci_irq = dev->irq; in pd6729_pci_probe()
693 socket[i].socket.dev.parent = &dev->dev; in pd6729_pci_probe()
699 /* Register the interrupt handler */ in pd6729_pci_probe()
700 ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED, in pd6729_pci_probe()
703 dev_err(&dev->dev, "Failed to register irq %d\n", in pd6729_pci_probe()
704 dev->irq); in pd6729_pci_probe()
709 init_timer(&socket->poll_timer); in pd6729_pci_probe()
710 socket->poll_timer.function = pd6729_interrupt_wrapper; in pd6729_pci_probe()
711 socket->poll_timer.data = (unsigned long)socket; in pd6729_pci_probe()
712 socket->poll_timer.expires = jiffies + HZ; in pd6729_pci_probe()
713 add_timer(&socket->poll_timer); in pd6729_pci_probe()
719 dev_warn(&dev->dev, "pcmcia_register_socket failed.\n"); in pd6729_pci_probe()
730 free_irq(dev->irq, socket); in pd6729_pci_probe()
732 del_timer_sync(&socket->poll_timer); in pd6729_pci_probe()
749 /* Turn off all interrupt sources */ in pd6729_pci_remove()
757 free_irq(dev->irq, socket); in pd6729_pci_remove()
759 del_timer_sync(&socket->poll_timer); in pd6729_pci_remove()