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

Commit 92429069 authored by Philipp Zabel's avatar Philipp Zabel Committed by Mark Brown
Browse files

ASoC: pxa-ssp: Use 16-bit DMA for magician stereo



Now magician and similar boards can use network mode with only one
active slot to explicitly set 16 bit frame width, even for S16_LE
stereo sound.

Signed-off-by: default avatarPhilipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 1f218695
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -627,12 +627,18 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
	u32 sscr0;
	u32 sscr0;
	u32 sspsp;
	u32 sspsp;
	int width = snd_pcm_format_physical_width(params_format(params));
	int width = snd_pcm_format_physical_width(params_format(params));
	int ttsa = ssp_read_reg(ssp, SSTSA) & 0xf;


	/* select correct DMA params */
	/* select correct DMA params */
	if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
	if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
		dma = 1; /* capture DMA offset is 1,3 */
		dma = 1; /* capture DMA offset is 1,3 */
	if (chn == 2)
	/* Network mode with one active slot (ttsa == 1) can be used
		dma += 2; /* stereo DMA offset is 2, mono is 0 */
	 * to force 16-bit frame width on the wire (for S16_LE), even
	 * with two channels. Use 16-bit DMA transfers for this case.
	 */
	if (((chn == 2) && (ttsa != 1)) || (width == 32))
		dma += 2; /* 32-bit DMA offset is 2, 16-bit is 0 */

	cpu_dai->dma_data = ssp_dma_params[cpu_dai->id][dma];
	cpu_dai->dma_data = ssp_dma_params[cpu_dai->id][dma];


	dev_dbg(&ssp->pdev->dev, "pxa_ssp_hw_params: dma %d\n", dma);
	dev_dbg(&ssp->pdev->dev, "pxa_ssp_hw_params: dma %d\n", dma);
@@ -712,7 +718,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
	/* When we use a network mode, we always require TDM slots
	/* When we use a network mode, we always require TDM slots
	 * - complain loudly and fail if they've not been set up yet.
	 * - complain loudly and fail if they've not been set up yet.
	 */
	 */
	if ((sscr0 & SSCR0_MOD) && !(ssp_read_reg(ssp, SSTSA) & 0xf)) {
	if ((sscr0 & SSCR0_MOD) && !ttsa) {
		dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
		dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
		return -EINVAL;
		return -EINVAL;
	}
	}