summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/fm801.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pci/fm801.c')
-rw-r--r--sys/dev/sound/pci/fm801.c75
1 files changed, 27 insertions, 48 deletions
diff --git a/sys/dev/sound/pci/fm801.c b/sys/dev/sound/pci/fm801.c
index 8188a1d..2173c0a 100644
--- a/sys/dev/sound/pci/fm801.c
+++ b/sys/dev/sound/pci/fm801.c
@@ -104,7 +104,6 @@
/* channel interface */
static void *fm801ch_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir);
-static int fm801ch_setdir(void *data, int dir);
static int fm801ch_setformat(void *data, u_int32_t format);
static int fm801ch_setspeed(void *data, u_int32_t speed);
static int fm801ch_setblocksize(void *data, u_int32_t blocksize);
@@ -119,9 +118,7 @@ static u_int32_t fmts[] = {
AFMT_U8,
AFMT_STEREO | AFMT_U8,
AFMT_S16_LE,
- AFMT_STEREO | AFMT_S16_LE, /*
- AFMT_STEREO | (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE),
- (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE), */
+ AFMT_STEREO | AFMT_S16_LE,
0
};
@@ -132,7 +129,7 @@ static pcmchan_caps fm801ch_caps = {
static pcm_channel fm801_chantemplate = {
fm801ch_init,
- fm801ch_setdir,
+ NULL, /* setdir */
fm801ch_setformat,
fm801ch_setspeed,
fm801ch_setblocksize,
@@ -192,23 +189,6 @@ struct fm801_info {
struct fm801_chinfo pch, rch;
};
-
-/* several procedures to release the thing properly if compiled as module */
-static struct fm801_info *save801;
-struct fm801_info *fm801_get __P((void ));
-
-static void
-fm801_save(struct fm801_info *fm801)
-{
- save801 = fm801;
-}
-
-struct fm801_info *
-fm801_get(void )
-{
- return save801;
-}
-
/* Bus Read / Write routines */
static u_int32_t
fm801_rd(struct fm801_info *fm801, int regno, int size)
@@ -395,7 +375,7 @@ static int
fm801_pci_attach(device_t dev)
{
u_int32_t data;
- struct ac97_info *codec;
+ struct ac97_info *codec = 0;
struct fm801_info *fm801;
int i;
int mapped = 0;
@@ -475,19 +455,40 @@ fm801_pci_attach(device_t dev)
pcm_addchan(dev, PCMDIR_REC, &fm801_chantemplate, fm801);
pcm_setstatus(dev, status);
- fm801_save(fm801);
return 0;
oops:
- printf("Forte Media FM801 initialization failed\n");
+ if (codec) ac97_destroy(codec);
if (fm801->reg) bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
if (fm801->ih) bus_teardown_intr(dev, fm801->irq, fm801->ih);
if (fm801->irq) bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
+ if (fm801->parent_dmat) bus_dma_tag_destroy(fm801->parent_dmat);
free(fm801, M_DEVBUF);
return ENXIO;
}
static int
+fm801_pci_detach(device_t dev)
+{
+ int r;
+ struct fm801_info *fm801;
+
+ DPRINT("Forte Media FM801 detach\n");
+
+ r = pcm_unregister(dev);
+ if (r)
+ return r;
+
+ fm801 = pcm_getdevinfo(dev);
+ bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
+ bus_teardown_intr(dev, fm801->irq, fm801->ih);
+ bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
+ bus_dma_tag_destroy(fm801->parent_dmat);
+ free(fm801, M_DEVBUF);
+ return 0;
+}
+
+static int
fm801_pci_probe( device_t dev )
{
int id;
@@ -524,14 +525,6 @@ fm801ch_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
}
static int
-fm801ch_setdir(void *data, int dir)
-{
- struct fm801_chinfo *ch = data;
- ch->dir = dir;
- return 0;
-}
-
-static int
fm801ch_setformat(void *data, u_int32_t format)
{
struct fm801_chinfo *ch = data;
@@ -716,20 +709,6 @@ fm801ch_getcaps(void *data)
return &fm801ch_caps;
}
-static int
-fm801_pci_detach(device_t dev)
-{
- struct fm801_info *fm801 = fm801_get();
-
- DPRINT("Forte Media FM801 detach\n");
-
- if (fm801->reg) bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
- if (fm801->ih) bus_teardown_intr(dev, fm801->irq, fm801->ih);
- if (fm801->irq) bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
- free(fm801, M_DEVBUF);
- return 0;
-}
-
static device_method_t fm801_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, fm801_pci_probe),
@@ -746,4 +725,4 @@ static driver_t fm801_driver = {
static devclass_t pcm_devclass;
-DRIVER_MODULE(fm801, pci, fm801_driver, pcm_devclass,0, 0);
+DRIVER_MODULE(fm801, pci, fm801_driver, pcm_devclass, 0, 0);
OpenPOWER on IntegriCloud