summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa/sb8.c
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2001-09-29 07:57:07 +0000
committercg <cg@FreeBSD.org>2001-09-29 07:57:07 +0000
commit3113c29f9549f5a7c16cc00242d500baddb6c12a (patch)
tree6559337f7a3f52a77b76a5b766d52f978eb671da /sys/dev/sound/isa/sb8.c
parent5d69c42a56c5adbe4c103a3d603b419a8b6c00b4 (diff)
downloadFreeBSD-src-3113c29f9549f5a7c16cc00242d500baddb6c12a.zip
FreeBSD-src-3113c29f9549f5a7c16cc00242d500baddb6c12a.tar.gz
allow the hardware buffer size to be controlled with hints
release isa dma channels on unload (ad1816, ess, sb8)
Diffstat (limited to 'sys/dev/sound/isa/sb8.c')
-rw-r--r--sys/dev/sound/isa/sb8.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c
index b02e5e4..41c64ce 100644
--- a/sys/dev/sound/isa/sb8.c
+++ b/sys/dev/sound/isa/sb8.c
@@ -38,7 +38,7 @@
SND_DECLARE_FILE("$FreeBSD$");
-#define SB_BUFFSIZE 4096
+#define SB_DEFAULT_BUFSZ 4096
static u_int32_t sb_fmt[] = {
AFMT_U8,
@@ -75,6 +75,7 @@ struct sb_info {
void *ih;
bus_dma_tag_t parent_dmat;
+ unsigned int bufsize;
int bd_id;
u_long bd_flags; /* board-specific flags */
struct sb_chinfo pch, rch;
@@ -261,6 +262,7 @@ sb_release_resources(struct sb_info *sb, device_t dev)
sb->irq = 0;
}
if (sb->drq) {
+ isa_dma_release(rman_get_start(sb->drq));
bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq);
sb->drq = 0;
}
@@ -291,10 +293,8 @@ sb_alloc_resources(struct sb_info *sb, device_t dev)
sb->drq = bus_alloc_resource(dev, SYS_RES_DRQ, &rid, 0, ~0, 1, RF_ACTIVE);
if (sb->io_base && sb->drq && sb->irq) {
- int bs = SB_BUFFSIZE;
-
isa_dma_acquire(rman_get_start(sb->drq));
- isa_dmainit(rman_get_start(sb->drq), bs);
+ isa_dmainit(rman_get_start(sb->drq), sb->bufsize);
return 0;
} else return ENXIO;
@@ -580,7 +580,7 @@ sbchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c
ch->channel = c;
ch->dir = dir;
ch->buffer = b;
- if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB_BUFFSIZE) == -1)
+ if (sndbuf_alloc(ch->buffer, sb->parent_dmat, sb->bufsize) == -1)
return NULL;
sndbuf_isadmasetup(ch->buffer, sb->drq);
return ch;
@@ -693,7 +693,6 @@ sb_attach(device_t dev)
{
struct sb_info *sb;
char status[SND_STATUSLEN];
- int bs = SB_BUFFSIZE;
uintptr_t ver;
sb = (struct sb_info *)malloc(sizeof *sb, M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -704,6 +703,7 @@ sb_attach(device_t dev)
BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver);
sb->bd_id = ver & 0x0000ffff;
sb->bd_flags = (ver & 0xffff0000) >> 16;
+ sb->bufsize = pcm_getbuffersize(dev, 4096, SB_DEFAULT_BUFSZ, 65536);
if (sb_alloc_resources(sb, dev))
goto no;
@@ -720,15 +720,15 @@ sb_attach(device_t dev)
/*lowaddr*/BUS_SPACE_MAXADDR_24BIT,
/*highaddr*/BUS_SPACE_MAXADDR,
/*filter*/NULL, /*filterarg*/NULL,
- /*maxsize*/bs, /*nsegments*/1,
+ /*maxsize*/sb->bufsize, /*nsegments*/1,
/*maxsegz*/0x3ffff,
/*flags*/0, &sb->parent_dmat) != 0) {
device_printf(dev, "unable to create dma tag\n");
goto no;
}
- snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld",
- rman_get_start(sb->io_base), rman_get_start(sb->irq), rman_get_start(sb->drq));
+ snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld bufsz %u",
+ rman_get_start(sb->io_base), rman_get_start(sb->irq), rman_get_start(sb->drq), sb->bufsize);
if (pcm_register(dev, sb, 1, 1))
goto no;
OpenPOWER on IntegriCloud