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

2  * Driver for the Cirrus PD6729 PCI-PCMCIA bridge.
16 #include <linux/interrupt.h>
28 MODULE_DESCRIPTION("Driver for the Cirrus PD6729 PCI-PCMCIA bridge");
29 MODULE_AUTHOR("Jun Komuro <komurojun-mbn@nifty.com>");
46 * Specifies the interrupt delivery mode. The default (1) is to use PCI
51 static int irq_mode = 1; /* 0 = ISA interrupt, 1 = PCI interrupt */
55 "interrupt delivery mode. 0 = ISA, 1 = PCI. default is 1");
69 reg += socket->number * 0x40; in indirect_read()
70 port = socket->io_base; in indirect_read()
86 reg = reg + socket->number * 0x40; in indirect_read16()
87 port = socket->io_base; in indirect_read16()
105 reg = reg + socket->number * 0x40; in indirect_write()
106 port = socket->io_base; in indirect_write()
113 unsigned char mask) in indirect_setbit() argument
120 reg = reg + socket->number * 0x40; in indirect_setbit()
121 port = socket->io_base; in indirect_setbit()
124 val |= mask; in indirect_setbit()
131 unsigned char mask) in indirect_resetbit() argument
138 reg = reg + socket->number * 0x40; in indirect_resetbit()
139 port = socket->io_base; in indirect_resetbit()
142 val &= ~mask; in indirect_resetbit()
156 reg = reg + socket->number * 0x40; in indirect_write16()
157 port = socket->io_base; in indirect_write16()
171 /* Interrupt handler functionality */
185 "in interrupt\n"); in pd6729_interrupt()
242 mod_timer(&socket->poll_timer, jiffies + HZ); in pd6729_interrupt_wrapper()
262 * Also notice the inverse-logic on the bits in pd6729_get_status()
285 t = (socket->number) ? socket : socket + 1; in pd6729_get_status()
288 *value |= (data & PD67_EXD_VS1(socket->number)) ? 0 : SS_3VCARD; in pd6729_get_status()
305 socket->card_irq = state->io_irq; in pd6729_set_socket()
309 if (!(state->flags & SS_RESET)) in pd6729_set_socket()
311 if (state->flags & SS_IOCARD) in pd6729_set_socket()
314 /* IGENC, Interrupt and General Control Register */ in pd6729_set_socket()
321 if (state->flags & SS_PWR_AUTO) { in pd6729_set_socket()
322 dev_dbg(&sock->dev, "Auto power\n"); in pd6729_set_socket()
325 if (state->flags & SS_OUTPUT_ENA) { in pd6729_set_socket()
326 dev_dbg(&sock->dev, "Power Enabled\n"); in pd6729_set_socket()
330 switch (state->Vcc) { in pd6729_set_socket()
334 dev_dbg(&sock->dev, in pd6729_set_socket()
336 socket->number); in pd6729_set_socket()
341 dev_dbg(&sock->dev, in pd6729_set_socket()
343 socket->number); in pd6729_set_socket()
348 dev_dbg(&sock->dev, in pd6729_set_socket()
350 "value: %i\n", state->Vcc); in pd6729_set_socket()
351 return -EINVAL; in pd6729_set_socket()
354 switch (state->Vpp) { in pd6729_set_socket()
356 dev_dbg(&sock->dev, "not setting Vpp on socket %i\n", in pd6729_set_socket()
357 socket->number); in pd6729_set_socket()
361 dev_dbg(&sock->dev, "setting Vpp to Vcc for socket %i\n", in pd6729_set_socket()
362 socket->number); in pd6729_set_socket()
366 dev_dbg(&sock->dev, "setting Vpp to 12.0\n"); in pd6729_set_socket()
370 dev_dbg(&sock->dev, "pd6729: pd6729_set_socket called with " in pd6729_set_socket()
371 "invalid VPP power value: %i\n", state->Vpp); in pd6729_set_socket()
372 return -EINVAL; in pd6729_set_socket()
388 /* Enable specific interrupt events */ in pd6729_set_socket()
391 if (state->csc_mask & SS_DETECT) in pd6729_set_socket()
394 if (state->flags & SS_IOCARD) { in pd6729_set_socket()
395 if (state->csc_mask & SS_STSCHG) in pd6729_set_socket()
398 if (state->csc_mask & SS_BATDEAD) in pd6729_set_socket()
400 if (state->csc_mask & SS_BATWARN) in pd6729_set_socket()
402 if (state->csc_mask & SS_READY) in pd6729_set_socket()
413 reg |= socket->card_irq; in pd6729_set_socket()
427 unsigned char map, ioctl; in pd6729_set_io_map() local
429 map = io->map; in pd6729_set_io_map()
432 if (map > 1) { in pd6729_set_io_map()
433 dev_dbg(&sock->dev, "pd6729_set_io_map with invalid map\n"); in pd6729_set_io_map()
434 return -EINVAL; in pd6729_set_io_map()
438 if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_IO(map)) in pd6729_set_io_map()
439 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_IO(map)); in pd6729_set_io_map()
441 /* dev_dbg(&sock->dev, "set_io_map: Setting range to %x - %x\n", in pd6729_set_io_map()
442 io->start, io->stop);*/ in pd6729_set_io_map()
445 indirect_write16(socket, I365_IO(map)+I365_W_START, io->start); in pd6729_set_io_map()
446 indirect_write16(socket, I365_IO(map)+I365_W_STOP, io->stop); in pd6729_set_io_map()
448 ioctl = indirect_read(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map); in pd6729_set_io_map()
450 if (io->flags & MAP_0WS) in pd6729_set_io_map()
451 ioctl |= I365_IOCTL_0WS(map); in pd6729_set_io_map()
452 if (io->flags & MAP_16BIT) in pd6729_set_io_map()
453 ioctl |= I365_IOCTL_16BIT(map); in pd6729_set_io_map()
454 if (io->flags & MAP_AUTOSZ) in pd6729_set_io_map()
455 ioctl |= I365_IOCTL_IOCS16(map); in pd6729_set_io_map()
460 if (io->flags & MAP_ACTIVE) in pd6729_set_io_map()
461 indirect_setbit(socket, I365_ADDRWIN, I365_ENA_IO(map)); in pd6729_set_io_map()
472 unsigned char map; in pd6729_set_mem_map() local
474 map = mem->map; in pd6729_set_mem_map()
475 if (map > 4) { in pd6729_set_mem_map()
476 dev_warn(&sock->dev, "invalid map requested\n"); in pd6729_set_mem_map()
477 return -EINVAL; in pd6729_set_mem_map()
480 if ((mem->res->start > mem->res->end) || (mem->speed > 1000)) { in pd6729_set_mem_map()
481 dev_warn(&sock->dev, "invalid invalid address / speed\n"); in pd6729_set_mem_map()
482 return -EINVAL; in pd6729_set_mem_map()
486 if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_MEM(map)) in pd6729_set_mem_map()
487 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_MEM(map)); in pd6729_set_mem_map()
490 base = I365_MEM(map); in pd6729_set_mem_map()
491 i = (mem->res->start >> 12) & 0x0fff; in pd6729_set_mem_map()
492 if (mem->flags & MAP_16BIT) in pd6729_set_mem_map()
494 if (mem->flags & MAP_0WS) in pd6729_set_mem_map()
500 i = (mem->res->end >> 12) & 0x0fff; in pd6729_set_mem_map()
501 switch (to_cycles(mem->speed)) { in pd6729_set_mem_map()
518 indirect_write(socket, PD67_EXT_INDEX, PD67_MEM_PAGE(map)); in pd6729_set_mem_map()
519 indirect_write(socket, PD67_EXT_DATA, mem->res->start >> 24); in pd6729_set_mem_map()
523 i = ((mem->card_start - mem->res->start) >> 12) & 0x3fff; in pd6729_set_mem_map()
524 if (mem->flags & MAP_WRPROT) in pd6729_set_mem_map()
526 if (mem->flags & MAP_ATTRIB) { in pd6729_set_mem_map()
527 /* dev_dbg(&sock->dev, "requesting attribute memory for " in pd6729_set_mem_map()
528 "socket %i\n", socket->number);*/ in pd6729_set_mem_map()
531 /* dev_dbg(&sock->dev, "requesting normal memory for " in pd6729_set_mem_map()
532 "socket %i\n", socket->number);*/ in pd6729_set_mem_map()
537 if (mem->flags & MAP_ACTIVE) in pd6729_set_mem_map()
538 indirect_setbit(socket, I365_ADDRWIN, I365_ENA_MEM(map)); in pd6729_set_mem_map()
552 io.map = i; in pd6729_init()
556 mem.map = i; in pd6729_init()
575 pr_devel("-> hit on irq %d\n", irq); in pd6729_test()
586 return -1; in pd6729_check_irq()
594 u_int mask0, mask = 0; in pd6729_isa_scan() local
608 mask |= (1 << i); in pd6729_isa_scan()
612 if (mask & (1<<i)) in pd6729_isa_scan()
613 printk("%s%d", ((mask & ((1<<i)-1)) ? "," : ""), i); in pd6729_isa_scan()
615 if (mask == 0) in pd6729_isa_scan()
620 return mask; in pd6729_isa_scan()
627 u_int mask; in pd6729_pci_probe() local
634 dev_warn(&dev->dev, "failed to kzalloc socket.\n"); in pd6729_pci_probe()
635 return -ENOMEM; in pd6729_pci_probe()
640 dev_warn(&dev->dev, "failed to enable pci_device.\n"); in pd6729_pci_probe()
645 dev_warn(&dev->dev, "refusing to load the driver as the " in pd6729_pci_probe()
647 ret = -ENOMEM; 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()
677 ret = -ENODEV; in pd6729_pci_probe()
685 socket[i].socket.irq_mask = mask; in pd6729_pci_probe()
686 socket[i].socket.pci_irq = dev->irq; in pd6729_pci_probe()
694 socket[i].socket.dev.parent = &dev->dev; in pd6729_pci_probe()
700 /* Register the interrupt handler */ in pd6729_pci_probe()
701 ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED, in pd6729_pci_probe()
704 dev_err(&dev->dev, "Failed to register irq %d\n", in pd6729_pci_probe()
705 dev->irq); in pd6729_pci_probe()
710 timer_setup(&socket->poll_timer, pd6729_interrupt_wrapper, 0); in pd6729_pci_probe()
711 mod_timer(&socket->poll_timer, jiffies + HZ); in pd6729_pci_probe()
717 dev_warn(&dev->dev, "pcmcia_register_socket failed.\n"); in pd6729_pci_probe()
728 free_irq(dev->irq, socket); in pd6729_pci_probe()
730 del_timer_sync(&socket->poll_timer); in pd6729_pci_probe()
747 /* Turn off all interrupt sources */ in pd6729_pci_remove()
755 free_irq(dev->irq, socket); in pd6729_pci_remove()
757 del_timer_sync(&socket->poll_timer); in pd6729_pci_remove()