summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/t4dwave.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pci/t4dwave.c')
-rw-r--r--sys/dev/sound/pci/t4dwave.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c
index f65bdb4..f411338 100644
--- a/sys/dev/sound/pci/t4dwave.c
+++ b/sys/dev/sound/pci/t4dwave.c
@@ -695,17 +695,40 @@ tr_pci_attach(device_t dev)
return 0;
bad:
+ if (codec) ac97_destroy(codec);
if (tr->reg) bus_release_resource(dev, tr->regtype, tr->regid, tr->reg);
if (tr->ih) bus_teardown_intr(dev, tr->irq, tr->ih);
if (tr->irq) bus_release_resource(dev, SYS_RES_IRQ, tr->irqid, tr->irq);
+ if (tr->parent_dmat) bus_dma_tag_destroy(tr->parent_dmat);
free(tr, M_DEVBUF);
return ENXIO;
}
+static int
+tr_pci_detach(device_t dev)
+{
+ int r;
+ struct tr_info *tr;
+
+ r = pcm_unregister(dev);
+ if (r)
+ return r;
+
+ tr = pcm_getdevinfo(dev);
+ bus_release_resource(dev, tr->regtype, tr->regid, tr->reg);
+ bus_teardown_intr(dev, tr->irq, tr->ih);
+ bus_release_resource(dev, SYS_RES_IRQ, tr->irqid, tr->irq);
+ bus_dma_tag_destroy(tr->parent_dmat);
+ free(tr, M_DEVBUF);
+
+ return 0;
+}
+
static device_method_t tr_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, tr_pci_probe),
DEVMETHOD(device_attach, tr_pci_attach),
+ DEVMETHOD(device_detach, tr_pci_detach),
{ 0, 0 }
};
OpenPOWER on IntegriCloud