aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/rt5665.c114
1 files changed, 59 insertions, 55 deletions
diff --git a/sound/soc/codecs/rt5665.c b/sound/soc/codecs/rt5665.c
index de2c104bbaf3..b8c50ed72396 100644
--- a/sound/soc/codecs/rt5665.c
+++ b/sound/soc/codecs/rt5665.c
@@ -3964,6 +3964,62 @@ static const struct snd_soc_dapm_route rt5665_dapm_routes[] = {
3964 {"PDMR", NULL, "PDM R Playback"}, 3964 {"PDMR", NULL, "PDM R Playback"},
3965}; 3965};
3966 3966
3967static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
3968 unsigned int rx_mask, int slots, int slot_width)
3969{
3970 struct snd_soc_codec *codec = dai->codec;
3971 unsigned int val = 0;
3972
3973 if (rx_mask || tx_mask)
3974 val |= RT5665_I2S1_MODE_TDM;
3975
3976 switch (slots) {
3977 case 4:
3978 val |= RT5665_TDM_IN_CH_4;
3979 val |= RT5665_TDM_OUT_CH_4;
3980 break;
3981 case 6:
3982 val |= RT5665_TDM_IN_CH_6;
3983 val |= RT5665_TDM_OUT_CH_6;
3984 break;
3985 case 8:
3986 val |= RT5665_TDM_IN_CH_8;
3987 val |= RT5665_TDM_OUT_CH_8;
3988 break;
3989 case 2:
3990 break;
3991 default:
3992 return -EINVAL;
3993 }
3994
3995 switch (slot_width) {
3996 case 20:
3997 val |= RT5665_TDM_IN_LEN_20;
3998 val |= RT5665_TDM_OUT_LEN_20;
3999 break;
4000 case 24:
4001 val |= RT5665_TDM_IN_LEN_24;
4002 val |= RT5665_TDM_OUT_LEN_24;
4003 break;
4004 case 32:
4005 val |= RT5665_TDM_IN_LEN_32;
4006 val |= RT5665_TDM_OUT_LEN_32;
4007 break;
4008 case 16:
4009 break;
4010 default:
4011 return -EINVAL;
4012 }
4013
4014 snd_soc_update_bits(codec, RT5665_TDM_CTRL_1,
4015 RT5665_I2S1_MODE_MASK | RT5665_TDM_IN_CH_MASK |
4016 RT5665_TDM_OUT_CH_MASK | RT5665_TDM_IN_LEN_MASK |
4017 RT5665_TDM_OUT_LEN_MASK, val);
4018
4019 return 0;
4020}
4021
4022
3967static int rt5665_hw_params(struct snd_pcm_substream *substream, 4023static int rt5665_hw_params(struct snd_pcm_substream *substream,
3968 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 4024 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
3969{ 4025{
@@ -4010,6 +4066,9 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream,
4010 switch (dai->id) { 4066 switch (dai->id) {
4011 case RT5665_AIF1_1: 4067 case RT5665_AIF1_1:
4012 case RT5665_AIF1_2: 4068 case RT5665_AIF1_2:
4069 if (params_channels(params) > 2)
4070 rt5665_set_tdm_slot(dai, 0xf, 0xf,
4071 params_channels(params), params_width(params));
4013 mask_clk = RT5665_I2S_PD1_MASK; 4072 mask_clk = RT5665_I2S_PD1_MASK;
4014 val_clk = pre_div << RT5665_I2S_PD1_SFT; 4073 val_clk = pre_div << RT5665_I2S_PD1_SFT;
4015 snd_soc_update_bits(codec, RT5665_I2S1_SDP, 4074 snd_soc_update_bits(codec, RT5665_I2S1_SDP,
@@ -4227,61 +4286,6 @@ static int rt5665_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int Source,
4227 return 0; 4286 return 0;
4228} 4287}
4229 4288
4230static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
4231 unsigned int rx_mask, int slots, int slot_width)
4232{
4233 struct snd_soc_codec *codec = dai->codec;
4234 unsigned int val = 0;
4235
4236 if (rx_mask || tx_mask)
4237 val |= RT5665_I2S1_MODE_TDM;
4238
4239 switch (slots) {
4240 case 4:
4241 val |= RT5665_TDM_IN_CH_4;
4242 val |= RT5665_TDM_OUT_CH_4;
4243 break;
4244 case 6:
4245 val |= RT5665_TDM_IN_CH_6;
4246 val |= RT5665_TDM_OUT_CH_6;
4247 break;
4248 case 8:
4249 val |= RT5665_TDM_IN_CH_8;
4250 val |= RT5665_TDM_OUT_CH_8;
4251 break;
4252 case 2:
4253 break;
4254 default:
4255 return -EINVAL;
4256 }
4257
4258 switch (slot_width) {
4259 case 20:
4260 val |= RT5665_TDM_IN_LEN_20;
4261 val |= RT5665_TDM_OUT_LEN_20;
4262 break;
4263 case 24:
4264 val |= RT5665_TDM_IN_LEN_24;
4265 val |= RT5665_TDM_OUT_LEN_24;
4266 break;
4267 case 32:
4268 val |= RT5665_TDM_IN_LEN_32;
4269 val |= RT5665_TDM_OUT_LEN_32;
4270 break;
4271 case 16:
4272 break;
4273 default:
4274 return -EINVAL;
4275 }
4276
4277 snd_soc_update_bits(codec, RT5665_TDM_CTRL_1,
4278 RT5665_I2S1_MODE_MASK | RT5665_TDM_IN_CH_MASK |
4279 RT5665_TDM_OUT_CH_MASK | RT5665_TDM_IN_LEN_MASK |
4280 RT5665_TDM_OUT_LEN_MASK, val);
4281
4282 return 0;
4283}
4284
4285static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) 4289static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
4286{ 4290{
4287 struct snd_soc_codec *codec = dai->codec; 4291 struct snd_soc_codec *codec = dai->codec;