From d0f117b7d255ce0769876ab92a495fd962e8cf48 Mon Sep 17 00:00:00 2001 From: dyoung Date: Sat, 23 Feb 2008 01:54:44 +0000 Subject: [PATCH] Detach self and children. Use device_t and accessors. Use PMF_FN_*. --- sys/dev/pci/auvia.c | 71 +++++++++++++++++++++++++++++++----------- sys/dev/pci/auviavar.h | 3 +- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/sys/dev/pci/auvia.c b/sys/dev/pci/auvia.c index 1e8139b3828e..3abf3ccb0ef9 100644 --- a/sys/dev/pci/auvia.c +++ b/sys/dev/pci/auvia.c @@ -1,4 +1,4 @@ -/* $NetBSD: auvia.c,v 1.62 2008/01/14 06:32:10 tsutsui Exp $ */ +/* $NetBSD: auvia.c,v 1.63 2008/02/23 01:54:44 dyoung Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -47,7 +47,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: auvia.c,v 1.62 2008/01/14 06:32:10 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: auvia.c,v 1.63 2008/02/23 01:54:44 dyoung Exp $"); #include #include @@ -86,8 +86,10 @@ struct auvia_dma_op { #define AUVIA_DMAOP_COUNT(x) ((x)&0x00FFFFFF) }; -static int auvia_match(struct device *, struct cfdata *, void *); -static void auvia_attach(struct device *, struct device *, void *); +static int auvia_match(device_t, struct cfdata *, void *); +static void auvia_attach(device_t, device_t, void *); +static int auvia_detach(device_t, int); +static void auvia_childdet(device_t, device_t); static int auvia_open(void *, int); static void auvia_close(void *); static int auvia_query_encoding(void *, struct audio_encoding *); @@ -118,7 +120,7 @@ static int auvia_trigger_output(void *, void *, void *, int, static int auvia_trigger_input(void *, void *, void *, int, void (*)(void *), void *, const audio_params_t *); -static bool auvia_resume(device_t); +static bool auvia_resume(device_t PMF_FN_PROTO); static int auvia_intr(void *); static int auvia_attach_codec(void *, struct ac97_codec_if *); @@ -129,8 +131,8 @@ static int auvia_waitready_codec(struct auvia_softc *); static int auvia_waitvalid_codec(struct auvia_softc *); static void auvia_spdif_event(void *, bool); -CFATTACH_DECL(auvia, sizeof (struct auvia_softc), - auvia_match, auvia_attach, NULL, NULL); +CFATTACH_DECL2(auvia, sizeof (struct auvia_softc), + auvia_match, auvia_attach, auvia_detach, NULL, NULL, auvia_childdet); /* VIA VT823xx revision number */ #define VIA_REV_8233PRE 0x10 @@ -270,8 +272,7 @@ static const struct audio_format auvia_spdif_formats[AUVIA_SPDIF_NFORMATS] = { static int -auvia_match(struct device *parent, struct cfdata *match, - void *aux) +auvia_match(device_t parent, struct cfdata *match, void *aux) { struct pci_attach_args *pa; @@ -290,7 +291,40 @@ auvia_match(struct device *parent, struct cfdata *match, } static void -auvia_attach(struct device *parent, struct device *self, void *aux) +auvia_childdet(device_t self, device_t child) +{ + /* we hold no child references, so do nothing */ +} + +static int +auvia_detach(device_t self, int flags) +{ + int rc; + struct auvia_softc *sc = device_private(self); + + if ((rc = config_detach_children(self, flags)) != 0) + return rc; + + pmf_device_deregister(self); + + auconv_delete_encodings(sc->sc_encodings); + auconv_delete_encodings(sc->sc_spdif_encodings); + + if (sc->codec_if != NULL) + sc->codec_if->vtbl->detach(sc->codec_if); + + /* XXX restore compatibility? */ + + if (sc->sc_ih != NULL) + pci_intr_disestablish(sc->sc_pc, sc->sc_ih); + + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); + + return 0; +} + +static void +auvia_attach(device_t parent, device_t self, void *aux) { struct pci_attach_args *pa; struct auvia_softc *sc; @@ -298,13 +332,12 @@ auvia_attach(struct device *parent, struct device *self, void *aux) pci_chipset_tag_t pc; pcitag_t pt; pci_intr_handle_t ih; - bus_size_t iosize; pcireg_t pr; int r; const char *revnum; /* VT823xx revision number */ pa = aux; - sc = (struct auvia_softc *)self; + sc = device_private(self); intrstr = NULL; pc = pa->pa_pc; pt = pa->pa_tag; @@ -320,7 +353,7 @@ auvia_attach(struct device *parent, struct device *self, void *aux) } if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_IO, 0, &sc->sc_iot, - &sc->sc_ioh, NULL, &iosize)) { + &sc->sc_ioh, NULL, &sc->sc_iosize)) { aprint_error(": can't map i/o space\n"); return; } @@ -375,7 +408,7 @@ auvia_attach(struct device *parent, struct device *self, void *aux) if (pci_intr_map(pa, &ih)) { aprint_error(": couldn't map interrupt\n"); - bus_space_unmap(sc->sc_iot, sc->sc_ioh, iosize); + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); return; } intrstr = pci_intr_string(pc, ih); @@ -387,7 +420,7 @@ auvia_attach(struct device *parent, struct device *self, void *aux) if (intrstr != NULL) aprint_normal(" at %s", intrstr); aprint_normal("\n"); - bus_space_unmap(sc->sc_iot, sc->sc_ioh, iosize); + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); return; } @@ -417,7 +450,7 @@ auvia_attach(struct device *parent, struct device *self, void *aux) aprint_error("%s: can't attach codec (error 0x%X)\n", sc->sc_dev.dv_xname, r); pci_intr_disestablish(pc, sc->sc_ih); - bus_space_unmap(sc->sc_iot, sc->sc_ioh, iosize); + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); return; } @@ -442,14 +475,14 @@ auvia_attach(struct device *parent, struct device *self, void *aux) &sc->sc_encodings)) { sc->codec_if->vtbl->detach(sc->codec_if); pci_intr_disestablish(pc, sc->sc_ih); - bus_space_unmap(sc->sc_iot, sc->sc_ioh, iosize); + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); return; } if (0 != auconv_create_encodings(auvia_spdif_formats, AUVIA_SPDIF_NFORMATS, &sc->sc_spdif_encodings)) { sc->codec_if->vtbl->detach(sc->codec_if); pci_intr_disestablish(pc, sc->sc_ih); - bus_space_unmap(sc->sc_iot, sc->sc_ioh, iosize); + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize); return; } @@ -1112,7 +1145,7 @@ auvia_intr(void *arg) } static bool -auvia_resume(device_t dv) +auvia_resume(device_t dv PMF_FN_ARGS) { struct auvia_softc *sc = device_private(dv); diff --git a/sys/dev/pci/auviavar.h b/sys/dev/pci/auviavar.h index cb583372d66d..e1dbd4ff8f9e 100644 --- a/sys/dev/pci/auviavar.h +++ b/sys/dev/pci/auviavar.h @@ -1,4 +1,4 @@ -/* $NetBSD: auviavar.h,v 1.12 2007/12/09 20:28:06 jmcneill Exp $ */ +/* $NetBSD: auviavar.h,v 1.13 2008/02/23 01:54:44 dyoung Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -65,6 +65,7 @@ struct auvia_softc { bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; + bus_size_t sc_iosize; bus_dma_tag_t sc_dmat; struct ac97_host_if host_if;