1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // MediaTek ALSA SoC Audio DAI TDM Control 4 // 5 // Copyright (c) 2022 MediaTek Inc. 6 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 7 8 #include <linux/regmap.h> 9 #include <sound/pcm_params.h> 10 11 #include "mt8186-afe-clk.h" 12 #include "mt8186-afe-common.h" 13 #include "mt8186-afe-gpio.h" 14 #include "mt8186-interconnection.h" 15 16 #define TDM_HD_EN_W_NAME "TDM_HD_EN" 17 #define TDM_MCLK_EN_W_NAME "TDM_MCLK_EN" 18 #define MTK_AFE_TDM_KCONTROL_NAME "TDM_HD_Mux" 19 20 struct mtk_afe_tdm_priv { 21 unsigned int id; 22 unsigned int rate; /* for determine which apll to use */ 23 unsigned int bck_invert; 24 unsigned int lck_invert; 25 unsigned int lrck_width; 26 unsigned int mclk_id; 27 unsigned int mclk_multiple; /* according to sample rate */ 28 unsigned int mclk_rate; 29 unsigned int mclk_apll; 30 unsigned int tdm_mode; 31 unsigned int data_mode; 32 unsigned int slave_mode; 33 unsigned int low_jitter_en; 34 }; 35 36 enum { 37 TDM_IN_I2S = 0, 38 TDM_IN_LJ = 1, 39 TDM_IN_RJ = 2, 40 TDM_IN_DSP_A = 4, 41 TDM_IN_DSP_B = 5, 42 }; 43 44 enum { 45 TDM_DATA_ONE_PIN = 0, 46 TDM_DATA_MULTI_PIN, 47 }; 48 49 enum { 50 TDM_BCK_NON_INV = 0, 51 TDM_BCK_INV = 1, 52 }; 53 54 enum { 55 TDM_LCK_NON_INV = 0, 56 TDM_LCK_INV = 1, 57 }; 58 59 static unsigned int get_tdm_lrck_width(snd_pcm_format_t format, 60 unsigned int mode) 61 { 62 if (mode == TDM_IN_DSP_A || mode == TDM_IN_DSP_B) 63 return 0; 64 65 return snd_pcm_format_physical_width(format) - 1; 66 } 67 68 static unsigned int get_tdm_ch_fixup(unsigned int channels) 69 { 70 if (channels > 4) 71 return 8; 72 else if (channels > 2) 73 return 4; 74 75 return 2; 76 } 77 78 static unsigned int get_tdm_ch_per_sdata(unsigned int mode, 79 unsigned int channels) 80 { 81 if (mode == TDM_IN_DSP_A || mode == TDM_IN_DSP_B) 82 return get_tdm_ch_fixup(channels); 83 84 return 2; 85 } 86 87 enum { 88 SUPPLY_SEQ_APLL, 89 SUPPLY_SEQ_TDM_MCK_EN, 90 SUPPLY_SEQ_TDM_HD_EN, 91 SUPPLY_SEQ_TDM_EN, 92 }; 93 94 static int get_tdm_id_by_name(const char *name) 95 { 96 return MT8186_DAI_TDM_IN; 97 } 98 99 static int mtk_tdm_en_event(struct snd_soc_dapm_widget *w, 100 struct snd_kcontrol *kcontrol, 101 int event) 102 { 103 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 104 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 105 struct mt8186_afe_private *afe_priv = afe->platform_priv; 106 int dai_id = get_tdm_id_by_name(w->name); 107 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 108 109 if (!tdm_priv) { 110 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 111 return -EINVAL; 112 } 113 114 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n", 115 __func__, w->name, event); 116 117 switch (event) { 118 case SND_SOC_DAPM_PRE_PMU: 119 mt8186_afe_gpio_request(afe->dev, true, tdm_priv->id, 0); 120 break; 121 case SND_SOC_DAPM_POST_PMD: 122 mt8186_afe_gpio_request(afe->dev, false, tdm_priv->id, 0); 123 break; 124 default: 125 break; 126 } 127 128 return 0; 129 } 130 131 static int mtk_tdm_mck_en_event(struct snd_soc_dapm_widget *w, 132 struct snd_kcontrol *kcontrol, 133 int event) 134 { 135 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 136 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 137 struct mt8186_afe_private *afe_priv = afe->platform_priv; 138 int dai_id = get_tdm_id_by_name(w->name); 139 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 140 141 if (!tdm_priv) { 142 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 143 return -EINVAL; 144 } 145 146 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x, dai_id %d\n", 147 __func__, w->name, event, dai_id); 148 149 switch (event) { 150 case SND_SOC_DAPM_PRE_PMU: 151 mt8186_mck_enable(afe, tdm_priv->mclk_id, tdm_priv->mclk_rate); 152 break; 153 case SND_SOC_DAPM_POST_PMD: 154 tdm_priv->mclk_rate = 0; 155 mt8186_mck_disable(afe, tdm_priv->mclk_id); 156 break; 157 default: 158 break; 159 } 160 161 return 0; 162 } 163 164 /* dai component */ 165 /* tdm virtual mux to output widget */ 166 static const char * const tdm_mux_map[] = { 167 "Normal", "Dummy_Widget", 168 }; 169 170 static int tdm_mux_map_value[] = { 171 0, 1, 172 }; 173 174 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(tdm_mux_map_enum, 175 SND_SOC_NOPM, 176 0, 177 1, 178 tdm_mux_map, 179 tdm_mux_map_value); 180 181 static const struct snd_kcontrol_new tdm_in_mux_control = 182 SOC_DAPM_ENUM("TDM In Select", tdm_mux_map_enum); 183 184 static const struct snd_soc_dapm_widget mtk_dai_tdm_widgets[] = { 185 SND_SOC_DAPM_CLOCK_SUPPLY("aud_tdm_clk"), 186 187 SND_SOC_DAPM_SUPPLY_S("TDM_EN", SUPPLY_SEQ_TDM_EN, 188 ETDM_IN1_CON0, ETDM_IN1_CON0_REG_ETDM_IN_EN_SFT, 189 0, mtk_tdm_en_event, 190 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 191 /* tdm hd en */ 192 SND_SOC_DAPM_SUPPLY_S(TDM_HD_EN_W_NAME, SUPPLY_SEQ_TDM_HD_EN, 193 ETDM_IN1_CON2, ETDM_IN1_CON2_REG_CLOCK_SOURCE_SEL_SFT, 194 0, NULL, 195 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 196 197 SND_SOC_DAPM_SUPPLY_S(TDM_MCLK_EN_W_NAME, SUPPLY_SEQ_TDM_MCK_EN, 198 SND_SOC_NOPM, 0, 0, 199 mtk_tdm_mck_en_event, 200 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 201 202 SND_SOC_DAPM_INPUT("TDM_DUMMY_IN"), 203 204 SND_SOC_DAPM_MUX("TDM_In_Mux", 205 SND_SOC_NOPM, 0, 0, &tdm_in_mux_control), 206 }; 207 208 static int mtk_afe_tdm_mclk_connect(struct snd_soc_dapm_widget *source, 209 struct snd_soc_dapm_widget *sink) 210 { 211 struct snd_soc_dapm_widget *w = sink; 212 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 213 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 214 struct mt8186_afe_private *afe_priv = afe->platform_priv; 215 int dai_id = get_tdm_id_by_name(w->name); 216 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 217 218 if (!tdm_priv) { 219 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 220 return 0; 221 } 222 223 return (tdm_priv->mclk_rate > 0) ? 1 : 0; 224 } 225 226 static int mtk_afe_tdm_mclk_apll_connect(struct snd_soc_dapm_widget *source, 227 struct snd_soc_dapm_widget *sink) 228 { 229 struct snd_soc_dapm_widget *w = sink; 230 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 231 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 232 struct mt8186_afe_private *afe_priv = afe->platform_priv; 233 int dai_id = get_tdm_id_by_name(w->name); 234 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 235 int cur_apll; 236 237 /* which apll */ 238 cur_apll = mt8186_get_apll_by_name(afe, source->name); 239 240 return (tdm_priv->mclk_apll == cur_apll) ? 1 : 0; 241 } 242 243 static int mtk_afe_tdm_hd_connect(struct snd_soc_dapm_widget *source, 244 struct snd_soc_dapm_widget *sink) 245 { 246 struct snd_soc_dapm_widget *w = sink; 247 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 248 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 249 struct mt8186_afe_private *afe_priv = afe->platform_priv; 250 int dai_id = get_tdm_id_by_name(w->name); 251 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 252 253 if (!tdm_priv) { 254 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 255 return 0; 256 } 257 258 return tdm_priv->low_jitter_en; 259 } 260 261 static int mtk_afe_tdm_apll_connect(struct snd_soc_dapm_widget *source, 262 struct snd_soc_dapm_widget *sink) 263 { 264 struct snd_soc_dapm_widget *w = sink; 265 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 266 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 267 struct mt8186_afe_private *afe_priv = afe->platform_priv; 268 int dai_id = get_tdm_id_by_name(w->name); 269 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 270 int cur_apll; 271 int tdm_need_apll; 272 273 if (!tdm_priv) { 274 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 275 return 0; 276 } 277 278 /* which apll */ 279 cur_apll = mt8186_get_apll_by_name(afe, source->name); 280 281 /* choose APLL from tdm rate */ 282 tdm_need_apll = mt8186_get_apll_by_rate(afe, tdm_priv->rate); 283 284 return (tdm_need_apll == cur_apll) ? 1 : 0; 285 } 286 287 /* low jitter control */ 288 static const char * const mt8186_tdm_hd_str[] = { 289 "Normal", "Low_Jitter" 290 }; 291 292 static const struct soc_enum mt8186_tdm_enum[] = { 293 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mt8186_tdm_hd_str), 294 mt8186_tdm_hd_str), 295 }; 296 297 static int mt8186_tdm_hd_get(struct snd_kcontrol *kcontrol, 298 struct snd_ctl_elem_value *ucontrol) 299 { 300 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 301 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 302 struct mt8186_afe_private *afe_priv = afe->platform_priv; 303 int dai_id = get_tdm_id_by_name(kcontrol->id.name); 304 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 305 306 if (!tdm_priv) { 307 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 308 return -EINVAL; 309 } 310 311 ucontrol->value.integer.value[0] = tdm_priv->low_jitter_en; 312 313 return 0; 314 } 315 316 static int mt8186_tdm_hd_set(struct snd_kcontrol *kcontrol, 317 struct snd_ctl_elem_value *ucontrol) 318 { 319 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 320 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 321 struct mt8186_afe_private *afe_priv = afe->platform_priv; 322 int dai_id = get_tdm_id_by_name(kcontrol->id.name); 323 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id]; 324 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 325 int hd_en; 326 327 if (ucontrol->value.enumerated.item[0] >= e->items) 328 return -EINVAL; 329 330 hd_en = ucontrol->value.integer.value[0]; 331 332 dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n", 333 __func__, kcontrol->id.name, hd_en); 334 335 if (!tdm_priv) { 336 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 337 return -EINVAL; 338 } 339 340 if (tdm_priv->low_jitter_en == hd_en) 341 return 0; 342 343 tdm_priv->low_jitter_en = hd_en; 344 345 return 1; 346 } 347 348 static const struct snd_kcontrol_new mtk_dai_tdm_controls[] = { 349 SOC_ENUM_EXT(MTK_AFE_TDM_KCONTROL_NAME, mt8186_tdm_enum[0], 350 mt8186_tdm_hd_get, mt8186_tdm_hd_set), 351 }; 352 353 static const struct snd_soc_dapm_route mtk_dai_tdm_routes[] = { 354 {"TDM IN", NULL, "aud_tdm_clk"}, 355 {"TDM IN", NULL, "TDM_EN"}, 356 {"TDM IN", NULL, TDM_HD_EN_W_NAME, mtk_afe_tdm_hd_connect}, 357 {TDM_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_tdm_apll_connect}, 358 {TDM_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_tdm_apll_connect}, 359 360 {"TDM IN", NULL, TDM_MCLK_EN_W_NAME, mtk_afe_tdm_mclk_connect}, 361 {TDM_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_tdm_mclk_apll_connect}, 362 {TDM_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_tdm_mclk_apll_connect}, 363 364 /* allow tdm on without codec on */ 365 {"TDM IN", NULL, "TDM_In_Mux"}, 366 {"TDM_In_Mux", "Dummy_Widget", "TDM_DUMMY_IN"}, 367 }; 368 369 /* dai ops */ 370 static int mtk_dai_tdm_cal_mclk(struct mtk_base_afe *afe, 371 struct mtk_afe_tdm_priv *tdm_priv, 372 int freq) 373 { 374 int apll; 375 int apll_rate; 376 377 apll = mt8186_get_apll_by_rate(afe, freq); 378 apll_rate = mt8186_get_apll_rate(afe, apll); 379 380 if (!freq || freq > apll_rate) { 381 dev_err(afe->dev, 382 "%s(), freq(%d Hz) invalid\n", __func__, freq); 383 return -EINVAL; 384 } 385 386 if (apll_rate % freq != 0) { 387 dev_err(afe->dev, 388 "%s(), APLL cannot generate %d Hz", __func__, freq); 389 return -EINVAL; 390 } 391 392 tdm_priv->mclk_rate = freq; 393 tdm_priv->mclk_apll = apll; 394 395 return 0; 396 } 397 398 static int mtk_dai_tdm_hw_params(struct snd_pcm_substream *substream, 399 struct snd_pcm_hw_params *params, 400 struct snd_soc_dai *dai) 401 { 402 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 403 struct mt8186_afe_private *afe_priv = afe->platform_priv; 404 int tdm_id = dai->id; 405 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[tdm_id]; 406 unsigned int tdm_mode = tdm_priv->tdm_mode; 407 unsigned int data_mode = tdm_priv->data_mode; 408 unsigned int rate = params_rate(params); 409 unsigned int channels = params_channels(params); 410 snd_pcm_format_t format = params_format(params); 411 unsigned int bit_width = 412 snd_pcm_format_physical_width(format); 413 unsigned int tdm_channels = (data_mode == TDM_DATA_ONE_PIN) ? 414 get_tdm_ch_per_sdata(tdm_mode, channels) : 2; 415 unsigned int lrck_width = 416 get_tdm_lrck_width(format, tdm_mode); 417 unsigned int tdm_con = 0; 418 bool slave_mode = tdm_priv->slave_mode; 419 bool lrck_inv = tdm_priv->lck_invert; 420 bool bck_inv = tdm_priv->bck_invert; 421 unsigned int tran_rate; 422 unsigned int tran_relatch_rate; 423 424 if (!tdm_priv) { 425 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 426 return -EINVAL; 427 } 428 429 tdm_priv->rate = rate; 430 431 tran_rate = mt8186_rate_transform(afe->dev, rate, dai->id); 432 tran_relatch_rate = mt8186_tdm_relatch_rate_transform(afe->dev, rate); 433 434 /* calculate mclk_rate, if not set explicitly */ 435 if (!tdm_priv->mclk_rate) { 436 tdm_priv->mclk_rate = rate * tdm_priv->mclk_multiple; 437 mtk_dai_tdm_cal_mclk(afe, 438 tdm_priv, 439 tdm_priv->mclk_rate); 440 } 441 442 /* ETDM_IN1_CON0 */ 443 tdm_con |= slave_mode << ETDM_IN1_CON0_REG_SLAVE_MODE_SFT; 444 tdm_con |= tdm_mode << ETDM_IN1_CON0_REG_FMT_SFT; 445 tdm_con |= (bit_width - 1) << ETDM_IN1_CON0_REG_BIT_LENGTH_SFT; 446 tdm_con |= (bit_width - 1) << ETDM_IN1_CON0_REG_WORD_LENGTH_SFT; 447 tdm_con |= (tdm_channels - 1) << ETDM_IN1_CON0_REG_CH_NUM_SFT; 448 /* need to disable sync mode otherwise this may cause latch data error */ 449 tdm_con |= 0 << ETDM_IN1_CON0_REG_SYNC_MODE_SFT; 450 /* relatch 1x en clock fix to h26m */ 451 tdm_con |= 0 << ETDM_IN1_CON0_REG_RELATCH_1X_EN_SEL_DOMAIN_SFT; 452 regmap_update_bits(afe->regmap, ETDM_IN1_CON0, ETDM_IN_CON0_CTRL_MASK, tdm_con); 453 454 /* ETDM_IN1_CON1 */ 455 tdm_con = 0; 456 tdm_con |= 0 << ETDM_IN1_CON1_REG_LRCK_AUTO_MODE_SFT; 457 tdm_con |= 1 << ETDM_IN1_CON1_PINMUX_MCLK_CTRL_OE_SFT; 458 tdm_con |= (lrck_width - 1) << ETDM_IN1_CON1_REG_LRCK_WIDTH_SFT; 459 regmap_update_bits(afe->regmap, ETDM_IN1_CON1, ETDM_IN_CON1_CTRL_MASK, tdm_con); 460 461 /* ETDM_IN1_CON3 */ 462 tdm_con = 0; 463 tdm_con = ETDM_IN_CON3_FS(tran_rate); 464 regmap_update_bits(afe->regmap, ETDM_IN1_CON3, ETDM_IN_CON3_CTRL_MASK, tdm_con); 465 466 /* ETDM_IN1_CON4 */ 467 tdm_con = 0; 468 tdm_con = ETDM_IN_CON4_FS(tran_relatch_rate); 469 if (slave_mode) { 470 if (lrck_inv) 471 tdm_con |= ETDM_IN_CON4_CON0_SLAVE_LRCK_INV; 472 if (bck_inv) 473 tdm_con |= ETDM_IN_CON4_CON0_SLAVE_BCK_INV; 474 } else { 475 if (lrck_inv) 476 tdm_con |= ETDM_IN_CON4_CON0_MASTER_LRCK_INV; 477 if (bck_inv) 478 tdm_con |= ETDM_IN_CON4_CON0_MASTER_BCK_INV; 479 } 480 regmap_update_bits(afe->regmap, ETDM_IN1_CON4, ETDM_IN_CON4_CTRL_MASK, tdm_con); 481 482 /* ETDM_IN1_CON2 */ 483 tdm_con = 0; 484 if (data_mode == TDM_DATA_MULTI_PIN) { 485 tdm_con |= ETDM_IN_CON2_MULTI_IP_2CH_MODE; 486 tdm_con |= ETDM_IN_CON2_MULTI_IP_CH(channels); 487 } 488 regmap_update_bits(afe->regmap, ETDM_IN1_CON2, ETDM_IN_CON2_CTRL_MASK, tdm_con); 489 490 /* ETDM_IN1_CON8 */ 491 tdm_con = 0; 492 if (slave_mode) { 493 tdm_con |= 1 << ETDM_IN1_CON8_REG_ETDM_USE_AFIFO_SFT; 494 tdm_con |= 0 << ETDM_IN1_CON8_REG_AFIFO_CLOCK_DOMAIN_SEL_SFT; 495 tdm_con |= ETDM_IN_CON8_FS(tran_relatch_rate); 496 } else { 497 tdm_con |= 0 << ETDM_IN1_CON8_REG_ETDM_USE_AFIFO_SFT; 498 } 499 regmap_update_bits(afe->regmap, ETDM_IN1_CON8, ETDM_IN_CON8_CTRL_MASK, tdm_con); 500 501 return 0; 502 } 503 504 static int mtk_dai_tdm_set_sysclk(struct snd_soc_dai *dai, 505 int clk_id, unsigned int freq, int dir) 506 { 507 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev); 508 struct mt8186_afe_private *afe_priv = afe->platform_priv; 509 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id]; 510 511 if (!tdm_priv) { 512 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 513 return -EINVAL; 514 } 515 516 if (dir != SND_SOC_CLOCK_IN) { 517 dev_err(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__); 518 return -EINVAL; 519 } 520 521 dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq); 522 523 return mtk_dai_tdm_cal_mclk(afe, tdm_priv, freq); 524 } 525 526 static int mtk_dai_tdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) 527 { 528 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev); 529 struct mt8186_afe_private *afe_priv = afe->platform_priv; 530 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id]; 531 532 if (!tdm_priv) { 533 dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__); 534 return -EINVAL; 535 } 536 537 /* DAI mode*/ 538 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 539 case SND_SOC_DAIFMT_I2S: 540 tdm_priv->tdm_mode = TDM_IN_I2S; 541 tdm_priv->data_mode = TDM_DATA_MULTI_PIN; 542 break; 543 case SND_SOC_DAIFMT_LEFT_J: 544 tdm_priv->tdm_mode = TDM_IN_LJ; 545 tdm_priv->data_mode = TDM_DATA_MULTI_PIN; 546 break; 547 case SND_SOC_DAIFMT_RIGHT_J: 548 tdm_priv->tdm_mode = TDM_IN_RJ; 549 tdm_priv->data_mode = TDM_DATA_MULTI_PIN; 550 break; 551 case SND_SOC_DAIFMT_DSP_A: 552 tdm_priv->tdm_mode = TDM_IN_DSP_A; 553 tdm_priv->data_mode = TDM_DATA_ONE_PIN; 554 break; 555 case SND_SOC_DAIFMT_DSP_B: 556 tdm_priv->tdm_mode = TDM_IN_DSP_B; 557 tdm_priv->data_mode = TDM_DATA_ONE_PIN; 558 break; 559 default: 560 dev_err(afe->dev, "%s(), invalid DAIFMT_FORMAT_MASK", __func__); 561 return -EINVAL; 562 } 563 564 /* DAI clock inversion*/ 565 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 566 case SND_SOC_DAIFMT_NB_NF: 567 tdm_priv->bck_invert = TDM_BCK_NON_INV; 568 tdm_priv->lck_invert = TDM_LCK_NON_INV; 569 break; 570 case SND_SOC_DAIFMT_NB_IF: 571 tdm_priv->bck_invert = TDM_BCK_NON_INV; 572 tdm_priv->lck_invert = TDM_LCK_INV; 573 break; 574 case SND_SOC_DAIFMT_IB_NF: 575 tdm_priv->bck_invert = TDM_BCK_INV; 576 tdm_priv->lck_invert = TDM_LCK_NON_INV; 577 break; 578 case SND_SOC_DAIFMT_IB_IF: 579 tdm_priv->bck_invert = TDM_BCK_INV; 580 tdm_priv->lck_invert = TDM_LCK_INV; 581 break; 582 default: 583 dev_err(afe->dev, "%s(), invalid DAIFMT_INV_MASK", __func__); 584 return -EINVAL; 585 } 586 587 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 588 case SND_SOC_DAIFMT_BP_FP: 589 tdm_priv->slave_mode = false; 590 break; 591 case SND_SOC_DAIFMT_BC_FC: 592 tdm_priv->slave_mode = true; 593 break; 594 default: 595 dev_err(afe->dev, "%s(), invalid DAIFMT_CLOCK_PROVIDER_MASK", 596 __func__); 597 return -EINVAL; 598 } 599 600 return 0; 601 } 602 603 static int mtk_dai_tdm_set_tdm_slot(struct snd_soc_dai *dai, 604 unsigned int tx_mask, 605 unsigned int rx_mask, 606 int slots, 607 int slot_width) 608 { 609 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev); 610 struct mt8186_afe_private *afe_priv = afe->platform_priv; 611 struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id]; 612 613 dev_dbg(dai->dev, "%s %d slot_width %d\n", __func__, dai->id, slot_width); 614 615 tdm_priv->lrck_width = slot_width; 616 617 return 0; 618 } 619 620 static const struct snd_soc_dai_ops mtk_dai_tdm_ops = { 621 .hw_params = mtk_dai_tdm_hw_params, 622 .set_sysclk = mtk_dai_tdm_set_sysclk, 623 .set_fmt = mtk_dai_tdm_set_fmt, 624 .set_tdm_slot = mtk_dai_tdm_set_tdm_slot, 625 }; 626 627 /* dai driver */ 628 #define MTK_TDM_RATES (SNDRV_PCM_RATE_8000_48000 |\ 629 SNDRV_PCM_RATE_88200 |\ 630 SNDRV_PCM_RATE_96000 |\ 631 SNDRV_PCM_RATE_176400 |\ 632 SNDRV_PCM_RATE_192000) 633 634 #define MTK_TDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 635 SNDRV_PCM_FMTBIT_S24_LE |\ 636 SNDRV_PCM_FMTBIT_S32_LE) 637 638 static struct snd_soc_dai_driver mtk_dai_tdm_driver[] = { 639 { 640 .name = "TDM IN", 641 .id = MT8186_DAI_TDM_IN, 642 .capture = { 643 .stream_name = "TDM IN", 644 .channels_min = 2, 645 .channels_max = 8, 646 .rates = MTK_TDM_RATES, 647 .formats = MTK_TDM_FORMATS, 648 }, 649 .ops = &mtk_dai_tdm_ops, 650 }, 651 }; 652 653 static struct mtk_afe_tdm_priv *init_tdm_priv_data(struct mtk_base_afe *afe) 654 { 655 struct mtk_afe_tdm_priv *tdm_priv; 656 657 tdm_priv = devm_kzalloc(afe->dev, sizeof(struct mtk_afe_tdm_priv), 658 GFP_KERNEL); 659 if (!tdm_priv) 660 return NULL; 661 662 tdm_priv->mclk_multiple = 512; 663 tdm_priv->mclk_id = MT8186_TDM_MCK; 664 tdm_priv->id = MT8186_DAI_TDM_IN; 665 666 return tdm_priv; 667 } 668 669 int mt8186_dai_tdm_register(struct mtk_base_afe *afe) 670 { 671 struct mt8186_afe_private *afe_priv = afe->platform_priv; 672 struct mtk_afe_tdm_priv *tdm_priv; 673 struct mtk_base_afe_dai *dai; 674 675 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 676 if (!dai) 677 return -ENOMEM; 678 679 list_add(&dai->list, &afe->sub_dais); 680 681 dai->dai_drivers = mtk_dai_tdm_driver; 682 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_tdm_driver); 683 684 dai->controls = mtk_dai_tdm_controls; 685 dai->num_controls = ARRAY_SIZE(mtk_dai_tdm_controls); 686 dai->dapm_widgets = mtk_dai_tdm_widgets; 687 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_tdm_widgets); 688 dai->dapm_routes = mtk_dai_tdm_routes; 689 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_tdm_routes); 690 691 tdm_priv = init_tdm_priv_data(afe); 692 if (!tdm_priv) 693 return -ENOMEM; 694 695 afe_priv->dai_priv[MT8186_DAI_TDM_IN] = tdm_priv; 696 697 return 0; 698 } 699