diff options
| author | Jerome Brunet <jbrunet@baylibre.com> | 2018-08-27 17:21:07 +0300 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2018-08-28 21:53:35 +0300 | 
| commit | 302df2694b97e6a56f7956c1105630809b141ea0 (patch) | |
| tree | 6167770ded11fc58743dd6b4e78372174edf3496 | |
| parent | dadfab7272b13ca441efdb9aa9117bc669680b05 (diff) | |
| download | linux-302df2694b97e6a56f7956c1105630809b141ea0.tar.xz | |
ASoC: meson: axg-tdm: restrict formats depending on slot width
Restrict the formats possible on the TDM interface depending on the width
of the TDM slot and let dpcm merging do the rest.
Fixes: d60e4f1e4be5 ("ASoC: meson: add tdm interface driver")
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
| -rw-r--r-- | sound/soc/meson/axg-tdm-interface.c | 50 | 
1 files changed, 29 insertions, 21 deletions
diff --git a/sound/soc/meson/axg-tdm-interface.c b/sound/soc/meson/axg-tdm-interface.c index 7b8baf46d968..585ce030b79b 100644 --- a/sound/soc/meson/axg-tdm-interface.c +++ b/sound/soc/meson/axg-tdm-interface.c @@ -42,6 +42,7 @@ int axg_tdm_set_tdm_slots(struct snd_soc_dai *dai, u32 *tx_mask,  	struct axg_tdm_stream *rx = (struct axg_tdm_stream *)  		dai->capture_dma_data;  	unsigned int tx_slots, rx_slots; +	unsigned int fmt = 0;  	tx_slots = axg_tdm_slots_total(tx_mask);  	rx_slots = axg_tdm_slots_total(rx_mask); @@ -52,38 +53,45 @@ int axg_tdm_set_tdm_slots(struct snd_soc_dai *dai, u32 *tx_mask,  		return -EINVAL;  	} -	/* -	 * Amend the dai driver channel number and let dpcm channel merge do -	 * its job -	 */ -	if (tx) { -		tx->mask = tx_mask; -		dai->driver->playback.channels_max = tx_slots; -	} - -	if (rx) { -		rx->mask = rx_mask; -		dai->driver->capture.channels_max = rx_slots; -	} -  	iface->slots = slots;  	switch (slot_width) {  	case 0: -		/* defaults width to 32 if not provided */ -		iface->slot_width = 32; -		break; -	case 8: -	case 16: -	case 24: +		slot_width = 32; +		/* Fall-through */  	case 32: -		iface->slot_width = slot_width; +		fmt |= SNDRV_PCM_FMTBIT_S32_LE; +		/* Fall-through */ +	case 24: +		fmt |= SNDRV_PCM_FMTBIT_S24_LE; +		fmt |= SNDRV_PCM_FMTBIT_S20_LE; +		/* Fall-through */ +	case 16: +		fmt |= SNDRV_PCM_FMTBIT_S16_LE; +		/* Fall-through */ +	case 8: +		fmt |= SNDRV_PCM_FMTBIT_S8;  		break;  	default:  		dev_err(dai->dev, "unsupported slot width: %d\n", slot_width);  		return -EINVAL;  	} +	iface->slot_width = slot_width; + +	/* Amend the dai driver and let dpcm merge do its job */ +	if (tx) { +		tx->mask = tx_mask; +		dai->driver->playback.channels_max = tx_slots; +		dai->driver->playback.formats = fmt; +	} + +	if (rx) { +		rx->mask = rx_mask; +		dai->driver->capture.channels_max = rx_slots; +		dai->driver->capture.formats = fmt; +	} +  	return 0;  }  EXPORT_SYMBOL_GPL(axg_tdm_set_tdm_slots);  | 
