summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/isa')
-rw-r--r--sys/dev/sound/isa/ad1816.c23
-rw-r--r--sys/dev/sound/isa/ess.c22
-rw-r--r--sys/dev/sound/isa/mss.c82
-rw-r--r--sys/dev/sound/isa/sb16.c77
-rw-r--r--sys/dev/sound/isa/sb8.c22
5 files changed, 118 insertions, 108 deletions
diff --git a/sys/dev/sound/isa/ad1816.c b/sys/dev/sound/isa/ad1816.c
index d6e1dd7..f83aafb 100644
--- a/sys/dev/sound/isa/ad1816.c
+++ b/sys/dev/sound/isa/ad1816.c
@@ -39,7 +39,7 @@ struct ad1816_chinfo {
struct ad1816_info *parent;
pcm_channel *channel;
snd_dbuf *buffer;
- int dir;
+ int dir, blksz;
};
struct ad1816_info {
@@ -131,12 +131,12 @@ ad1816_intr(void *arg)
c &= AD1816_INTRCI | AD1816_INTRPI;
}
/* check for capture interupt */
- if (ad1816->rch.buffer->dl && (c & AD1816_INTRCI)) {
+ if (sndbuf_runsz(ad1816->rch.buffer) && (c & AD1816_INTRCI)) {
chn_intr(ad1816->rch.channel);
served |= AD1816_INTRCI; /* cp served */
}
/* check for playback interupt */
- if (ad1816->pch.buffer->dl && (c & AD1816_INTRPI)) {
+ if (sndbuf_runsz(ad1816->pch.buffer) && (c & AD1816_INTRPI)) {
chn_intr(ad1816->pch.channel);
served |= AD1816_INTRPI; /* pb served */
}
@@ -311,8 +311,7 @@ ad1816chan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = ad1816;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = DSP_BUFFSIZE;
- if (chn_allocbuf(ch->buffer, ad1816->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, ad1816->parent_dmat, DSP_BUFFSIZE) == -1) return NULL;
return ch;
}
@@ -322,8 +321,7 @@ ad1816chan_setdir(kobj_t obj, void *data, int dir)
struct ad1816_chinfo *ch = data;
struct ad1816_info *ad1816 = ch->parent;
- ch->buffer->chan = rman_get_start((dir == PCMDIR_PLAY)?
- ad1816->drq1 : ad1816->drq2);
+ sndbuf_isadmasetup(ch->buffer, (dir == PCMDIR_PLAY)? ad1816->drq1 : ad1816->drq2);
ch->dir = dir;
return 0;
}
@@ -384,7 +382,10 @@ ad1816chan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
ad1816chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
- return blocksize;
+ struct ad1816_chinfo *ch = data;
+
+ ch->blksz = blocksize;
+ return ch->blksz;
}
static int
@@ -397,14 +398,14 @@ ad1816chan_trigger(kobj_t obj, void *data, int go)
if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
return 0;
- buf_isadma(ch->buffer, go);
+ sndbuf_isadma(ch->buffer, go);
wr = (ch->dir == PCMDIR_PLAY);
reg = wr? AD1816_PLAY : AD1816_CAPT;
switch (go) {
case PCMTRIG_START:
/* start only if not already running */
if (!(io_rd(ad1816, reg) & AD1816_ENABLE)) {
- int cnt = ((ch->buffer->dl) >> 2) - 1;
+ int cnt = ((ch->blksz) >> 2) - 1;
ad1816_write(ad1816, wr? 8 : 10, cnt); /* count */
ad1816_write(ad1816, wr? 9 : 11, 0); /* reset cur cnt */
ad1816_write(ad1816, 1, ad1816_read(ad1816, 1) |
@@ -441,7 +442,7 @@ static int
ad1816chan_getptr(kobj_t obj, void *data)
{
struct ad1816_chinfo *ch = data;
- return buf_isadmaptr(ch->buffer);
+ return sndbuf_isadmaptr(ch->buffer);
}
static pcmchan_caps *
diff --git a/sys/dev/sound/isa/ess.c b/sys/dev/sound/isa/ess.c
index f353289..b9c8362 100644
--- a/sys/dev/sound/isa/ess.c
+++ b/sys/dev/sound/isa/ess.c
@@ -82,7 +82,7 @@ struct ess_chinfo {
pcm_channel *channel;
snd_dbuf *buffer;
int dir, hwch, stopping, run;
- u_int32_t fmt, spd;
+ u_int32_t fmt, spd, blksz;
};
struct ess_info {
@@ -358,7 +358,7 @@ ess_intr(void *arg)
printf("ess: play intr while not running\n");
if (sc->pch.stopping) {
sc->pch.run = 0;
- buf_isadma(sc->pch.buffer, PCMTRIG_STOP);
+ sndbuf_isadma(sc->pch.buffer, PCMTRIG_STOP);
sc->pch.stopping = 0;
if (sc->pch.hwch == 1)
ess_write(sc, 0xb8, ess_read(sc, 0xb8) & ~0x01);
@@ -373,7 +373,7 @@ ess_intr(void *arg)
printf("ess: record intr while not running\n");
if (sc->rch.stopping) {
sc->rch.run = 0;
- buf_isadma(sc->rch.buffer, PCMTRIG_STOP);
+ sndbuf_isadma(sc->rch.buffer, PCMTRIG_STOP);
sc->rch.stopping = 0;
/* XXX: will this stop audio2? */
ess_write(sc, 0xb8, ess_read(sc, 0xb8) & ~0x01);
@@ -509,7 +509,7 @@ ess_start(struct ess_chinfo *ch)
struct ess_info *sc = ch->parent;
int play = (ch->dir == PCMDIR_PLAY)? 1 : 0;
- ess_setupch(sc, ch->hwch, ch->dir, ch->spd, ch->fmt, ch->buffer->dl);
+ ess_setupch(sc, ch->hwch, ch->dir, ch->spd, ch->fmt, ch->blksz);
ch->stopping = 0;
if (ch->hwch == 1)
ess_write(sc, 0xb8, ess_read(sc, 0xb8) | 0x01);
@@ -547,14 +547,13 @@ esschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = sc;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = ESS_BUFFSIZE;
- if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sc->parent_dmat, ESS_BUFFSIZE) == -1)
return NULL;
ch->dir = dir;
ch->hwch = 1;
if ((dir == PCMDIR_PLAY) && (sc->duplex))
ch->hwch = 2;
- ch->buffer->chan = rman_get_start((ch->hwch == 1)? sc->drq1 : sc->drq2);
+ sndbuf_isadmasetup(ch->buffer, (ch->hwch == 1)? sc->drq1 : sc->drq2);
return ch;
}
@@ -584,7 +583,10 @@ esschan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
esschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
- return blocksize;
+ struct ess_chinfo *ch = data;
+
+ ch->blksz = blocksize;
+ return ch->blksz;
}
static int
@@ -598,7 +600,7 @@ esschan_trigger(kobj_t obj, void *data, int go)
switch (go) {
case PCMTRIG_START:
ch->run = 1;
- buf_isadma(ch->buffer, go);
+ sndbuf_isadma(ch->buffer, go);
ess_start(ch);
break;
@@ -616,7 +618,7 @@ esschan_getptr(kobj_t obj, void *data)
{
struct ess_chinfo *ch = data;
- return buf_isadmaptr(ch->buffer);
+ return sndbuf_isadmaptr(ch->buffer);
}
static pcmchan_caps *
diff --git a/sys/dev/sound/isa/mss.c b/sys/dev/sound/isa/mss.c
index 3c6a126..a1802d4 100644
--- a/sys/dev/sound/isa/mss.c
+++ b/sys/dev/sound/isa/mss.c
@@ -48,7 +48,7 @@ struct mss_chinfo {
pcm_channel *channel;
snd_dbuf *buffer;
int dir;
- u_int32_t fmt;
+ u_int32_t fmt, blksz;
};
struct mss_info {
@@ -67,7 +67,6 @@ struct mss_info {
char mss_indexed_regs[MSS_INDEXED_REGS];
char opl_indexed_regs[OPL_INDEXED_REGS];
- int pdma, rdma;
int bd_id; /* used to hold board-id info, eg. sb version,
* mss codec type, etc. etc.
*/
@@ -242,19 +241,17 @@ mss_release_resources(struct mss_info *mss, device_t dev)
mss->irq);
mss->irq = 0;
}
- if (mss->drq1) {
- bus_release_resource(dev, SYS_RES_DRQ, mss->drq1_rid,
- mss->drq1);
- mss->drq1 = 0;
- mss->pdma = -1;
- }
- if (mss->drq2) {
+ if (mss->drq2 && mss->drq2 != mss->drq1) {
bus_release_resource(dev, SYS_RES_DRQ, mss->drq2_rid,
mss->drq2);
mss->drq2 = 0;
- mss->rdma = -1;
}
- if (mss->io_base) {
+ if (mss->drq1) {
+ bus_release_resource(dev, SYS_RES_DRQ, mss->drq1_rid,
+ mss->drq1);
+ mss->drq1 = 0;
+ }
+ if (mss->io_base) {
bus_release_resource(dev, SYS_RES_IOPORT, mss->io_rid,
mss->io_base);
mss->io_base = 0;
@@ -274,7 +271,7 @@ mss_release_resources(struct mss_info *mss, device_t dev)
static int
mss_alloc_resources(struct mss_info *mss, device_t dev)
{
- int ok = 1;
+ int pdma, rdma, ok = 1;
if (!mss->io_base)
mss->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT, &mss->io_rid,
0, ~0, 1, RF_ACTIVE);
@@ -296,16 +293,16 @@ mss_alloc_resources(struct mss_info *mss, device_t dev)
if (mss->drq2_rid >= 0 && !mss->drq2) ok = 0;
if (ok) {
- mss->pdma = rman_get_start(mss->drq1);
- isa_dma_acquire(mss->pdma);
- isa_dmainit(mss->pdma, MSS_BUFFSIZE);
+ pdma = rman_get_start(mss->drq1);
+ isa_dma_acquire(pdma);
+ isa_dmainit(pdma, MSS_BUFFSIZE);
mss->bd_flags &= ~BD_F_DUPLEX;
if (mss->drq2) {
- mss->rdma = rman_get_start(mss->drq2);
- isa_dma_acquire(mss->rdma);
- isa_dmainit(mss->rdma, MSS_BUFFSIZE);
+ rdma = rman_get_start(mss->drq2);
+ isa_dma_acquire(rdma);
+ isa_dmainit(rdma, MSS_BUFFSIZE);
mss->bd_flags |= BD_F_DUPLEX;
- } else mss->rdma = mss->pdma;
+ } else mss->drq2 = mss->drq1;
}
return ok;
}
@@ -691,11 +688,11 @@ mss_intr(void *arg)
/* get exact reason for full-duplex boards */
c = FULL_DUPLEX(mss)? ad_read(mss, 24) : 0x30;
c &= ~served;
- if (mss->pch.buffer->dl && (c & 0x10)) {
+ if (sndbuf_runsz(mss->pch.buffer) && (c & 0x10)) {
served |= 0x10;
chn_intr(mss->pch.channel);
}
- if (mss->rch.buffer->dl && (c & 0x20)) {
+ if (sndbuf_runsz(mss->rch.buffer) && (c & 0x20)) {
served |= 0x20;
chn_intr(mss->rch.channel);
}
@@ -935,7 +932,7 @@ mss_trigger(struct mss_chinfo *ch, int go)
m = ad_read(mss, 9);
switch (go) {
case PCMTRIG_START:
- cnt = (ch->buffer->dl / ss) - 1;
+ cnt = (ch->blksz / ss) - 1;
DEB(if (m & 4) printf("OUCH! reg 9 0x%02x\n", m););
m |= wr? I9_PEN : I9_CEN; /* enable DMA */
@@ -1015,8 +1012,8 @@ opti931_intr(void *arg)
return;
}
- if (mss->rch.buffer->dl && (mc11 & 8)) chn_intr(mss->rch.channel);
- if (mss->pch.buffer->dl && (mc11 & 4)) chn_intr(mss->pch.channel);
+ if (sndbuf_runsz(mss->rch.buffer) && (mc11 & 8)) chn_intr(mss->rch.channel);
+ if (sndbuf_runsz(mss->pch.buffer) && (mc11 & 4)) chn_intr(mss->pch.channel);
opti_wr(mss, 11, ~mc11); /* ack */
if (--loops) goto again;
DEB(printf("xxx too many loops\n");)
@@ -1033,10 +1030,9 @@ msschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = mss;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = MSS_BUFFSIZE;
- ch->buffer->chan = (dir == PCMDIR_PLAY)? mss->pdma : mss->rdma;
ch->dir = dir;
- if (chn_allocbuf(ch->buffer, mss->parent_dmat) == -1) return NULL;
+ if (sndbuf_alloc(ch->buffer, mss->parent_dmat, MSS_BUFFSIZE) == -1) return NULL;
+ sndbuf_isadmasetup(ch->buffer, (dir == PCMDIR_PLAY)? mss->drq1 : mss->drq2);
return ch;
}
@@ -1060,7 +1056,10 @@ msschan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
msschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
- return blocksize;
+ struct mss_chinfo *ch = data;
+
+ ch->blksz = blocksize;
+ return ch->blksz;
}
static int
@@ -1071,7 +1070,7 @@ msschan_trigger(kobj_t obj, void *data, int go)
if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
return 0;
- buf_isadma(ch->buffer, go);
+ sndbuf_isadma(ch->buffer, go);
mss_trigger(ch, go);
return 0;
}
@@ -1080,7 +1079,7 @@ static int
msschan_getptr(kobj_t obj, void *data)
{
struct mss_chinfo *ch = data;
- return buf_isadmaptr(ch->buffer);
+ return sndbuf_isadmaptr(ch->buffer);
}
static pcmchan_caps *
@@ -1496,11 +1495,13 @@ ymf_test(device_t dev, struct mss_info *mss)
static int
mss_doattach(device_t dev, struct mss_info *mss)
{
- int flags = device_get_flags(dev);
+ int pdma, rdma, flags = device_get_flags(dev);
char status[SND_STATUSLEN];
if (!mss_alloc_resources(mss, dev)) goto no;
mss_init(mss, dev);
+ pdma = rman_get_start(mss->drq1);
+ rdma = rman_get_start(mss->drq2);
if (flags & DV_F_TRUE_MSS) {
/* has IRQ/DMA registers, set IRQ and DMA addr */
#ifdef PC98 /* CS423[12] in PC98 can use IRQ3,5,10,12 */
@@ -1521,13 +1522,12 @@ mss_doattach(device_t dev, struct mss_info *mss)
if ((io_rd(mss, 3) & 0x40) == 0) device_printf(dev, "IRQ Conflict?\n");
#endif
/* Write IRQ+DMA setup */
- if (pdma_bits[mss->pdma] == -1) goto no;
- bits |= pdma_bits[mss->pdma];
- if (mss->pdma != mss->rdma) {
- if (mss->rdma == valid_rdma[mss->pdma]) bits |= 4;
+ if (pdma_bits[pdma] == -1) goto no;
+ bits |= pdma_bits[pdma];
+ if (pdma != rdma) {
+ if (rdma == valid_rdma[pdma]) bits |= 4;
else {
- printf("invalid dual dma config %d:%d\n",
- mss->pdma, mss->rdma);
+ printf("invalid dual dma config %d:%d\n", pdma, rdma);
goto no;
}
}
@@ -1542,7 +1542,7 @@ mss_doattach(device_t dev, struct mss_info *mss)
default:
bus_setup_intr(dev, mss->irq, INTR_TYPE_TTY, mss_intr, mss, &mss->ih);
}
- if (mss->pdma == mss->rdma)
+ if (pdma == rdma)
pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
/*lowaddr*/BUS_SPACE_MAXADDR_24BIT,
@@ -1555,9 +1555,9 @@ mss_doattach(device_t dev, struct mss_info *mss)
goto no;
}
snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %d",
- rman_get_start(mss->io_base), rman_get_start(mss->irq), mss->pdma);
- if (mss->pdma != mss->rdma) snprintf(status + strlen(status),
- SND_STATUSLEN - strlen(status), ":%d", mss->rdma);
+ rman_get_start(mss->io_base), rman_get_start(mss->irq), pdma);
+ if (pdma != rdma) snprintf(status + strlen(status),
+ SND_STATUSLEN - strlen(status), ":%d", rdma);
if (pcm_register(dev, mss, 1, 1)) goto no;
pcm_addchan(dev, PCMDIR_REC, &msschan_class, mss);
diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c
index e1485fa..ce69b54 100644
--- a/sys/dev/sound/isa/sb16.c
+++ b/sys/dev/sound/isa/sb16.c
@@ -84,7 +84,7 @@ struct sb_info {
int bd_id;
u_long bd_flags; /* board-specific flags */
- int dl, dh, prio, prio16;
+ int prio, prio16;
struct sb_chinfo pch, rch;
};
@@ -370,15 +370,15 @@ 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->drq1) {
- bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq1);
- sb->drq1 = 0;
- }
- if (sb->drq2) {
+ if (sb->drq2 && (sb->drq2 != sb->drq2)) {
bus_release_resource(dev, SYS_RES_DRQ, 1, sb->drq2);
sb->drq2 = 0;
}
- if (sb->io_base) {
+ if (sb->drq1) {
+ bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq1);
+ sb->drq1 = 0;
+ }
+ if (sb->io_base) {
bus_release_resource(dev, SYS_RES_IOPORT, 0, sb->io_base);
sb->io_base = 0;
}
@@ -419,6 +419,9 @@ sb16_alloc_resources(struct sb_info *sb, device_t dev)
if (sb->drq2) {
isa_dma_acquire(rman_get_start(sb->drq2));
isa_dmainit(rman_get_start(sb->drq2), bs);
+ } else {
+ sb->drq2 = sb->drq1;
+ pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
}
return 0;
} else return ENXIO;
@@ -458,15 +461,15 @@ sb_intr(void *arg)
}
} else {
if (c & 1) { /* 8-bit dma */
- if (sb->pch.dch == sb->dl)
+ if (sb->pch.dch == 1)
reason |= 1;
- if (sb->rch.dch == sb->dl)
+ if (sb->rch.dch == 1)
reason |= 2;
}
if (c & 2) { /* 16-bit dma */
- if (sb->pch.dch == sb->dh)
+ if (sb->pch.dch == 2)
reason |= 1;
- if (sb->rch.dch == sb->dh)
+ if (sb->rch.dch == 2)
reason |= 2;
}
}
@@ -494,38 +497,43 @@ sb_setup(struct sb_info *sb)
int l, pprio;
if (sb->bd_flags & BD_F_DMARUN)
- buf_isadma(sb->pch.buffer, PCMTRIG_STOP);
+ sndbuf_isadma(sb->pch.buffer, PCMTRIG_STOP);
if (sb->bd_flags & BD_F_DMARUN2)
- buf_isadma(sb->rch.buffer, PCMTRIG_STOP);
+ sndbuf_isadma(sb->rch.buffer, PCMTRIG_STOP);
sb->bd_flags &= ~(BD_F_DMARUN | BD_F_DMARUN2);
sb_reset_dsp(sb);
if (sb->bd_flags & BD_F_SB16X) {
pprio = sb->pch.run? 1 : 0;
- sb->pch.buffer->chan = pprio? sb->dl : -1;
- sb->rch.buffer->chan = pprio? sb->dh : sb->dl;
+ sndbuf_isadmasetup(sb->pch.buffer, pprio? sb->drq1 : NULL);
+ sb->pch.dch = pprio? 1 : 0;
+ sndbuf_isadmasetup(sb->rch.buffer, pprio? sb->drq2 : sb->drq1);
+ sb->rch.dch = pprio? 2 : 1;
} else {
if (sb->pch.run && sb->rch.run) {
pprio = (sb->rch.fmt & AFMT_16BIT)? 0 : 1;
- sb->pch.buffer->chan = pprio? sb->dh : sb->dl;
- sb->rch.buffer->chan = pprio? sb->dl : sb->dh;
+ sndbuf_isadmasetup(sb->pch.buffer, pprio? sb->drq2 : sb->drq1);
+ sb->pch.dch = pprio? 2 : 1;
+ sndbuf_isadmasetup(sb->rch.buffer, pprio? sb->drq1 : sb->drq2);
+ sb->rch.dch = pprio? 1 : 2;
} else {
if (sb->pch.run) {
- sb->pch.buffer->chan = (sb->pch.fmt & AFMT_16BIT)? sb->dh : sb->dl;
- sb->rch.buffer->chan = (sb->pch.fmt & AFMT_16BIT)? sb->dl : sb->dh;
+ sndbuf_isadmasetup(sb->pch.buffer, (sb->pch.fmt & AFMT_16BIT)? sb->drq2 : sb->drq1);
+ sb->pch.dch = (sb->pch.fmt & AFMT_16BIT)? 2 : 1;
+ sndbuf_isadmasetup(sb->rch.buffer, (sb->pch.fmt & AFMT_16BIT)? sb->drq1 : sb->drq2);
+ sb->rch.dch = (sb->pch.fmt & AFMT_16BIT)? 1 : 2;
} else if (sb->rch.run) {
- sb->pch.buffer->chan = (sb->rch.fmt & AFMT_16BIT)? sb->dl : sb->dh;
- sb->rch.buffer->chan = (sb->rch.fmt & AFMT_16BIT)? sb->dh : sb->dl;
+ sndbuf_isadmasetup(sb->pch.buffer, (sb->rch.fmt & AFMT_16BIT)? sb->drq1 : sb->drq2);
+ sb->pch.dch = (sb->rch.fmt & AFMT_16BIT)? 1 : 2;
+ sndbuf_isadmasetup(sb->rch.buffer, (sb->rch.fmt & AFMT_16BIT)? sb->drq2 : sb->drq1);
+ sb->rch.dch = (sb->rch.fmt & AFMT_16BIT)? 2 : 1;
}
}
}
- sb->pch.dch = sb->pch.buffer->chan;
- sb->rch.dch = sb->rch.buffer->chan;
-
- sb->pch.buffer->dir = ISADMA_WRITE;
- sb->rch.buffer->dir = ISADMA_READ;
+ sndbuf_isadmasetdir(sb->pch.buffer, PCMDIR_PLAY);
+ sndbuf_isadmasetdir(sb->rch.buffer, PCMDIR_REC);
/*
printf("setup: [pch = %d, pfmt = %d, pgo = %d] [rch = %d, rfmt = %d, rgo = %d]\n",
@@ -553,7 +561,7 @@ sb_setup(struct sb_info *sb)
v = (ch->fmt & AFMT_STEREO)? DSP_F16_STEREO : 0;
v |= (ch->fmt & AFMT_SIGNED)? DSP_F16_SIGNED : 0;
sb_cmd2(sb, v, l);
- buf_isadma(ch->buffer, PCMTRIG_START);
+ sndbuf_isadma(ch->buffer, PCMTRIG_START);
sb->bd_flags |= BD_F_DMARUN;
}
@@ -578,7 +586,7 @@ sb_setup(struct sb_info *sb)
v = (ch->fmt & AFMT_STEREO)? DSP_F16_STEREO : 0;
v |= (ch->fmt & AFMT_SIGNED)? DSP_F16_SIGNED : 0;
sb_cmd2(sb, v, l);
- buf_isadma(ch->buffer, PCMTRIG_START);
+ sndbuf_isadma(ch->buffer, PCMTRIG_START);
sb->bd_flags |= BD_F_DMARUN2;
}
@@ -595,10 +603,9 @@ sb16chan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->parent = sb;
ch->channel = c;
ch->buffer = b;
- ch->buffer->bufsize = SB16_BUFFSIZE;
ch->dir = dir;
- if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB16_BUFFSIZE) == -1)
return NULL;
return ch;
@@ -632,7 +639,7 @@ sb16chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
struct sb_chinfo *ch = data;
ch->blksz = blocksize;
- return blocksize;
+ return ch->blksz;
}
static int
@@ -659,7 +666,7 @@ sb16chan_getptr(kobj_t obj, void *data)
{
struct sb_chinfo *ch = data;
- return buf_isadmaptr(ch->buffer);
+ return sndbuf_isadmaptr(ch->buffer);
}
static pcmchan_caps *
@@ -749,11 +756,9 @@ sb16_attach(device_t dev)
if (bus_setup_intr(dev, sb->irq, INTR_TYPE_TTY, sb_intr, sb, &sb->ih))
goto no;
- if (!sb->drq2 || (sb->bd_flags & BD_F_SB16X))
+ if (sb->bd_flags & BD_F_SB16X)
pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
- sb->dl = rman_get_start(sb->drq1);
- sb->dh = sb->drq2? rman_get_start(sb->drq2) : sb->dl;
sb->prio = 0;
if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
@@ -770,7 +775,7 @@ sb16_attach(device_t dev)
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 (sb->drq2)
+ if (!(pcm_getflags(dev) & SD_F_SIMPLEX))
snprintf(status + strlen(status), SND_STATUSLEN - strlen(status),
":%ld", rman_get_start(sb->drq2));
diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c
index b2e66b3..39a8f95 100644
--- a/sys/dev/sound/isa/sb8.c
+++ b/sys/dev/sound/isa/sb8.c
@@ -64,7 +64,7 @@ struct sb_chinfo {
pcm_channel *channel;
snd_dbuf *buffer;
int dir;
- u_int32_t fmt, spd;
+ u_int32_t fmt, spd, blksz;
};
struct sb_info {
@@ -463,10 +463,10 @@ sb_intr(void *arg)
{
struct sb_info *sb = (struct sb_info *)arg;
- if (sb->pch.buffer->dl > 0)
+ if (sndbuf_runsz(sb->pch.buffer) > 0)
chn_intr(sb->pch.channel);
- if (sb->rch.buffer->dl > 0)
+ if (sndbuf_runsz(sb->rch.buffer) > 0)
chn_intr(sb->rch.channel);
sb_rd(sb, DSP_DATA_AVAIL); /* int ack */
@@ -517,7 +517,7 @@ sb_start(struct sb_chinfo *ch)
struct sb_info *sb = ch->parent;
int play = (ch->dir == PCMDIR_PLAY)? 1 : 0;
int stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
- int l = ch->buffer->dl;
+ int l = ch->blksz;
u_char i;
l--;
@@ -566,10 +566,9 @@ sbchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->channel = c;
ch->dir = dir;
ch->buffer = b;
- ch->buffer->bufsize = SB_BUFFSIZE;
- ch->buffer->chan = rman_get_start(sb->drq);
- if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1)
+ if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB_BUFFSIZE) == -1)
return NULL;
+ sndbuf_isadmasetup(ch->buffer, sb->drq);
return ch;
}
@@ -594,7 +593,10 @@ sbchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
sbchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
- return blocksize;
+ struct sb_chinfo *ch = data;
+
+ ch->blksz = blocksize;
+ return ch->blksz;
}
static int
@@ -605,7 +607,7 @@ sbchan_trigger(kobj_t obj, void *data, int go)
if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
return 0;
- buf_isadma(ch->buffer, go);
+ sndbuf_isadma(ch->buffer, go);
if (go == PCMTRIG_START)
sb_start(ch);
else
@@ -618,7 +620,7 @@ sbchan_getptr(kobj_t obj, void *data)
{
struct sb_chinfo *ch = data;
- return buf_isadmaptr(ch->buffer);
+ return sndbuf_isadmaptr(ch->buffer);
}
static pcmchan_caps *
OpenPOWER on IntegriCloud