Lines Matching +full:pcm +full:- +full:sync +full:- +full:mode
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
33 #include <dev/sound/pcm/sound.h>
34 #include <dev/sound/pcm/ac97.h>
72 int base, count, mode, ctrl;
112 return bus_space_read_1(via->st, via->sh, regno);
114 return bus_space_read_2(via->st, via->sh, regno);
116 return bus_space_read_4(via->st, via->sh, regno);
128 bus_space_write_1(via->st, via->sh, regno, data);
131 bus_space_write_2(via->st, via->sh, regno, data);
134 bus_space_write_4(via->st, via->sh, regno, data);
139 /* -------------------------------------------------------------------- */
181 if (via_waitready_codec(via)) return -1;
194 return -1;
199 return -1;
202 return -1;
214 /* -------------------------------------------------------------------- */
225 * This creates two half-buffers, one of which is playing; the other
228 seg_size = ch->blksz;
229 segs = sndbuf_getsize(ch->buffer) / seg_size;
230 phys_addr = sndbuf_getbufaddr(ch->buffer);
233 flag = (i == segs - 1)? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
234 ch->sgd_table[i].ptr = phys_addr + (i * seg_size);
235 ch->sgd_table[i].flags = flag | seg_size;
248 snd_mtxlock(via->lock);
250 ch = &via->pch;
251 ch->base = VIA_PLAY_DMAOPS_BASE;
252 ch->count = VIA_PLAY_DMAOPS_COUNT;
253 ch->ctrl = VIA_PLAY_CONTROL;
254 ch->mode = VIA_PLAY_MODE;
255 ch->sgd_addr = via->sgd_addr;
256 ch->sgd_table = &via->sgd_table[0];
258 ch = &via->rch;
259 ch->base = VIA_RECORD_DMAOPS_BASE;
260 ch->count = VIA_RECORD_DMAOPS_COUNT;
261 ch->ctrl = VIA_RECORD_CONTROL;
262 ch->mode = VIA_RECORD_MODE;
263 ch->sgd_addr = via->sgd_addr + sizeof(struct via_dma_op) * SEGS_PER_CHAN;
264 ch->sgd_table = &via->sgd_table[SEGS_PER_CHAN];
267 ch->parent = via;
268 ch->channel = c;
269 ch->buffer = b;
270 ch->dir = dir;
271 snd_mtxunlock(via->lock);
273 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
283 struct via_info *via = ch->parent;
284 int mode, mode_set;
292 DEB(printf("set format: dir = %d, format=%x\n", ch->dir, format));
293 snd_mtxlock(via->lock);
294 mode = via_rd(via, ch->mode, 1);
295 mode &= ~(VIA_RPMODE_16BIT | VIA_RPMODE_STEREO);
296 mode |= mode_set;
297 via_wr(via, ch->mode, mode, 1);
298 snd_mtxunlock(via->lock);
307 struct via_info *via = ch->parent;
315 * If the codec supports variable-rate audio (i.e. does the upsampling
319 if (via->codec_caps & AC97_EXTCAP_VRA) {
320 reg = (ch->dir == PCMDIR_PLAY)? AC97_REGEXT_FDACRATE : AC97_REGEXT_LADCRATE;
321 return ac97_setrate(via->codec, reg, speed);
331 ch->blksz = blocksize;
332 sndbuf_resize(ch->buffer, SEGS_PER_CHAN, ch->blksz);
334 return ch->blksz;
341 struct via_info *via = ch->parent;
342 bus_addr_t sgd_addr = ch->sgd_addr;
347 DEB(printf("ado located at va=%p pa=%x\n", ch->sgd_table, sgd_addr));
349 snd_mtxlock(via->lock);
352 via_wr(via, ch->base, sgd_addr, 4);
353 via_wr(via, ch->ctrl, VIA_RPCTRL_START, 1);
355 via_wr(via, ch->ctrl, VIA_RPCTRL_TERMINATE, 1);
356 snd_mtxunlock(via->lock);
366 struct via_info *via = ch->parent;
367 bus_addr_t sgd_addr = ch->sgd_addr;
370 snd_mtxlock(via->lock);
371 base1 = via_rd(via, ch->base, 4);
372 len = via_rd(via, ch->count, 4);
373 base = via_rd(via, ch->base, 4);
375 len = via_rd(via, ch->count, 4);
376 snd_mtxunlock(via->lock);
383 seg = (base - sgd_addr) / sizeof(struct via_dma_op);
388 ptr = (seg * sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN) - len;
389 if (ch->dir == PCMDIR_REC) {
391 /* so don't return any part line - it isn't in RAM yet */
403 struct via_info *via = ch->parent;
405 return (via->codec_caps & AC97_EXTCAP_VRA)? &via_vracaps : &via_caps;
420 /* -------------------------------------------------------------------- */
429 snd_mtxlock(via->lock);
432 snd_mtxunlock(via->lock);
433 chn_intr(via->pch.channel);
434 snd_mtxlock(via->lock);
440 snd_mtxunlock(via->lock);
441 chn_intr(via->rch.channel);
444 snd_mtxunlock(via->lock);
464 via->sgd_addr = bds->ds_addr;
475 via->lock = snd_mtxcreate(device_get_nameunit(dev),
492 pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_EN, 1); /* Force no sync */
494 pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_EN | VIA_ACLINK_SYNC, 1); /* Sync */
496 pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_EN, 1); /* Force no sync */
511 via->regid = PCIR_BAR(0);
512 via->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
513 &via->regid, RF_ACTIVE);
514 if (!via->reg) {
518 via->st = rman_get_bustag(via->reg);
519 via->sh = rman_get_bushandle(via->reg);
521 via->bufsz = pcm_getbuffersize(dev, 4096, VIA_DEFAULT_BUFSZ, 65536);
523 via->irqid = 0;
524 via->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &via->irqid,
526 if (!via->irq || snd_setup_intr(dev, via->irq, INTR_MPSAFE, via_intr, via, &via->ih)) {
534 via->codec = AC97_CREATE(dev, via, via_ac97);
535 if (!via->codec)
538 if (mixer_init(dev, ac97_getmixerclass(), via->codec))
541 via->codec_caps = ac97_getextcaps(via->codec);
542 ac97_setextmode(via->codec,
543 via->codec_caps & (AC97_EXTCAP_VRA | AC97_EXTCAP_VRM));
551 /*maxsize*/via->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
553 /*lockarg*/NULL, &via->parent_dmat) != 0) {
571 /*lockarg*/NULL, &via->sgd_dmat) != 0) {
576 if (bus_dmamem_alloc(via->sgd_dmat, (void **)&via->sgd_table,
577 BUS_DMA_NOWAIT, &via->sgd_dmamap) != 0)
579 if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table,
584 rman_get_start(via->reg), rman_get_start(via->irq),
595 if (via->codec) ac97_destroy(via->codec);
596 if (via->reg) bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
597 if (via->ih) bus_teardown_intr(dev, via->irq, via->ih);
598 if (via->irq) bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
599 if (via->parent_dmat) bus_dma_tag_destroy(via->parent_dmat);
600 if (via->sgd_addr) bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
601 if (via->sgd_table) bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
602 if (via->sgd_dmat) bus_dma_tag_destroy(via->sgd_dmat);
603 if (via->lock) snd_mtxfree(via->lock);
619 bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
620 bus_teardown_intr(dev, via->irq, via->ih);
621 bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
622 bus_dma_tag_destroy(via->parent_dmat);
623 bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
624 bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
625 bus_dma_tag_destroy(via->sgd_dmat);
626 snd_mtxfree(via->lock);
639 "pcm",