summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/via8233.c
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2003-02-20 17:31:12 +0000
committercognet <cognet@FreeBSD.org>2003-02-20 17:31:12 +0000
commit25a2aa22f19c732e8551e7ad32190bf14add4562 (patch)
tree754946b164b23a1f5dc38394662ee5a04598b6a7 /sys/dev/sound/pci/via8233.c
parent22cf3256d9e0c5f63427ab60eb09a6f768660c18 (diff)
downloadFreeBSD-src-25a2aa22f19c732e8551e7ad32190bf14add4562.zip
FreeBSD-src-25a2aa22f19c732e8551e7ad32190bf14add4562.tar.gz
Implement a "sndbuf_getbufaddr" function and use it instead of vtophys().
Reviewed by: orion
Diffstat (limited to 'sys/dev/sound/pci/via8233.c')
-rw-r--r--sys/dev/sound/pci/via8233.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/dev/sound/pci/via8233.c b/sys/dev/sound/pci/via8233.c
index 9f6dfc8..1af7caa 100644
--- a/sys/dev/sound/pci/via8233.c
+++ b/sys/dev/sound/pci/via8233.c
@@ -73,6 +73,7 @@ struct via_chinfo {
struct pcm_channel *channel;
struct snd_dbuf *buffer;
struct via_dma_op *sgd_table;
+ bus_addr_t sgd_addr;
int dir, blksz;
int rbase; /* base register for channel */
};
@@ -83,6 +84,7 @@ struct via_info {
bus_dma_tag_t parent_dmat;
bus_dma_tag_t sgd_dmat;
bus_dmamap_t sgd_dmamap;
+ bus_addr_t sgd_addr;
struct resource *reg, *irq;
int regid, irqid;
@@ -229,7 +231,7 @@ via_buildsgdt(struct via_chinfo *ch)
*/
seg_size = sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN;
- phys_addr = vtophys(sndbuf_getbuf(ch->buffer));
+ phys_addr = sndbuf_getbufaddr(ch->buffer);
for (i = 0; i < SEGS_PER_CHAN; i++) {
flag = (i == SEGS_PER_CHAN - 1) ? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
@@ -360,6 +362,8 @@ via8233chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->buffer = b;
ch->dir = dir;
ch->sgd_table = &via->sgd_table[(dir == PCMDIR_PLAY)? 0 : SEGS_PER_CHAN];
+ ch->sgd_addr = dir == PCMDIR_PLAY ? via->sgd_addr :
+ via->sgd_addr * SEGS_PER_CHAN;
if (ch->dir == PCMDIR_PLAY) {
ch->rbase = VIA_MC_SGD_STATUS;
@@ -381,12 +385,11 @@ via8233chan_trigger(kobj_t obj, void* data, int go)
{
struct via_chinfo *ch = data;
struct via_info *via = ch->parent;
- struct via_dma_op *ado = ch->sgd_table;
switch(go) {
case PCMTRIG_START:
via_buildsgdt(ch);
- via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, vtophys(ado), 4);
+ via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, ch->sgd_addr, 4);
via_wr(via, ch->rbase + VIA_RP_CONTROL,
SGD_CONTROL_START | SGD_CONTROL_AUTOSTART |
SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG, 1);
@@ -478,6 +481,8 @@ via_probe(device_t dev)
static void
dma_cb(void *p, bus_dma_segment_t *bds, int a, int b)
{
+ struct via_info *via = (struct via_info *)p;
+ via->sgd_addr = bds->ds_addr;
}
static int
@@ -580,7 +585,7 @@ via_attach(device_t dev)
BUS_DMA_NOWAIT, &via->sgd_dmamap) == -1)
goto bad;
if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table,
- NSEGS * sizeof(struct via_dma_op), dma_cb, 0, 0))
+ NSEGS * sizeof(struct via_dma_op), dma_cb, via, 0))
goto bad;
if (via_chip_init(dev))
OpenPOWER on IntegriCloud