1 /* $NetBSD: shpcmcia.c,v 1.2 2011/07/26 22:52:48 dyoung Exp $ */ 2 3 /*- 4 * Copyright (c) 2009 NONAKA Kimihiro <nonaka@netbsd.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __KERNEL_RCSID(0, "$NetBSD: shpcmcia.c,v 1.2 2011/07/26 22:52:48 dyoung Exp $"); 31 32 #include <sys/types.h> 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/device.h> 36 #include <sys/malloc.h> 37 #include <sys/kthread.h> 38 #include <sys/kernel.h> 39 #include <sys/callout.h> 40 #include <sys/bus.h> 41 #include <sys/intr.h> 42 43 #include <dev/pcmcia/pcmciachip.h> 44 #include <dev/pcmcia/pcmciavar.h> 45 46 #include <machine/autoconf.h> 47 48 #include <sh3/devreg.h> 49 #include <sh3/bscreg.h> 50 #include <sh3/pfcreg.h> 51 52 #include <evbsh3/ap_ms104_sh4/ap_ms104_sh4reg.h> 53 #include <evbsh3/ap_ms104_sh4/ap_ms104_sh4var.h> 54 55 #ifdef SHPCMCIA_DEBUG 56 #define DPRINTF(s) printf s 57 #else 58 #define DPRINTF(s) 59 #endif 60 61 static int shpcmcia_chip_mem_alloc(pcmcia_chipset_handle_t, 62 bus_size_t, struct pcmcia_mem_handle *); 63 static void shpcmcia_chip_mem_free(pcmcia_chipset_handle_t, 64 struct pcmcia_mem_handle *); 65 static int shpcmcia_chip_mem_map(pcmcia_chipset_handle_t, int, 66 bus_addr_t, bus_size_t, struct pcmcia_mem_handle *, 67 bus_size_t *, int *); 68 static void shpcmcia_chip_mem_unmap(pcmcia_chipset_handle_t, int); 69 static int shpcmcia_chip_io_alloc(pcmcia_chipset_handle_t, 70 bus_addr_t, bus_size_t, bus_size_t, 71 struct pcmcia_io_handle *); 72 static void shpcmcia_chip_io_free(pcmcia_chipset_handle_t, 73 struct pcmcia_io_handle *); 74 static int shpcmcia_chip_io_map(pcmcia_chipset_handle_t, int, 75 bus_addr_t, bus_size_t, struct pcmcia_io_handle *, int *); 76 static void shpcmcia_chip_io_unmap(pcmcia_chipset_handle_t, int); 77 static void *shpcmcia_chip_intr_establish(pcmcia_chipset_handle_t, 78 struct pcmcia_function *, int, int (*)(void *), void *); 79 static void shpcmcia_chip_intr_disestablish(pcmcia_chipset_handle_t, 80 void *); 81 static void shpcmcia_chip_socket_enable(pcmcia_chipset_handle_t); 82 static void shpcmcia_chip_socket_disable(pcmcia_chipset_handle_t); 83 static void shpcmcia_chip_socket_settype(pcmcia_chipset_handle_t, 84 int); 85 86 static struct pcmcia_chip_functions shpcmcia_chip_functions = { 87 /* memory space allocation */ 88 .mem_alloc = shpcmcia_chip_mem_alloc, 89 .mem_free = shpcmcia_chip_mem_free, 90 91 /* memory space window mapping */ 92 .mem_map = shpcmcia_chip_mem_map, 93 .mem_unmap = shpcmcia_chip_mem_unmap, 94 95 /* I/O space allocation */ 96 .io_alloc = shpcmcia_chip_io_alloc, 97 .io_free = shpcmcia_chip_io_free, 98 99 /* I/O space window mapping */ 100 .io_map = shpcmcia_chip_io_map, 101 .io_unmap = shpcmcia_chip_io_unmap, 102 103 /* interrupt glue */ 104 .intr_establish = shpcmcia_chip_intr_establish, 105 .intr_disestablish = shpcmcia_chip_intr_disestablish, 106 107 /* card enable/disable */ 108 .socket_enable = shpcmcia_chip_socket_enable, 109 .socket_disable = shpcmcia_chip_socket_disable, 110 .socket_settype = shpcmcia_chip_socket_settype, 111 112 /* card detection */ 113 .card_detect = NULL, 114 }; 115 116 /* 117 * event thread 118 */ 119 struct shpcmcia_event { 120 SIMPLEQ_ENTRY(shpcmcia_event) pe_q; 121 int pe_type; 122 }; 123 124 /* pe_type */ 125 #define SHPCMCIA_EVENT_INSERT 0 126 #define SHPCMCIA_EVENT_REMOVE 1 127 128 struct shpcmcia_softc; 129 struct shpcmcia_handle { 130 struct shpcmcia_softc *sc; 131 132 int flags; 133 #define SHPCMCIA_FLAG_SOCKETP 0x0001 134 #define SHPCMCIA_FLAG_CARDP 0x0002 135 int laststate; 136 #define SHPCMCIA_LASTSTATE_EMPTY 0x0000 137 #define SHPCMCIA_LASTSTATE_PRESENT 0x0002 138 139 140 int memalloc; 141 struct { 142 bus_addr_t addr; 143 bus_size_t size; 144 long offset; 145 int kind; 146 #define SHPCMCIA_MEM_WINS 5 147 } mem[SHPCMCIA_MEM_WINS]; 148 149 int ioalloc; 150 struct { 151 bus_addr_t addr; 152 bus_size_t size; 153 int width; 154 #define SHPCMCIA_IO_WINS 2 155 } io[SHPCMCIA_IO_WINS]; 156 157 struct device *pcmcia; 158 159 int shutdown; 160 lwp_t *event_thread; 161 SIMPLEQ_HEAD(, shpcmcia_event) events; 162 }; 163 164 struct shpcmcia_softc { 165 device_t sc_dev; 166 167 bus_space_tag_t sc_iot; 168 bus_space_handle_t sc_ioh; 169 bus_space_tag_t sc_memt; 170 bus_space_handle_t sc_memh; 171 bus_space_tag_t sc_attt; 172 bus_space_handle_t sc_atth; 173 174 pcmcia_chipset_tag_t sc_pct; 175 176 void *sc_ih; 177 #if 0 178 void *sc_detect_ih; 179 #else 180 callout_t sc_detect_ch; 181 #endif 182 183 bus_addr_t sc_membase; 184 #define SHPCMCIA_MAX_MEM_PAGES (8 * sizeof(int)) 185 186 bus_addr_t sc_iobase; 187 bus_size_t sc_iosize; 188 189 #define SHPCMCIA_NSLOTS 1 190 struct shpcmcia_handle sc_handle[SHPCMCIA_NSLOTS]; 191 }; 192 193 static int shpcmcia_probe(device_t, cfdata_t, void *); 194 static void shpcmcia_attach(device_t, device_t, void *); 195 static int shpcmcia_print(void *, const char *); 196 197 CFATTACH_DECL_NEW(shpcmcia, sizeof(struct shpcmcia_softc), 198 shpcmcia_probe, shpcmcia_attach, NULL, NULL); 199 200 #if 0 201 static int shpcmcia_card_detect_intr(void *arg); 202 #else 203 static void shpcmcia_card_detect_poll(void *arg); 204 #endif 205 206 static void shpcmcia_init_socket(struct shpcmcia_handle *); 207 static void shpcmcia_attach_socket(struct shpcmcia_handle *); 208 static void shpcmcia_attach_sockets(struct shpcmcia_softc *); 209 210 static void shpcmcia_event_thread(void *); 211 static void shpcmcia_queue_event(struct shpcmcia_handle *, int); 212 213 static void shpcmcia_attach_card(struct shpcmcia_handle *); 214 static void shpcmcia_detach_card(struct shpcmcia_handle *, int ); 215 static void shpcmcia_deactivate_card(struct shpcmcia_handle *); 216 217 static int 218 shpcmcia_probe(device_t parent, cfdata_t cfp, void *aux) 219 { 220 struct mainbus_attach_args *maa = aux; 221 222 if (strcmp(maa->ma_name, "shpcmcia") != 0) 223 return 0; 224 return 1; 225 } 226 227 static void 228 shpcmcia_attach(device_t parent, device_t self, void *aux) 229 { 230 struct shpcmcia_softc *sc = device_private(self); 231 #if 0 232 uint32_t reg; 233 #endif 234 235 sc->sc_dev = self; 236 237 aprint_naive("\n"); 238 aprint_normal("\n"); 239 240 #if 0 241 /* setup bus controller */ 242 /* max wait */ 243 reg = _reg_read_4(SH4_WCR1); 244 reg |= 0x00700000; 245 _reg_write_4(SH4_WCR1, reg); 246 reg = _reg_read_4(SH4_WCR2); 247 reg |= 0xfff00000; 248 _reg_write_4(SH4_WCR2, reg); 249 reg = _reg_read_4(SH4_WCR3); 250 reg |= 0x07700000; 251 _reg_write_4(SH4_WCR3, reg); 252 reg = _reg_read_4(SH4_PCR); 253 reg |= 0xffffffff; 254 _reg_write_4(SH4_PCR, reg); 255 #endif 256 257 sc->sc_pct = (pcmcia_chipset_tag_t)&shpcmcia_chip_functions; 258 sc->sc_iot = &ap_ms104_sh4_bus_io; 259 sc->sc_memt = &ap_ms104_sh4_bus_mem; 260 sc->sc_attt = &ap_ms104_sh4_bus_att; 261 262 if (bus_space_map(sc->sc_attt, 0x14000000, 4 * 1024, 0, &sc->sc_atth)) 263 panic("%s: couldn't map attribute\n", device_xname(sc->sc_dev)); 264 if (bus_space_map(sc->sc_iot, 0x15000000, 64 * 1024, 0, 265 &sc->sc_ioh)) 266 panic("%s: couldn't map io memory\n", device_xname(sc->sc_dev)); 267 if (bus_space_map(sc->sc_memt, 0x16000000, 32 * 1024 * 1024, 0, 268 &sc->sc_memh)) 269 panic("%s: couldn't map memory\n", device_xname(sc->sc_dev)); 270 271 sc->sc_iobase = sc->sc_ioh; 272 sc->sc_iosize = 64 * 1024; 273 sc->sc_membase = sc->sc_memh; 274 275 sc->sc_handle[0].sc = sc; 276 sc->sc_handle[0].flags = SHPCMCIA_FLAG_SOCKETP; 277 sc->sc_handle[0].laststate = SHPCMCIA_LASTSTATE_EMPTY; 278 SIMPLEQ_INIT(&sc->sc_handle[0].events); 279 280 #if 0 281 sc->sc_detect_ih = gpio_intr_establish(GPIO_PIN_CARD_CD, 282 shpcmcia_card_detect_intr, sc); 283 if (sc->sc_detect_ih == NULL) { 284 aprint_error_dev(self, "couldn't establish detect interrupt\n"); 285 } 286 #else 287 callout_init(&sc->sc_detect_ch, 0); 288 callout_reset(&sc->sc_detect_ch, hz, shpcmcia_card_detect_poll, sc); 289 #endif 290 291 shpcmcia_attach_sockets(sc); 292 } 293 294 static void 295 shpcmcia_attach_sockets(struct shpcmcia_softc *sc) 296 { 297 298 shpcmcia_attach_socket(&sc->sc_handle[0]); 299 } 300 301 static void 302 shpcmcia_attach_socket(struct shpcmcia_handle *h) 303 { 304 struct pcmciabus_attach_args paa; 305 306 /* initialize the rest of the handle */ 307 h->shutdown = 0; 308 h->memalloc = 0; 309 h->ioalloc = 0; 310 311 /* now, config one pcmcia device per socket */ 312 paa.paa_busname = "pcmcia"; 313 paa.pct = (pcmcia_chipset_tag_t)h->sc->sc_pct; 314 paa.pch = (pcmcia_chipset_handle_t)h; 315 316 h->pcmcia = config_found_ia(h->sc->sc_dev, "pcmciabus", &paa, 317 shpcmcia_print); 318 319 /* if there's actually a pcmcia device attached, initialize the slot */ 320 if (h->pcmcia) 321 shpcmcia_init_socket(h); 322 } 323 324 /*ARGSUSED*/ 325 static int 326 shpcmcia_print(void *arg, const char *pnp) 327 { 328 329 if (pnp) 330 aprint_normal("pcmcia at %s", pnp); 331 return UNCONF; 332 } 333 334 static void 335 shpcmcia_init_socket(struct shpcmcia_handle *h) 336 { 337 uint16_t reg; 338 339 /* 340 * queue creation of a kernel thread to handle insert/removal events. 341 */ 342 #ifdef DIAGNOSTIC 343 if (h->event_thread != NULL) 344 panic("shpcmcia_attach_socket: event thread"); 345 #endif 346 347 /* if there's a card there, then attach it. */ 348 reg = _reg_read_2(SH4_PDTRA); 349 if (!(reg & (1 << GPIO_PIN_CARD_CD))) { 350 shpcmcia_attach_card(h); 351 h->laststate = SHPCMCIA_LASTSTATE_PRESENT; 352 } else { 353 h->laststate = SHPCMCIA_LASTSTATE_EMPTY; 354 } 355 356 if (kthread_create(PRI_NONE, 0, NULL, shpcmcia_event_thread, h, 357 &h->event_thread, "%s", device_xname(h->sc->sc_dev))) { 358 aprint_error_dev(h->sc->sc_dev, 359 "unable to create event thread\n"); 360 panic("shpcmcia_create_event_thread"); 361 } 362 } 363 364 /* 365 * event thread 366 */ 367 static void 368 shpcmcia_event_thread(void *arg) 369 { 370 struct shpcmcia_handle *h = (struct shpcmcia_handle *)arg; 371 struct shpcmcia_event *pe; 372 int s; 373 374 while (h->shutdown == 0) { 375 s = splhigh(); 376 if ((pe = SIMPLEQ_FIRST(&h->events)) == NULL) { 377 splx(s); 378 (void) tsleep(&h->events, PWAIT, "waitev", 0); 379 continue; 380 } else { 381 splx(s); 382 /* sleep .25s to be enqueued chatterling interrupts */ 383 (void) tsleep((void *)shpcmcia_event_thread, 384 PWAIT, "waitss", hz / 4); 385 } 386 s = splhigh(); 387 SIMPLEQ_REMOVE_HEAD(&h->events, pe_q); 388 splx(s); 389 390 switch (pe->pe_type) { 391 case SHPCMCIA_EVENT_INSERT: 392 s = splhigh(); 393 for (;;) { 394 struct shpcmcia_event *pe1, *pe2; 395 396 if ((pe1 = SIMPLEQ_FIRST(&h->events)) == NULL) 397 break; 398 if (pe1->pe_type != SHPCMCIA_EVENT_REMOVE) 399 break; 400 if ((pe2 = SIMPLEQ_NEXT(pe1, pe_q)) == NULL) 401 break; 402 if (pe2->pe_type == SHPCMCIA_EVENT_INSERT) { 403 SIMPLEQ_REMOVE_HEAD(&h->events, pe_q); 404 free(pe1, M_TEMP); 405 SIMPLEQ_REMOVE_HEAD(&h->events, pe_q); 406 free(pe2, M_TEMP); 407 } 408 } 409 splx(s); 410 411 DPRINTF(("%s: insertion event\n", 412 device_xname(h->sc->sc_dev))); 413 shpcmcia_attach_card(h); 414 break; 415 416 case SHPCMCIA_EVENT_REMOVE: 417 s = splhigh(); 418 for (;;) { 419 struct shpcmcia_event *pe1, *pe2; 420 421 if ((pe1 = SIMPLEQ_FIRST(&h->events)) == NULL) 422 break; 423 if (pe1->pe_type != SHPCMCIA_EVENT_INSERT) 424 break; 425 if ((pe2 = SIMPLEQ_NEXT(pe1, pe_q)) == NULL) 426 break; 427 if (pe2->pe_type == SHPCMCIA_EVENT_REMOVE) { 428 SIMPLEQ_REMOVE_HEAD(&h->events, pe_q); 429 free(pe1, M_TEMP); 430 SIMPLEQ_REMOVE_HEAD(&h->events, pe_q); 431 free(pe2, M_TEMP); 432 } 433 } 434 splx(s); 435 436 DPRINTF(("%s: removal event\n", 437 device_xname(h->sc->sc_dev))); 438 shpcmcia_detach_card(h, DETACH_FORCE); 439 break; 440 441 default: 442 panic("shpcmcia_event_thread: unknown event %d", 443 pe->pe_type); 444 } 445 free(pe, M_TEMP); 446 } 447 448 h->event_thread = NULL; 449 450 /* In case parent is waiting for us to exit. */ 451 wakeup(h->sc); 452 453 kthread_exit(0); 454 } 455 456 static void 457 shpcmcia_queue_event(struct shpcmcia_handle *h, int event) 458 { 459 struct shpcmcia_event *pe; 460 int s; 461 462 pe = malloc(sizeof(*pe), M_TEMP, M_NOWAIT); 463 if (pe == NULL) 464 panic("shpcmcia_queue_event: can't allocate event"); 465 466 pe->pe_type = event; 467 s = splhigh(); 468 SIMPLEQ_INSERT_TAIL(&h->events, pe, pe_q); 469 splx(s); 470 wakeup(&h->events); 471 } 472 473 static void 474 shpcmcia_attach_card(struct shpcmcia_handle *h) 475 { 476 477 DPRINTF(("%s\n", __func__)); 478 479 if (!(h->flags & SHPCMCIA_FLAG_CARDP)) { 480 /* call the MI attach function */ 481 pcmcia_card_attach(h->pcmcia); 482 483 h->flags |= SHPCMCIA_FLAG_CARDP; 484 } else { 485 DPRINTF(("shpcmcia_attach_card: already attached")); 486 } 487 } 488 489 static void 490 shpcmcia_detach_card(struct shpcmcia_handle *h, int flags) 491 { 492 493 DPRINTF(("%s\n", __func__)); 494 495 if (h->flags & SHPCMCIA_FLAG_CARDP) { 496 h->flags &= ~SHPCMCIA_FLAG_CARDP; 497 498 /* call the MI detach function */ 499 pcmcia_card_detach(h->pcmcia, flags); 500 } else { 501 DPRINTF(("shpcmcia_detach_card: already detached")); 502 } 503 } 504 505 static void 506 shpcmcia_deactivate_card(struct shpcmcia_handle *h) 507 { 508 509 DPRINTF(("%s\n", __func__)); 510 511 /* call the MI deactivate function */ 512 pcmcia_card_deactivate(h->pcmcia); 513 514 shpcmcia_chip_socket_disable(h); 515 } 516 517 #if 0 518 /* 519 * interrupt 520 */ 521 static int 522 shpcmcia_card_detect_intr(void *arg) 523 { 524 struct shpcmcia_softc *sc = (struct shpcmcia_softc *)arg; 525 struct shpcmcia_handle *h = &sc->sc_handle[0]; 526 uint16_t reg; 527 528 DPRINTF(("%s\n", __func__)); 529 530 reg = _reg_read_2(SH4_PDTRA); 531 if (reg & (1 << GPIO_PIN_CARD_CD)) { 532 /* remove */ 533 if (h->laststate == SHPCMCIA_LASTSTATE_PRESENT) { 534 /* Deactivate the card now. */ 535 shpcmcia_deactivate_card(h); 536 shpcmcia_queue_event(h, SHPCMCIA_EVENT_REMOVE); 537 } 538 h->laststate = SHPCMCIA_LASTSTATE_EMPTY; 539 } else { 540 /* insert */ 541 if (h->laststate != SHPCMCIA_LASTSTATE_PRESENT) { 542 shpcmcia_queue_event(h, SHPCMCIA_EVENT_INSERT); 543 } 544 h->laststate = SHPCMCIA_LASTSTATE_PRESENT; 545 } 546 return 1; 547 } 548 #else 549 /* 550 * card polling 551 */ 552 static void 553 shpcmcia_card_detect_poll(void *arg) 554 { 555 struct shpcmcia_softc *sc = (struct shpcmcia_softc *)arg; 556 struct shpcmcia_handle *h = &sc->sc_handle[0]; 557 uint16_t reg; 558 559 DPRINTF(("%s\n", __func__)); 560 561 reg = _reg_read_2(SH4_PDTRA); 562 if (reg & (1 << GPIO_PIN_CARD_CD)) { 563 /* remove */ 564 if (h->laststate == SHPCMCIA_LASTSTATE_PRESENT) { 565 /* Deactivate the card now. */ 566 shpcmcia_deactivate_card(h); 567 shpcmcia_queue_event(h, SHPCMCIA_EVENT_REMOVE); 568 } 569 h->laststate = SHPCMCIA_LASTSTATE_EMPTY; 570 } else { 571 /* insert */ 572 if (h->laststate != SHPCMCIA_LASTSTATE_PRESENT) { 573 shpcmcia_queue_event(h, SHPCMCIA_EVENT_INSERT); 574 } 575 h->laststate = SHPCMCIA_LASTSTATE_PRESENT; 576 } 577 578 callout_schedule(&sc->sc_detect_ch, hz); 579 } 580 #endif 581 582 /* 583 * pcmcia chip functions 584 */ 585 /* Memory space functions. */ 586 static int 587 shpcmcia_chip_mem_alloc(pcmcia_chipset_handle_t pch, bus_size_t size, 588 struct pcmcia_mem_handle *pmhp) 589 { 590 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 591 struct shpcmcia_softc *sc = h->sc; 592 593 DPRINTF(("%s: size=%d\n", __func__, (unsigned)size)); 594 595 memset(pmhp, 0, sizeof(*pmhp)); 596 pmhp->memt = sc->sc_memt; 597 pmhp->memh = sc->sc_memh; 598 pmhp->addr = 0; 599 pmhp->size = size; 600 pmhp->realsize = size; 601 602 return 0; 603 } 604 605 /*ARGSUSED*/ 606 static void 607 shpcmcia_chip_mem_free(pcmcia_chipset_handle_t pch, 608 struct pcmcia_mem_handle *pmhp) 609 { 610 611 DPRINTF(("%s\n", __func__)); 612 } 613 614 static int 615 shpcmcia_chip_mem_map(pcmcia_chipset_handle_t pch, int kind, 616 bus_addr_t card_addr, bus_size_t size, struct pcmcia_mem_handle *pmhp, 617 bus_size_t *offsetp, int *windowp) 618 { 619 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 620 struct shpcmcia_softc *sc = h->sc; 621 int win; 622 int i; 623 int s; 624 625 DPRINTF(("%s: kind=%#x, card_addr=%#x, size=%d\n", 626 __func__, kind, (unsigned)card_addr, (unsigned)size)); 627 628 s = splbio(); 629 win = -1; 630 for (i = 0; i < SHPCMCIA_MEM_WINS; i++) { 631 if ((h->memalloc & (1 << i)) == 0) { 632 win = i; 633 h->memalloc |= (1 << i); 634 break; 635 } 636 } 637 splx(s); 638 if (win == -1) 639 return 1; 640 641 *windowp = win; 642 *offsetp = 0; 643 644 h->mem[win].addr = pmhp->addr; 645 h->mem[win].size = size; 646 h->mem[win].offset = (((long)card_addr) - ((long)pmhp->addr)); 647 h->mem[win].kind = kind; 648 649 switch (kind) { 650 case PCMCIA_MEM_ATTR: 651 DPRINTF(("%s:PCMCIA_MEM_ATTR\n",device_xname(sc->sc_dev))); 652 pmhp->memh = sc->sc_atth + card_addr; 653 break; 654 655 default: 656 pmhp->memh = sc->sc_memh + card_addr; 657 break; 658 } 659 660 return 0; 661 } 662 663 /*ARGSUSED*/ 664 static void 665 shpcmcia_chip_mem_unmap(pcmcia_chipset_handle_t pch, int window) 666 { 667 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 668 int s; 669 670 DPRINTF(("%s\n", __func__)); 671 672 s = splbio(); 673 h->memalloc &= ~(1 << window); 674 splx(s); 675 } 676 677 /* I/O space functions. */ 678 static int 679 shpcmcia_chip_io_alloc(pcmcia_chipset_handle_t pch, 680 bus_addr_t start, bus_size_t size, bus_size_t align, 681 struct pcmcia_io_handle *pihp) 682 { 683 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 684 struct shpcmcia_softc *sc = h->sc; 685 686 DPRINTF(("%s\n", __func__)); 687 688 memset(pihp, 0, sizeof(*pihp)); 689 pihp->iot = sc->sc_iot; 690 pihp->ioh = sc->sc_ioh; 691 pihp->addr = start; 692 pihp->size = size; 693 pihp->flags |= PCMCIA_IO_ALLOCATED; 694 695 return 0; 696 } 697 698 /*ARGSUSED*/ 699 static void 700 shpcmcia_chip_io_free(pcmcia_chipset_handle_t pch, 701 struct pcmcia_io_handle *pih) 702 { 703 704 DPRINTF(("%s\n", __func__)); 705 } 706 707 /*ARGSUSED*/ 708 static int 709 shpcmcia_chip_io_map(pcmcia_chipset_handle_t pch, int width, 710 bus_addr_t card_addr, bus_size_t size, struct pcmcia_io_handle *pihp, 711 int *windowp) 712 { 713 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 714 struct shpcmcia_softc *sc = h->sc; 715 bus_addr_t ioaddr = pihp->addr + card_addr; 716 int win; 717 int i; 718 int s; 719 720 DPRINTF(("%s\n", __func__)); 721 722 s = splbio(); 723 win = -1; 724 for (i = 0; i < SHPCMCIA_IO_WINS; i++) { 725 if ((h->ioalloc & (1 << i)) == 0) { 726 win = i; 727 h->ioalloc |= (1 << i); 728 break; 729 } 730 } 731 splx(s); 732 if (win == -1) 733 return 1; 734 735 *windowp = win; 736 737 /* XXX: IOS16 */ 738 739 aprint_normal_dev(sc->sc_dev, "port 0x%0lx", (u_long)ioaddr); 740 if (size > 1) 741 aprint_normal("-0x%lx", (u_long) ioaddr + (u_long) size - 1); 742 aprint_normal("\n"); 743 744 h->io[win].addr = ioaddr; 745 h->io[win].size = size; 746 h->io[win].width = width; 747 748 return 0; 749 } 750 751 /*ARGSUSED*/ 752 static void 753 shpcmcia_chip_io_unmap(pcmcia_chipset_handle_t pch, int window) 754 { 755 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 756 int s; 757 758 DPRINTF(("%s\n", __func__)); 759 760 s = splbio(); 761 h->ioalloc &= ~(1 << window); 762 splx(s); 763 } 764 765 /* Interrupt functions. */ 766 static void * 767 shpcmcia_chip_intr_establish(pcmcia_chipset_handle_t pch, 768 struct pcmcia_function *pf, int ipl, int (*ih_func)(void *), void *ih_arg) 769 { 770 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 771 struct shpcmcia_softc *sc = h->sc; 772 int s; 773 774 KASSERT(sc->sc_ih == NULL); 775 DPRINTF(("%s\n", __func__)); 776 777 s = splhigh(); 778 sc->sc_ih = extintr_establish(EXTINTR_INTR_CFIREQ, IST_LEVEL, ipl, 779 ih_func, ih_arg); 780 if (sc->sc_ih == NULL) { 781 aprint_error_dev(sc->sc_dev, 782 "couldn't establish card interrupt\n"); 783 } 784 splx(s); 785 786 return sc->sc_ih; 787 } 788 789 static void 790 shpcmcia_chip_intr_disestablish(pcmcia_chipset_handle_t pch, void *cookie) 791 { 792 struct shpcmcia_handle *h = (struct shpcmcia_handle *)pch; 793 struct shpcmcia_softc *sc = h->sc; 794 int s; 795 796 KASSERT(sc->sc_ih != NULL); 797 DPRINTF(("%s\n", __func__)); 798 799 s = splhigh(); 800 extintr_disestablish(sc->sc_ih); 801 sc->sc_ih = NULL; 802 splx(s); 803 } 804 805 /* Socket functions. */ 806 static void 807 shpcmcia_chip_socket_enable(pcmcia_chipset_handle_t pch) 808 { 809 uint16_t reg; 810 811 DPRINTF(("%s\n", __func__)); 812 813 /* power on the card */ 814 reg = _reg_read_2(SH4_PDTRA); 815 reg &= ~(1 << GPIO_PIN_CARD_PON); 816 _reg_write_2(SH4_PDTRA, reg); 817 818 /* wait for card ready */ 819 while (_reg_read_1(EXTINTR_STAT1) & MASK1_INT12) 820 continue; 821 822 /* enable bus buffer */ 823 reg = _reg_read_2(SH4_PDTRA); 824 reg &= ~(1 << GPIO_PIN_CARD_ENABLE); 825 _reg_write_2(SH4_PDTRA, reg); 826 827 /* reset the card */ 828 reg = _reg_read_2(SH4_PDTRA); 829 reg &= ~(1 << GPIO_PIN_CARD_RESET); 830 _reg_write_2(SH4_PDTRA, reg); 831 delay(100 * 1000); 832 } 833 834 /*ARGSUSED*/ 835 static void 836 shpcmcia_chip_socket_disable(pcmcia_chipset_handle_t pch) 837 { 838 uint16_t reg; 839 840 DPRINTF(("%s\n", __func__)); 841 842 /* reset the card */ 843 reg = _reg_read_2(SH4_PDTRA); 844 reg |= (1 << GPIO_PIN_CARD_RESET); 845 _reg_write_2(SH4_PDTRA, reg); 846 847 /* power off the card */ 848 reg = _reg_read_2(SH4_PDTRA); 849 reg |= (1 << GPIO_PIN_CARD_PON); 850 _reg_write_2(SH4_PDTRA, reg); 851 852 /* disable bus buffer */ 853 reg = _reg_read_2(SH4_PDTRA); 854 reg |= (1 << GPIO_PIN_CARD_ENABLE); 855 _reg_write_2(SH4_PDTRA, reg); 856 } 857 858 /*ARGSUSED*/ 859 static void 860 shpcmcia_chip_socket_settype(pcmcia_chipset_handle_t pch, int type) 861 { 862 863 DPRINTF(("%s\n", __func__)); 864 } 865