Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 778a17c3 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Liam Girdwood
Browse files

ASoC: omap-mcbsp: Use DMA packet mode for non mono streams on OMAP3+



Take the DMA packet mode into use when the McBSP is configured in element
dma_op_mode if the stream is not mono.
In this way we transfer one sample from/to McBSP FIFO upon DMA request.
This change only affects OMAP3+ versions, where the McBSP ports have FIFO.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarJarkko Nikula <jarkko.nikula@bitmer.com>
Signed-off-by: default avatarLiam Girdwood <lrg@ti.com>
parent 766812e6
Loading
Loading
Loading
Loading
+17 −13
Original line number Diff line number Diff line
@@ -71,16 +71,15 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)

	dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);

	/* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
	if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
	/*
	 * Configure McBSP threshold based on either:
		 * packet_size, when the sDMA is in packet mode, or
		 * based on the period size.
	 * packet_size, when the sDMA is in packet mode, or based on the
	 * period size in THRESHOLD mode, otherwise use McBSP threshold = 1
	 * for mono streams.
	 */
	if (dma_data->packet_size)
		words = dma_data->packet_size;
		else
	else if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
		words = snd_pcm_lib_period_bytes(substream) /
						(mcbsp->wlen / 8);
	else
@@ -230,6 +229,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
	unsigned int format, div, framesize, master;

	dma_data = &mcbsp->dma_data[substream->stream];
	channels = params_channels(params);

	switch (params_format(params)) {
	case SNDRV_PCM_FORMAT_S16_LE:
@@ -283,6 +283,10 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
			} else {
				sync_mode = OMAP_DMA_SYNC_FRAME;
			}
		} else if (channels > 1) {
			/* Use packet mode for non mono streams */
			pkt_size = channels;
			sync_mode = OMAP_DMA_SYNC_PACKET;
		}
	}

@@ -301,7 +305,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
	regs->rcr1	&= ~(RFRLEN1(0x7f) | RWDLEN1(7));
	regs->xcr1	&= ~(XFRLEN1(0x7f) | XWDLEN1(7));
	format = mcbsp->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
	wpf = channels = params_channels(params);
	wpf = channels;
	if (channels == 2 && (format == SND_SOC_DAIFMT_I2S ||
			      format == SND_SOC_DAIFMT_LEFT_J)) {
		/* Use dual-phase frames */