> -static int rt1015_hw_params_pll_and_tdm(struct snd_pcm_substream *substream, > - struct snd_pcm_hw_params *params) > -{ > - struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); > - struct snd_soc_dai *codec_dai; > - int i, fs = 100, ret; > - > for_each_rtd_codec_dais(rtd, i, codec_dai) { > ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK, > - params_rate(params) * fs, > + clk_freq, > params_rate(params) * 256); > - if (ret) > + if (ret) { > + dev_err(codec_dai->dev, "fail to set pll, ret %d\n", > + ret); > return ret; > + } > > ret = snd_soc_dai_set_sysclk(codec_dai, RT1015_SCLK_S_PLL, > params_rate(params) * 256, > SND_SOC_CLOCK_IN); > - if (ret) > + if (ret) { > + dev_err(codec_dai->dev, "fail to set sysclk, ret %d\n", > + ret); > return ret; > - } > - /* rx slot 1 for RT1015_DEV0_NAME */ > - ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_codec(rtd, 0), > - 0x0, 0x1, 4, 24); > - if (ret) > - return ret; > + } > > - /* rx slot 2 for RT1015_DEV1_NAME */ > - ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_codec(rtd, 1), > - 0x0, 0x2, 4, 24); > - if (ret) > - return ret; > + switch (dai_link->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) { > + case SND_SOC_DAIFMT_DSP_A: > + case SND_SOC_DAIFMT_DSP_B: > + /* 4-slot TDM */ > + ret = snd_soc_dai_set_tdm_slot(codec_dai, > + rt1015_tdm_mask[i].tx, > + rt1015_tdm_mask[i].rx, > + 4, > + params_width(params)); The changes look ok, just wondering if we can avoid hard-coding those 4 values. Can we not get the number of TDM slots from topology and/or dailink configuration? > + if (ret < 0) { > + dev_err(codec_dai->dev, "fail to set tdm slot, ret %d\n", > + ret); > + return ret; > + } > + break; > + default: > + dev_dbg(codec_dai->dev, "codec is in I2S mode\n"); > + break; > + } > + } > > - return 0; > + return ret;