Lines Matching +full:pcm +full:- +full:interface +full:- +full:rate

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
33 #include <dev/sound/pcm/sound.h>
34 #include <dev/sound/pcm/ac97.h>
176 return (bus_space_read_1(fm801->st, fm801->sh, regno));
178 return (bus_space_read_2(fm801->st, fm801->sh, regno));
180 return (bus_space_read_4(fm801->st, fm801->sh, regno));
192 bus_space_write_1(fm801->st, fm801->sh, regno, data);
195 bus_space_write_2(fm801->st, fm801->sh, regno, data);
198 bus_space_write_4(fm801->st, fm801->sh, regno, data);
203 /* -------------------------------------------------------------------- */
216 DPRINT("fm801 rdcd: 1 - DELAY\n");
228 DPRINT("fm801 rdcd: 2 - DELAY\n");
251 DPRINT("fm801 rdcd: 1 - DELAY\n");
255 return -1;
264 DPRINT("fm801 wrcd: 2 - DELAY\n");
268 return -1;
281 /* -------------------------------------------------------------------- */
295 fm801->play_flip++;
296 if(fm801->play_flip & 1) {
297 fm801_wr(fm801, FM_PLAY_DMABUF1, fm801->play_start,4);
299 fm801_wr(fm801, FM_PLAY_DMABUF2, fm801->play_nextblk,4);
300 chn_intr(fm801->pch.channel);
304 fm801->rec_flip++;
305 if(fm801->rec_flip & 1) {
306 fm801_wr(fm801, FM_REC_DMABUF1, fm801->rec_start,4);
308 fm801_wr(fm801, FM_REC_DMABUF2, fm801->rec_nextblk,4);
309 chn_intr(fm801->rch.channel);
326 /* -------------------------------------------------------------------- */
327 /* channel interface */
332 struct fm801_chinfo *ch = (dir == PCMDIR_PLAY)? &fm801->pch : &fm801->rch;
335 ch->parent = fm801;
336 ch->channel = c;
337 ch->buffer = b;
338 ch->dir = dir;
339 if (sndbuf_alloc(ch->buffer, fm801->parent_dmat, 0, fm801->bufsz) != 0)
348 struct fm801_info *fm801 = ch->parent;
356 if(ch->dir == PCMDIR_PLAY) {
357 fm801->play_fmt =
359 fm801->play_fmt |= (format & AFMT_16BIT) ? FM_PLAY_16BIT : 0;
363 if(ch->dir == PCMDIR_REC ) {
364 fm801->rec_fmt = (AFMT_CHANNEL(format) > 1)? FM_REC_STEREO:0;
365 fm801->rec_fmt |= (format & AFMT_16BIT) ? FM_PLAY_16BIT : 0;
374 u_int32_t rate;
387 /* anything above -> 48000 */
394 struct fm801_info *fm801 = ch->parent;
399 if(ch->dir == PCMDIR_PLAY) {
400 fm801->pch.spd = fm801_rates[i].rate;
401 fm801->play_shift = (i<<8);
402 fm801->play_shift &= FM_PLAY_RATE_MASK;
405 if(ch->dir == PCMDIR_REC ) {
406 fm801->rch.spd = fm801_rates[i].rate;
407 fm801->rec_shift = (i<<8);
408 fm801->rec_shift &= FM_REC_RATE_MASK;
411 ch->spd = fm801_rates[i].rate;
413 return fm801_rates[i].rate;
420 struct fm801_info *fm801 = ch->parent;
424 * desired values in any case - otherwise sound playback
427 if(ch->dir == PCMDIR_PLAY)
428 fm801->play_blksize = blocksize;
430 if(ch->dir == PCMDIR_REC)
431 fm801->rec_blksize = blocksize;
433 DPRINT("fm801ch_setblocksize %d (dir %d)\n",blocksize, ch->dir);
442 struct fm801_info *fm801 = ch->parent;
443 u_int32_t baseaddr = sndbuf_getbufaddr(ch->buffer);
451 if (ch->dir == PCMDIR_PLAY) {
453 fm801->play_start = baseaddr;
454 fm801->play_nextblk = fm801->play_start + fm801->play_blksize;
455 fm801->play_flip = 0;
456 fm801_wr(fm801, FM_PLAY_DMALEN, fm801->play_blksize - 1, 2);
457 fm801_wr(fm801, FM_PLAY_DMABUF1,fm801->play_start,4);
458 fm801_wr(fm801, FM_PLAY_DMABUF2,fm801->play_nextblk,4);
460 FM_PLAY_START | FM_PLAY_STOPNOW | fm801->play_fmt | fm801->play_shift,
463 fm801->play_flip = 0;
469 } else if(ch->dir == PCMDIR_REC) {
471 fm801->rec_start = baseaddr;
472 fm801->rec_nextblk = fm801->rec_start + fm801->rec_blksize;
473 fm801->rec_flip = 0;
474 fm801_wr(fm801, FM_REC_DMALEN, fm801->rec_blksize - 1, 2);
475 fm801_wr(fm801, FM_REC_DMABUF1,fm801->rec_start,4);
476 fm801_wr(fm801, FM_REC_DMABUF2,fm801->rec_nextblk,4);
478 FM_REC_START | FM_REC_STOPNOW | fm801->rec_fmt | fm801->rec_shift,
481 fm801->rec_flip = 0;
497 struct fm801_info *fm801 = ch->parent;
500 if (ch->dir == PCMDIR_PLAY) {
502 (fm801->play_flip&1) ?
503 FM_PLAY_DMABUF2:FM_PLAY_DMABUF1, 4) - fm801->play_start;
506 if (ch->dir == PCMDIR_REC) {
508 (fm801->rec_flip&1) ?
509 FM_REC_DMABUF2:FM_REC_DMABUF1, 4) - fm801->rec_start;
533 /* -------------------------------------------------------------------- */
579 fm801->type = pci_get_devid(dev);
584 fm801->regid = PCIR_BAR(i);
585 fm801->regtype = SYS_RES_MEMORY;
586 fm801->reg = bus_alloc_resource_any(dev, fm801->regtype,
587 &fm801->regid, RF_ACTIVE);
588 if(!fm801->reg)
590 fm801->regtype = SYS_RES_IOPORT;
591 fm801->reg = bus_alloc_resource_any(dev,
592 fm801->regtype,
593 &fm801->regid,
597 if(fm801->reg) {
598 fm801->st = rman_get_bustag(fm801->reg);
599 fm801->sh = rman_get_bushandle(fm801->reg);
609 fm801->bufsz = pcm_getbuffersize(dev, 4096, FM801_DEFAULT_BUFSZ, 65536);
616 if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto oops;
618 fm801->irqid = 0;
619 fm801->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &fm801->irqid,
621 if (!fm801->irq ||
622 snd_setup_intr(dev, fm801->irq, 0, fm801_intr, fm801, &fm801->ih)) {
632 /*maxsize*/fm801->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
634 &fm801->parent_dmat) != 0) {
640 (fm801->regtype == SYS_RES_IOPORT)? "port" : "mem",
641 rman_get_start(fm801->reg), rman_get_start(fm801->irq),
651 fm801->radio = device_add_child(dev, "radio", DEVICE_UNIT_ANY);
658 if (fm801->reg) bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
659 if (fm801->ih) bus_teardown_intr(dev, fm801->irq, fm801->ih);
660 if (fm801->irq) bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
661 if (fm801->parent_dmat) bus_dma_tag_destroy(fm801->parent_dmat);
684 bus_release_resource(dev, fm801->regtype, fm801->regid, fm801->reg);
685 bus_teardown_intr(dev, fm801->irq, fm801->ih);
686 bus_release_resource(dev, SYS_RES_IRQ, fm801->irqid, fm801->irq);
687 bus_dma_tag_destroy(fm801->parent_dmat);
720 return (fm801->reg);
732 /* Device interface */
740 /* Bus interface */
750 "pcm",