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

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
45 #include <dev/sound/pcm/sound.h>
88 #define TCR4_SYWD_M 0x1f /* Sync Width Mask */
89 #define TCR4_SYWD_S 8 /* Sync Width Shift */
91 #define TCR4_FSE (1 << 3) /* Frame Sync Early */
92 #define TCR4_FSP (1 << 1) /* Frame Sync Polarity Low */
93 #define TCR4_FSD (1 << 0) /* Frame Sync Direction Master */
120 * MCLK - master clock
121 * nch - number of channels
122 * LRCLK - left right clock
171 /* PCM device private data */
183 { -1, 0 }
202 sc = scp->sc;
205 return -1;
209 snd_mtxlock(sc->lock);
210 pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
212 snd_mtxunlock(sc->lock);
226 device_printf(scp->dev, "saimixer_set() %d %d\n",
253 sc = scp->sc;
255 snd_mtxlock(sc->lock);
256 ch = &scp->chan[0];
257 ch->dir = dir;
258 ch->run = 0;
259 ch->buffer = b;
260 ch->channel = c;
261 ch->parent = scp;
262 snd_mtxunlock(sc->lock);
264 if (sndbuf_setup(ch->buffer, sc->buf_base, sc->dma_size) != 0) {
265 device_printf(scp->dev, "Can't setup sndbuf.\n");
276 struct sc_pcminfo *scp = ch->parent;
277 struct sc_info *sc = scp->sc;
280 device_printf(scp->dev, "saichan_free()\n");
283 snd_mtxlock(sc->lock);
285 snd_mtxunlock(sc->lock);
295 ch->format = format;
311 scp = ch->parent;
312 sc = scp->sc;
326 threshold = sr->speed + ((rate_map[i + 1].speed != 0) ?
327 ((rate_map[i + 1].speed - sr->speed) >> 1) : 0);
333 sc->sr = sr;
337 return (sr->speed);
346 sr = sc->sr;
352 * after re-enabling transmitter (DMA goes stall).
357 reg |= (sr->div << 0);
360 pll4_configure_output(sr->mfi, sr->mfn, sr->mfd);
367 struct sc_pcminfo *scp = ch->parent;
368 struct sc_info *sc = scp->sc;
370 sndbuf_resize(ch->buffer, sc->dma_size / blocksize, blocksize);
372 sc->period = sndbuf_getblksz(ch->buffer);
373 return (sc->period);
386 ch = &scp->chan[0];
388 sc = scp->sc;
389 tcd = sc->tcd;
391 sc->pos += (tcd->nbytes * tcd->nmajor);
392 if (sc->pos >= sc->dma_size)
393 sc->pos -= sc->dma_size;
395 if (ch->run)
396 chn_intr(ch->channel);
414 if ((node = ofw_bus_get_node(sc->dev)) == -1)
417 if ((len = OF_getproplen(node, "edma-controller")) <= 0)
419 if ((len = OF_getproplen(node, "edma-src-transmit")) <= 0)
421 if ((len = OF_getproplen(node, "edma-mux-group")) <= 0)
424 OF_getencprop(node, "edma-src-transmit", &dts_value, len);
426 OF_getencprop(node, "edma-mux-group", &dts_value, len);
428 OF_getencprop(node, "edma-controller", &dts_value, len);
431 if ((len = OF_getproplen(edma_node, "device-id")) <= 0) {
435 OF_getencprop(edma_node, "device-id", &dts_value, len);
444 if (edma_sc->device_id == edma_device_id) {
454 device_printf(sc->dev, "no eDMA. can't operate\n");
458 sc->edma_sc = edma_sc;
460 sc->edma_chnum = edma_sc->channel_configure(edma_sc, edma_mux_group,
462 if (sc->edma_chnum < 0) {
476 sc = scp->sc;
479 tcd->channel = sc->edma_chnum;
480 tcd->ih = sai_dma_intr;
481 tcd->ih_user = scp;
482 tcd->saddr = sc->buf_base_phys;
483 tcd->daddr = rman_get_start(sc->res[0]) + I2S_TDR0;
489 tcd->nbytes = 64;
491 tcd->nmajor = 512;
492 tcd->smod = 17; /* dma_size range */
493 tcd->dmod = 0;
494 tcd->esg = 0;
495 tcd->soff = 0x4;
496 tcd->doff = 0;
497 tcd->ssize = 0x2;
498 tcd->dsize = 0x2;
499 tcd->slast = 0;
500 tcd->dlast_sga = 0;
502 sc->tcd = tcd;
504 sc->edma_sc->dma_setup(sc->edma_sc, sc->tcd);
513 struct sc_pcminfo *scp = ch->parent;
514 struct sc_info *sc = scp->sc;
516 snd_mtxlock(sc->lock);
521 device_printf(scp->dev, "trigger start\n");
523 ch->run = 1;
529 device_printf(scp->dev, "trigger stop or abort\n");
531 ch->run = 0;
535 snd_mtxunlock(sc->lock);
548 scp = ch->parent;
549 sc = scp->sc;
551 return (sc->pos);
556 * eDMA doesn't allow 24-bit coping,
592 if (!ofw_bus_is_compatible(dev, "fsl,mvf600-sai"))
606 sc = scp->sc;
608 device_printf(sc->dev, "Error I2S_TCSR == 0x%08x\n",
644 /* Configure to 32-bit I2S mode */
690 sc->dev = dev;
691 sc->sr = &rate_map[0];
692 sc->pos = 0;
694 sc->lock = snd_mtxcreate(device_get_nameunit(dev), "sai softc");
695 if (sc->lock == NULL) {
700 if (bus_alloc_resources(dev, sai_spec, sc->res)) {
706 sc->bst = rman_get_bustag(sc->res[0]);
707 sc->bsh = rman_get_bushandle(sc->res[0]);
715 /* Setup PCM */
717 scp->sc = sc;
718 scp->dev = dev;
721 sc->dma_size = 131072;
729 bus_get_dma_tag(sc->dev),
730 4, sc->dma_size, /* alignment, boundary */
734 sc->dma_size, 1, /* maxsize, nsegments */
735 sc->dma_size, 0, /* maxsegsize, flags */
737 &sc->dma_tag);
739 err = bus_dmamem_alloc(sc->dma_tag, (void **)&sc->buf_base,
740 BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &sc->dma_map);
746 err = bus_dmamap_load(sc->dma_tag, sc->dma_map, sc->buf_base,
747 sc->dma_size, sai_dmamap_cb, &sc->buf_base_phys, BUS_DMA_NOWAIT);
753 bzero(sc->buf_base, sc->dma_size);
756 err = bus_setup_intr(dev, sc->res[1], INTR_MPSAFE | INTR_TYPE_AV,
757 NULL, sai_intr, scp, &sc->ih);
767 scp->chnum = 0;
769 scp->chnum++;
774 device_printf(dev, "Can't register pcm.\n");
793 "pcm",