ASoC: stm32: sai: Move static settings to DAI init
authorOlivier Moysan <olivier.moysan@st.com>
Thu, 19 Oct 2017 13:03:18 +0000 (15:03 +0200)
committerMark Brown <broonie@kernel.org>
Sat, 21 Oct 2017 10:17:49 +0000 (11:17 +0100)
Audio interface direction and protocol settings does not change
at runtime. So, these settings are moved from hw_params
function to dai_probe and set_fmt.

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

index dde8ddf..815ef10 100644 (file)
@@ -308,12 +308,15 @@ static int stm32_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
 static int stm32_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
 {
        struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
-       int cr1 = 0, frcr = 0;
-       int cr1_mask = 0, frcr_mask = 0;
+       int cr1, frcr = 0;
+       int cr1_mask, frcr_mask = 0;
        int ret;
 
        dev_dbg(cpu_dai->dev, "fmt %x\n", fmt);
 
+       cr1_mask = SAI_XCR1_PRTCFG_MASK;
+       cr1 = SAI_XCR1_PRTCFG_SET(SAI_FREE_PROTOCOL);
+
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
        /* SCK active high for all protocols */
        case SND_SOC_DAIFMT_I2S:
@@ -340,7 +343,7 @@ static int stm32_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
                return -EINVAL;
        }
 
-       cr1_mask |= SAI_XCR1_PRTCFG_MASK | SAI_XCR1_CKSTR;
+       cr1_mask |= SAI_XCR1_CKSTR;
        frcr_mask |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSOFF |
                     SAI_XFRCR_FSDEF;
 
@@ -458,7 +461,7 @@ static int stm32_sai_set_config(struct snd_soc_dai *cpu_dai,
                           SAI_XCR2_FTH_SET(STM_SAI_FIFO_TH_HALF));
 
        /* Mode, data format and channel config */
-       cr1 = SAI_XCR1_PRTCFG_SET(SAI_FREE_PROTOCOL);
+       cr1_mask = SAI_XCR1_DS_MASK;
        switch (params_format(params)) {
        case SNDRV_PCM_FORMAT_S8:
                cr1 |= SAI_XCR1_DS_SET(SAI_DATASIZE_8);
@@ -473,11 +476,6 @@ static int stm32_sai_set_config(struct snd_soc_dai *cpu_dai,
                dev_err(cpu_dai->dev, "Data format not supported");
                return -EINVAL;
        }
-       cr1_mask = SAI_XCR1_DS_MASK | SAI_XCR1_PRTCFG_MASK;
-
-       cr1_mask |= SAI_XCR1_RX_TX;
-       if (STM_SAI_IS_CAPTURE(sai))
-               cr1 |= SAI_XCR1_RX_TX;
 
        cr1_mask |= SAI_XCR1_MONO;
        if ((sai->slots == 2) && (params_channels(params) == 1))
@@ -729,6 +727,7 @@ static void stm32_sai_shutdown(struct snd_pcm_substream *substream,
 static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai)
 {
        struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);
+       int cr1 = 0, cr1_mask;
 
        sai->dma_params.addr = (dma_addr_t)(sai->phys_addr + STM_SAI_DR_REGX);
        /*
@@ -745,7 +744,11 @@ static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai)
        else
                snd_soc_dai_init_dma_data(cpu_dai, NULL, &sai->dma_params);
 
-       return 0;
+       cr1_mask = SAI_XCR1_RX_TX;
+       if (STM_SAI_IS_CAPTURE(sai))
+               cr1 |= SAI_XCR1_RX_TX;
+
+       return regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, cr1_mask, cr1);
 }
 
 static const struct snd_soc_dai_ops stm32_sai_pcm_dai_ops = {