pccard.c (58581) | pccard.c (59193) |
---|---|
1/* $NetBSD: pcmcia.c,v 1.13 1998/12/24 04:51:59 marc Exp $ */ | 1/* $NetBSD: pcmcia.c,v 1.13 1998/12/24 04:51:59 marc Exp $ */ |
2/* $FreeBSD: head/sys/dev/pccard/pccard.c 58581 2000-03-26 07:01:52Z imp $ */ | 2/* $FreeBSD: head/sys/dev/pccard/pccard.c 59193 2000-04-13 06:42:58Z imp $ */ |
3 4/* 5 * Copyright (c) 1997 Marc Horowitz. 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 --- 32 unchanged lines hidden (view full) --- 43#include <sys/rman.h> 44#include <machine/resource.h> 45 46#include <dev/pccard/pccardreg.h> 47#include <dev/pccard/pccardchip.h> 48#include <dev/pccard/pccardvar.h> 49 50#include "power_if.h" | 3 4/* 5 * Copyright (c) 1997 Marc Horowitz. 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 --- 32 unchanged lines hidden (view full) --- 43#include <sys/rman.h> 44#include <machine/resource.h> 45 46#include <dev/pccard/pccardreg.h> 47#include <dev/pccard/pccardchip.h> 48#include <dev/pccard/pccardvar.h> 49 50#include "power_if.h" |
51#include "card_if.h" |
|
51 52#define PCCARDDEBUG 53 54#ifdef PCCARDDEBUG 55int pccard_debug = 1; 56#define DPRINTF(arg) if (pccard_debug) printf arg 57#define DEVPRINTF(arg) if (pccard_debug) device_printf arg | 52 53#define PCCARDDEBUG 54 55#ifdef PCCARDDEBUG 56int pccard_debug = 1; 57#define DPRINTF(arg) if (pccard_debug) printf arg 58#define DEVPRINTF(arg) if (pccard_debug) device_printf arg |
58int pccardintr_debug = 0; 59/* this is done this way to avoid doing lots of conditionals 60 at interrupt level. */ 61#define PCCARD_CARD_INTR (pccardintr_debug?pccard_card_intrdebug:pccard_card_intr) | |
62#else 63#define DPRINTF(arg) 64#define DEVPRINTF(arg) | 59#else 60#define DPRINTF(arg) 61#define DEVPRINTF(arg) |
65#define PCCARD_CARD_INTR (pccard_card_intr) | |
66#endif 67 68#ifdef PCCARDVERBOSE 69int pccard_verbose = 1; 70#else 71int pccard_verbose = 0; 72#endif 73 74int pccard_print(void *, const char *); 75 | 62#endif 63 64#ifdef PCCARDVERBOSE 65int pccard_verbose = 1; 66#else 67int pccard_verbose = 0; 68#endif 69 70int pccard_print(void *, const char *); 71 |
76int pccard_card_intr(void *); 77#ifdef PCCARDDEBUG 78int pccard_card_intrdebug(void *); 79#endif 80 | |
81int 82pccard_ccr_read(pf, ccr) 83 struct pccard_function *pf; 84 int ccr; 85{ 86 return (bus_space_read_1(pf->pf_ccrt, pf->pf_ccrh, 87 pf->pf_ccr_offset + ccr)); 88} --- 6 unchanged lines hidden (view full) --- 95{ 96 97 if ((pf->ccr_mask) & (1 << (ccr / 2))) { 98 bus_space_write_1(pf->pf_ccrt, pf->pf_ccrh, 99 pf->pf_ccr_offset + ccr, val); 100 } 101} 102 | 72int 73pccard_ccr_read(pf, ccr) 74 struct pccard_function *pf; 75 int ccr; 76{ 77 return (bus_space_read_1(pf->pf_ccrt, pf->pf_ccrh, 78 pf->pf_ccr_offset + ccr)); 79} --- 6 unchanged lines hidden (view full) --- 86{ 87 88 if ((pf->ccr_mask) & (1 << (ccr / 2))) { 89 bus_space_write_1(pf->pf_ccrt, pf->pf_ccrh, 90 pf->pf_ccr_offset + ccr, val); 91 } 92} 93 |
103int 104pccard_card_attach(device_t dev) | 94static int 95pccard_attach_card(device_t dev) |
105{ 106 struct pccard_softc *sc = (struct pccard_softc *) 107 device_get_softc(dev); 108 struct pccard_function *pf; 109 int attached; 110 111 DEVPRINTF((dev, "pccard_card_attach\n")); 112 /* --- 28 unchanged lines hidden (view full) --- 141 142 attached = 0; 143 144 DEVPRINTF((dev, "functions scanning\n")); 145 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 146 if (STAILQ_EMPTY(&pf->cfe_head)) 147 continue; 148 | 96{ 97 struct pccard_softc *sc = (struct pccard_softc *) 98 device_get_softc(dev); 99 struct pccard_function *pf; 100 int attached; 101 102 DEVPRINTF((dev, "pccard_card_attach\n")); 103 /* --- 28 unchanged lines hidden (view full) --- 132 133 attached = 0; 134 135 DEVPRINTF((dev, "functions scanning\n")); 136 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 137 if (STAILQ_EMPTY(&pf->cfe_head)) 138 continue; 139 |
149#ifdef DIAGNOSTIC 150 if (pf->child != NULL) { 151 device_printf(sc->dev, 152 "%s still attached to function %d!\n", 153 device_get_name(pf->child), pf->number); 154 panic("pccard_card_attach"); 155 } 156#endif | |
157 pf->sc = sc; | 140 pf->sc = sc; |
158 pf->child = NULL; | |
159 pf->cfe = NULL; 160 pf->ih_fct = NULL; 161 pf->ih_arg = NULL; 162 } 163 164 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 165 if (STAILQ_EMPTY(&pf->cfe_head)) 166 continue; --- 12 unchanged lines hidden (view full) --- 179 pccard_ccr_read(pf, 0x10), pccard_ccr_read(pf, 0x12))); 180 } 181#endif 182 } 183 184 return (attached ? 0 : 1); 185} 186 | 141 pf->cfe = NULL; 142 pf->ih_fct = NULL; 143 pf->ih_arg = NULL; 144 } 145 146 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 147 if (STAILQ_EMPTY(&pf->cfe_head)) 148 continue; --- 12 unchanged lines hidden (view full) --- 161 pccard_ccr_read(pf, 0x10), pccard_ccr_read(pf, 0x12))); 162 } 163#endif 164 } 165 166 return (attached ? 0 : 1); 167} 168 |
187void 188pccard_card_detach(device_t dev, int flags) | 169static int 170pccard_detach_card(device_t dev, int flags) |
189{ 190 struct pccard_softc *sc = (struct pccard_softc *) 191 device_get_softc(dev); 192 struct pccard_function *pf; 193#if XXX 194 int error; 195#endif 196 197 /* 198 * We are running on either the PCCARD socket's event thread 199 * or in user context detaching a device by user request. 200 */ 201 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 202 if (STAILQ_FIRST(&pf->cfe_head) == NULL) 203 continue; | 171{ 172 struct pccard_softc *sc = (struct pccard_softc *) 173 device_get_softc(dev); 174 struct pccard_function *pf; 175#if XXX 176 int error; 177#endif 178 179 /* 180 * We are running on either the PCCARD socket's event thread 181 * or in user context detaching a device by user request. 182 */ 183 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 184 if (STAILQ_FIRST(&pf->cfe_head) == NULL) 185 continue; |
204 if (pf->child == NULL) 205 continue; | 186#if XXX |
206 DEVPRINTF((sc->dev, "detaching %s (function %d)\n", 207 device_get_name(pf->child), pf->number)); | 187 DEVPRINTF((sc->dev, "detaching %s (function %d)\n", 188 device_get_name(pf->child), pf->number)); |
208#if XXX | |
209 if ((error = config_detach(pf->child, flags)) != 0) { 210 device_printf(sc->dev, 211 "error %d detaching %s (function %d)\n", 212 error, device_get_name(pf->child), pf->number); 213 } else 214 pf->child = NULL; 215#endif 216 } | 189 if ((error = config_detach(pf->child, flags)) != 0) { 190 device_printf(sc->dev, 191 "error %d detaching %s (function %d)\n", 192 error, device_get_name(pf->child), pf->number); 193 } else 194 pf->child = NULL; 195#endif 196 } |
197 return 0; |
|
217} 218 | 198} 199 |
219void 220pccard_card_deactivate(device_t dev) | 200static int 201pccard_card_gettype(device_t dev, int *type) |
221{ | 202{ |
222 struct pccard_softc *sc = (struct pccard_softc *) 223 device_get_softc(dev); 224 struct pccard_function *pf; 225 226 /* 227 * We're in the chip's card removal interrupt handler. 228 * Deactivate the child driver. The PCCARD socket's 229 * event thread will run later to finish the detach. 230 */ 231 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 232 if (STAILQ_FIRST(&pf->cfe_head) == NULL) 233 continue; 234 if (pf->child == NULL) 235 continue; 236 DEVPRINTF((sc->dev, "deactivating %s (function %d)\n", 237 device_get_name(pf->child), pf->number)); 238#if XXX 239 config_deactivate(pf->child); 240#endif 241 } 242} 243 244int 245pccard_card_gettype(device_t dev) 246{ | |
247 struct pccard_softc *sc = (struct pccard_softc *) 248 device_get_softc(dev); 249 struct pccard_function *pf; 250 251 /* 252 * set the iftype to memory if this card has no functions (not yet 253 * probed), or only one function, and that is not initialized yet or 254 * that is memory. 255 */ 256 pf = STAILQ_FIRST(&sc->card.pf_head); 257 if (pf == NULL || 258 (STAILQ_NEXT(pf, pf_list) == NULL && 259 (pf->cfe == NULL || pf->cfe->iftype == PCCARD_IFTYPE_MEMORY))) | 203 struct pccard_softc *sc = (struct pccard_softc *) 204 device_get_softc(dev); 205 struct pccard_function *pf; 206 207 /* 208 * set the iftype to memory if this card has no functions (not yet 209 * probed), or only one function, and that is not initialized yet or 210 * that is memory. 211 */ 212 pf = STAILQ_FIRST(&sc->card.pf_head); 213 if (pf == NULL || 214 (STAILQ_NEXT(pf, pf_list) == NULL && 215 (pf->cfe == NULL || pf->cfe->iftype == PCCARD_IFTYPE_MEMORY))) |
260 return (PCCARD_IFTYPE_MEMORY); | 216 *type = PCCARD_IFTYPE_MEMORY; |
261 else | 217 else |
262 return (PCCARD_IFTYPE_IO); | 218 *type = PCCARD_IFTYPE_IO; 219 return 0; |
263} 264 265/* 266 * Initialize a PCCARD function. May be called as long as the function is 267 * disabled. 268 */ 269void 270pccard_function_init(struct pccard_function *pf, --- 255 unchanged lines hidden (view full) --- 526{ 527 528 pccard_chip_io_unmap(pf->sc->pct, pf->sc->pch, window); 529 530 /* XXX Anything for multi-function cards? */ 531} 532#endif 533 | 220} 221 222/* 223 * Initialize a PCCARD function. May be called as long as the function is 224 * disabled. 225 */ 226void 227pccard_function_init(struct pccard_function *pf, --- 255 unchanged lines hidden (view full) --- 483{ 484 485 pccard_chip_io_unmap(pf->sc->pct, pf->sc->pch, window); 486 487 /* XXX Anything for multi-function cards? */ 488} 489#endif 490 |
534/* I don't think FreeBSD needs the next two functions at all */ 535/* XXX */ 536int 537pccard_card_intr(void *arg) 538{ 539 struct pccard_softc *sc = arg; 540 struct pccard_function *pf; 541 int reg, ret, ret2; 542 543 ret = 0; 544 545 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 546 if (pf->ih_fct != NULL && 547 (pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) { 548 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS); 549 if (reg & PCCARD_CCR_STATUS_INTR) { 550 ret2 = (*pf->ih_fct)(pf->ih_arg); 551 if (ret2 != 0 && ret == 0) 552 ret = ret2; 553 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS); 554 pccard_ccr_write(pf, PCCARD_CCR_STATUS, 555 reg & ~PCCARD_CCR_STATUS_INTR); 556 } 557 } 558 } 559 560 return (ret); 561} 562 563#ifdef PCCARDDEBUG 564int 565pccard_card_intrdebug(arg) 566 void *arg; 567{ 568 struct pccard_softc *sc = arg; 569 struct pccard_function *pf; 570 int reg, ret, ret2; 571 572 ret = 0; 573 574 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { 575 device_printf(sc->dev, 576 "intr flags=%x fct=%d cor=%02x csr=%02x pin=%02x", 577 pf->pf_flags, pf->number, 578 pccard_ccr_read(pf, PCCARD_CCR_OPTION), 579 pccard_ccr_read(pf, PCCARD_CCR_STATUS), 580 pccard_ccr_read(pf, PCCARD_CCR_PIN)); 581 if (pf->ih_fct != NULL && 582 (pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) { 583 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS); 584 if (reg & PCCARD_CCR_STATUS_INTR) { 585 ret2 = (*pf->ih_fct)(pf->ih_arg); 586 if (ret2 != 0 && ret == 0) 587 ret = ret2; 588 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS); 589 printf("; csr %02x->%02x", 590 reg, reg & ~PCCARD_CCR_STATUS_INTR); 591 pccard_ccr_write(pf, PCCARD_CCR_STATUS, 592 reg & ~PCCARD_CCR_STATUS_INTR); 593 } 594 } 595 printf("\n"); 596 } 597 598 return (ret); 599} 600#endif 601 | |
602#define PCCARD_NPORT 2 603#define PCCARD_NMEM 5 604#define PCCARD_NIRQ 1 605#define PCCARD_NDRQ 0 606 607static int 608pccard_add_children(device_t dev, int busno) 609{ | 491#define PCCARD_NPORT 2 492#define PCCARD_NMEM 5 493#define PCCARD_NIRQ 1 494#define PCCARD_NDRQ 0 495 496static int 497pccard_add_children(device_t dev, int busno) 498{ |
499 /* Call parent to scan for any current children */ |
|
610 return 0; 611} 612 613static int 614pccard_probe(device_t dev) 615{ 616 device_set_desc(dev, "PC Card bus -- newconfig version"); 617 return pccard_add_children(dev, device_get_unit(dev)); 618} 619 | 500 return 0; 501} 502 503static int 504pccard_probe(device_t dev) 505{ 506 device_set_desc(dev, "PC Card bus -- newconfig version"); 507 return pccard_add_children(dev, device_get_unit(dev)); 508} 509 |
510static int 511pccard_attach(device_t dev) 512{ 513 struct pccard_softc *sc; 514 515 sc = (struct pccard_softc *) device_get_softc(dev); 516 sc->dev = dev; 517 518 return bus_generic_attach(dev); 519} 520 |
|
620static void 621pccard_print_resources(struct resource_list *rl, const char *name, int type, 622 int count, const char *format) 623{ 624 struct resource_list_entry *rle; 625 int printed; 626 int i; 627 --- 94 unchanged lines hidden (view full) --- 722static void 723pccard_delete_resource(device_t dev, device_t child, int type, int rid) 724{ 725 struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child); 726 struct resource_list *rl = &devi->resources; 727 resource_list_delete(rl, type, rid); 728} 729 | 521static void 522pccard_print_resources(struct resource_list *rl, const char *name, int type, 523 int count, const char *format) 524{ 525 struct resource_list_entry *rle; 526 int printed; 527 int i; 528 --- 94 unchanged lines hidden (view full) --- 623static void 624pccard_delete_resource(device_t dev, device_t child, int type, int rid) 625{ 626 struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child); 627 struct resource_list *rl = &devi->resources; 628 resource_list_delete(rl, type, rid); 629} 630 |
631static int 632pccard_set_res_flags(device_t dev, device_t child, int type, int rid, 633 u_int32_t flags) 634{ 635 return CARD_SET_RES_FLAGS(device_get_parent(dev), child, type, 636 rid, flags); 637} 638 639static int 640pccard_set_memory_offset(device_t dev, device_t child, int rid, 641 u_int32_t offset) 642{ 643 return CARD_SET_MEMORY_OFFSET(device_get_parent(dev), child, rid, 644 offset); 645} 646 |
|
730static device_method_t pccard_methods[] = { 731 /* Device interface */ 732 DEVMETHOD(device_probe, pccard_probe), | 647static device_method_t pccard_methods[] = { 648 /* Device interface */ 649 DEVMETHOD(device_probe, pccard_probe), |
733 DEVMETHOD(device_attach, bus_generic_attach), | 650 DEVMETHOD(device_attach, pccard_attach), |
734 DEVMETHOD(device_shutdown, bus_generic_shutdown), 735 DEVMETHOD(device_suspend, bus_generic_suspend), 736 DEVMETHOD(device_resume, bus_generic_resume), 737 738 /* Bus interface */ 739 DEVMETHOD(bus_print_child, pccard_print_child), 740 DEVMETHOD(bus_driver_added, bus_generic_driver_added), 741 DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource), 742 DEVMETHOD(bus_release_resource, bus_generic_release_resource), 743 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), 744 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), 745 DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), 746 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), 747 DEVMETHOD(bus_set_resource, pccard_set_resource), 748 DEVMETHOD(bus_get_resource, pccard_get_resource), 749 DEVMETHOD(bus_delete_resource, pccard_delete_resource), 750 | 651 DEVMETHOD(device_shutdown, bus_generic_shutdown), 652 DEVMETHOD(device_suspend, bus_generic_suspend), 653 DEVMETHOD(device_resume, bus_generic_resume), 654 655 /* Bus interface */ 656 DEVMETHOD(bus_print_child, pccard_print_child), 657 DEVMETHOD(bus_driver_added, bus_generic_driver_added), 658 DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource), 659 DEVMETHOD(bus_release_resource, bus_generic_release_resource), 660 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), 661 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), 662 DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), 663 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), 664 DEVMETHOD(bus_set_resource, pccard_set_resource), 665 DEVMETHOD(bus_get_resource, pccard_get_resource), 666 DEVMETHOD(bus_delete_resource, pccard_delete_resource), 667 |
668 /* Card Interface */ 669 DEVMETHOD(card_set_res_flags, pccard_set_res_flags), 670 DEVMETHOD(card_set_memory_offset, pccard_set_memory_offset), 671 DEVMETHOD(card_get_type, pccard_card_gettype), 672 DEVMETHOD(card_attach_card, pccard_attach_card), 673 DEVMETHOD(card_detach_card, pccard_detach_card), 674 |
|
751 { 0, 0 } 752}; 753 754static driver_t pccard_driver = { 755 "pccard", 756 pccard_methods, 757 1, /* no softc */ 758}; 759 760devclass_t pccard_devclass; 761 762DRIVER_MODULE(pccard, pcic, pccard_driver, pccard_devclass, 0, 0); 763DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0); 764DRIVER_MODULE(pccard, pccbb, pccard_driver, pccard_devclass, 0, 0); 765DRIVER_MODULE(pccard, tcic, pccard_driver, pccard_devclass, 0, 0); | 675 { 0, 0 } 676}; 677 678static driver_t pccard_driver = { 679 "pccard", 680 pccard_methods, 681 1, /* no softc */ 682}; 683 684devclass_t pccard_devclass; 685 686DRIVER_MODULE(pccard, pcic, pccard_driver, pccard_devclass, 0, 0); 687DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0); 688DRIVER_MODULE(pccard, pccbb, pccard_driver, pccard_devclass, 0, 0); 689DRIVER_MODULE(pccard, tcic, pccard_driver, pccard_devclass, 0, 0); |