ASoC: stm32: i2s: improve channel capabilities handling
authorOlivier Moysan <olivier.moysan@st.com>
Mon, 11 Mar 2019 15:26:29 +0000 (16:26 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 11 Mar 2019 16:33:17 +0000 (16:33 +0000)
Use alsa snd_pcm_hw_constraint_single service to manage
channels restriction. This provides better status on driver
limitations, to the application.

Signed-off-by: Olivier Moysan <olivier.moysan@st.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/stm/stm32_i2s.c

index 783b334..06bbbef 100644 (file)
@@ -496,12 +496,6 @@ static int stm32_i2s_configure(struct snd_soc_dai *cpu_dai,
        unsigned int fthlv;
        int ret;
 
-       if ((params_channels(params) == 1) &&
-           ((i2s->fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_DSP_A)) {
-               dev_err(cpu_dai->dev, "Mono mode supported only by DSP_A\n");
-               return -EINVAL;
-       }
-
        switch (format) {
        case 16:
                cfgr = I2S_CGFR_DATLEN_SET(I2S_I2SMOD_DATLEN_16);
@@ -551,6 +545,10 @@ static int stm32_i2s_startup(struct snd_pcm_substream *substream,
        i2s->substream = substream;
        spin_unlock_irqrestore(&i2s->irq_lock, flags);
 
+       if ((i2s->fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_DSP_A)
+               snd_pcm_hw_constraint_single(substream->runtime,
+                                            SNDRV_PCM_HW_PARAM_CHANNELS, 2);
+
        ret = clk_prepare_enable(i2s->i2sclk);
        if (ret < 0) {
                dev_err(cpu_dai->dev, "Failed to enable clock: %d\n", ret);