Lines Matching +full:pcm +full:- +full:sync +full:- +full:mode
1 /*-
44 #include <dev/sound/pcm/sound.h>
60 bus_space_read_4(_sc->bst, _sc->bsh, _reg)
62 bus_space_write_4(_sc->bst, _sc->bsh, _reg, _val)
74 #define SCR_I2S_MODE_S 5 /* I2S Mode Select. */
77 #define SCR_NET (1 << 3) /* Network mode */
98 #define STCR_TFSI (1 << 2) /* Transmit Frame Sync Invert. */
99 #define STCR_TFSL (1 << 1) /* Transmit Frame Sync Length. */
100 #define STCR_TEFS (1 << 0) /* Transmit Early Frame Sync. */
156 * Fref ------/ | | | | | | | | | |
157 * PLL4 div select -/ | | | | | | | | |
158 * PLL4 num --------------/ | | | | | | | |
159 * PLL4 denom -------------------/ | | | | | | |
160 * PLL4 post div ---------------------/ | | | | | |
161 * CCM ssi pre div (CCM_CS1CDR) ----------/ | | | | |
162 * CCM ssi post div (CCM_CS1CDR) -------------/ | | | |
163 * SSI PM7_PM0_S ---------------------------------/ | | |
164 * SSI Fixed divider ---------------------------------/ | |
165 * SSI DIV2 ----------------------------------------------/ |
166 * SSI PSR (prescaler /1 or /8) ------------------------------/
206 /* PCM device private data */
218 { -1, 0 }
237 sc = scp->sc;
240 return -1;
245 snd_mtxlock(sc->lock);
246 pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
248 snd_mtxunlock(sc->lock);
264 device_printf(scp->dev, "ssimixer_set() %d %d\n",
291 sc = scp->sc;
293 snd_mtxlock(sc->lock);
294 ch = &scp->chan[0];
295 ch->dir = dir;
296 ch->run = 0;
297 ch->buffer = b;
298 ch->channel = c;
299 ch->parent = scp;
300 snd_mtxunlock(sc->lock);
302 if (sndbuf_setup(ch->buffer, sc->buf_base, sc->dma_size) != 0) {
303 device_printf(scp->dev, "Can't setup sndbuf.\n");
314 struct sc_pcminfo *scp = ch->parent;
315 struct sc_info *sc = scp->sc;
318 device_printf(scp->dev, "ssichan_free()\n");
321 snd_mtxlock(sc->lock);
323 snd_mtxunlock(sc->lock);
333 ch->format = format;
349 scp = ch->parent;
350 sc = scp->sc;
364 threshold = sr->speed + ((rate_map[i + 1].speed != 0) ?
365 ((rate_map[i + 1].speed - sr->speed) >> 1) : 0);
371 sc->sr = sr;
375 return (sr->speed);
383 sr = sc->sr;
385 pll4_configure_output(sr->mfi, sr->mfn, sr->mfd);
394 struct sc_pcminfo *scp = ch->parent;
395 struct sc_info *sc = scp->sc;
397 sndbuf_resize(ch->buffer, sc->dma_size / blocksize, blocksize);
401 return (sndbuf_getblksz(ch->buffer));
414 ch = &scp->chan[0];
415 sc = scp->sc;
416 conf = sc->conf;
418 bufsize = sndbuf_getsize(ch->buffer);
420 sc->pos += conf->period;
421 if (sc->pos >= bufsize)
422 sc->pos -= bufsize;
424 if (ch->run)
425 chn_intr(ch->channel);
439 if ((node = ofw_bus_get_node(sc->dev)) == -1)
446 device_printf(sc->dev,
454 sc->sdma_ev_rx = dts_value[1];
455 sc->sdma_ev_tx = dts_value[5];
464 device_printf(sc->dev, "No sDMA found. Can't operate\n");
468 sc->sdma_sc = sdma_sc;
481 ch = &scp->chan[0];
482 sc = scp->sc;
483 conf = sc->conf;
485 conf->ih = ssi_dma_intr;
486 conf->ih_user = scp;
487 conf->saddr = sc->buf_base_phys;
488 conf->daddr = rman_get_start(sc->res[0]) + SSI_STX0;
489 conf->event = sc->sdma_ev_tx; /* SDMA TX event */
490 conf->period = sndbuf_getblksz(ch->buffer);
491 conf->num_bd = sndbuf_getblkcnt(ch->buffer);
500 fmt = sndbuf_getfmt(ch->buffer);
503 conf->word_length = 16;
504 conf->command = CMD_2BYTES;
506 conf->word_length = 24;
507 conf->command = CMD_3BYTES;
509 device_printf(sc->dev, "Unknown format\n");
510 return (-1);
522 sc = scp->sc;
524 if (sdma_configure(sc->sdma_channel, sc->conf) != 0) {
525 device_printf(sc->dev, "Can't configure sDMA\n");
526 return (-1);
533 sdma_start(sc->sdma_channel);
544 sc = scp->sc;
550 sdma_stop(sc->sdma_channel);
552 bzero(sc->buf_base, sc->dma_size);
565 scp = ch->parent;
566 sc = scp->sc;
568 snd_mtxlock(sc->lock);
573 device_printf(scp->dev, "trigger start\n");
575 ch->run = 1;
584 device_printf(scp->dev, "trigger stop or abort\n");
586 ch->run = 0;
593 snd_mtxunlock(sc->lock);
606 scp = ch->parent;
607 sc = scp->sc;
609 return (sc->pos);
646 if (!ofw_bus_is_compatible(dev, "fsl,imx6q-ssi"))
661 sc = scp->sc;
666 device_printf(scp->sc->dev, "SSI Intr 0x%08x\n",
700 reg &= ~(STCR_TFSI); /* active high frame sync */
734 sc->dev = dev;
735 sc->sr = &rate_map[0];
736 sc->pos = 0;
737 sc->conf = malloc(sizeof(struct sdma_conf), M_DEVBUF, M_WAITOK | M_ZERO);
739 sc->lock = snd_mtxcreate(device_get_nameunit(dev), "ssi softc");
740 if (sc->lock == NULL) {
745 if (bus_alloc_resources(dev, ssi_spec, sc->res)) {
751 sc->bst = rman_get_bustag(sc->res[0]);
752 sc->bsh = rman_get_bushandle(sc->res[0]);
760 /* Setup PCM */
762 scp->sc = sc;
763 scp->dev = dev;
769 sc->dma_size = 131072;
777 bus_get_dma_tag(sc->dev),
778 4, sc->dma_size, /* alignment, boundary */
782 sc->dma_size, 1, /* maxsize, nsegments */
783 sc->dma_size, 0, /* maxsegsize, flags */
785 &sc->dma_tag);
787 err = bus_dmamem_alloc(sc->dma_tag, (void **)&sc->buf_base,
788 BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &sc->dma_map);
794 err = bus_dmamap_load(sc->dma_tag, sc->dma_map, sc->buf_base,
795 sc->dma_size, ssi_dmamap_cb, &sc->buf_base_phys, BUS_DMA_NOWAIT);
801 bzero(sc->buf_base, sc->dma_size);
804 err = bus_setup_intr(dev, sc->res[1], INTR_MPSAFE | INTR_TYPE_AV,
805 NULL, ssi_intr, scp, &sc->ih);
815 scp->chnum = 0;
817 scp->chnum++;
822 device_printf(dev, "Can't register pcm.\n");
831 sc->sdma_channel = sdma_alloc();
832 if (sc->sdma_channel < 0) {
833 device_printf(sc->dev, "Can't get sDMA channel\n");
847 "pcm",