summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa/sb16.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/isa/sb16.c')
-rw-r--r--sys/dev/sound/isa/sb16.c77
1 files changed, 46 insertions, 31 deletions
diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c
index 53c4242..7aef4e3 100644
--- a/sys/dev/sound/isa/sb16.c
+++ b/sys/dev/sound/isa/sb16.c
@@ -82,6 +82,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 */
int prio, prio16;
@@ -89,6 +90,7 @@ struct sb_info {
device_t parent_dev;
};
+#if 0
static void sb_lock(struct sb_info *sb);
static void sb_unlock(struct sb_info *sb);
static int sb_rd(struct sb_info *sb, int reg);
@@ -102,6 +104,7 @@ static int sb_getmixer(struct sb_info *sb, u_int port);
static int sb_reset_dsp(struct sb_info *sb);
static void sb_intr(void *arg);
+#endif
/*
* Common code for the midi and pcm functions
@@ -112,6 +115,18 @@ static void sb_intr(void *arg);
* sb_get_byte returns a single byte from the DSP data port
*/
+static void
+sb_lock(struct sb_info *sb) {
+
+ sbc_lock(device_get_softc(sb->parent_dev));
+}
+
+static void
+sb_unlock(struct sb_info *sb) {
+
+ sbc_unlock(device_get_softc(sb->parent_dev));
+}
+
static int
port_rd(struct resource *port, int off)
{
@@ -181,13 +196,23 @@ sb_cmd1(struct sb_info *sb, u_char cmd, int val)
static int
sb_cmd2(struct sb_info *sb, u_char cmd, int val)
{
+ int r;
+
#if 0
printf("sb_cmd2: %x, %x\n", cmd, val);
#endif
+ sb_lock(sb);
+ r = 0;
if (sb_dspwr(sb, cmd)) {
- return sb_dspwr(sb, val & 0xff) &&
- sb_dspwr(sb, (val >> 8) & 0xff);
- } else return 0;
+ if (sb_dspwr(sb, val & 0xff)) {
+ if (sb_dspwr(sb, (val >> 8) & 0xff)) {
+ r = 1;
+ }
+ }
+ }
+ sb_unlock(sb);
+
+ return r;
}
/*
@@ -376,9 +401,11 @@ sb16_release_resources(struct sb_info *sb, device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, 0, sb->irq);
sb->irq = 0;
}
- if (sb->drq2 && (sb->drq2 != sb->drq1)) {
- isa_dma_release(rman_get_start(sb->drq2));
- bus_release_resource(dev, SYS_RES_DRQ, 1, sb->drq2);
+ if (sb->drq2) {
+ if (sb->drq2 != sb->drq1) {
+ isa_dma_release(rman_get_start(sb->drq2));
+ bus_release_resource(dev, SYS_RES_DRQ, 1, sb->drq2);
+ }
sb->drq2 = 0;
}
if (sb->drq1) {
@@ -419,14 +446,12 @@ sb16_alloc_resources(struct sb_info *sb, device_t dev)
sb->drq2 = bus_alloc_resource(dev, SYS_RES_DRQ, &rid, 0, ~0, 1, RF_ACTIVE);
if (sb->io_base && sb->drq1 && sb->irq) {
- int bs = SB16_BUFFSIZE;
-
isa_dma_acquire(rman_get_start(sb->drq1));
- isa_dmainit(rman_get_start(sb->drq1), bs);
+ isa_dmainit(rman_get_start(sb->drq1), sb->bufsize);
if (sb->drq2) {
isa_dma_acquire(rman_get_start(sb->drq2));
- isa_dmainit(rman_get_start(sb->drq2), bs);
+ isa_dmainit(rman_get_start(sb->drq2), sb->bufsize);
} else {
sb->drq2 = sb->drq1;
pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
@@ -617,7 +642,7 @@ sb16chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->buffer = b;
ch->dir = dir;
- if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB16_BUFFSIZE) == -1)
+ if (sndbuf_alloc(ch->buffer, sb->parent_dmat, sb->bufsize) == -1)
return NULL;
return ch;
@@ -747,8 +772,7 @@ sb16_attach(device_t dev)
{
struct sb_info *sb;
uintptr_t ver;
- char status[SND_STATUSLEN];
- int bs = SB16_BUFFSIZE;
+ char status[SND_STATUSLEN], status2[SND_STATUSLEN];
sb = (struct sb_info *)malloc(sizeof *sb, M_DEVBUF, M_NOWAIT | M_ZERO);
if (!sb)
@@ -758,6 +782,7 @@ sb16_attach(device_t dev)
BUS_READ_IVAR(sb->parent_dev, dev, 1, &ver);
sb->bd_id = ver & 0x0000ffff;
sb->bd_flags = (ver & 0xffff0000) >> 16;
+ sb->bufsize = pcm_getbuffersize(dev, 4096, SB16_BUFFSIZE, 65536);
if (sb16_alloc_resources(sb, dev))
goto no;
@@ -777,19 +802,21 @@ sb16_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->drq1));
if (!(pcm_getflags(dev) & SD_F_SIMPLEX))
- snprintf(status + strlen(status), SND_STATUSLEN - strlen(status),
- ":%ld", rman_get_start(sb->drq2));
+ snprintf(status2, SND_STATUSLEN, ":%ld", rman_get_start(sb->drq2));
+ else
+ status2[0] = '\0';
+
+ snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld%s bufsz %ud",
+ rman_get_start(sb->io_base), rman_get_start(sb->irq),
+ rman_get_start(sb->drq1), status2, sb->bufsize);
if (pcm_register(dev, sb, 1, 1))
goto no;
@@ -820,18 +847,6 @@ sb16_detach(device_t dev)
return 0;
}
-static void
-sb_lock(struct sb_info *sb) {
-
- sbc_lock(device_get_softc(sb->parent_dev));
-}
-
-static void
-sb_unlock(struct sb_info *sb) {
-
- sbc_unlock(device_get_softc(sb->parent_dev));
-}
-
static device_method_t sb16_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, sb16_probe),
OpenPOWER on IntegriCloud