Lines Matching +full:mem +full:- +full:io
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for Intel I82092AA PCI-PCMCIA bridge.
8 * Loosly based on i82365.c from the pcmcia-cs package
21 #include <linux/io.h>
62 unsigned int io_base; /* base io address of the socket */
99 dev_err(&dev->dev, in i82092aa_pci_probe()
101 ret = -EIO; in i82092aa_pci_probe()
104 dev_info(&dev->dev, "configured as a %d socket device.\n", in i82092aa_pci_probe()
108 ret = -EBUSY; in i82092aa_pci_probe()
119 sockets[i].socket.pci_irq = dev->irq; in i82092aa_pci_probe()
127 dev_dbg(&dev->dev, "slot %i is occupied\n", i); in i82092aa_pci_probe()
129 dev_dbg(&dev->dev, "slot %i is vacant\n", i); in i82092aa_pci_probe()
142 dev_dbg(&dev->dev, "Requesting interrupt %i\n", dev->irq); in i82092aa_pci_probe()
143 ret = request_irq(dev->irq, i82092aa_interrupt, IRQF_SHARED, in i82092aa_pci_probe()
146 dev_err(&dev->dev, "Failed to register IRQ %d, aborting\n", in i82092aa_pci_probe()
147 dev->irq); in i82092aa_pci_probe()
152 sockets[i].socket.dev.parent = &dev->dev; in i82092aa_pci_probe()
164 for (i--; i >= 0; i--) in i82092aa_pci_probe()
167 free_irq(dev->irq, i82092aa_interrupt); in i82092aa_pci_probe()
179 free_irq(dev->irq, i82092aa_interrupt); in i82092aa_pci_remove()
325 dev_info(&sockets[i].dev->dev, in i82092aa_interrupt()
330 /* For IO/CARDS, bit 0 means "read the card" */ in i82092aa_interrupt()
388 pccard_io_map io = { 0, 0, 0, 0, 1 }; in i82092aa_init() local
389 pccard_mem_map mem = { .res = &res, }; in i82092aa_init() local
392 io.map = i; in i82092aa_init()
393 i82092aa_set_io_map(sock, &io); in i82092aa_init()
396 mem.map = i; in i82092aa_init()
397 i82092aa_set_mem_map(sock, &mem); in i82092aa_init()
406 struct socket_info, socket)->number; in i82092aa_get_status()
417 /* IO cards have a different meaning of bits 0,1 */ in i82092aa_get_status()
418 /* Also notice the inverse-logic on the bits */ in i82092aa_get_status()
420 /* IO card */ in i82092aa_get_status()
448 unsigned int sock = sock_info->number; in i82092aa_set_socket()
460 if (!(state->flags & SS_RESET)) in i82092aa_set_socket()
462 if (state->flags & SS_IOCARD) in i82092aa_set_socket()
472 if (state->flags & SS_PWR_AUTO) { in i82092aa_set_socket()
473 dev_info(&sock_info->dev->dev, "Auto power\n"); in i82092aa_set_socket()
476 if (state->flags & SS_OUTPUT_ENA) { in i82092aa_set_socket()
477 dev_info(&sock_info->dev->dev, "Power Enabled\n"); in i82092aa_set_socket()
481 switch (state->Vcc) { in i82092aa_set_socket()
485 dev_info(&sock_info->dev->dev, in i82092aa_set_socket()
491 dev_err(&sock_info->dev->dev, in i82092aa_set_socket()
493 __func__, state->Vcc); in i82092aa_set_socket()
494 return -EINVAL; in i82092aa_set_socket()
497 switch (state->Vpp) { in i82092aa_set_socket()
499 dev_info(&sock_info->dev->dev, in i82092aa_set_socket()
503 dev_info(&sock_info->dev->dev, in i82092aa_set_socket()
508 dev_info(&sock_info->dev->dev, "setting Vpp to 12.0\n"); in i82092aa_set_socket()
512 dev_err(&sock_info->dev->dev, in i82092aa_set_socket()
514 __func__, state->Vcc); in i82092aa_set_socket()
515 return -EINVAL; in i82092aa_set_socket()
524 if (state->csc_mask & SS_DETECT) in i82092aa_set_socket()
526 if (state->flags & SS_IOCARD) { in i82092aa_set_socket()
527 if (state->csc_mask & SS_STSCHG) in i82092aa_set_socket()
530 if (state->csc_mask & SS_BATDEAD) in i82092aa_set_socket()
532 if (state->csc_mask & SS_BATWARN) in i82092aa_set_socket()
534 if (state->csc_mask & SS_READY) in i82092aa_set_socket()
550 struct pccard_io_map *io) in i82092aa_set_io_map() argument
554 unsigned int sock = sock_info->number; in i82092aa_set_io_map()
557 map = io->map; in i82092aa_set_io_map()
561 return -EINVAL; in i82092aa_set_io_map()
563 if ((io->start > 0xffff) || (io->stop > 0xffff) in i82092aa_set_io_map()
564 || (io->stop < io->start)) in i82092aa_set_io_map()
565 return -EINVAL; in i82092aa_set_io_map()
572 indirect_write16(sock, I365_IO(map)+I365_W_START, io->start); in i82092aa_set_io_map()
573 indirect_write16(sock, I365_IO(map)+I365_W_STOP, io->stop); in i82092aa_set_io_map()
577 if (io->flags & (MAP_16BIT|MAP_AUTOSZ)) in i82092aa_set_io_map()
583 if (io->flags & MAP_ACTIVE) in i82092aa_set_io_map()
590 struct pccard_mem_map *mem) in i82092aa_set_mem_map() argument
594 unsigned int sock = sock_info->number; in i82092aa_set_mem_map()
599 pcibios_resource_to_bus(sock_info->dev->bus, ®ion, mem->res); in i82092aa_set_mem_map()
601 map = mem->map; in i82092aa_set_mem_map()
603 return -EINVAL; in i82092aa_set_mem_map()
605 if ((mem->card_start > 0x3ffffff) || (region.start > region.end) || in i82092aa_set_mem_map()
606 (mem->speed > 1000)) { in i82092aa_set_mem_map()
607 dev_err(&sock_info->dev->dev, in i82092aa_set_mem_map()
608 "invalid mem map for socket %i: %llx to %llx with a start of %x\n", in i82092aa_set_mem_map()
612 mem->card_start); in i82092aa_set_mem_map()
613 return -EINVAL; in i82092aa_set_mem_map()
623 if (mem->flags & MAP_16BIT) in i82092aa_set_mem_map()
625 if (mem->flags & MAP_0WS) in i82092aa_set_mem_map()
632 switch (to_cycles(mem->speed)) { in i82092aa_set_mem_map()
650 i = ((mem->card_start - region.start) >> 12) & 0x3fff; in i82092aa_set_mem_map()
651 if (mem->flags & MAP_WRPROT) in i82092aa_set_mem_map()
653 if (mem->flags & MAP_ATTRIB) in i82092aa_set_mem_map()
658 if (mem->flags & MAP_ACTIVE) in i82092aa_set_mem_map()