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

Commit c04019d4 authored by Timur Tabi's avatar Timur Tabi Committed by Mark Brown
Browse files

ASoC: add support for separate codec DAIs to the fsl_dma driver



Some codecs have separate DAIs for playback and capture, so the DMA driver
should allocate a DMA buffer only for the streams that are valid when the
driver is opened.

Signed-off-by: default avatarTimur Tabi <timur@freescale.com>
Acked-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent b67696b4
Loading
Loading
Loading
Loading
+21 −13
Original line number Diff line number Diff line
@@ -303,22 +303,30 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
	if (!card->dev->coherent_dma_mask)
		card->dev->coherent_dma_mask = fsl_dma_dmamask;

	/* Some codecs have separate DAIs for playback and capture, so we
	 * should allocate a DMA buffer only for the streams that are valid.
	 */

	if (dai->driver->playback.channels_min) {
		ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
			fsl_dma_hardware.buffer_bytes_max,
			&pcm->streams[0].substream->dma_buffer);
		if (ret) {
		dev_err(card->dev, "can't allocate playback dma buffer\n");
			dev_err(card->dev, "can't alloc playback dma buffer\n");
			return ret;
		}
	}

	if (dai->driver->capture.channels_min) {
		ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
			fsl_dma_hardware.buffer_bytes_max,
			&pcm->streams[1].substream->dma_buffer);
		if (ret) {
			snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer);
		dev_err(card->dev, "can't allocate capture dma buffer\n");
			dev_err(card->dev, "can't alloc capture dma buffer\n");
			return ret;
		}
	}

	return 0;
}