diff options
-rw-r--r-- | sys/dev/pcmcia/pcmcia.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/sys/dev/pcmcia/pcmcia.c b/sys/dev/pcmcia/pcmcia.c index d44d22cac11..24d2aefff23 100644 --- a/sys/dev/pcmcia/pcmcia.c +++ b/sys/dev/pcmcia/pcmcia.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pcmcia.c,v 1.24 1999/08/16 21:46:11 fgsch Exp $ */ +/* $OpenBSD: pcmcia.c,v 1.25 2000/02/05 22:10:50 deraadt Exp $ */ /* $NetBSD: pcmcia.c,v 1.9 1998/08/13 02:10:55 eeh Exp $ */ /* @@ -57,6 +57,7 @@ int pcmcia_submatch __P((struct device *, void *, void *)); void pcmcia_attach __P((struct device *, struct device *, void *)); int pcmcia_print __P((void *, const char *)); void pcmcia_card_detach_notify __P((struct device *, void *)); +void pcmcia_power __P((int why, void *arg)); static inline void pcmcia_socket_enable __P((pcmcia_chipset_tag_t, pcmcia_chipset_handle_t *)); @@ -121,6 +122,32 @@ pcmcia_attach(parent, self, aux) sc->iosize = paa->iosize; sc->ih = NULL; + powerhook_establish(pcmcia_power, sc); +} + +void +pcmcia_power(why, arg) + int why; + void *arg; +{ + struct pcmcia_softc *sc = (struct pcmcia_softc *) arg; + struct pcmcia_function *pf; + struct device *d; + int act = DVACT_ACTIVATE; + + if (why != PWR_RESUME) + act = DVACT_DEACTIVATE; + + for (pf = SIMPLEQ_FIRST(&sc->card.pf_head); pf != NULL; + pf = SIMPLEQ_NEXT(pf, pf_list)) { + if (SIMPLEQ_FIRST(&pf->cfe_head) == NULL) + continue; + d = pf->child; + if (d == NULL) + continue; + if (d->dv_cfdata->cf_attach->ca_activate) + (*d->dv_cfdata->cf_attach->ca_activate)(d, act); + } } int |