Lines Matching +full:pcm +full:- +full:sync +full:- +full:mode

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
40 #include <dev/sound/pcm/sound.h>
41 #include <dev/sound/pcm/ac97.h>
65 /* ------------------------------------------------------------------------- */
101 /* -------------------------------------------------------------------- */
122 /* -------------------------------------------------------------------- */
143 /* -------------------------------------------------------------------- */
149 return bus_space_read_4(sc->st, sc->sh, regno);
155 bus_space_write_4(sc->st, sc->sh, regno, data);
184 tries --;
198 tries --;
203 /* ------------------------------------------------------------------------- */
251 /* -------------------------------------------------------------------- */
273 device_printf(sc->dev, "cs4281_rdcd: DCV did not go\n");
274 return -1;
279 device_printf(sc->dev,"cs4281_rdcd: VSTS did not come\n");
280 return -1;
299 device_printf(sc->dev,"cs4281_wrcd: DCV did not go\n");
312 /* ------------------------------------------------------------------------- */
319 struct sc_chinfo *ch = (dir == PCMDIR_PLAY) ? &sc->pch : &sc->rch;
321 ch->buffer = b;
322 if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0) {
325 ch->parent = sc;
326 ch->channel = c;
328 ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
329 ch->spd = DSP_DEFAULT_SPEED;
330 ch->bps = 1;
331 ch->blksz = sndbuf_getsize(ch->buffer);
333 ch->dma_chan = (dir == PCMDIR_PLAY) ? CS4281_DMA_PLAY : CS4281_DMA_REC;
334 ch->dma_setup = 0;
346 struct sc_info *sc = ch->parent;
351 /* 2 interrupts are possible and used in buffer (half-empty,empty),
353 ch->blksz = MIN(blocksize, sc->bufsz / 2);
354 sndbuf_resize(ch->buffer, 2, ch->blksz);
355 ch->dma_setup = 0;
359 DEB(printf("cs4281chan_setblocksize: blksz %d Setting %d\n", blocksize, ch->blksz));
361 return ch->blksz;
368 struct sc_info *sc = ch->parent;
372 r = (ch->dma_chan == CS4281_DMA_PLAY) ? CS4281PCI_DACSR : CS4281PCI_ADCSR;
377 ch->spd = cs4281_rv_to_rate(v);
378 return ch->spd;
385 struct sc_info *sc = ch->parent;
390 if (ch->dma_chan == CS4281_DMA_PLAY)
396 cs4281_wr(sc, CS4281PCI_DMR(ch->dma_chan), v);
400 ch->fmt = format;
401 ch->bps = cs4281_format_to_bps(format);
402 ch->dma_setup = 0;
411 struct sc_info *sc = ch->parent;
415 sz = sndbuf_getsize(ch->buffer);
416 dba = cs4281_rd(sc, CS4281PCI_DBA(ch->dma_chan));
417 dca = cs4281_rd(sc, CS4281PCI_DCA(ch->dma_chan));
418 ptr = (dca - dba + sz) % sz;
463 /* -------------------------------------------------------------------- */
466 /* adcdac_go enables/disable DMA channel, returns non-zero if DMA was
472 struct sc_info *sc = ch->parent;
475 going = !(cs4281_rd(sc, CS4281PCI_DCR(ch->dma_chan)) & CS4281PCI_DCR_MSK);
478 cs4281_clr4(sc, CS4281PCI_DCR(ch->dma_chan), CS4281PCI_DCR_MSK);
480 cs4281_set4(sc, CS4281PCI_DCR(ch->dma_chan), CS4281PCI_DCR_MSK);
490 struct sc_info *sc = ch->parent;
493 if (!ch->dma_setup) {
495 cs4281_wr(sc, CS4281PCI_DBA(ch->dma_chan),
496 sndbuf_getbufaddr(ch->buffer));
497 cs4281_wr(sc, CS4281PCI_DBC(ch->dma_chan),
498 sndbuf_getsize(ch->buffer) / ch->bps - 1);
499 ch->dma_setup = 1;
504 /* -------------------------------------------------------------------- */
518 chn_intr(sc->pch.channel);
523 chn_intr(sc->rch.channel);
527 /* Signal End-of-Interrupt */
531 /* -------------------------------------------------------------------- */
552 DEB(printf("cs4281_power %d -> %d\n", sc->power, state));
553 sc->power = state;
567 /* (1) Make ESYN 0 to turn sync pulse on AC97 link */
584 /* (4) Power Up - this combination is essential. */
594 device_printf(sc->dev, "Clock stabilization failed\n");
595 return -1;
609 device_printf(sc->dev, "codec did not avail\n");
610 return -1;
628 device_printf(sc->dev, "codec failed to calibrate\n");
629 return -1;
640 device_printf(sc->dev, "cs4281 never got valid data\n");
641 return -1;
701 /* Set Auto-Initialize and set directions */
735 /* -------------------------------------------------------------------- */
762 sc->dev = dev;
763 sc->type = pci_get_devid(dev);
769 device_printf(dev, "chip is in D%d power mode "
770 "-- setting to D0\n", pci_get_powerstate(dev));
775 sc->regid = PCIR_BAR(0);
776 sc->regtype = SYS_RES_MEMORY;
777 sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid, RF_ACTIVE);
778 if (!sc->reg) {
779 sc->regtype = SYS_RES_IOPORT;
780 sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid,
782 if (!sc->reg) {
787 sc->st = rman_get_bustag(sc->reg);
788 sc->sh = rman_get_bushandle(sc->reg);
790 sc->memid = PCIR_BAR(1);
791 sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->memid,
793 if (sc->mem == NULL) {
798 sc->irqid = 0;
799 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid,
801 if (!sc->irq) {
806 if (snd_setup_intr(dev, sc->irq, 0, cs4281_intr, sc, &sc->ih)) {
811 sc->bufsz = pcm_getbuffersize(dev, 4096, CS4281_DEFAULT_BUFSZ, 65536);
818 /*maxsize*/sc->bufsz, /*nsegments*/1,
821 &sc->parent_dmat) != 0) {
830 if (cs4281_init(sc) == -1) {
848 (sc->regtype == SYS_RES_IOPORT)? "port" : "mem",
849 rman_get_start(sc->reg), rman_get_start(sc->irq),
859 if (sc->reg)
860 bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
861 if (sc->mem)
862 bus_release_resource(dev, SYS_RES_MEMORY, sc->memid, sc->mem);
863 if (sc->ih)
864 bus_teardown_intr(dev, sc->irq, sc->ih);
865 if (sc->irq)
866 bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
867 if (sc->parent_dmat)
868 bus_dma_tag_destroy(sc->parent_dmat);
889 bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
890 bus_release_resource(dev, SYS_RES_MEMORY, sc->memid, sc->mem);
891 bus_teardown_intr(dev, sc->irq, sc->ih);
892 bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
893 bus_dma_tag_destroy(sc->parent_dmat);
906 sc->rch.dma_active = adcdac_go(&sc->rch, 0);
907 sc->pch.dma_active = adcdac_go(&sc->pch, 0);
925 if (cs4281_init(sc) == -1) {
931 if (mixer_reinit(dev) == -1) {
937 cs4281chan_setspeed(NULL, &sc->rch, sc->rch.spd);
938 cs4281chan_setblocksize(NULL, &sc->rch, sc->rch.blksz);
939 cs4281chan_setformat(NULL, &sc->rch, sc->rch.fmt);
940 adcdac_go(&sc->rch, sc->rch.dma_active);
942 cs4281chan_setspeed(NULL, &sc->pch, sc->pch.spd);
943 cs4281chan_setblocksize(NULL, &sc->pch, sc->pch.blksz);
944 cs4281chan_setformat(NULL, &sc->pch, sc->pch.fmt);
945 adcdac_go(&sc->pch, sc->pch.dma_active);
961 "pcm",