Lines Matching full:socket

67 static int yenta_probe_cb_irq(struct yenta_socket *socket);
68 static unsigned int yenta_probe_irq(struct yenta_socket *socket,
82 static inline u32 cb_readl(struct yenta_socket *socket, unsigned reg) in cb_readl() argument
84 u32 val = readl(socket->base + reg); in cb_readl()
85 debug("%04x %08x\n", socket, reg, val); in cb_readl()
89 static inline void cb_writel(struct yenta_socket *socket, unsigned reg, u32 val) in cb_writel() argument
91 debug("%04x %08x\n", socket, reg, val); in cb_writel()
92 writel(val, socket->base + reg); in cb_writel()
93 readl(socket->base + reg); /* avoid problems with PCI write posting */ in cb_writel()
96 static inline u8 config_readb(struct yenta_socket *socket, unsigned offset) in config_readb() argument
99 pci_read_config_byte(socket->dev, offset, &val); in config_readb()
100 debug("%04x %02x\n", socket, offset, val); in config_readb()
104 static inline u16 config_readw(struct yenta_socket *socket, unsigned offset) in config_readw() argument
107 pci_read_config_word(socket->dev, offset, &val); in config_readw()
108 debug("%04x %04x\n", socket, offset, val); in config_readw()
112 static inline u32 config_readl(struct yenta_socket *socket, unsigned offset) in config_readl() argument
115 pci_read_config_dword(socket->dev, offset, &val); in config_readl()
116 debug("%04x %08x\n", socket, offset, val); in config_readl()
120 static inline void config_writeb(struct yenta_socket *socket, unsigned offset, u8 val) in config_writeb() argument
122 debug("%04x %02x\n", socket, offset, val); in config_writeb()
123 pci_write_config_byte(socket->dev, offset, val); in config_writeb()
126 static inline void config_writew(struct yenta_socket *socket, unsigned offset, u16 val) in config_writew() argument
128 debug("%04x %04x\n", socket, offset, val); in config_writew()
129 pci_write_config_word(socket->dev, offset, val); in config_writew()
132 static inline void config_writel(struct yenta_socket *socket, unsigned offset, u32 val) in config_writel() argument
134 debug("%04x %08x\n", socket, offset, val); in config_writel()
135 pci_write_config_dword(socket->dev, offset, val); in config_writel()
138 static inline u8 exca_readb(struct yenta_socket *socket, unsigned reg) in exca_readb() argument
140 u8 val = readb(socket->base + 0x800 + reg); in exca_readb()
141 debug("%04x %02x\n", socket, reg, val); in exca_readb()
145 static inline u8 exca_readw(struct yenta_socket *socket, unsigned reg) in exca_readw() argument
148 val = readb(socket->base + 0x800 + reg); in exca_readw()
149 val |= readb(socket->base + 0x800 + reg + 1) << 8; in exca_readw()
150 debug("%04x %04x\n", socket, reg, val); in exca_readw()
154 static inline void exca_writeb(struct yenta_socket *socket, unsigned reg, u8 val) in exca_writeb() argument
156 debug("%04x %02x\n", socket, reg, val); in exca_writeb()
157 writeb(val, socket->base + 0x800 + reg); in exca_writeb()
158 readb(socket->base + 0x800 + reg); /* PCI write posting... */ in exca_writeb()
161 static void exca_writew(struct yenta_socket *socket, unsigned reg, u16 val) in exca_writew() argument
163 debug("%04x %04x\n", socket, reg, val); in exca_writew()
164 writeb(val, socket->base + 0x800 + reg); in exca_writew()
165 writeb(val >> 8, socket->base + 0x800 + reg + 1); in exca_writew()
168 readb(socket->base + 0x800 + reg); in exca_writew()
169 readb(socket->base + 0x800 + reg + 1); in exca_writew()
175 struct yenta_socket *socket = pci_get_drvdata(dev); in show_yenta_registers() local
183 val = cb_readl(socket, i); in show_yenta_registers()
197 val = exca_readb(socket, i); in show_yenta_registers()
212 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); in yenta_get_status() local
214 u32 state = cb_readl(socket, CB_SOCKET_STATE); in yenta_get_status()
228 u8 status = exca_readb(socket, I365_STATUS); in yenta_get_status()
230 if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) { in yenta_get_status()
245 static void yenta_set_power(struct yenta_socket *socket, socket_state_t *state) in yenta_set_power() argument
248 if (!(cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) && in yenta_set_power()
249 (socket->flags & YENTA_16BIT_POWER_EXCA)) { in yenta_set_power()
251 reg = old = exca_readb(socket, I365_POWER); in yenta_set_power()
255 if (socket->flags & YENTA_16BIT_POWER_DF) { in yenta_set_power()
297 exca_writeb(socket, I365_POWER, reg); in yenta_set_power()
322 if (reg != cb_readl(socket, CB_SOCKET_CONTROL)) in yenta_set_power()
323 cb_writel(socket, CB_SOCKET_CONTROL, reg); in yenta_set_power()
329 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); in yenta_set_socket() local
334 yenta_set_power(socket, state); in yenta_set_socket()
336 socket->io_irq = state->io_irq; in yenta_set_socket()
337 bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~(CB_BRIDGE_CRST | CB_BRIDGE_INTR); in yenta_set_socket()
338 if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) { in yenta_set_socket()
343 intr = exca_readb(socket, I365_INTCTL); in yenta_set_socket()
345 if (!socket->dev->irq) { in yenta_set_socket()
346 intr |= socket->cb_irq ? socket->cb_irq : state->io_irq; in yenta_set_socket()
349 exca_writeb(socket, I365_INTCTL, intr); in yenta_set_socket()
353 reg = exca_readb(socket, I365_INTCTL) & (I365_RING_ENA | I365_INTR_ENA); in yenta_set_socket()
356 if (state->io_irq != socket->dev->irq) { in yenta_set_socket()
360 exca_writeb(socket, I365_INTCTL, reg); in yenta_set_socket()
362 reg = exca_readb(socket, I365_POWER) & (I365_VCC_MASK|I365_VPP1_MASK); in yenta_set_socket()
368 if (exca_readb(socket, I365_POWER) != reg) in yenta_set_socket()
369 exca_writeb(socket, I365_POWER, reg); in yenta_set_socket()
372 reg = exca_readb(socket, I365_CSCINT); in yenta_set_socket()
386 exca_writeb(socket, I365_CSCINT, reg); in yenta_set_socket()
387 exca_readb(socket, I365_CSC); in yenta_set_socket()
391 config_writew(socket, CB_BRIDGE_CONTROL, bridge); in yenta_set_socket()
392 /* Socket event mask: get card insert/remove events.. */ in yenta_set_socket()
393 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_set_socket()
394 cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK); in yenta_set_socket()
396 /* if powering up: do it as the last step when the socket is configured */ in yenta_set_socket()
398 yenta_set_power(socket, state); in yenta_set_socket()
404 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); in yenta_set_io_map() local
414 addr = exca_readb(socket, I365_ADDRWIN); in yenta_set_io_map()
419 exca_writeb(socket, I365_ADDRWIN, addr); in yenta_set_io_map()
422 exca_writew(socket, I365_IO(map)+I365_W_START, io->start); in yenta_set_io_map()
423 exca_writew(socket, I365_IO(map)+I365_W_STOP, io->stop); in yenta_set_io_map()
425 ioctl = exca_readb(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map); in yenta_set_io_map()
432 exca_writeb(socket, I365_IOCTL, ioctl); in yenta_set_io_map()
435 exca_writeb(socket, I365_ADDRWIN, addr | enable); in yenta_set_io_map()
441 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); in yenta_set_mem_map() local
448 pcibios_resource_to_bus(socket->dev, &region, mem->res); in yenta_set_mem_map()
460 addr = exca_readb(socket, I365_ADDRWIN); in yenta_set_mem_map()
463 exca_writeb(socket, I365_ADDRWIN, addr); in yenta_set_mem_map()
466 exca_writeb(socket, CB_MEM_PAGE(map), start >> 24); in yenta_set_mem_map()
473 exca_writew(socket, I365_MEM(map) + I365_W_START, word); in yenta_set_mem_map()
489 exca_writew(socket, I365_MEM(map) + I365_W_STOP, word); in yenta_set_mem_map()
496 exca_writew(socket, I365_MEM(map) + I365_W_OFF, word); in yenta_set_mem_map()
499 exca_writeb(socket, I365_ADDRWIN, addr | enable); in yenta_set_mem_map()
508 struct yenta_socket *socket = (struct yenta_socket *) dev_id; in yenta_interrupt() local
513 cb_event = cb_readl(socket, CB_SOCKET_EVENT); in yenta_interrupt()
514 cb_writel(socket, CB_SOCKET_EVENT, cb_event); in yenta_interrupt()
516 csc = exca_readb(socket, I365_CSC); in yenta_interrupt()
523 if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) { in yenta_interrupt()
532 pcmcia_parse_events(&socket->socket, events); in yenta_interrupt()
539 struct yenta_socket *socket = (struct yenta_socket *) data; in yenta_interrupt_wrapper() local
541 yenta_interrupt(0, (void *)socket); in yenta_interrupt_wrapper()
542 socket->poll_timer.expires = jiffies + HZ; in yenta_interrupt_wrapper()
543 add_timer(&socket->poll_timer); in yenta_interrupt_wrapper()
546 static void yenta_clear_maps(struct yenta_socket *socket) in yenta_clear_maps() argument
553 yenta_set_socket(&socket->socket, &dead_socket); in yenta_clear_maps()
556 yenta_set_io_map(&socket->socket, &io); in yenta_clear_maps()
560 yenta_set_mem_map(&socket->socket, &mem); in yenta_clear_maps()
565 static void yenta_interrogate(struct yenta_socket *socket) in yenta_interrogate() argument
569 state = cb_readl(socket, CB_SOCKET_STATE); in yenta_interrogate()
573 cb_writel(socket, CB_SOCKET_FORCE, CB_CVSTEST); in yenta_interrogate()
579 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); in yenta_sock_init() local
581 exca_writeb(socket, I365_GBLCTL, 0x00); in yenta_sock_init()
582 exca_writeb(socket, I365_GENCTL, 0x00); in yenta_sock_init()
585 yenta_interrogate(socket); in yenta_sock_init()
587 yenta_clear_maps(socket); in yenta_sock_init()
589 if (socket->type && socket->type->sock_init) in yenta_sock_init()
590 socket->type->sock_init(socket); in yenta_sock_init()
593 cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK); in yenta_sock_init()
600 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); in yenta_sock_suspend() local
603 cb_writel(socket, CB_SOCKET_MASK, 0x0); in yenta_sock_suspend()
669 static int yenta_search_res(struct yenta_socket *socket, struct resource *res, in yenta_search_res() argument
675 pci_bus_for_each_resource(socket->dev->bus, root, i) { in yenta_search_res()
689 static int yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type, int addr_start, i… in yenta_allocate_res() argument
691 struct pci_dev *dev = socket->dev; in yenta_allocate_res()
709 region.start = config_readl(socket, addr_start) & mask; in yenta_allocate_res()
710 region.end = config_readl(socket, addr_end) | ~mask; in yenta_allocate_res()
722 if ((yenta_search_res(socket, res, BRIDGE_IO_MAX)) || in yenta_allocate_res()
723 (yenta_search_res(socket, res, BRIDGE_IO_ACC)) || in yenta_allocate_res()
724 (yenta_search_res(socket, res, BRIDGE_IO_MIN))) in yenta_allocate_res()
728 if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) || in yenta_allocate_res()
729 (yenta_search_res(socket, res, BRIDGE_MEM_ACC)) || in yenta_allocate_res()
730 (yenta_search_res(socket, res, BRIDGE_MEM_MIN))) in yenta_allocate_res()
735 if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) || in yenta_allocate_res()
736 (yenta_search_res(socket, res, BRIDGE_MEM_ACC)) || in yenta_allocate_res()
737 (yenta_search_res(socket, res, BRIDGE_MEM_MIN))) in yenta_allocate_res()
751 static void yenta_allocate_resources(struct yenta_socket *socket) in yenta_allocate_resources() argument
754 program += yenta_allocate_res(socket, 0, IORESOURCE_IO, in yenta_allocate_resources()
756 program += yenta_allocate_res(socket, 1, IORESOURCE_IO, in yenta_allocate_resources()
758 program += yenta_allocate_res(socket, 2, IORESOURCE_MEM|IORESOURCE_PREFETCH, in yenta_allocate_resources()
760 program += yenta_allocate_res(socket, 3, IORESOURCE_MEM, in yenta_allocate_resources()
763 pci_setup_cardbus(socket->dev->subordinate); in yenta_allocate_resources()
770 static void yenta_free_resources(struct yenta_socket *socket) in yenta_free_resources() argument
775 res = socket->dev->resource + PCI_BRIDGE_RESOURCES + i; in yenta_free_resources()
793 /* we don't want a dying socket registered */ in yenta_close()
794 pcmcia_unregister_socket(&sock->socket); in yenta_close()
912 static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mask) in yenta_probe_irq() argument
923 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_irq()
924 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); in yenta_probe_irq()
925 reg = exca_readb(socket, I365_CSCINT); in yenta_probe_irq()
926 exca_writeb(socket, I365_CSCINT, 0); in yenta_probe_irq()
931 exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG | (i << 4)); in yenta_probe_irq()
932 cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); in yenta_probe_irq()
934 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_irq()
936 cb_writel(socket, CB_SOCKET_MASK, 0); in yenta_probe_irq()
937 exca_writeb(socket, I365_CSCINT, reg); in yenta_probe_irq()
954 struct yenta_socket *socket = (struct yenta_socket *) dev_id; in yenta_probe_handler() local
959 cb_event = cb_readl(socket, CB_SOCKET_EVENT); in yenta_probe_handler()
960 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_handler()
961 csc = exca_readb(socket, I365_CSC); in yenta_probe_handler()
964 socket->probe_status = 1; in yenta_probe_handler()
972 static int yenta_probe_cb_irq(struct yenta_socket *socket) in yenta_probe_cb_irq() argument
976 if (!socket->cb_irq) in yenta_probe_cb_irq()
979 socket->probe_status = 0; in yenta_probe_cb_irq()
981 if (request_irq(socket->cb_irq, yenta_probe_handler, IRQF_SHARED, "yenta", socket)) { in yenta_probe_cb_irq()
982 dev_printk(KERN_WARNING, &socket->dev->dev, in yenta_probe_cb_irq()
988 if (!socket->dev->irq) in yenta_probe_cb_irq()
989 reg = exca_readb(socket, I365_CSCINT); in yenta_probe_cb_irq()
990 exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); in yenta_probe_cb_irq()
991 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_cb_irq()
992 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); in yenta_probe_cb_irq()
993 cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); in yenta_probe_cb_irq()
998 cb_writel(socket, CB_SOCKET_MASK, 0); in yenta_probe_cb_irq()
999 exca_writeb(socket, I365_CSCINT, reg); in yenta_probe_cb_irq()
1000 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_cb_irq()
1001 exca_readb(socket, I365_CSC); in yenta_probe_cb_irq()
1003 free_irq(socket->cb_irq, socket); in yenta_probe_cb_irq()
1005 return (int) socket->probe_status; in yenta_probe_cb_irq()
1014 static void yenta_get_socket_capabilities(struct yenta_socket *socket, u32 isa_irq_mask) in yenta_get_socket_capabilities() argument
1016 socket->socket.pci_irq = socket->cb_irq; in yenta_get_socket_capabilities()
1018 socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask); in yenta_get_socket_capabilities()
1020 socket->socket.irq_mask = 0; in yenta_get_socket_capabilities()
1022 dev_printk(KERN_INFO, &socket->dev->dev, in yenta_get_socket_capabilities()
1024 socket->socket.irq_mask, socket->cb_irq); in yenta_get_socket_capabilities()
1030 static void yenta_config_init(struct yenta_socket *socket) in yenta_config_init() argument
1033 struct pci_dev *dev = socket->dev; in yenta_config_init()
1036 pcibios_resource_to_bus(socket->dev, &region, &dev->resource[0]); in yenta_config_init()
1038 config_writel(socket, CB_LEGACY_MODE_BASE, 0); in yenta_config_init()
1039 config_writel(socket, PCI_BASE_ADDRESS_0, region.start); in yenta_config_init()
1040 config_writew(socket, PCI_COMMAND, in yenta_config_init()
1047 config_writeb(socket, PCI_CACHE_LINE_SIZE, L1_CACHE_BYTES / 4); in yenta_config_init()
1048 config_writeb(socket, PCI_LATENCY_TIMER, 168); in yenta_config_init()
1049 config_writel(socket, PCI_PRIMARY_BUS, in yenta_config_init()
1061 bridge = config_readw(socket, CB_BRIDGE_CONTROL); in yenta_config_init()
1064 config_writew(socket, CB_BRIDGE_CONTROL, bridge); in yenta_config_init()
1143 * socket information structure..
1147 struct yenta_socket *socket; in yenta_probe() local
1161 socket = kzalloc(sizeof(struct yenta_socket), GFP_KERNEL); in yenta_probe()
1162 if (!socket) in yenta_probe()
1166 socket->socket.ops = &yenta_socket_operations; in yenta_probe()
1167 socket->socket.resource_ops = &pccard_nonstatic_ops; in yenta_probe()
1168 socket->socket.dev.parent = &dev->dev; in yenta_probe()
1169 socket->socket.driver_data = socket; in yenta_probe()
1170 socket->socket.owner = THIS_MODULE; in yenta_probe()
1171 socket->socket.features = SS_CAP_PAGE_REGS | SS_CAP_PCCARD; in yenta_probe()
1172 socket->socket.map_size = 0x1000; in yenta_probe()
1173 socket->socket.cb_dev = dev; in yenta_probe()
1176 socket->dev = dev; in yenta_probe()
1177 pci_set_drvdata(dev, socket); in yenta_probe()
1201 socket->base = ioremap(pci_resource_start(dev, 0), 0x1000); in yenta_probe()
1202 if (!socket->base) { in yenta_probe()
1214 yenta_config_init(socket); in yenta_probe()
1217 cb_writel(socket, CB_SOCKET_MASK, 0x0); in yenta_probe()
1220 yenta_allocate_resources(socket); in yenta_probe()
1222 socket->cb_irq = dev->irq; in yenta_probe()
1227 socket->type = &cardbus_type[id->driver_data]; in yenta_probe()
1229 ret = socket->type->override(socket); in yenta_probe()
1236 …if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket))… in yenta_probe()
1238 socket->cb_irq = 0; /* But zero is a valid IRQ number. */ in yenta_probe()
1239 init_timer(&socket->poll_timer); in yenta_probe()
1240 socket->poll_timer.function = yenta_interrupt_wrapper; in yenta_probe()
1241 socket->poll_timer.data = (unsigned long)socket; in yenta_probe()
1242 socket->poll_timer.expires = jiffies + HZ; in yenta_probe()
1243 add_timer(&socket->poll_timer); in yenta_probe()
1246 "socket.\n"); in yenta_probe()
1251 socket->socket.features |= SS_CAP_CARDBUS; in yenta_probe()
1255 yenta_interrogate(socket); in yenta_probe()
1256 yenta_get_socket_capabilities(socket, isa_interrupts); in yenta_probe()
1258 "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); in yenta_probe()
1263 ret = pcmcia_register_socket(&socket->socket); in yenta_probe()
1271 pcmcia_unregister_socket(&socket->socket); in yenta_probe()
1275 iounmap(socket->base); in yenta_probe()
1281 kfree(socket); in yenta_probe()
1290 struct yenta_socket *socket = pci_get_drvdata(pdev); in yenta_dev_suspend_noirq() local
1292 if (!socket) in yenta_dev_suspend_noirq()
1295 if (socket->type && socket->type->save_state) in yenta_dev_suspend_noirq()
1296 socket->type->save_state(socket); in yenta_dev_suspend_noirq()
1299 pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]); in yenta_dev_suspend_noirq()
1300 pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]); in yenta_dev_suspend_noirq()
1309 struct yenta_socket *socket = pci_get_drvdata(pdev); in yenta_dev_resume_noirq() local
1312 if (!socket) in yenta_dev_resume_noirq()
1315 pci_write_config_dword(pdev, 16*4, socket->saved_state[0]); in yenta_dev_resume_noirq()
1316 pci_write_config_dword(pdev, 17*4, socket->saved_state[1]); in yenta_dev_resume_noirq()
1324 if (socket->type && socket->type->restore_state) in yenta_dev_resume_noirq()
1325 socket->type->restore_state(socket); in yenta_dev_resume_noirq()