Lines Matching +full:mixed +full:- +full:burst
1 // SPDX-License-Identifier: GPL-2.0-only
39 MODULE_PARM_DESC(pwr_irqs_off, "Force IRQs off during power-on of slot. Use only when seeing IRQ st…
43 MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' "
58 #define debug(x, s, args...) dev_dbg(&s->dev->dev, x, ##args)
80 * Generate easy-to-use ways of reading a cardbus sockets
86 u32 val = readl(socket->base + reg); in cb_readl()
94 writel(val, socket->base + reg); in cb_writel()
95 readl(socket->base + reg); /* avoid problems with PCI write posting */ in cb_writel()
101 pci_read_config_byte(socket->dev, offset, &val); in config_readb()
109 pci_read_config_word(socket->dev, offset, &val); in config_readw()
117 pci_read_config_dword(socket->dev, offset, &val); in config_readl()
125 pci_write_config_byte(socket->dev, offset, val); in config_writeb()
131 pci_write_config_word(socket->dev, offset, val); in config_writew()
137 pci_write_config_dword(socket->dev, offset, val); in config_writel()
142 u8 val = readb(socket->base + 0x800 + reg); in exca_readb()
150 val = readb(socket->base + 0x800 + reg); in exca_readw()
151 val |= readb(socket->base + 0x800 + reg + 1) << 8; in exca_readw()
159 writeb(val, socket->base + 0x800 + reg); in exca_writeb()
160 readb(socket->base + 0x800 + reg); /* PCI write posting... */ in exca_writeb()
166 writeb(val, socket->base + 0x800 + reg); in exca_writew()
167 writeb(val >> 8, socket->base + 0x800 + reg + 1); in exca_writew()
170 readb(socket->base + 0x800 + reg); in exca_writew()
171 readb(socket->base + 0x800 + reg + 1); in exca_writew()
183 offset += scnprintf(buf + offset, PAGE_SIZE - offset, "\n%02x:", i); in show_yenta_registers()
185 offset += scnprintf(buf + offset, PAGE_SIZE - offset, " %08x", val); in show_yenta_registers()
188 offset += scnprintf(buf + offset, PAGE_SIZE - offset, "\n\nExCA registers:"); in show_yenta_registers()
193 memcpy(buf + offset, " -", 2); in show_yenta_registers()
196 offset += scnprintf(buf + offset, PAGE_SIZE - offset, "\n%02x:", i); in show_yenta_registers()
199 offset += scnprintf(buf + offset, PAGE_SIZE - offset, " %02x", val); in show_yenta_registers()
208 * Ugh, mixed-mode cardbus and 16-bit pccard state: things depend
250 (socket->flags & YENTA_16BIT_POWER_EXCA)) { in yenta_set_power()
255 /* i82365SL-DF style */ in yenta_set_power()
256 if (socket->flags & YENTA_16BIT_POWER_DF) { in yenta_set_power()
257 switch (state->Vcc) { in yenta_set_power()
268 switch (state->Vpp) { in yenta_set_power()
278 /* i82365SL-B style */ in yenta_set_power()
279 switch (state->Vcc) { in yenta_set_power()
287 switch (state->Vpp) { in yenta_set_power()
301 switch (state->Vcc) { in yenta_set_power()
312 switch (state->Vpp) { in yenta_set_power()
334 if (state->Vcc == 0) in yenta_set_socket()
337 socket->io_irq = state->io_irq; in yenta_set_socket()
341 bridge |= (state->flags & SS_RESET) ? CB_BRIDGE_CRST : 0; in yenta_set_socket()
346 if (!socket->dev->irq) { in yenta_set_socket()
347 intr |= socket->cb_irq ? socket->cb_irq : state->io_irq; in yenta_set_socket()
355 reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; in yenta_set_socket()
356 reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; in yenta_set_socket()
357 if (state->io_irq != socket->dev->irq) { in yenta_set_socket()
358 reg |= state->io_irq; in yenta_set_socket()
365 if (state->flags & SS_PWR_AUTO) in yenta_set_socket()
367 if (state->flags & SS_OUTPUT_ENA) in yenta_set_socket()
376 if (state->flags & SS_IOCARD) { in yenta_set_socket()
377 if (state->csc_mask & SS_STSCHG) in yenta_set_socket()
380 if (state->csc_mask & SS_BATDEAD) in yenta_set_socket()
382 if (state->csc_mask & SS_BATWARN) in yenta_set_socket()
384 if (state->csc_mask & SS_READY) in yenta_set_socket()
389 if (sock->zoom_video) in yenta_set_socket()
390 sock->zoom_video(sock, state->flags & SS_ZVCARD); in yenta_set_socket()
394 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_set_socket()
398 if (state->Vcc != 0) in yenta_set_socket()
409 map = io->map; in yenta_set_io_map()
412 return -EINVAL; in yenta_set_io_map()
423 exca_writew(socket, I365_IO(map)+I365_W_START, io->start); in yenta_set_io_map()
424 exca_writew(socket, I365_IO(map)+I365_W_STOP, io->stop); in yenta_set_io_map()
427 if (io->flags & MAP_0WS) in yenta_set_io_map()
429 if (io->flags & MAP_16BIT) in yenta_set_io_map()
431 if (io->flags & MAP_AUTOSZ) in yenta_set_io_map()
435 if (io->flags & MAP_ACTIVE) in yenta_set_io_map()
449 pcibios_resource_to_bus(socket->dev->bus, ®ion, mem->res); in yenta_set_mem_map()
451 map = mem->map; in yenta_set_mem_map()
454 card_start = mem->card_start; in yenta_set_mem_map()
457 (card_start >> 26) || mem->speed > 1000) in yenta_set_mem_map()
458 return -EINVAL; in yenta_set_mem_map()
470 if (mem->flags & MAP_16BIT) in yenta_set_mem_map()
472 if (mem->flags & MAP_0WS) in yenta_set_mem_map()
477 switch (to_cycles(mem->speed)) { in yenta_set_mem_map()
492 word = ((card_start - start) >> 12) & 0x3fff; in yenta_set_mem_map()
493 if (mem->flags & MAP_WRPROT) in yenta_set_mem_map()
495 if (mem->flags & MAP_ATTRIB) in yenta_set_mem_map()
499 if (mem->flags & MAP_ACTIVE) in yenta_set_mem_map()
533 pcmcia_parse_events(&socket->socket, events); in yenta_interrupt()
543 socket->poll_timer.expires = jiffies + HZ; in yenta_interrupt_wrapper()
544 add_timer(&socket->poll_timer); in yenta_interrupt_wrapper()
554 yenta_set_socket(&socket->socket, &dead_socket); in yenta_clear_maps()
557 yenta_set_io_map(&socket->socket, &io); in yenta_clear_maps()
561 yenta_set_mem_map(&socket->socket, &mem); in yenta_clear_maps()
590 if (socket->type && socket->type->sock_init) in yenta_sock_init()
591 socket->type->sock_init(socket); in yenta_sock_init()
593 /* Re-enable CSC interrupts */ in yenta_sock_init()
633 if (res->flags & IORESOURCE_IO) { in yenta_search_one_res()
639 unsigned long avail = root->end - root->start; in yenta_search_one_res()
676 pci_bus_for_each_resource(socket->dev->bus, root, i) { in yenta_search_res()
680 if ((res->flags ^ root->flags) & in yenta_search_res()
692 struct pci_dev *dev = socket->dev; in yenta_allocate_res()
697 res = &dev->resource[nr]; in yenta_allocate_res()
699 if (res->parent) in yenta_allocate_res()
707 res->name = dev->subordinate->name; in yenta_allocate_res()
708 res->flags = type; in yenta_allocate_res()
713 pcibios_bus_to_resource(dev->bus, res, ®ion); in yenta_allocate_res()
716 dev_info(&dev->dev, in yenta_allocate_res()
732 /* Approximating prefetchable by non-prefetchable */ in yenta_allocate_res()
733 res->flags = IORESOURCE_MEM; in yenta_allocate_res()
741 dev_info(&dev->dev, in yenta_allocate_res()
744 res->start = res->end = res->flags = 0; in yenta_allocate_res()
750 struct pci_dev *dev = socket->dev; in yenta_free_res()
753 res = &dev->resource[nr]; in yenta_free_res()
754 if (res->start != 0 && res->end != 0) in yenta_free_res()
757 res->start = res->end = res->flags = 0; in yenta_free_res()
779 pci_setup_cardbus(socket->dev->subordinate); in yenta_allocate_resources()
796 * Close it down - release our resources and go home..
803 device_remove_file(&dev->dev, &dev_attr_yenta_registers); in yenta_close()
806 pcmcia_unregister_socket(&sock->socket); in yenta_close()
812 if (sock->cb_irq) in yenta_close()
813 free_irq(sock->cb_irq, sock); in yenta_close()
815 del_timer_sync(&sock->poll_timer); in yenta_close()
817 iounmap(sock->base); in yenta_close()
851 CARDBUS_TYPE_DEFAULT = -1,
935 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_irq()
946 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_irq()
972 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_handler()
976 socket->probe_status = 1; in yenta_probe_handler()
988 if (!socket->cb_irq) in yenta_probe_cb_irq()
989 return -1; in yenta_probe_cb_irq()
991 socket->probe_status = 0; in yenta_probe_cb_irq()
993 if (request_irq(socket->cb_irq, yenta_probe_handler, IRQF_SHARED, "yenta", socket)) { in yenta_probe_cb_irq()
994 dev_warn(&socket->dev->dev, in yenta_probe_cb_irq()
996 return -1; in yenta_probe_cb_irq()
1000 if (!socket->dev->irq) in yenta_probe_cb_irq()
1003 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_cb_irq()
1012 cb_writel(socket, CB_SOCKET_EVENT, -1); in yenta_probe_cb_irq()
1015 free_irq(socket->cb_irq, socket); in yenta_probe_cb_irq()
1017 return (int) socket->probe_status; in yenta_probe_cb_irq()
1024 * Set static data that doesn't need re-initializing..
1028 socket->socket.pci_irq = socket->cb_irq; in yenta_get_socket_capabilities()
1030 socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask); in yenta_get_socket_capabilities()
1032 socket->socket.irq_mask = 0; in yenta_get_socket_capabilities()
1034 dev_info(&socket->dev->dev, "ISA IRQ mask 0x%04x, PCI irq %d\n", in yenta_get_socket_capabilities()
1035 socket->socket.irq_mask, socket->cb_irq); in yenta_get_socket_capabilities()
1044 struct pci_dev *dev = socket->dev; in yenta_config_init()
1047 pcibios_resource_to_bus(socket->dev->bus, ®ion, &dev->resource[0]); in yenta_config_init()
1062 ((unsigned int)dev->subordinate->busn_res.end << 16) | /* subordinate bus */ in yenta_config_init()
1063 ((unsigned int)dev->subordinate->busn_res.start << 8) | /* secondary bus */ in yenta_config_init()
1064 dev->subordinate->primary); /* primary bus */ in yenta_config_init()
1068 * - enable write posting. in yenta_config_init()
1069 * - memory window 0 prefetchable, window 1 non-prefetchable in yenta_config_init()
1070 * - PCI interrupts enabled if a PCI interrupt exists.. in yenta_config_init()
1079 * yenta_fixup_parent_bridge - Fix subordinate bus# of the parent bridge
1084 * of the parent brige - some BIOSes seem to be too lazy to set it right.
1097 struct pci_bus *bridge_to_fix = cardbus_bridge->parent; in yenta_fixup_parent_bridge()
1100 if (bridge_to_fix->busn_res.end >= cardbus_bridge->busn_res.end) in yenta_fixup_parent_bridge()
1103 if (!bridge_to_fix->parent) in yenta_fixup_parent_bridge()
1107 upper_limit = bridge_to_fix->parent->busn_res.end; in yenta_fixup_parent_bridge()
1110 list_for_each_entry(sibling, &bridge_to_fix->parent->children, in yenta_fixup_parent_bridge()
1118 if (sibling->busn_res.start > bridge_to_fix->busn_res.end in yenta_fixup_parent_bridge()
1119 && sibling->busn_res.start <= upper_limit) in yenta_fixup_parent_bridge()
1120 upper_limit = sibling->busn_res.start - 1; in yenta_fixup_parent_bridge()
1124 if (cardbus_bridge->busn_res.end > upper_limit) in yenta_fixup_parent_bridge()
1125 dev_warn(&cardbus_bridge->dev, in yenta_fixup_parent_bridge()
1130 if (bridge_to_fix->busn_res.end < upper_limit) { in yenta_fixup_parent_bridge()
1134 min_t(int, cardbus_bridge->busn_res.end, upper_limit); in yenta_fixup_parent_bridge()
1136 dev_info(&bridge_to_fix->dev, in yenta_fixup_parent_bridge()
1138 bridge_to_fix->number, in yenta_fixup_parent_bridge()
1139 (int)bridge_to_fix->busn_res.end, in yenta_fixup_parent_bridge()
1143 bridge_to_fix->busn_res.end = subordinate_to_assign; in yenta_fixup_parent_bridge()
1146 pci_write_config_byte(bridge_to_fix->self, in yenta_fixup_parent_bridge()
1147 PCI_SUBORDINATE_BUS, bridge_to_fix->busn_res.end); in yenta_fixup_parent_bridge()
1166 if (!dev->subordinate) { in yenta_probe()
1167 dev_err(&dev->dev, "no bus associated! (try 'pci=assign-busses')\n"); in yenta_probe()
1168 return -ENODEV; in yenta_probe()
1173 return -ENOMEM; in yenta_probe()
1176 socket->socket.ops = ¥ta_socket_operations; in yenta_probe()
1177 socket->socket.resource_ops = &pccard_nonstatic_ops; in yenta_probe()
1178 socket->socket.dev.parent = &dev->dev; in yenta_probe()
1179 socket->socket.driver_data = socket; in yenta_probe()
1180 socket->socket.owner = THIS_MODULE; in yenta_probe()
1181 socket->socket.features = SS_CAP_PAGE_REGS | SS_CAP_PCCARD; in yenta_probe()
1182 socket->socket.map_size = 0x1000; in yenta_probe()
1183 socket->socket.cb_dev = dev; in yenta_probe()
1186 socket->dev = dev; in yenta_probe()
1193 ret = -EBUSY; in yenta_probe()
1202 dev_err(&dev->dev, "No cardbus resource!\n"); in yenta_probe()
1203 ret = -ENODEV; in yenta_probe()
1211 socket->base = ioremap(pci_resource_start(dev, 0), 0x1000); in yenta_probe()
1212 if (!socket->base) { in yenta_probe()
1213 ret = -ENOMEM; in yenta_probe()
1221 dev_info(&dev->dev, "CardBus bridge found [%04x:%04x]\n", in yenta_probe()
1222 dev->subsystem_vendor, dev->subsystem_device); in yenta_probe()
1232 socket->cb_irq = dev->irq; in yenta_probe()
1235 if (id->driver_data != CARDBUS_TYPE_DEFAULT && in yenta_probe()
1236 id->driver_data < ARRAY_SIZE(cardbus_type)) { in yenta_probe()
1237 socket->type = &cardbus_type[id->driver_data]; in yenta_probe()
1239 ret = socket->type->override(socket); in yenta_probe()
1246 …if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket))… in yenta_probe()
1248 socket->cb_irq = 0; /* But zero is a valid IRQ number. */ in yenta_probe()
1249 timer_setup(&socket->poll_timer, yenta_interrupt_wrapper, 0); in yenta_probe()
1250 mod_timer(&socket->poll_timer, jiffies + HZ); in yenta_probe()
1251 dev_info(&dev->dev, in yenta_probe()
1253 dev_info(&dev->dev, in yenta_probe()
1256 socket->socket.features |= SS_CAP_CARDBUS; in yenta_probe()
1262 dev_info(&dev->dev, "Socket status: %08x\n", in yenta_probe()
1265 yenta_fixup_parent_bridge(dev->subordinate); in yenta_probe()
1268 ret = pcmcia_register_socket(&socket->socket); in yenta_probe()
1273 ret = device_create_file(&dev->dev, &dev_attr_yenta_registers); in yenta_probe()
1281 pcmcia_unregister_socket(&socket->socket); in yenta_probe()
1283 if (socket->cb_irq) in yenta_probe()
1284 free_irq(socket->cb_irq, socket); in yenta_probe()
1286 del_timer_sync(&socket->poll_timer); in yenta_probe()
1288 iounmap(socket->base); in yenta_probe()
1309 if (socket->type && socket->type->save_state) in yenta_dev_suspend_noirq()
1310 socket->type->save_state(socket); in yenta_dev_suspend_noirq()
1313 pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]); in yenta_dev_suspend_noirq()
1314 pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]); in yenta_dev_suspend_noirq()
1329 pci_write_config_dword(pdev, 16*4, socket->saved_state[0]); in yenta_dev_resume_noirq()
1330 pci_write_config_dword(pdev, 17*4, socket->saved_state[1]); in yenta_dev_resume_noirq()
1338 if (socket->type && socket->type->restore_state) in yenta_dev_resume_noirq()
1339 socket->type->restore_state(socket); in yenta_dev_resume_noirq()
1375 * data sheets for these devices. --rmk)