diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2012-03-15 12:20:32 +0200 |
---|---|---|
committer | Liam Girdwood <lrg@ti.com> | 2012-05-22 17:33:18 +0100 |
commit | 778a17c31fc1c0ecc22c9012747d5249ed6db80f (patch) | |
tree | d6af1115c4411a29fe677a2a8fb075dd5a3aa492 /sound/soc | |
parent | 766812e6d5e2e23be1e212cf84902d5e834dd865 (diff) |
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: Peter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Jarkko Nikula <jarkko.nikula@bitmer.com>
Signed-off-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 6912ac7cb625..418dc3cebdec 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -71,18 +71,17 @@ 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. - */ - if (dma_data->packet_size) - words = dma_data->packet_size; - else - words = snd_pcm_lib_period_bytes(substream) / - (mcbsp->wlen / 8); + /* + * Configure McBSP threshold based on either: + * 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 if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) + words = snd_pcm_lib_period_bytes(substream) / + (mcbsp->wlen / 8); else words = 1; @@ -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 */ |