13 Sep
2022
13 Sep
'22
10:07 a.m.
-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;