1 1.34 thorpej /* $NetBSD: gayle_pcmcia.c,v 1.34 2021/08/07 16:18:41 thorpej Exp $ */ 2 1.6 aymeric 3 1.6 aymeric /* public domain */ 4 1.1 aymeric 5 1.12 aymeric #include <sys/cdefs.h> 6 1.34 thorpej __KERNEL_RCSID(0, "$NetBSD: gayle_pcmcia.c,v 1.34 2021/08/07 16:18:41 thorpej Exp $"); 7 1.12 aymeric 8 1.1 aymeric /* PCMCIA front-end driver for A1200's and A600's. */ 9 1.1 aymeric 10 1.1 aymeric #include <sys/param.h> 11 1.1 aymeric #include <sys/device.h> 12 1.1 aymeric #include <sys/kernel.h> 13 1.1 aymeric #include <sys/kthread.h> 14 1.1 aymeric #include <sys/systm.h> 15 1.3 mrg 16 1.1 aymeric #include <uvm/uvm.h> 17 1.3 mrg 18 1.1 aymeric #include <dev/pcmcia/pcmciareg.h> 19 1.1 aymeric #include <dev/pcmcia/pcmciavar.h> 20 1.1 aymeric 21 1.1 aymeric #include <machine/cpu.h> 22 1.1 aymeric #include <amiga/amiga/custom.h> 23 1.1 aymeric #include <amiga/amiga/device.h> 24 1.1 aymeric #include <amiga/amiga/gayle.h> 25 1.1 aymeric #include <amiga/amiga/isr.h> 26 1.1 aymeric 27 1.1 aymeric 28 1.11 aymeric /* There is one of these for each slot. And yes, there is only one slot. */ 29 1.1 aymeric struct pccard_slot { 30 1.1 aymeric struct pccard_softc *sc; /* refer to `parent' */ 31 1.1 aymeric int (*intr_func)(void *); 32 1.1 aymeric void * intr_arg; 33 1.26 chs device_t card; 34 1.1 aymeric int flags; 35 1.1 aymeric #define SLOT_OCCUPIED 0x01 36 1.1 aymeric #define SLOT_NEW_CARD_EVENT 0x02 37 1.1 aymeric }; 38 1.1 aymeric 39 1.1 aymeric struct pccard_softc { 40 1.1 aymeric struct bus_space_tag io_space; 41 1.1 aymeric struct bus_space_tag attr_space; 42 1.1 aymeric struct bus_space_tag mem_space; 43 1.1 aymeric struct pccard_slot devs[1]; 44 1.1 aymeric struct isr intr6; 45 1.1 aymeric struct isr intr2; 46 1.1 aymeric }; 47 1.1 aymeric 48 1.26 chs static int pccard_probe(device_t, cfdata_t, void *); 49 1.26 chs static void pccard_attach(device_t, device_t, void *); 50 1.11 aymeric static void pccard_attach_slot(struct pccard_slot *); 51 1.11 aymeric static int pccard_intr6(void *); 52 1.11 aymeric static int pccard_intr2(void *); 53 1.11 aymeric static void pccard_kthread(void *); 54 1.11 aymeric 55 1.11 aymeric static int pcf_mem_alloc(pcmcia_chipset_handle_t, bus_size_t, 56 1.11 aymeric struct pcmcia_mem_handle *); 57 1.11 aymeric static void pcf_mem_free(pcmcia_chipset_handle_t, struct pcmcia_mem_handle *); 58 1.11 aymeric static int pcf_mem_map(pcmcia_chipset_handle_t, int, bus_addr_t, bus_size_t, 59 1.11 aymeric struct pcmcia_mem_handle *, bus_addr_t *, int *); 60 1.11 aymeric static void pcf_mem_unmap(pcmcia_chipset_handle_t, int); 61 1.11 aymeric static int pcf_io_alloc(pcmcia_chipset_handle_t, bus_addr_t, bus_size_t, 62 1.11 aymeric bus_size_t, struct pcmcia_io_handle *); 63 1.11 aymeric static void pcf_io_free(pcmcia_chipset_handle_t, struct pcmcia_io_handle *); 64 1.11 aymeric static int pcf_io_map(pcmcia_chipset_handle_t, int, bus_addr_t, bus_size_t, 65 1.11 aymeric struct pcmcia_io_handle *, int *); 66 1.11 aymeric static void pcf_io_unmap(pcmcia_chipset_handle_t, int); 67 1.11 aymeric static void *pcf_intr_establish(pcmcia_chipset_handle_t, 68 1.11 aymeric struct pcmcia_function *, int, int (*)(void *), void *); 69 1.11 aymeric static void pcf_intr_disestablish(pcmcia_chipset_handle_t, void *); 70 1.11 aymeric static void pcf_socket_enable(pcmcia_chipset_handle_t); 71 1.11 aymeric static void pcf_socket_disable(pcmcia_chipset_handle_t); 72 1.15 aymeric static void pcf_socket_settype(pcmcia_chipset_handle_t, int); 73 1.1 aymeric 74 1.1 aymeric static bsr(pcmio_bsr1, u_int8_t); 75 1.1 aymeric static bsw(pcmio_bsw1, u_int8_t); 76 1.1 aymeric static bsrm(pcmio_bsrm1, u_int8_t); 77 1.1 aymeric static bswm(pcmio_bswm1, u_int8_t); 78 1.1 aymeric static bsrm(pcmio_bsrr1, u_int8_t); 79 1.1 aymeric static bswm(pcmio_bswr1, u_int8_t); 80 1.1 aymeric static bssr(pcmio_bssr1, u_int8_t); 81 1.1 aymeric static bscr(pcmio_bscr1, u_int8_t); 82 1.1 aymeric 83 1.26 chs CFATTACH_DECL_NEW(pccard, sizeof(struct pccard_softc), 84 1.14 thorpej pccard_probe, pccard_attach, NULL, NULL); 85 1.1 aymeric 86 1.19 aymeric static struct pcmcia_chip_functions chip_functions = { 87 1.1 aymeric pcf_mem_alloc, pcf_mem_free, 88 1.1 aymeric pcf_mem_map, pcf_mem_unmap, 89 1.1 aymeric pcf_io_alloc, pcf_io_free, 90 1.1 aymeric pcf_io_map, pcf_io_unmap, 91 1.1 aymeric pcf_intr_establish, pcf_intr_disestablish, 92 1.15 aymeric pcf_socket_enable, pcf_socket_disable, 93 1.15 aymeric pcf_socket_settype 94 1.1 aymeric }; 95 1.1 aymeric 96 1.19 aymeric static struct amiga_bus_space_methods pcmio_bs_methods; 97 1.1 aymeric 98 1.11 aymeric static u_int8_t *reset_card_reg; 99 1.11 aymeric 100 1.1 aymeric static int 101 1.26 chs pccard_probe(device_t parent, cfdata_t cf, void *aux) 102 1.1 aymeric { 103 1.11 aymeric 104 1.24 phx return (is_a600() || is_a1200()) && matchname(aux, "pccard"); 105 1.1 aymeric } 106 1.1 aymeric 107 1.1 aymeric static void 108 1.26 chs pccard_attach(device_t parent, device_t self, void *aux) 109 1.1 aymeric { 110 1.26 chs struct pccard_softc *sc = device_private(self); 111 1.1 aymeric struct pcmciabus_attach_args paa; 112 1.19 aymeric vaddr_t pcmcia_base; 113 1.1 aymeric vaddr_t i; 114 1.1 aymeric 115 1.1 aymeric printf("\n"); 116 1.1 aymeric 117 1.1 aymeric gayle_init(); 118 1.1 aymeric 119 1.20 chs pcmcia_base = uvm_km_alloc(kernel_map, 120 1.20 chs GAYLE_PCMCIA_END - GAYLE_PCMCIA_START, 121 1.20 chs 0, UVM_KMF_VAONLY | UVM_KMF_NOWAIT); 122 1.20 chs if (pcmcia_base == 0) { 123 1.1 aymeric printf("attach failed (no virtual memory)\n"); 124 1.1 aymeric return; 125 1.1 aymeric } 126 1.1 aymeric 127 1.1 aymeric for (i = GAYLE_PCMCIA_START; i < GAYLE_PCMCIA_END; i += PAGE_SIZE) 128 1.20 chs pmap_enter(vm_map_pmap(kernel_map), 129 1.1 aymeric i - GAYLE_PCMCIA_START + pcmcia_base, i, 130 1.21 thorpej VM_PROT_READ | VM_PROT_WRITE, true); 131 1.20 chs pmap_update(vm_map_pmap(kernel_map)); 132 1.1 aymeric 133 1.1 aymeric /* override the one-byte access methods for I/O space */ 134 1.32 is pcmio_bs_methods = amiga_bus_stride_1swap; 135 1.1 aymeric pcmio_bs_methods.bsr1 = pcmio_bsr1; 136 1.1 aymeric pcmio_bs_methods.bsw1 = pcmio_bsw1; 137 1.1 aymeric pcmio_bs_methods.bsrm1 = pcmio_bsrm1; 138 1.1 aymeric pcmio_bs_methods.bswm1 = pcmio_bswm1; 139 1.1 aymeric pcmio_bs_methods.bsrr1 = pcmio_bsrr1; 140 1.1 aymeric pcmio_bs_methods.bswr1 = pcmio_bswr1; 141 1.1 aymeric pcmio_bs_methods.bssr1 = pcmio_bssr1; 142 1.1 aymeric pcmio_bs_methods.bscr1 = pcmio_bscr1; 143 1.1 aymeric 144 1.19 aymeric reset_card_reg = (u_int8_t *) pcmcia_base + 145 1.19 aymeric (GAYLE_PCMCIA_RESET - GAYLE_PCMCIA_START); 146 1.1 aymeric 147 1.26 chs sc->io_space.base = (bus_addr_t) pcmcia_base + 148 1.19 aymeric (GAYLE_PCMCIA_IO_START - GAYLE_PCMCIA_START); 149 1.26 chs sc->io_space.absm = &pcmio_bs_methods; 150 1.1 aymeric 151 1.26 chs sc->attr_space.base = (bus_addr_t) pcmcia_base + 152 1.19 aymeric (GAYLE_PCMCIA_ATTR_START - GAYLE_PCMCIA_START); 153 1.26 chs sc->attr_space.absm = &amiga_bus_stride_1; 154 1.1 aymeric 155 1.6 aymeric /* XXX we should check if the 4M of common memory are actually 156 1.6 aymeric * RAM or PCMCIA usable. 157 1.6 aymeric * For now, we just do as if the 4M were RAM and make common memory 158 1.6 aymeric * point to attribute memory, which is OK for some I/O cards. 159 1.6 aymeric */ 160 1.26 chs sc->mem_space.base = (bus_addr_t) pcmcia_base; 161 1.26 chs sc->mem_space.absm = &amiga_bus_stride_1; 162 1.1 aymeric 163 1.26 chs sc->devs[0].sc = sc; 164 1.26 chs sc->devs[0].intr_func = NULL; 165 1.26 chs sc->devs[0].intr_arg = NULL; 166 1.26 chs sc->devs[0].flags = 0; 167 1.1 aymeric 168 1.28 rkujawa gayle_pcmcia_status_write(0); 169 1.28 rkujawa gayle_intr_ack(0); 170 1.28 rkujawa gayle_pcmcia_config_write(0); 171 1.28 rkujawa gayle_intr_enable_set(GAYLE_INT_IDE); 172 1.1 aymeric 173 1.1 aymeric paa.paa_busname = "pcmcia"; 174 1.1 aymeric paa.pct = &chip_functions; 175 1.26 chs paa.pch = &sc->devs[0]; 176 1.34 thorpej sc->devs[0].card = config_found(self, &paa, simple_devprint, 177 1.34 thorpej CFARGS_NONE); 178 1.26 chs if (sc->devs[0].card == NULL) { 179 1.19 aymeric printf("attach failed, config_found() returned NULL\n"); 180 1.19 aymeric pmap_remove(kernel_map->pmap, pcmcia_base, 181 1.19 aymeric pcmcia_base + (GAYLE_PCMCIA_END - GAYLE_PCMCIA_START)); 182 1.19 aymeric pmap_update(kernel_map->pmap); 183 1.19 aymeric uvm_deallocate(kernel_map, pcmcia_base, 184 1.19 aymeric GAYLE_PCMCIA_END - GAYLE_PCMCIA_START); 185 1.1 aymeric return; 186 1.1 aymeric } 187 1.1 aymeric 188 1.26 chs sc->intr6.isr_intr = pccard_intr6; 189 1.27 jandberg sc->intr6.isr_arg = sc; 190 1.26 chs sc->intr6.isr_ipl = 6; 191 1.26 chs add_isr(&sc->intr6); 192 1.26 chs 193 1.26 chs sc->intr2.isr_intr = pccard_intr2; 194 1.27 jandberg sc->intr2.isr_arg = sc; 195 1.26 chs sc->intr2.isr_ipl = 2; 196 1.26 chs add_isr(&sc->intr2); 197 1.1 aymeric 198 1.26 chs if (kthread_create(PRI_NONE, 0, NULL, pccard_kthread, sc, 199 1.22 ad NULL, "pccard")) { 200 1.22 ad printf("%s: can't create kernel thread\n", 201 1.26 chs device_xname(self)); 202 1.22 ad panic("pccard kthread_create() failed"); 203 1.22 ad } 204 1.1 aymeric 205 1.28 rkujawa gayle_intr_enable_set(GAYLE_INT_DETECT | GAYLE_INT_IREQ); 206 1.1 aymeric 207 1.1 aymeric /* reset the card if it's already there */ 208 1.28 rkujawa if (gayle_pcmcia_status_read() & GAYLE_CCMEM_DETECT) { 209 1.1 aymeric volatile u_int8_t x; 210 1.30 phx 211 1.30 phx gayle_intr_ack(0xff); 212 1.30 phx delay(500); 213 1.30 phx gayle_intr_ack(0xfc); 214 1.30 phx 215 1.31 jandberg delay(100*1000); 216 1.31 jandberg 217 1.1 aymeric *reset_card_reg = 0x0; 218 1.1 aymeric delay(1000); 219 1.1 aymeric x = *reset_card_reg; 220 1.29 christos __USE(x); 221 1.28 rkujawa gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR); 222 1.1 aymeric } 223 1.1 aymeric 224 1.26 chs pccard_attach_slot(&sc->devs[0]); 225 1.1 aymeric } 226 1.1 aymeric 227 1.1 aymeric static int 228 1.11 aymeric pccard_intr6(void *arg) 229 1.1 aymeric { 230 1.26 chs struct pccard_softc *sc = arg; 231 1.1 aymeric 232 1.28 rkujawa if (gayle_intr_status() & GAYLE_INT_DETECT) { 233 1.28 rkujawa gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_STSCHG | 234 1.28 rkujawa GAYLE_INT_SPKR | GAYLE_INT_WP | GAYLE_INT_IREQ); 235 1.26 chs sc->devs[0].flags |= SLOT_NEW_CARD_EVENT; 236 1.1 aymeric return 1; 237 1.1 aymeric } 238 1.1 aymeric return 0; 239 1.1 aymeric } 240 1.1 aymeric 241 1.1 aymeric static int 242 1.11 aymeric pccard_intr2(void *arg) 243 1.1 aymeric { 244 1.26 chs struct pccard_softc *sc = arg; 245 1.26 chs struct pccard_slot *slot = &sc->devs[0]; 246 1.1 aymeric 247 1.1 aymeric if (slot->flags & SLOT_NEW_CARD_EVENT) { 248 1.1 aymeric slot->flags &= ~SLOT_NEW_CARD_EVENT; 249 1.1 aymeric 250 1.1 aymeric /* reset the registers */ 251 1.28 rkujawa gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_DETECT); 252 1.28 rkujawa gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR); 253 1.28 rkujawa gayle_pcmcia_config_write(0); 254 1.26 chs pccard_attach_slot(&sc->devs[0]); 255 1.1 aymeric } else { 256 1.28 rkujawa int intreq = gayle_intr_status() & 257 1.2 aymeric (GAYLE_INT_STSCHG | GAYLE_INT_WP | GAYLE_INT_IREQ); 258 1.2 aymeric if (intreq) { 259 1.28 rkujawa gayle_intr_ack((intreq ^ 0x2c) | 0xc0); 260 1.1 aymeric 261 1.6 aymeric return slot->flags & SLOT_OCCUPIED && 262 1.6 aymeric slot->intr_func != NULL && 263 1.1 aymeric slot->intr_func(slot->intr_arg); 264 1.1 aymeric } 265 1.1 aymeric } 266 1.1 aymeric return 0; 267 1.1 aymeric } 268 1.1 aymeric 269 1.1 aymeric static void 270 1.11 aymeric pccard_kthread(void *arg) 271 1.1 aymeric { 272 1.26 chs struct pccard_softc *sc = arg; 273 1.26 chs struct pccard_slot *slot = &sc->devs[0]; 274 1.1 aymeric 275 1.1 aymeric for (;;) { 276 1.1 aymeric int s = spl2(); 277 1.1 aymeric 278 1.1 aymeric if (slot->flags & SLOT_NEW_CARD_EVENT) { 279 1.1 aymeric slot->flags &= ~SLOT_NEW_CARD_EVENT; 280 1.28 rkujawa gayle_intr_ack(0xc0); 281 1.1 aymeric 282 1.1 aymeric /* reset the registers */ 283 1.28 rkujawa gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_DETECT); 284 1.28 rkujawa gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR); 285 1.28 rkujawa gayle_pcmcia_config_write(0); 286 1.26 chs pccard_attach_slot(&sc->devs[0]); 287 1.1 aymeric } 288 1.1 aymeric splx(s); 289 1.1 aymeric 290 1.1 aymeric tsleep(slot, PWAIT, "pccthread", hz); 291 1.1 aymeric } 292 1.1 aymeric } 293 1.1 aymeric 294 1.1 aymeric static void 295 1.11 aymeric pccard_attach_slot(struct pccard_slot *slot) 296 1.1 aymeric { 297 1.11 aymeric 298 1.1 aymeric if (!(slot->flags & SLOT_OCCUPIED) && 299 1.28 rkujawa gayle_pcmcia_status_read() & GAYLE_CCMEM_DETECT) { 300 1.1 aymeric if (pcmcia_card_attach(slot->card) == 0) 301 1.1 aymeric slot->flags |= SLOT_OCCUPIED; 302 1.1 aymeric } 303 1.1 aymeric } 304 1.1 aymeric 305 1.1 aymeric static int 306 1.11 aymeric pcf_mem_alloc(pcmcia_chipset_handle_t pch, bus_size_t bsz, 307 1.11 aymeric struct pcmcia_mem_handle *pcmh) 308 1.1 aymeric { 309 1.1 aymeric struct pccard_slot *slot = (struct pccard_slot *) pch; 310 1.11 aymeric 311 1.1 aymeric pcmh->memt = &slot->sc->attr_space; 312 1.1 aymeric pcmh->memh = pcmh->memt->base; 313 1.1 aymeric return 0; 314 1.1 aymeric } 315 1.1 aymeric 316 1.1 aymeric static void 317 1.11 aymeric pcf_mem_free(pcmcia_chipset_handle_t pch, struct pcmcia_mem_handle *memh) 318 1.1 aymeric { 319 1.1 aymeric } 320 1.1 aymeric 321 1.1 aymeric static int 322 1.11 aymeric pcf_mem_map(pcmcia_chipset_handle_t pch, int kind, bus_addr_t addr, 323 1.11 aymeric bus_size_t size, struct pcmcia_mem_handle *pcmh, 324 1.11 aymeric bus_addr_t *offsetp, int *windowp) 325 1.1 aymeric { 326 1.1 aymeric struct pccard_slot *slot = (struct pccard_slot *) pch; 327 1.1 aymeric 328 1.6 aymeric /* Ignore width requirements */ 329 1.6 aymeric kind &= ~PCMCIA_WIDTH_MEM_MASK; 330 1.6 aymeric 331 1.1 aymeric switch (kind) { 332 1.1 aymeric case PCMCIA_MEM_ATTR: 333 1.1 aymeric pcmh->memt = &slot->sc->attr_space; 334 1.1 aymeric break; 335 1.1 aymeric case PCMCIA_MEM_COMMON: 336 1.1 aymeric pcmh->memt = &slot->sc->mem_space; 337 1.1 aymeric break; 338 1.1 aymeric default: 339 1.1 aymeric /* This means that this code needs an update/a bugfix */ 340 1.7 is printf(__FILE__ ": unknown kind %d of PCMCIA memory\n", kind); 341 1.1 aymeric return 1; 342 1.1 aymeric } 343 1.1 aymeric 344 1.1 aymeric bus_space_map(pcmh->memt, addr, size, 0, &pcmh->memh); 345 1.1 aymeric *offsetp = 0; 346 1.1 aymeric *windowp = 0; /* unused */ 347 1.1 aymeric 348 1.1 aymeric return 0; 349 1.1 aymeric } 350 1.1 aymeric 351 1.1 aymeric static void 352 1.11 aymeric pcf_mem_unmap(pcmcia_chipset_handle_t pch, int win) 353 1.1 aymeric { 354 1.1 aymeric } 355 1.1 aymeric 356 1.1 aymeric static int 357 1.11 aymeric pcf_io_alloc(pcmcia_chipset_handle_t pch, bus_addr_t start, bus_size_t size, 358 1.11 aymeric bus_size_t align, struct pcmcia_io_handle *pcihp) 359 1.1 aymeric { 360 1.1 aymeric struct pccard_slot *slot = (struct pccard_slot *) pch; 361 1.1 aymeric 362 1.1 aymeric pcihp->iot = &slot->sc->io_space; 363 1.1 aymeric pcihp->ioh = pcihp->iot->base; 364 1.1 aymeric return 0; 365 1.1 aymeric } 366 1.1 aymeric 367 1.1 aymeric static void 368 1.11 aymeric pcf_io_free(pcmcia_chipset_handle_t pch, struct pcmcia_io_handle *pcihp) 369 1.1 aymeric { 370 1.1 aymeric } 371 1.1 aymeric 372 1.1 aymeric static int 373 1.11 aymeric pcf_io_map(pcmcia_chipset_handle_t pch, int width, bus_addr_t offset, 374 1.11 aymeric bus_size_t size, struct pcmcia_io_handle *pcihp, int *windowp) 375 1.1 aymeric { 376 1.1 aymeric struct pccard_slot *slot = (struct pccard_slot *) pch; 377 1.1 aymeric 378 1.1 aymeric pcihp->iot = &slot->sc->io_space; 379 1.16 jandberg bus_space_map(pcihp->iot, offset, size, 0, &pcihp->ioh); 380 1.1 aymeric 381 1.1 aymeric *windowp = 0; /* unused */ 382 1.1 aymeric return 0; 383 1.1 aymeric } 384 1.1 aymeric 385 1.1 aymeric static void 386 1.11 aymeric pcf_io_unmap(pcmcia_chipset_handle_t pch, int win) 387 1.1 aymeric { 388 1.1 aymeric } 389 1.1 aymeric 390 1.1 aymeric static void * 391 1.11 aymeric pcf_intr_establish(pcmcia_chipset_handle_t pch, struct pcmcia_function *pf, 392 1.11 aymeric int ipl, int (*func)(void *), void *arg) 393 1.1 aymeric { 394 1.1 aymeric struct pccard_slot *slot = (struct pccard_slot *) pch; 395 1.1 aymeric int s; 396 1.1 aymeric 397 1.1 aymeric s = splhigh(); 398 1.1 aymeric if (slot->intr_func == NULL) { 399 1.1 aymeric slot->intr_func = func; 400 1.1 aymeric slot->intr_arg = arg; 401 1.1 aymeric } else { 402 1.1 aymeric /* if we are here, we need to put intrs into a list */ 403 1.6 aymeric printf("ARGH! see " __FILE__ "\n"); 404 1.1 aymeric slot = NULL; 405 1.1 aymeric } 406 1.1 aymeric splx(s); 407 1.1 aymeric 408 1.1 aymeric return slot; 409 1.1 aymeric } 410 1.1 aymeric 411 1.1 aymeric static void 412 1.11 aymeric pcf_intr_disestablish(pcmcia_chipset_handle_t pch, void *intr_handler) 413 1.1 aymeric { 414 1.1 aymeric struct pccard_slot *slot = (struct pccard_slot *) intr_handler; 415 1.1 aymeric 416 1.1 aymeric if (slot != NULL) { 417 1.1 aymeric slot->intr_func = NULL; 418 1.1 aymeric slot->intr_arg = NULL; 419 1.1 aymeric } 420 1.1 aymeric } 421 1.1 aymeric 422 1.1 aymeric static void 423 1.11 aymeric pcf_socket_enable(pcmcia_chipset_handle_t pch) 424 1.1 aymeric { 425 1.1 aymeric } 426 1.1 aymeric 427 1.1 aymeric static void 428 1.11 aymeric pcf_socket_disable(pcmcia_chipset_handle_t pch) 429 1.1 aymeric { 430 1.1 aymeric } 431 1.1 aymeric 432 1.15 aymeric static void 433 1.15 aymeric pcf_socket_settype(pcmcia_chipset_handle_t pch, int type) { 434 1.15 aymeric } 435 1.1 aymeric 436 1.1 aymeric static u_int8_t 437 1.11 aymeric pcmio_bsr1(bus_space_handle_t h, bus_size_t o) 438 1.1 aymeric { 439 1.11 aymeric 440 1.1 aymeric return *((volatile u_int8_t *) h + o + (o & 1 ? 0xffff : 0)); 441 1.1 aymeric } 442 1.1 aymeric 443 1.1 aymeric static void 444 1.11 aymeric pcmio_bsw1(bus_space_handle_t h, bus_size_t o, unsigned v) 445 1.1 aymeric { 446 1.11 aymeric 447 1.1 aymeric *((volatile u_int8_t *) h + o + (o & 1 ? 0xffff : 0)) = v; 448 1.1 aymeric } 449 1.1 aymeric 450 1.1 aymeric static void 451 1.11 aymeric pcmio_bsrm1(bus_space_handle_t h, bus_size_t o, u_int8_t *p, bus_size_t c) 452 1.1 aymeric { 453 1.11 aymeric volatile u_int8_t *src = (volatile u_int8_t *) 454 1.11 aymeric (h + o + (o & 1 ? 0xffff : 0)); 455 1.1 aymeric 456 1.1 aymeric 457 1.1 aymeric /* XXX we can (should, must) optimize this if c >= 4 */ 458 1.1 aymeric for (; c > 0; c--) 459 1.1 aymeric *p++ = *src; 460 1.1 aymeric } 461 1.1 aymeric 462 1.1 aymeric 463 1.1 aymeric static void 464 1.11 aymeric pcmio_bswm1(bus_space_handle_t h, bus_size_t o, const u_int8_t *p, bus_size_t c) 465 1.1 aymeric { 466 1.11 aymeric volatile u_int8_t *dst = (volatile u_int8_t *) 467 1.11 aymeric (h + o + (o & 1 ? 0xffff : 0)); 468 1.1 aymeric 469 1.1 aymeric 470 1.1 aymeric /* XXX we can (should, must) optimize this if c >= 4 */ 471 1.1 aymeric for (; c > 0; c--) 472 1.1 aymeric *dst = *p++; 473 1.1 aymeric } 474 1.1 aymeric 475 1.1 aymeric static void 476 1.11 aymeric pcmio_bsrr1(bus_space_handle_t h, bus_size_t o, u_int8_t *p, bus_size_t c) 477 1.1 aymeric { 478 1.1 aymeric volatile u_int8_t *cp1; 479 1.1 aymeric volatile u_int8_t *cp2; 480 1.1 aymeric volatile u_int8_t *temp; 481 1.1 aymeric 482 1.1 aymeric if (o & 1) { 483 1.1 aymeric cp1 = (volatile u_int8_t *) h + o + 0x10000; 484 1.1 aymeric cp2 = (volatile u_int8_t *) h + o; 485 1.1 aymeric } else { 486 1.1 aymeric cp1 = (volatile u_int8_t *) h + o; 487 1.1 aymeric cp2 = (volatile u_int8_t *) h + o + 0x10000 + 2; 488 1.1 aymeric } 489 1.1 aymeric 490 1.1 aymeric /* XXX we can (should, must) optimize this if c >= 4 */ 491 1.1 aymeric for (; c > 0; c--) { 492 1.1 aymeric *p++ = *cp1; 493 1.1 aymeric cp1 += 2; 494 1.1 aymeric 495 1.1 aymeric /* swap pointers - hope gcc generates exg for this ;) */ 496 1.1 aymeric temp = cp1; 497 1.1 aymeric cp1 = cp2; 498 1.1 aymeric cp2 = temp; 499 1.1 aymeric } 500 1.1 aymeric } 501 1.1 aymeric 502 1.1 aymeric 503 1.1 aymeric static void 504 1.11 aymeric pcmio_bswr1(bus_space_handle_t h, bus_size_t o, const u_int8_t *p, bus_size_t c) 505 1.1 aymeric { 506 1.1 aymeric volatile u_int8_t *cp1; 507 1.1 aymeric volatile u_int8_t *cp2; 508 1.1 aymeric volatile u_int8_t *temp; 509 1.1 aymeric 510 1.1 aymeric if (o & 1) { 511 1.1 aymeric cp1 = (volatile u_int8_t *) h + o + 0x10000; 512 1.1 aymeric cp2 = (volatile u_int8_t *) h + o; 513 1.1 aymeric } else { 514 1.1 aymeric cp1 = (volatile u_int8_t *) h + o; 515 1.1 aymeric cp2 = (volatile u_int8_t *) h + o + 0x10000 + 2; 516 1.1 aymeric } 517 1.1 aymeric 518 1.1 aymeric /* XXX we can (should, must) optimize this if c >= 4 */ 519 1.1 aymeric for (; c > 0; c--) { 520 1.1 aymeric *cp1 = *p++; 521 1.1 aymeric cp1 += 2; 522 1.1 aymeric 523 1.1 aymeric /* swap pointers - hope gcc generates exg for this ;) */ 524 1.1 aymeric temp = cp1; 525 1.1 aymeric cp1 = cp2; 526 1.1 aymeric cp2 = temp; 527 1.1 aymeric } 528 1.1 aymeric } 529 1.1 aymeric 530 1.1 aymeric void 531 1.11 aymeric pcmio_bssr1(bus_space_handle_t h, bus_size_t o, unsigned v, bus_size_t c) 532 1.1 aymeric { 533 1.11 aymeric 534 1.1 aymeric panic("pcmio_bssr1 is not defined (" __FILE__ ")"); 535 1.1 aymeric } 536 1.1 aymeric 537 1.1 aymeric void 538 1.11 aymeric pcmio_bscr1(bus_space_handle_t h, bus_size_t o, bus_space_handle_t g, 539 1.11 aymeric bus_size_t q, bus_size_t c) 540 1.1 aymeric { 541 1.11 aymeric 542 1.1 aymeric panic("pcmio_bscr1 is not defined (" __FILE__ ")"); 543 1.1 aymeric } 544