diff options
author | cg <cg@FreeBSD.org> | 2000-09-09 19:21:04 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2000-09-09 19:21:04 +0000 |
commit | a081b436a34dc6b7c3f1418e1429edbd7a31c3ff (patch) | |
tree | 916a90fe682463a47c2285b9f4bc874b6720fce7 /sys/dev/sound/isa/ad1816.c | |
parent | f80149566df17edb15598b2d33d559f831c5edb5 (diff) | |
download | FreeBSD-src-a081b436a34dc6b7c3f1418e1429edbd7a31c3ff.zip FreeBSD-src-a081b436a34dc6b7c3f1418e1429edbd7a31c3ff.tar.gz |
detach support
remove un-needed setdir functions
add bus_teardown_intr calls where necessary
destroy our dma tags where necessary
destroy ac97 before releasing resources
Diffstat (limited to 'sys/dev/sound/isa/ad1816.c')
-rw-r--r-- | sys/dev/sound/isa/ad1816.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/sys/dev/sound/isa/ad1816.c b/sys/dev/sound/isa/ad1816.c index 3cebbe3..d25931e 100644 --- a/sys/dev/sound/isa/ad1816.c +++ b/sys/dev/sound/isa/ad1816.c @@ -49,6 +49,7 @@ struct ad1816_info { int drq1_rid; struct resource *drq2; /* rec */ int drq2_rid; + void *ih; bus_dma_tag_t parent_dmat; struct ad1816_chinfo pch, rch; @@ -480,6 +481,8 @@ static void ad1816_release_resources(struct ad1816_info *ad1816, device_t dev) { if (ad1816->irq) { + if (ad1816->ih) + bus_teardown_intr(dev, ad1816->irq, ad1816->ih); bus_release_resource(dev, SYS_RES_IRQ, ad1816->irq_rid, ad1816->irq); ad1816->irq = 0; @@ -499,7 +502,11 @@ ad1816_release_resources(struct ad1816_info *ad1816, device_t dev) ad1816->io_base); ad1816->io_base = 0; } - free(ad1816, M_DEVBUF); + if (ad1816->parent_dmat) { + bus_dma_tag_destroy(ad1816->parent_dmat); + ad1816->parent_dmat = 0; + } + free(ad1816, M_DEVBUF); } static int @@ -575,7 +582,6 @@ static int ad1816_attach(device_t dev) { struct ad1816_info *ad1816; - void *ih; char status[SND_STATUSLEN]; ad1816 = (struct ad1816_info *)malloc(sizeof *ad1816, M_DEVBUF, M_NOWAIT); @@ -590,7 +596,7 @@ ad1816_attach(device_t dev) if (!ad1816_alloc_resources(ad1816, dev)) goto no; ad1816_init(ad1816, dev); mixer_init(dev, &ad1816_mixer, ad1816); - bus_setup_intr(dev, ad1816->irq, INTR_TYPE_TTY, ad1816_intr, ad1816, &ih); + bus_setup_intr(dev, ad1816->irq, INTR_TYPE_TTY, ad1816_intr, ad1816, &ad1816->ih); if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR_24BIT, /*highaddr*/BUS_SPACE_MAXADDR, @@ -621,10 +627,26 @@ no: } +static int +ad1816_detach(device_t dev) +{ + int r; + struct ad1816_info *ad1816; + + r = pcm_unregister(dev); + if (r) + return r; + + ad1816 = pcm_getdevinfo(dev); + ad1816_release_resources(ad1816, dev); + return 0; +} + static device_method_t ad1816_methods[] = { /* Device interface */ DEVMETHOD(device_probe, ad1816_probe), DEVMETHOD(device_attach, ad1816_attach), + DEVMETHOD(device_detach, ad1816_detach), { 0, 0 } }; |