summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/neomagic.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pci/neomagic.c')
-rw-r--r--sys/dev/sound/pci/neomagic.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/sys/dev/sound/pci/neomagic.c b/sys/dev/sound/pci/neomagic.c
index 72ae8b8..7cfe838 100644
--- a/sys/dev/sound/pci/neomagic.c
+++ b/sys/dev/sound/pci/neomagic.c
@@ -137,7 +137,7 @@ static pcmchan_caps nm_caps = {4000, 48000, nm_fmt, 0};
static pcm_channel nm_chantemplate = {
nmchan_init,
- nmchan_setdir,
+ NULL, /* setdir */
nmchan_setformat,
nmchan_setspeed,
nmchan_setblocksize,
@@ -379,12 +379,6 @@ nmchan_free(void *data)
}
static int
-nmchan_setdir(void *data, int dir)
-{
- return 0;
-}
-
-static int
nmchan_setformat(void *data, u_int32_t format)
{
struct sc_chinfo *ch = data;
@@ -599,7 +593,7 @@ nm_pci_attach(device_t dev)
{
u_int32_t data;
struct sc_info *sc;
- struct ac97_info *codec;
+ struct ac97_info *codec = 0;
char status[SND_STATUSLEN];
if ((sc = malloc(sizeof(*sc), M_DEVBUF, M_NOWAIT)) == NULL) {
@@ -658,6 +652,7 @@ nm_pci_attach(device_t dev)
return 0;
bad:
+ if (codec) ac97_destroy(codec);
if (sc->buf) bus_release_resource(dev, SYS_RES_MEMORY, sc->bufid, sc->buf);
if (sc->reg) bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg);
if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
@@ -667,6 +662,26 @@ bad:
}
static int
+nm_pci_detach(device_t dev)
+{
+ int r;
+ struct sc_info *sc;
+
+ r = pcm_unregister(dev);
+ if (r)
+ return r;
+
+ sc = pcm_getdevinfo(dev);
+ bus_release_resource(dev, SYS_RES_MEMORY, sc->bufid, sc->buf);
+ bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg);
+ bus_teardown_intr(dev, sc->irq, sc->ih);
+ bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
+ free(sc, M_DEVBUF);
+
+ return 0;
+}
+
+static int
nm_pci_resume(device_t dev)
{
struct sc_info *sc;
OpenPOWER on IntegriCloud