On 5/21/20 11:25 AM, Lukasz Majczak wrote:
Split be_hw_params_fixup function for different codecs as current common
function, leads to crash while trying to get snd_soc_dpcm with
container_of() macro in kabylake_ssp_fixup().
The crash call path looks as below:
soc_pcm_hw_params()
snd_soc_dai_hw_params(codec_dai, substream, &codec_params);
rtd->dai_link->be_hw_params_fixup(rtd, params)
kabylake_ssp_fixup()
In this case, codec_params is just a copy of an internal structure and is
not embedded into struct snd_soc_dpcm thus we cannot use
container_of() on it.

v1 -> v2:
- Extract dmic from SSP0 as every BE should have own fixup function.
v2 -> v3:
- Restore naming in the dapm route table to not confuse with other
drivers
- Fixed indentations

you need the changelog to be below the --- marker two lines down.


Signed-off-by: Lukasz Majczak <l...@semihalf.com>
---

[...]

+static int kabylake_dmic01_hw_params(struct snd_pcm_substream *substream,
+       struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       int ret = 0;
+
+       ret = snd_soc_dai_set_tdm_slot(rtd->codec_dai, 0xF, 0, 8, 16);
+       if (ret < 0) {
+               dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dai_set_sysclk(rtd->codec_dai,
+               RT5514_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
+       if (ret < 0) {
+               dev_err(rtd->dev, "set sysclk err: %d\n", ret);
+               return ret;
+       }
+
+       return ret;
+}
+
  static struct snd_soc_ops kabylake_ssp0_ops = {
        .hw_params = kabylake_ssp0_hw_params,
  };
+static struct snd_soc_ops kabylake_dmic01_ops = {
+       .hw_params = kabylake_dmic01_hw_params,
+};
+
  static const unsigned int channels_dmic[] = {
        4,
  };
@@ -507,14 +528,19 @@ SND_SOC_DAILINK_DEF(ssp0_pin,
  SND_SOC_DAILINK_DEF(ssp0_codec,
        DAILINK_COMP_ARRAY(
        /* Left */ COMP_CODEC(MAXIM_DEV0_NAME, KBL_MAXIM_CODEC_DAI),
-       /* Right */COMP_CODEC(MAXIM_DEV1_NAME, KBL_MAXIM_CODEC_DAI),
-       /* dmic */ COMP_CODEC(RT5514_DEV_NAME, KBL_REALTEK_DMIC_CODEC_DAI)));
+       /* Right */COMP_CODEC(MAXIM_DEV1_NAME, KBL_MAXIM_CODEC_DAI)));
SND_SOC_DAILINK_DEF(ssp1_pin,
        DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin")));
  SND_SOC_DAILINK_DEF(ssp1_codec,
        DAILINK_COMP_ARRAY(COMP_CODEC(RT5663_DEV_NAME, KBL_REALTEK_CODEC_DAI)));
+SND_SOC_DAILINK_DEF(dmic01_pin,
+       DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
+SND_SOC_DAILINK_DEF(dmic01_codec,
+       DAILINK_COMP_ARRAY(
+               COMP_CODEC(RT5514_DEV_NAME, KBL_REALTEK_DMIC_CODEC_DAI)));
+
  SND_SOC_DAILINK_DEF(idisp1_pin,
        DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
  SND_SOC_DAILINK_DEF(idisp1_codec,
@@ -618,9 +644,8 @@ static struct snd_soc_dai_link kabylake_dais[] = {
                        SND_SOC_DAIFMT_NB_NF |
                        SND_SOC_DAIFMT_CBS_CFS,
                .ignore_pmdown_time = 1,
-               .be_hw_params_fixup = kabylake_ssp_fixup,
+               .be_hw_params_fixup = kabylake_ssp0_fixup,
                .dpcm_playback = 1,
-               .dpcm_capture = 1,
                .ops = &kabylake_ssp0_ops,
                SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform),
        },
@@ -632,12 +657,25 @@ static struct snd_soc_dai_link kabylake_dais[] = {
                .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
                        SND_SOC_DAIFMT_CBS_CFS,
                .ignore_pmdown_time = 1,
-               .be_hw_params_fixup = kabylake_ssp_fixup,
+               .be_hw_params_fixup = kabylake_ssp1_fixup,
                .ops = &kabylake_rt5663_ops,
                .dpcm_playback = 1,
                .dpcm_capture = 1,
                SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform),
        },
+       {
+               .name = "dmic01",
+               .id = 2,
+               .no_pcm = 1,
+               .dai_fmt = SND_SOC_DAIFMT_DSP_B |
+                       SND_SOC_DAIFMT_NB_NF |
+                       SND_SOC_DAIFMT_CBS_CFS,
+               .ignore_pmdown_time = 1,
+               .be_hw_params_fixup = kabylake_dmic_fixup,
+               .dpcm_capture = 1,
+               .ops = &kabylake_dmic01_ops,
+               SND_SOC_DAILINK_REG(dmic01_pin, dmic01_codec, platform),
+       },

don't add a new dailink, this is not right.

        {
                .name = "iDisp1",
                .id = 3,

base-commit: a4f6fc98cd2fa1774bcaeb248c67156ef9402a56

Reply via email to