diff options
| -rw-r--r-- | sound/soc/codecs/rt5665.c | 114 |
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 | ||
| 3967 | static 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 | |||
| 3967 | static int rt5665_hw_params(struct snd_pcm_substream *substream, | 4023 | static 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 | ||
| 4230 | static 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 | |||
| 4285 | static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) | 4289 | static 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; |
