1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * MediaTek ALSA SoC Audio DAI eTDM Control 4 * 5 * Copyright (c) 2021 MediaTek Inc. 6 * Author: Bicycle Tsai <bicycle.tsai@mediatek.com> 7 * Trevor Wu <trevor.wu@mediatek.com> 8 */ 9 10 #include <linux/delay.h> 11 #include <linux/pm_runtime.h> 12 #include <linux/regmap.h> 13 #include <sound/pcm_params.h> 14 #include "mt8195-afe-clk.h" 15 #include "mt8195-afe-common.h" 16 #include "mt8195-reg.h" 17 18 #define MT8195_ETDM_MAX_CHANNELS 24 19 #define MT8195_ETDM_NORMAL_MAX_BCK_RATE 24576000 20 #define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START) 21 #define ENUM_TO_STR(x) #x 22 23 enum { 24 MTK_DAI_ETDM_FORMAT_I2S = 0, 25 MTK_DAI_ETDM_FORMAT_LJ, 26 MTK_DAI_ETDM_FORMAT_RJ, 27 MTK_DAI_ETDM_FORMAT_EIAJ, 28 MTK_DAI_ETDM_FORMAT_DSPA, 29 MTK_DAI_ETDM_FORMAT_DSPB, 30 }; 31 32 enum { 33 MTK_DAI_ETDM_DATA_ONE_PIN = 0, 34 MTK_DAI_ETDM_DATA_MULTI_PIN, 35 }; 36 37 enum { 38 ETDM_IN, 39 ETDM_OUT, 40 }; 41 42 enum { 43 ETDM_IN_FROM_PAD, 44 ETDM_IN_FROM_ETDM_OUT1, 45 ETDM_IN_FROM_ETDM_OUT2, 46 }; 47 48 enum { 49 ETDM_IN_SLAVE_FROM_PAD, 50 ETDM_IN_SLAVE_FROM_ETDM_OUT1, 51 ETDM_IN_SLAVE_FROM_ETDM_OUT2, 52 }; 53 54 enum { 55 ETDM_OUT_SLAVE_FROM_PAD, 56 ETDM_OUT_SLAVE_FROM_ETDM_IN1, 57 ETDM_OUT_SLAVE_FROM_ETDM_IN2, 58 }; 59 60 enum { 61 COWORK_ETDM_NONE = 0, 62 COWORK_ETDM_IN1_M = 2, 63 COWORK_ETDM_IN1_S = 3, 64 COWORK_ETDM_IN2_M = 4, 65 COWORK_ETDM_IN2_S = 5, 66 COWORK_ETDM_OUT1_M = 10, 67 COWORK_ETDM_OUT1_S = 11, 68 COWORK_ETDM_OUT2_M = 12, 69 COWORK_ETDM_OUT2_S = 13, 70 COWORK_ETDM_OUT3_M = 14, 71 COWORK_ETDM_OUT3_S = 15, 72 }; 73 74 enum { 75 ETDM_RELATCH_TIMING_A1A2SYS, 76 ETDM_RELATCH_TIMING_A3SYS, 77 ETDM_RELATCH_TIMING_A4SYS, 78 }; 79 80 enum { 81 ETDM_SYNC_NONE, 82 ETDM_SYNC_FROM_IN1, 83 ETDM_SYNC_FROM_IN2, 84 ETDM_SYNC_FROM_OUT1, 85 ETDM_SYNC_FROM_OUT2, 86 ETDM_SYNC_FROM_OUT3, 87 }; 88 89 struct etdm_con_reg { 90 unsigned int con0; 91 unsigned int con1; 92 unsigned int con2; 93 unsigned int con3; 94 unsigned int con4; 95 unsigned int con5; 96 }; 97 98 struct mtk_dai_etdm_rate { 99 unsigned int rate; 100 unsigned int reg_value; 101 }; 102 103 struct mtk_dai_etdm_priv { 104 unsigned int clock_mode; 105 unsigned int data_mode; 106 bool slave_mode; 107 bool lrck_inv; 108 bool bck_inv; 109 unsigned int format; 110 unsigned int slots; 111 unsigned int lrck_width; 112 unsigned int mclk_freq; 113 unsigned int mclk_apll; 114 unsigned int mclk_dir; 115 int cowork_source_id; //dai id 116 unsigned int cowork_slv_count; 117 int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1]; //dai_id 118 bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS]; 119 unsigned int en_ref_cnt; 120 }; 121 122 static const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = { 123 { .rate = 8000, .reg_value = 0, }, 124 { .rate = 12000, .reg_value = 1, }, 125 { .rate = 16000, .reg_value = 2, }, 126 { .rate = 24000, .reg_value = 3, }, 127 { .rate = 32000, .reg_value = 4, }, 128 { .rate = 48000, .reg_value = 5, }, 129 { .rate = 96000, .reg_value = 7, }, 130 { .rate = 192000, .reg_value = 9, }, 131 { .rate = 384000, .reg_value = 11, }, 132 { .rate = 11025, .reg_value = 16, }, 133 { .rate = 22050, .reg_value = 17, }, 134 { .rate = 44100, .reg_value = 18, }, 135 { .rate = 88200, .reg_value = 19, }, 136 { .rate = 176400, .reg_value = 20, }, 137 { .rate = 352800, .reg_value = 21, }, 138 }; 139 140 static bool mt8195_afe_etdm_is_valid(int id) 141 { 142 switch (id) { 143 case MT8195_AFE_IO_ETDM1_IN: 144 fallthrough; 145 case MT8195_AFE_IO_ETDM2_IN: 146 fallthrough; 147 case MT8195_AFE_IO_ETDM1_OUT: 148 fallthrough; 149 case MT8195_AFE_IO_ETDM2_OUT: 150 fallthrough; 151 case MT8195_AFE_IO_DPTX: 152 fallthrough; 153 case MT8195_AFE_IO_ETDM3_OUT: 154 return true; 155 default: 156 return false; 157 } 158 } 159 160 static bool mt8195_afe_hdmitx_dptx_is_valid(int id) 161 { 162 switch (id) { 163 case MT8195_AFE_IO_DPTX: 164 fallthrough; 165 case MT8195_AFE_IO_ETDM3_OUT: 166 return true; 167 default: 168 return false; 169 } 170 } 171 172 static int get_etdm_fs_timing(unsigned int rate) 173 { 174 int i; 175 176 for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++) 177 if (mt8195_etdm_rates[i].rate == rate) 178 return mt8195_etdm_rates[i].reg_value; 179 180 return -EINVAL; 181 } 182 183 static unsigned int get_etdm_ch_fixup(unsigned int channels) 184 { 185 if (channels > 16) 186 return 24; 187 else if (channels > 8) 188 return 16; 189 else if (channels > 4) 190 return 8; 191 else if (channels > 2) 192 return 4; 193 else 194 return 2; 195 } 196 197 static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg) 198 { 199 switch (dai_id) { 200 case MT8195_AFE_IO_ETDM1_IN: 201 etdm_reg->con0 = ETDM_IN1_CON0; 202 etdm_reg->con1 = ETDM_IN1_CON1; 203 etdm_reg->con2 = ETDM_IN1_CON2; 204 etdm_reg->con3 = ETDM_IN1_CON3; 205 etdm_reg->con4 = ETDM_IN1_CON4; 206 etdm_reg->con5 = ETDM_IN1_CON5; 207 break; 208 case MT8195_AFE_IO_ETDM2_IN: 209 etdm_reg->con0 = ETDM_IN2_CON0; 210 etdm_reg->con1 = ETDM_IN2_CON1; 211 etdm_reg->con2 = ETDM_IN2_CON2; 212 etdm_reg->con3 = ETDM_IN2_CON3; 213 etdm_reg->con4 = ETDM_IN2_CON4; 214 etdm_reg->con5 = ETDM_IN2_CON5; 215 break; 216 case MT8195_AFE_IO_ETDM1_OUT: 217 etdm_reg->con0 = ETDM_OUT1_CON0; 218 etdm_reg->con1 = ETDM_OUT1_CON1; 219 etdm_reg->con2 = ETDM_OUT1_CON2; 220 etdm_reg->con3 = ETDM_OUT1_CON3; 221 etdm_reg->con4 = ETDM_OUT1_CON4; 222 etdm_reg->con5 = ETDM_OUT1_CON5; 223 break; 224 case MT8195_AFE_IO_ETDM2_OUT: 225 etdm_reg->con0 = ETDM_OUT2_CON0; 226 etdm_reg->con1 = ETDM_OUT2_CON1; 227 etdm_reg->con2 = ETDM_OUT2_CON2; 228 etdm_reg->con3 = ETDM_OUT2_CON3; 229 etdm_reg->con4 = ETDM_OUT2_CON4; 230 etdm_reg->con5 = ETDM_OUT2_CON5; 231 break; 232 case MT8195_AFE_IO_ETDM3_OUT: 233 case MT8195_AFE_IO_DPTX: 234 etdm_reg->con0 = ETDM_OUT3_CON0; 235 etdm_reg->con1 = ETDM_OUT3_CON1; 236 etdm_reg->con2 = ETDM_OUT3_CON2; 237 etdm_reg->con3 = ETDM_OUT3_CON3; 238 etdm_reg->con4 = ETDM_OUT3_CON4; 239 etdm_reg->con5 = ETDM_OUT3_CON5; 240 break; 241 default: 242 return -EINVAL; 243 } 244 return 0; 245 } 246 247 static int get_etdm_dir(unsigned int dai_id) 248 { 249 switch (dai_id) { 250 case MT8195_AFE_IO_ETDM1_IN: 251 case MT8195_AFE_IO_ETDM2_IN: 252 return ETDM_IN; 253 case MT8195_AFE_IO_ETDM1_OUT: 254 case MT8195_AFE_IO_ETDM2_OUT: 255 case MT8195_AFE_IO_ETDM3_OUT: 256 return ETDM_OUT; 257 default: 258 return -EINVAL; 259 } 260 } 261 262 static int get_etdm_wlen(unsigned int bitwidth) 263 { 264 return bitwidth <= 16 ? 16 : 32; 265 } 266 267 static int is_cowork_mode(struct snd_soc_dai *dai) 268 { 269 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 270 struct mt8195_afe_private *afe_priv = afe->platform_priv; 271 struct mtk_dai_etdm_priv *etdm_data; 272 273 if (!mt8195_afe_etdm_is_valid(dai->id)) 274 return -EINVAL; 275 276 etdm_data = afe_priv->dai_priv[dai->id]; 277 return (etdm_data->cowork_slv_count > 0 || 278 etdm_data->cowork_source_id != COWORK_ETDM_NONE); 279 } 280 281 static int sync_to_dai_id(int source_sel) 282 { 283 switch (source_sel) { 284 case ETDM_SYNC_FROM_IN1: 285 return MT8195_AFE_IO_ETDM1_IN; 286 case ETDM_SYNC_FROM_IN2: 287 return MT8195_AFE_IO_ETDM2_IN; 288 case ETDM_SYNC_FROM_OUT1: 289 return MT8195_AFE_IO_ETDM1_OUT; 290 case ETDM_SYNC_FROM_OUT2: 291 return MT8195_AFE_IO_ETDM2_OUT; 292 case ETDM_SYNC_FROM_OUT3: 293 return MT8195_AFE_IO_ETDM3_OUT; 294 default: 295 return 0; 296 } 297 } 298 299 static int get_etdm_cowork_master_id(struct snd_soc_dai *dai) 300 { 301 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 302 struct mt8195_afe_private *afe_priv = afe->platform_priv; 303 struct mtk_dai_etdm_priv *etdm_data; 304 int dai_id; 305 306 if (!mt8195_afe_etdm_is_valid(dai->id)) 307 return -EINVAL; 308 309 etdm_data = afe_priv->dai_priv[dai->id]; 310 dai_id = etdm_data->cowork_source_id; 311 312 if (dai_id == COWORK_ETDM_NONE) 313 dai_id = dai->id; 314 315 return dai_id; 316 } 317 318 static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = { 319 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0), 320 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0), 321 SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0), 322 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0), 323 }; 324 325 static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = { 326 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0), 327 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0), 328 SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0), 329 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0), 330 }; 331 332 static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = { 333 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0), 334 SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0), 335 }; 336 337 static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = { 338 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0), 339 SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0), 340 }; 341 342 static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = { 343 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0), 344 SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0), 345 }; 346 347 static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = { 348 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0), 349 SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0), 350 }; 351 352 static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = { 353 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0), 354 SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0), 355 }; 356 357 static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = { 358 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0), 359 SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0), 360 }; 361 362 static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = { 363 SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0), 364 SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0), 365 }; 366 367 static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = { 368 SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0), 369 SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0), 370 }; 371 372 static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = { 373 SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0), 374 SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0), 375 }; 376 377 static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = { 378 SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0), 379 SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0), 380 }; 381 382 static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = { 383 SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0), 384 SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0), 385 }; 386 387 static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = { 388 SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0), 389 SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0), 390 }; 391 392 static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = { 393 SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0), 394 SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0), 395 }; 396 397 static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = { 398 SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0), 399 SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0), 400 }; 401 402 static const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = { 403 SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0), 404 SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0), 405 }; 406 407 static const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = { 408 SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0), 409 SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0), 410 }; 411 412 static const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = { 413 SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0), 414 SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0), 415 }; 416 417 static const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = { 418 SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0), 419 SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0), 420 }; 421 422 static const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = { 423 SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0), 424 SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0), 425 }; 426 427 static const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = { 428 SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0), 429 SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0), 430 }; 431 432 static const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = { 433 SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0), 434 SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0), 435 }; 436 437 static const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = { 438 SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0), 439 SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0), 440 }; 441 442 static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = { 443 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0), 444 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0), 445 SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0), 446 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0), 447 }; 448 449 static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = { 450 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0), 451 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0), 452 SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0), 453 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0), 454 }; 455 456 static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = { 457 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0), 458 SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0), 459 }; 460 461 static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = { 462 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0), 463 SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0), 464 }; 465 466 static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = { 467 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0), 468 SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0), 469 }; 470 471 static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = { 472 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0), 473 SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0), 474 }; 475 476 static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = { 477 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0), 478 SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0), 479 }; 480 481 static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = { 482 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0), 483 SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0), 484 }; 485 486 static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = { 487 SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0), 488 SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0), 489 }; 490 491 static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = { 492 SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0), 493 SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0), 494 }; 495 496 static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = { 497 SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0), 498 SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0), 499 }; 500 501 static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = { 502 SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0), 503 SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0), 504 }; 505 506 static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = { 507 SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0), 508 SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0), 509 }; 510 511 static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = { 512 SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0), 513 SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0), 514 }; 515 516 static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = { 517 SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0), 518 SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0), 519 }; 520 521 static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = { 522 SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0), 523 SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0), 524 }; 525 526 static const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = { 527 SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0), 528 SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0), 529 }; 530 531 static const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = { 532 SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0), 533 SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0), 534 }; 535 536 static const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = { 537 SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0), 538 SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0), 539 }; 540 541 static const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = { 542 SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0), 543 SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0), 544 }; 545 546 static const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = { 547 SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0), 548 SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0), 549 }; 550 551 static const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = { 552 SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0), 553 SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0), 554 }; 555 556 static const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = { 557 SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0), 558 SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0), 559 }; 560 561 static const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = { 562 SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0), 563 SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0), 564 }; 565 566 static const char * const mt8195_etdm_clk_src_sel_text[] = { 567 "26m", 568 "a1sys_a2sys", 569 "a3sys", 570 "a4sys", 571 }; 572 573 static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum, 574 mt8195_etdm_clk_src_sel_text); 575 576 static const char * const hdmitx_dptx_mux_map[] = { 577 "Disconnect", "Connect", 578 }; 579 580 static int hdmitx_dptx_mux_map_value[] = { 581 0, 1, 582 }; 583 584 /* HDMI_OUT_MUX */ 585 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum, 586 SND_SOC_NOPM, 587 0, 588 1, 589 hdmitx_dptx_mux_map, 590 hdmitx_dptx_mux_map_value); 591 592 static const struct snd_kcontrol_new hdmi_out_mux_control = 593 SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum); 594 595 /* DPTX_OUT_MUX */ 596 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum, 597 SND_SOC_NOPM, 598 0, 599 1, 600 hdmitx_dptx_mux_map, 601 hdmitx_dptx_mux_map_value); 602 603 static const struct snd_kcontrol_new dptx_out_mux_control = 604 SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum); 605 606 /* HDMI_CH0_MUX ~ HDMI_CH7_MUX */ 607 static const char *const afe_conn_hdmi_mux_map[] = { 608 "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", 609 }; 610 611 static int afe_conn_hdmi_mux_map_value[] = { 612 0, 1, 2, 3, 4, 5, 6, 7, 613 }; 614 615 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum, 616 AFE_TDMOUT_CONN0, 617 0, 618 0xf, 619 afe_conn_hdmi_mux_map, 620 afe_conn_hdmi_mux_map_value); 621 622 static const struct snd_kcontrol_new hdmi_ch0_mux_control = 623 SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum); 624 625 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum, 626 AFE_TDMOUT_CONN0, 627 4, 628 0xf, 629 afe_conn_hdmi_mux_map, 630 afe_conn_hdmi_mux_map_value); 631 632 static const struct snd_kcontrol_new hdmi_ch1_mux_control = 633 SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum); 634 635 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum, 636 AFE_TDMOUT_CONN0, 637 8, 638 0xf, 639 afe_conn_hdmi_mux_map, 640 afe_conn_hdmi_mux_map_value); 641 642 static const struct snd_kcontrol_new hdmi_ch2_mux_control = 643 SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum); 644 645 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum, 646 AFE_TDMOUT_CONN0, 647 12, 648 0xf, 649 afe_conn_hdmi_mux_map, 650 afe_conn_hdmi_mux_map_value); 651 652 static const struct snd_kcontrol_new hdmi_ch3_mux_control = 653 SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum); 654 655 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum, 656 AFE_TDMOUT_CONN0, 657 16, 658 0xf, 659 afe_conn_hdmi_mux_map, 660 afe_conn_hdmi_mux_map_value); 661 662 static const struct snd_kcontrol_new hdmi_ch4_mux_control = 663 SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum); 664 665 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum, 666 AFE_TDMOUT_CONN0, 667 20, 668 0xf, 669 afe_conn_hdmi_mux_map, 670 afe_conn_hdmi_mux_map_value); 671 672 static const struct snd_kcontrol_new hdmi_ch5_mux_control = 673 SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum); 674 675 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum, 676 AFE_TDMOUT_CONN0, 677 24, 678 0xf, 679 afe_conn_hdmi_mux_map, 680 afe_conn_hdmi_mux_map_value); 681 682 static const struct snd_kcontrol_new hdmi_ch6_mux_control = 683 SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum); 684 685 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum, 686 AFE_TDMOUT_CONN0, 687 28, 688 0xf, 689 afe_conn_hdmi_mux_map, 690 afe_conn_hdmi_mux_map_value); 691 692 static const struct snd_kcontrol_new hdmi_ch7_mux_control = 693 SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum); 694 695 static int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol, 696 struct snd_ctl_elem_value *ucontrol) 697 { 698 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 699 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 700 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 701 unsigned int source = ucontrol->value.enumerated.item[0]; 702 unsigned int val; 703 unsigned int mask; 704 unsigned int reg; 705 706 if (source >= e->items) 707 return -EINVAL; 708 709 reg = 0; 710 if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 711 reg = ETDM_OUT1_CON4; 712 mask = ETDM_OUT_CON4_CLOCK_MASK; 713 val = ETDM_OUT_CON4_CLOCK(source); 714 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 715 reg = ETDM_OUT2_CON4; 716 mask = ETDM_OUT_CON4_CLOCK_MASK; 717 val = ETDM_OUT_CON4_CLOCK(source); 718 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 719 reg = ETDM_OUT3_CON4; 720 mask = ETDM_OUT_CON4_CLOCK_MASK; 721 val = ETDM_OUT_CON4_CLOCK(source); 722 } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 723 reg = ETDM_IN1_CON2; 724 mask = ETDM_IN_CON2_CLOCK_MASK; 725 val = ETDM_IN_CON2_CLOCK(source); 726 } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 727 reg = ETDM_IN2_CON2; 728 mask = ETDM_IN_CON2_CLOCK_MASK; 729 val = ETDM_IN_CON2_CLOCK(source); 730 } 731 732 if (reg) 733 regmap_update_bits(afe->regmap, reg, mask, val); 734 735 return 0; 736 } 737 738 static int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol, 739 struct snd_ctl_elem_value *ucontrol) 740 { 741 struct snd_soc_component *component = 742 snd_soc_kcontrol_component(kcontrol); 743 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 744 unsigned int value = 0; 745 unsigned int reg = 0; 746 unsigned int mask = 0; 747 unsigned int shift = 0; 748 749 if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 750 reg = ETDM_OUT1_CON4; 751 mask = ETDM_OUT_CON4_CLOCK_MASK; 752 shift = ETDM_OUT_CON4_CLOCK_SHIFT; 753 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 754 reg = ETDM_OUT2_CON4; 755 mask = ETDM_OUT_CON4_CLOCK_MASK; 756 shift = ETDM_OUT_CON4_CLOCK_SHIFT; 757 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 758 reg = ETDM_OUT3_CON4; 759 mask = ETDM_OUT_CON4_CLOCK_MASK; 760 shift = ETDM_OUT_CON4_CLOCK_SHIFT; 761 } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 762 reg = ETDM_IN1_CON2; 763 mask = ETDM_IN_CON2_CLOCK_MASK; 764 shift = ETDM_IN_CON2_CLOCK_SHIFT; 765 } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 766 reg = ETDM_IN2_CON2; 767 mask = ETDM_IN_CON2_CLOCK_MASK; 768 shift = ETDM_IN_CON2_CLOCK_SHIFT; 769 } 770 771 if (reg) 772 regmap_read(afe->regmap, reg, &value); 773 774 value &= mask; 775 value >>= shift; 776 ucontrol->value.enumerated.item[0] = value; 777 return 0; 778 } 779 780 static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = { 781 SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", 782 etdmout_clk_src_enum, 783 mt8195_etdm_clk_src_sel_get, 784 mt8195_etdm_clk_src_sel_put), 785 SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", 786 etdmout_clk_src_enum, 787 mt8195_etdm_clk_src_sel_get, 788 mt8195_etdm_clk_src_sel_put), 789 SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", 790 etdmout_clk_src_enum, 791 mt8195_etdm_clk_src_sel_get, 792 mt8195_etdm_clk_src_sel_put), 793 SOC_ENUM_EXT("ETDM_IN1_Clock_Source", 794 etdmout_clk_src_enum, 795 mt8195_etdm_clk_src_sel_get, 796 mt8195_etdm_clk_src_sel_put), 797 SOC_ENUM_EXT("ETDM_IN2_Clock_Source", 798 etdmout_clk_src_enum, 799 mt8195_etdm_clk_src_sel_get, 800 mt8195_etdm_clk_src_sel_put), 801 }; 802 803 static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = { 804 /* eTDM_IN2 */ 805 SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0), 806 SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0), 807 SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0), 808 SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0), 809 SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0), 810 SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0), 811 SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0), 812 SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0), 813 814 /* eTDM_IN1 */ 815 SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0), 816 SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0), 817 SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0), 818 SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0), 819 SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0), 820 SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0), 821 SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0), 822 SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0), 823 SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0), 824 SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0), 825 SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0), 826 SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0), 827 SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0), 828 SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0), 829 SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0), 830 SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0), 831 SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0), 832 SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0), 833 SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0), 834 SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0), 835 SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0), 836 SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0), 837 SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0), 838 SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0), 839 840 /* eTDM_OUT2 */ 841 SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0, 842 mtk_dai_etdm_o048_mix, 843 ARRAY_SIZE(mtk_dai_etdm_o048_mix)), 844 SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0, 845 mtk_dai_etdm_o049_mix, 846 ARRAY_SIZE(mtk_dai_etdm_o049_mix)), 847 SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0, 848 mtk_dai_etdm_o050_mix, 849 ARRAY_SIZE(mtk_dai_etdm_o050_mix)), 850 SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0, 851 mtk_dai_etdm_o051_mix, 852 ARRAY_SIZE(mtk_dai_etdm_o051_mix)), 853 SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0, 854 mtk_dai_etdm_o052_mix, 855 ARRAY_SIZE(mtk_dai_etdm_o052_mix)), 856 SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0, 857 mtk_dai_etdm_o053_mix, 858 ARRAY_SIZE(mtk_dai_etdm_o053_mix)), 859 SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0, 860 mtk_dai_etdm_o054_mix, 861 ARRAY_SIZE(mtk_dai_etdm_o054_mix)), 862 SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0, 863 mtk_dai_etdm_o055_mix, 864 ARRAY_SIZE(mtk_dai_etdm_o055_mix)), 865 SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0, 866 mtk_dai_etdm_o056_mix, 867 ARRAY_SIZE(mtk_dai_etdm_o056_mix)), 868 SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0, 869 mtk_dai_etdm_o057_mix, 870 ARRAY_SIZE(mtk_dai_etdm_o057_mix)), 871 SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0, 872 mtk_dai_etdm_o058_mix, 873 ARRAY_SIZE(mtk_dai_etdm_o058_mix)), 874 SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0, 875 mtk_dai_etdm_o059_mix, 876 ARRAY_SIZE(mtk_dai_etdm_o059_mix)), 877 SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0, 878 mtk_dai_etdm_o060_mix, 879 ARRAY_SIZE(mtk_dai_etdm_o060_mix)), 880 SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0, 881 mtk_dai_etdm_o061_mix, 882 ARRAY_SIZE(mtk_dai_etdm_o061_mix)), 883 SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0, 884 mtk_dai_etdm_o062_mix, 885 ARRAY_SIZE(mtk_dai_etdm_o062_mix)), 886 SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0, 887 mtk_dai_etdm_o063_mix, 888 ARRAY_SIZE(mtk_dai_etdm_o063_mix)), 889 SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0, 890 mtk_dai_etdm_o064_mix, 891 ARRAY_SIZE(mtk_dai_etdm_o064_mix)), 892 SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0, 893 mtk_dai_etdm_o065_mix, 894 ARRAY_SIZE(mtk_dai_etdm_o065_mix)), 895 SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0, 896 mtk_dai_etdm_o066_mix, 897 ARRAY_SIZE(mtk_dai_etdm_o066_mix)), 898 SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0, 899 mtk_dai_etdm_o067_mix, 900 ARRAY_SIZE(mtk_dai_etdm_o067_mix)), 901 SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0, 902 mtk_dai_etdm_o068_mix, 903 ARRAY_SIZE(mtk_dai_etdm_o068_mix)), 904 SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0, 905 mtk_dai_etdm_o069_mix, 906 ARRAY_SIZE(mtk_dai_etdm_o069_mix)), 907 SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0, 908 mtk_dai_etdm_o070_mix, 909 ARRAY_SIZE(mtk_dai_etdm_o070_mix)), 910 SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0, 911 mtk_dai_etdm_o071_mix, 912 ARRAY_SIZE(mtk_dai_etdm_o071_mix)), 913 914 /* eTDM_OUT1 */ 915 SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0, 916 mtk_dai_etdm_o072_mix, 917 ARRAY_SIZE(mtk_dai_etdm_o072_mix)), 918 SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0, 919 mtk_dai_etdm_o073_mix, 920 ARRAY_SIZE(mtk_dai_etdm_o073_mix)), 921 SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0, 922 mtk_dai_etdm_o074_mix, 923 ARRAY_SIZE(mtk_dai_etdm_o074_mix)), 924 SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0, 925 mtk_dai_etdm_o075_mix, 926 ARRAY_SIZE(mtk_dai_etdm_o075_mix)), 927 SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0, 928 mtk_dai_etdm_o076_mix, 929 ARRAY_SIZE(mtk_dai_etdm_o076_mix)), 930 SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0, 931 mtk_dai_etdm_o077_mix, 932 ARRAY_SIZE(mtk_dai_etdm_o077_mix)), 933 SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0, 934 mtk_dai_etdm_o078_mix, 935 ARRAY_SIZE(mtk_dai_etdm_o078_mix)), 936 SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0, 937 mtk_dai_etdm_o079_mix, 938 ARRAY_SIZE(mtk_dai_etdm_o079_mix)), 939 SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0, 940 mtk_dai_etdm_o080_mix, 941 ARRAY_SIZE(mtk_dai_etdm_o080_mix)), 942 SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0, 943 mtk_dai_etdm_o081_mix, 944 ARRAY_SIZE(mtk_dai_etdm_o081_mix)), 945 SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0, 946 mtk_dai_etdm_o082_mix, 947 ARRAY_SIZE(mtk_dai_etdm_o082_mix)), 948 SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0, 949 mtk_dai_etdm_o083_mix, 950 ARRAY_SIZE(mtk_dai_etdm_o083_mix)), 951 SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0, 952 mtk_dai_etdm_o084_mix, 953 ARRAY_SIZE(mtk_dai_etdm_o084_mix)), 954 SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0, 955 mtk_dai_etdm_o085_mix, 956 ARRAY_SIZE(mtk_dai_etdm_o085_mix)), 957 SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0, 958 mtk_dai_etdm_o086_mix, 959 ARRAY_SIZE(mtk_dai_etdm_o086_mix)), 960 SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0, 961 mtk_dai_etdm_o087_mix, 962 ARRAY_SIZE(mtk_dai_etdm_o087_mix)), 963 SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0, 964 mtk_dai_etdm_o088_mix, 965 ARRAY_SIZE(mtk_dai_etdm_o088_mix)), 966 SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0, 967 mtk_dai_etdm_o089_mix, 968 ARRAY_SIZE(mtk_dai_etdm_o089_mix)), 969 SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0, 970 mtk_dai_etdm_o090_mix, 971 ARRAY_SIZE(mtk_dai_etdm_o090_mix)), 972 SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0, 973 mtk_dai_etdm_o091_mix, 974 ARRAY_SIZE(mtk_dai_etdm_o091_mix)), 975 SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0, 976 mtk_dai_etdm_o092_mix, 977 ARRAY_SIZE(mtk_dai_etdm_o092_mix)), 978 SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0, 979 mtk_dai_etdm_o093_mix, 980 ARRAY_SIZE(mtk_dai_etdm_o093_mix)), 981 SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0, 982 mtk_dai_etdm_o094_mix, 983 ARRAY_SIZE(mtk_dai_etdm_o094_mix)), 984 SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0, 985 mtk_dai_etdm_o095_mix, 986 ARRAY_SIZE(mtk_dai_etdm_o095_mix)), 987 988 /* eTDM_OUT3 */ 989 SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0, 990 &hdmi_out_mux_control), 991 SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0, 992 &dptx_out_mux_control), 993 994 SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0, 995 &hdmi_ch0_mux_control), 996 SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0, 997 &hdmi_ch1_mux_control), 998 SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0, 999 &hdmi_ch2_mux_control), 1000 SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0, 1001 &hdmi_ch3_mux_control), 1002 SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0, 1003 &hdmi_ch4_mux_control), 1004 SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0, 1005 &hdmi_ch5_mux_control), 1006 SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0, 1007 &hdmi_ch6_mux_control), 1008 SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0, 1009 &hdmi_ch7_mux_control), 1010 1011 SND_SOC_DAPM_INPUT("ETDM_INPUT"), 1012 SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"), 1013 }; 1014 1015 static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = { 1016 {"I012", NULL, "ETDM2 Capture"}, 1017 {"I013", NULL, "ETDM2 Capture"}, 1018 {"I014", NULL, "ETDM2 Capture"}, 1019 {"I015", NULL, "ETDM2 Capture"}, 1020 {"I016", NULL, "ETDM2 Capture"}, 1021 {"I017", NULL, "ETDM2 Capture"}, 1022 {"I018", NULL, "ETDM2 Capture"}, 1023 {"I019", NULL, "ETDM2 Capture"}, 1024 1025 {"I072", NULL, "ETDM1 Capture"}, 1026 {"I073", NULL, "ETDM1 Capture"}, 1027 {"I074", NULL, "ETDM1 Capture"}, 1028 {"I075", NULL, "ETDM1 Capture"}, 1029 {"I076", NULL, "ETDM1 Capture"}, 1030 {"I077", NULL, "ETDM1 Capture"}, 1031 {"I078", NULL, "ETDM1 Capture"}, 1032 {"I079", NULL, "ETDM1 Capture"}, 1033 {"I080", NULL, "ETDM1 Capture"}, 1034 {"I081", NULL, "ETDM1 Capture"}, 1035 {"I082", NULL, "ETDM1 Capture"}, 1036 {"I083", NULL, "ETDM1 Capture"}, 1037 {"I084", NULL, "ETDM1 Capture"}, 1038 {"I085", NULL, "ETDM1 Capture"}, 1039 {"I086", NULL, "ETDM1 Capture"}, 1040 {"I087", NULL, "ETDM1 Capture"}, 1041 {"I088", NULL, "ETDM1 Capture"}, 1042 {"I089", NULL, "ETDM1 Capture"}, 1043 {"I090", NULL, "ETDM1 Capture"}, 1044 {"I091", NULL, "ETDM1 Capture"}, 1045 {"I092", NULL, "ETDM1 Capture"}, 1046 {"I093", NULL, "ETDM1 Capture"}, 1047 {"I094", NULL, "ETDM1 Capture"}, 1048 {"I095", NULL, "ETDM1 Capture"}, 1049 1050 {"UL8", NULL, "ETDM1 Capture"}, 1051 {"UL3", NULL, "ETDM2 Capture"}, 1052 1053 {"ETDM2 Playback", NULL, "O048"}, 1054 {"ETDM2 Playback", NULL, "O049"}, 1055 {"ETDM2 Playback", NULL, "O050"}, 1056 {"ETDM2 Playback", NULL, "O051"}, 1057 {"ETDM2 Playback", NULL, "O052"}, 1058 {"ETDM2 Playback", NULL, "O053"}, 1059 {"ETDM2 Playback", NULL, "O054"}, 1060 {"ETDM2 Playback", NULL, "O055"}, 1061 {"ETDM2 Playback", NULL, "O056"}, 1062 {"ETDM2 Playback", NULL, "O057"}, 1063 {"ETDM2 Playback", NULL, "O058"}, 1064 {"ETDM2 Playback", NULL, "O059"}, 1065 {"ETDM2 Playback", NULL, "O060"}, 1066 {"ETDM2 Playback", NULL, "O061"}, 1067 {"ETDM2 Playback", NULL, "O062"}, 1068 {"ETDM2 Playback", NULL, "O063"}, 1069 {"ETDM2 Playback", NULL, "O064"}, 1070 {"ETDM2 Playback", NULL, "O065"}, 1071 {"ETDM2 Playback", NULL, "O066"}, 1072 {"ETDM2 Playback", NULL, "O067"}, 1073 {"ETDM2 Playback", NULL, "O068"}, 1074 {"ETDM2 Playback", NULL, "O069"}, 1075 {"ETDM2 Playback", NULL, "O070"}, 1076 {"ETDM2 Playback", NULL, "O071"}, 1077 1078 {"ETDM1 Playback", NULL, "O072"}, 1079 {"ETDM1 Playback", NULL, "O073"}, 1080 {"ETDM1 Playback", NULL, "O074"}, 1081 {"ETDM1 Playback", NULL, "O075"}, 1082 {"ETDM1 Playback", NULL, "O076"}, 1083 {"ETDM1 Playback", NULL, "O077"}, 1084 {"ETDM1 Playback", NULL, "O078"}, 1085 {"ETDM1 Playback", NULL, "O079"}, 1086 {"ETDM1 Playback", NULL, "O080"}, 1087 {"ETDM1 Playback", NULL, "O081"}, 1088 {"ETDM1 Playback", NULL, "O082"}, 1089 {"ETDM1 Playback", NULL, "O083"}, 1090 {"ETDM1 Playback", NULL, "O084"}, 1091 {"ETDM1 Playback", NULL, "O085"}, 1092 {"ETDM1 Playback", NULL, "O086"}, 1093 {"ETDM1 Playback", NULL, "O087"}, 1094 {"ETDM1 Playback", NULL, "O088"}, 1095 {"ETDM1 Playback", NULL, "O089"}, 1096 {"ETDM1 Playback", NULL, "O090"}, 1097 {"ETDM1 Playback", NULL, "O091"}, 1098 {"ETDM1 Playback", NULL, "O092"}, 1099 {"ETDM1 Playback", NULL, "O093"}, 1100 {"ETDM1 Playback", NULL, "O094"}, 1101 {"ETDM1 Playback", NULL, "O095"}, 1102 1103 {"O048", "I020 Switch", "I020"}, 1104 {"O049", "I021 Switch", "I021"}, 1105 1106 {"O048", "I022 Switch", "I022"}, 1107 {"O049", "I023 Switch", "I023"}, 1108 {"O050", "I024 Switch", "I024"}, 1109 {"O051", "I025 Switch", "I025"}, 1110 {"O052", "I026 Switch", "I026"}, 1111 {"O053", "I027 Switch", "I027"}, 1112 {"O054", "I028 Switch", "I028"}, 1113 {"O055", "I029 Switch", "I029"}, 1114 {"O056", "I030 Switch", "I030"}, 1115 {"O057", "I031 Switch", "I031"}, 1116 {"O058", "I032 Switch", "I032"}, 1117 {"O059", "I033 Switch", "I033"}, 1118 {"O060", "I034 Switch", "I034"}, 1119 {"O061", "I035 Switch", "I035"}, 1120 {"O062", "I036 Switch", "I036"}, 1121 {"O063", "I037 Switch", "I037"}, 1122 {"O064", "I038 Switch", "I038"}, 1123 {"O065", "I039 Switch", "I039"}, 1124 {"O066", "I040 Switch", "I040"}, 1125 {"O067", "I041 Switch", "I041"}, 1126 {"O068", "I042 Switch", "I042"}, 1127 {"O069", "I043 Switch", "I043"}, 1128 {"O070", "I044 Switch", "I044"}, 1129 {"O071", "I045 Switch", "I045"}, 1130 1131 {"O048", "I046 Switch", "I046"}, 1132 {"O049", "I047 Switch", "I047"}, 1133 {"O050", "I048 Switch", "I048"}, 1134 {"O051", "I049 Switch", "I049"}, 1135 {"O052", "I050 Switch", "I050"}, 1136 {"O053", "I051 Switch", "I051"}, 1137 {"O054", "I052 Switch", "I052"}, 1138 {"O055", "I053 Switch", "I053"}, 1139 {"O056", "I054 Switch", "I054"}, 1140 {"O057", "I055 Switch", "I055"}, 1141 {"O058", "I056 Switch", "I056"}, 1142 {"O059", "I057 Switch", "I057"}, 1143 {"O060", "I058 Switch", "I058"}, 1144 {"O061", "I059 Switch", "I059"}, 1145 {"O062", "I060 Switch", "I060"}, 1146 {"O063", "I061 Switch", "I061"}, 1147 {"O064", "I062 Switch", "I062"}, 1148 {"O065", "I063 Switch", "I063"}, 1149 {"O066", "I064 Switch", "I064"}, 1150 {"O067", "I065 Switch", "I065"}, 1151 {"O068", "I066 Switch", "I066"}, 1152 {"O069", "I067 Switch", "I067"}, 1153 {"O070", "I068 Switch", "I068"}, 1154 {"O071", "I069 Switch", "I069"}, 1155 1156 {"O048", "I070 Switch", "I070"}, 1157 {"O049", "I071 Switch", "I071"}, 1158 1159 {"O072", "I020 Switch", "I020"}, 1160 {"O073", "I021 Switch", "I021"}, 1161 1162 {"O072", "I022 Switch", "I022"}, 1163 {"O073", "I023 Switch", "I023"}, 1164 {"O074", "I024 Switch", "I024"}, 1165 {"O075", "I025 Switch", "I025"}, 1166 {"O076", "I026 Switch", "I026"}, 1167 {"O077", "I027 Switch", "I027"}, 1168 {"O078", "I028 Switch", "I028"}, 1169 {"O079", "I029 Switch", "I029"}, 1170 {"O080", "I030 Switch", "I030"}, 1171 {"O081", "I031 Switch", "I031"}, 1172 {"O082", "I032 Switch", "I032"}, 1173 {"O083", "I033 Switch", "I033"}, 1174 {"O084", "I034 Switch", "I034"}, 1175 {"O085", "I035 Switch", "I035"}, 1176 {"O086", "I036 Switch", "I036"}, 1177 {"O087", "I037 Switch", "I037"}, 1178 {"O088", "I038 Switch", "I038"}, 1179 {"O089", "I039 Switch", "I039"}, 1180 {"O090", "I040 Switch", "I040"}, 1181 {"O091", "I041 Switch", "I041"}, 1182 {"O092", "I042 Switch", "I042"}, 1183 {"O093", "I043 Switch", "I043"}, 1184 {"O094", "I044 Switch", "I044"}, 1185 {"O095", "I045 Switch", "I045"}, 1186 1187 {"O072", "I046 Switch", "I046"}, 1188 {"O073", "I047 Switch", "I047"}, 1189 {"O074", "I048 Switch", "I048"}, 1190 {"O075", "I049 Switch", "I049"}, 1191 {"O076", "I050 Switch", "I050"}, 1192 {"O077", "I051 Switch", "I051"}, 1193 {"O078", "I052 Switch", "I052"}, 1194 {"O079", "I053 Switch", "I053"}, 1195 {"O080", "I054 Switch", "I054"}, 1196 {"O081", "I055 Switch", "I055"}, 1197 {"O082", "I056 Switch", "I056"}, 1198 {"O083", "I057 Switch", "I057"}, 1199 {"O084", "I058 Switch", "I058"}, 1200 {"O085", "I059 Switch", "I059"}, 1201 {"O086", "I060 Switch", "I060"}, 1202 {"O087", "I061 Switch", "I061"}, 1203 {"O088", "I062 Switch", "I062"}, 1204 {"O089", "I063 Switch", "I063"}, 1205 {"O090", "I064 Switch", "I064"}, 1206 {"O091", "I065 Switch", "I065"}, 1207 {"O092", "I066 Switch", "I066"}, 1208 {"O093", "I067 Switch", "I067"}, 1209 {"O094", "I068 Switch", "I068"}, 1210 {"O095", "I069 Switch", "I069"}, 1211 1212 {"O072", "I070 Switch", "I070"}, 1213 {"O073", "I071 Switch", "I071"}, 1214 1215 {"HDMI_CH0_MUX", "CH0", "DL10"}, 1216 {"HDMI_CH0_MUX", "CH1", "DL10"}, 1217 {"HDMI_CH0_MUX", "CH2", "DL10"}, 1218 {"HDMI_CH0_MUX", "CH3", "DL10"}, 1219 {"HDMI_CH0_MUX", "CH4", "DL10"}, 1220 {"HDMI_CH0_MUX", "CH5", "DL10"}, 1221 {"HDMI_CH0_MUX", "CH6", "DL10"}, 1222 {"HDMI_CH0_MUX", "CH7", "DL10"}, 1223 1224 {"HDMI_CH1_MUX", "CH0", "DL10"}, 1225 {"HDMI_CH1_MUX", "CH1", "DL10"}, 1226 {"HDMI_CH1_MUX", "CH2", "DL10"}, 1227 {"HDMI_CH1_MUX", "CH3", "DL10"}, 1228 {"HDMI_CH1_MUX", "CH4", "DL10"}, 1229 {"HDMI_CH1_MUX", "CH5", "DL10"}, 1230 {"HDMI_CH1_MUX", "CH6", "DL10"}, 1231 {"HDMI_CH1_MUX", "CH7", "DL10"}, 1232 1233 {"HDMI_CH2_MUX", "CH0", "DL10"}, 1234 {"HDMI_CH2_MUX", "CH1", "DL10"}, 1235 {"HDMI_CH2_MUX", "CH2", "DL10"}, 1236 {"HDMI_CH2_MUX", "CH3", "DL10"}, 1237 {"HDMI_CH2_MUX", "CH4", "DL10"}, 1238 {"HDMI_CH2_MUX", "CH5", "DL10"}, 1239 {"HDMI_CH2_MUX", "CH6", "DL10"}, 1240 {"HDMI_CH2_MUX", "CH7", "DL10"}, 1241 1242 {"HDMI_CH3_MUX", "CH0", "DL10"}, 1243 {"HDMI_CH3_MUX", "CH1", "DL10"}, 1244 {"HDMI_CH3_MUX", "CH2", "DL10"}, 1245 {"HDMI_CH3_MUX", "CH3", "DL10"}, 1246 {"HDMI_CH3_MUX", "CH4", "DL10"}, 1247 {"HDMI_CH3_MUX", "CH5", "DL10"}, 1248 {"HDMI_CH3_MUX", "CH6", "DL10"}, 1249 {"HDMI_CH3_MUX", "CH7", "DL10"}, 1250 1251 {"HDMI_CH4_MUX", "CH0", "DL10"}, 1252 {"HDMI_CH4_MUX", "CH1", "DL10"}, 1253 {"HDMI_CH4_MUX", "CH2", "DL10"}, 1254 {"HDMI_CH4_MUX", "CH3", "DL10"}, 1255 {"HDMI_CH4_MUX", "CH4", "DL10"}, 1256 {"HDMI_CH4_MUX", "CH5", "DL10"}, 1257 {"HDMI_CH4_MUX", "CH6", "DL10"}, 1258 {"HDMI_CH4_MUX", "CH7", "DL10"}, 1259 1260 {"HDMI_CH5_MUX", "CH0", "DL10"}, 1261 {"HDMI_CH5_MUX", "CH1", "DL10"}, 1262 {"HDMI_CH5_MUX", "CH2", "DL10"}, 1263 {"HDMI_CH5_MUX", "CH3", "DL10"}, 1264 {"HDMI_CH5_MUX", "CH4", "DL10"}, 1265 {"HDMI_CH5_MUX", "CH5", "DL10"}, 1266 {"HDMI_CH5_MUX", "CH6", "DL10"}, 1267 {"HDMI_CH5_MUX", "CH7", "DL10"}, 1268 1269 {"HDMI_CH6_MUX", "CH0", "DL10"}, 1270 {"HDMI_CH6_MUX", "CH1", "DL10"}, 1271 {"HDMI_CH6_MUX", "CH2", "DL10"}, 1272 {"HDMI_CH6_MUX", "CH3", "DL10"}, 1273 {"HDMI_CH6_MUX", "CH4", "DL10"}, 1274 {"HDMI_CH6_MUX", "CH5", "DL10"}, 1275 {"HDMI_CH6_MUX", "CH6", "DL10"}, 1276 {"HDMI_CH6_MUX", "CH7", "DL10"}, 1277 1278 {"HDMI_CH7_MUX", "CH0", "DL10"}, 1279 {"HDMI_CH7_MUX", "CH1", "DL10"}, 1280 {"HDMI_CH7_MUX", "CH2", "DL10"}, 1281 {"HDMI_CH7_MUX", "CH3", "DL10"}, 1282 {"HDMI_CH7_MUX", "CH4", "DL10"}, 1283 {"HDMI_CH7_MUX", "CH5", "DL10"}, 1284 {"HDMI_CH7_MUX", "CH6", "DL10"}, 1285 {"HDMI_CH7_MUX", "CH7", "DL10"}, 1286 1287 {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 1288 {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 1289 {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 1290 {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 1291 {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 1292 {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 1293 {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 1294 {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 1295 1296 {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 1297 {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 1298 {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 1299 {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 1300 {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 1301 {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 1302 {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 1303 {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 1304 1305 {"ETDM3 Playback", NULL, "HDMI_OUT_MUX"}, 1306 {"DPTX Playback", NULL, "DPTX_OUT_MUX"}, 1307 1308 {"ETDM_OUTPUT", NULL, "DPTX Playback"}, 1309 {"ETDM_OUTPUT", NULL, "ETDM1 Playback"}, 1310 {"ETDM_OUTPUT", NULL, "ETDM2 Playback"}, 1311 {"ETDM_OUTPUT", NULL, "ETDM3 Playback"}, 1312 {"ETDM1 Capture", NULL, "ETDM_INPUT"}, 1313 {"ETDM2 Capture", NULL, "ETDM_INPUT"}, 1314 }; 1315 1316 static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id) 1317 { 1318 int ret = 0; 1319 struct etdm_con_reg etdm_reg; 1320 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1321 struct mtk_dai_etdm_priv *etdm_data; 1322 unsigned long flags; 1323 1324 if (!mt8195_afe_etdm_is_valid(dai_id)) 1325 return -EINVAL; 1326 1327 etdm_data = afe_priv->dai_priv[dai_id]; 1328 spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 1329 etdm_data->en_ref_cnt++; 1330 if (etdm_data->en_ref_cnt == 1) { 1331 ret = get_etdm_reg(dai_id, &etdm_reg); 1332 if (ret < 0) 1333 goto out; 1334 1335 regmap_update_bits(afe->regmap, etdm_reg.con0, 1336 ETDM_CON0_EN, ETDM_CON0_EN); 1337 } 1338 out: 1339 spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 1340 return ret; 1341 } 1342 1343 static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id) 1344 { 1345 int ret = 0; 1346 struct etdm_con_reg etdm_reg; 1347 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1348 struct mtk_dai_etdm_priv *etdm_data; 1349 unsigned long flags; 1350 1351 if (!mt8195_afe_etdm_is_valid(dai_id)) 1352 return -EINVAL; 1353 1354 etdm_data = afe_priv->dai_priv[dai_id]; 1355 spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 1356 if (etdm_data->en_ref_cnt > 0) { 1357 etdm_data->en_ref_cnt--; 1358 if (etdm_data->en_ref_cnt == 0) { 1359 ret = get_etdm_reg(dai_id, &etdm_reg); 1360 if (ret < 0) 1361 goto out; 1362 1363 regmap_update_bits(afe->regmap, etdm_reg.con0, 1364 ETDM_CON0_EN, 0); 1365 } 1366 } 1367 out: 1368 spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 1369 return ret; 1370 } 1371 1372 static int etdm_cowork_slv_sel(int id, int slave_mode) 1373 { 1374 if (slave_mode) { 1375 switch (id) { 1376 case MT8195_AFE_IO_ETDM1_IN: 1377 return COWORK_ETDM_IN1_S; 1378 case MT8195_AFE_IO_ETDM2_IN: 1379 return COWORK_ETDM_IN2_S; 1380 case MT8195_AFE_IO_ETDM1_OUT: 1381 return COWORK_ETDM_OUT1_S; 1382 case MT8195_AFE_IO_ETDM2_OUT: 1383 return COWORK_ETDM_OUT2_S; 1384 case MT8195_AFE_IO_ETDM3_OUT: 1385 return COWORK_ETDM_OUT3_S; 1386 default: 1387 return -EINVAL; 1388 } 1389 } else { 1390 switch (id) { 1391 case MT8195_AFE_IO_ETDM1_IN: 1392 return COWORK_ETDM_IN1_M; 1393 case MT8195_AFE_IO_ETDM2_IN: 1394 return COWORK_ETDM_IN2_M; 1395 case MT8195_AFE_IO_ETDM1_OUT: 1396 return COWORK_ETDM_OUT1_M; 1397 case MT8195_AFE_IO_ETDM2_OUT: 1398 return COWORK_ETDM_OUT2_M; 1399 case MT8195_AFE_IO_ETDM3_OUT: 1400 return COWORK_ETDM_OUT3_M; 1401 default: 1402 return -EINVAL; 1403 } 1404 } 1405 } 1406 1407 static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id) 1408 { 1409 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1410 struct mtk_dai_etdm_priv *etdm_data; 1411 unsigned int reg = 0; 1412 unsigned int mask; 1413 unsigned int val; 1414 int cowork_source_sel; 1415 1416 if (!mt8195_afe_etdm_is_valid(dai_id)) 1417 return -EINVAL; 1418 1419 etdm_data = afe_priv->dai_priv[dai_id]; 1420 if (etdm_data->cowork_source_id == COWORK_ETDM_NONE) 1421 return 0; 1422 1423 cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id, 1424 etdm_data->slave_mode); 1425 if (cowork_source_sel < 0) 1426 return cowork_source_sel; 1427 1428 switch (dai_id) { 1429 case MT8195_AFE_IO_ETDM1_IN: 1430 reg = ETDM_COWORK_CON1; 1431 mask = ETDM_IN1_SLAVE_SEL_MASK; 1432 val = ETDM_IN1_SLAVE_SEL(cowork_source_sel); 1433 break; 1434 case MT8195_AFE_IO_ETDM2_IN: 1435 reg = ETDM_COWORK_CON2; 1436 mask = ETDM_IN2_SLAVE_SEL_MASK; 1437 val = ETDM_IN2_SLAVE_SEL(cowork_source_sel); 1438 break; 1439 case MT8195_AFE_IO_ETDM1_OUT: 1440 reg = ETDM_COWORK_CON0; 1441 mask = ETDM_OUT1_SLAVE_SEL_MASK; 1442 val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel); 1443 break; 1444 case MT8195_AFE_IO_ETDM2_OUT: 1445 reg = ETDM_COWORK_CON2; 1446 mask = ETDM_OUT2_SLAVE_SEL_MASK; 1447 val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel); 1448 break; 1449 case MT8195_AFE_IO_ETDM3_OUT: 1450 reg = ETDM_COWORK_CON2; 1451 mask = ETDM_OUT3_SLAVE_SEL_MASK; 1452 val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel); 1453 break; 1454 default: 1455 return 0; 1456 } 1457 1458 regmap_update_bits(afe->regmap, reg, mask, val); 1459 1460 return 0; 1461 } 1462 1463 static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id) 1464 { 1465 int cg_id = -1; 1466 1467 switch (dai_id) { 1468 case MT8195_AFE_IO_DPTX: 1469 cg_id = MT8195_CLK_AUD_HDMI_OUT; 1470 break; 1471 case MT8195_AFE_IO_ETDM1_IN: 1472 cg_id = MT8195_CLK_AUD_TDM_IN; 1473 break; 1474 case MT8195_AFE_IO_ETDM2_IN: 1475 cg_id = MT8195_CLK_AUD_I2SIN; 1476 break; 1477 case MT8195_AFE_IO_ETDM1_OUT: 1478 cg_id = MT8195_CLK_AUD_TDM_OUT; 1479 break; 1480 case MT8195_AFE_IO_ETDM2_OUT: 1481 cg_id = MT8195_CLK_AUD_I2S_OUT; 1482 break; 1483 case MT8195_AFE_IO_ETDM3_OUT: 1484 cg_id = MT8195_CLK_AUD_HDMI_OUT; 1485 break; 1486 default: 1487 break; 1488 } 1489 1490 return cg_id; 1491 } 1492 1493 static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id) 1494 { 1495 int clk_id = -1; 1496 1497 switch (dai_id) { 1498 case MT8195_AFE_IO_DPTX: 1499 clk_id = MT8195_CLK_TOP_DPTX_M_SEL; 1500 break; 1501 case MT8195_AFE_IO_ETDM1_IN: 1502 clk_id = MT8195_CLK_TOP_I2SI1_M_SEL; 1503 break; 1504 case MT8195_AFE_IO_ETDM2_IN: 1505 clk_id = MT8195_CLK_TOP_I2SI2_M_SEL; 1506 break; 1507 case MT8195_AFE_IO_ETDM1_OUT: 1508 clk_id = MT8195_CLK_TOP_I2SO1_M_SEL; 1509 break; 1510 case MT8195_AFE_IO_ETDM2_OUT: 1511 clk_id = MT8195_CLK_TOP_I2SO2_M_SEL; 1512 break; 1513 case MT8195_AFE_IO_ETDM3_OUT: 1514 default: 1515 break; 1516 } 1517 1518 return clk_id; 1519 } 1520 1521 static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id) 1522 { 1523 int clk_id = -1; 1524 1525 switch (dai_id) { 1526 case MT8195_AFE_IO_DPTX: 1527 clk_id = MT8195_CLK_TOP_APLL12_DIV9; 1528 break; 1529 case MT8195_AFE_IO_ETDM1_IN: 1530 clk_id = MT8195_CLK_TOP_APLL12_DIV0; 1531 break; 1532 case MT8195_AFE_IO_ETDM2_IN: 1533 clk_id = MT8195_CLK_TOP_APLL12_DIV1; 1534 break; 1535 case MT8195_AFE_IO_ETDM1_OUT: 1536 clk_id = MT8195_CLK_TOP_APLL12_DIV2; 1537 break; 1538 case MT8195_AFE_IO_ETDM2_OUT: 1539 clk_id = MT8195_CLK_TOP_APLL12_DIV3; 1540 break; 1541 case MT8195_AFE_IO_ETDM3_OUT: 1542 default: 1543 break; 1544 } 1545 1546 return clk_id; 1547 } 1548 1549 static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id) 1550 { 1551 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1552 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 1553 1554 if (clkdiv_id < 0) 1555 return -EINVAL; 1556 1557 mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]); 1558 1559 return 0; 1560 } 1561 1562 static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id) 1563 { 1564 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1565 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 1566 1567 if (clkdiv_id < 0) 1568 return -EINVAL; 1569 1570 mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]); 1571 1572 return 0; 1573 } 1574 1575 /* dai ops */ 1576 static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream, 1577 struct snd_soc_dai *dai) 1578 { 1579 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1580 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1581 struct mtk_dai_etdm_priv *mst_etdm_data; 1582 int cg_id; 1583 int mst_dai_id; 1584 int slv_dai_id; 1585 int i; 1586 1587 if (is_cowork_mode(dai)) { 1588 mst_dai_id = get_etdm_cowork_master_id(dai); 1589 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 1590 return -EINVAL; 1591 1592 mtk_dai_etdm_enable_mclk(afe, mst_dai_id); 1593 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 1594 if (cg_id >= 0) 1595 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 1596 1597 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 1598 1599 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 1600 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 1601 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 1602 if (cg_id >= 0) 1603 mt8195_afe_enable_clk(afe, 1604 afe_priv->clk[cg_id]); 1605 } 1606 } else { 1607 mtk_dai_etdm_enable_mclk(afe, dai->id); 1608 1609 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 1610 if (cg_id >= 0) 1611 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 1612 } 1613 1614 return 0; 1615 } 1616 1617 static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream, 1618 struct snd_soc_dai *dai) 1619 { 1620 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1621 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1622 struct mtk_dai_etdm_priv *mst_etdm_data; 1623 int cg_id; 1624 int mst_dai_id; 1625 int slv_dai_id; 1626 int i; 1627 1628 if (is_cowork_mode(dai)) { 1629 mst_dai_id = get_etdm_cowork_master_id(dai); 1630 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 1631 return; 1632 1633 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 1634 if (cg_id >= 0) 1635 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 1636 1637 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 1638 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 1639 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 1640 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 1641 if (cg_id >= 0) 1642 mt8195_afe_disable_clk(afe, 1643 afe_priv->clk[cg_id]); 1644 } 1645 mtk_dai_etdm_disable_mclk(afe, mst_dai_id); 1646 } else { 1647 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 1648 if (cg_id >= 0) 1649 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 1650 1651 mtk_dai_etdm_disable_mclk(afe, dai->id); 1652 } 1653 } 1654 1655 static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe, 1656 int dai_id, unsigned int rate) 1657 { 1658 unsigned int mode = 0; 1659 unsigned int reg = 0; 1660 unsigned int val = 0; 1661 unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO); 1662 1663 if (rate != 0) 1664 mode = mt8195_afe_fs_timing(rate); 1665 1666 switch (dai_id) { 1667 case MT8195_AFE_IO_ETDM1_IN: 1668 reg = ETDM_IN1_AFIFO_CON; 1669 if (rate == 0) 1670 mode = MT8195_ETDM_IN1_1X_EN; 1671 break; 1672 case MT8195_AFE_IO_ETDM2_IN: 1673 reg = ETDM_IN2_AFIFO_CON; 1674 if (rate == 0) 1675 mode = MT8195_ETDM_IN2_1X_EN; 1676 break; 1677 default: 1678 return -EINVAL; 1679 } 1680 1681 val = (mode | ETDM_IN_USE_AFIFO); 1682 1683 regmap_update_bits(afe->regmap, reg, mask, val); 1684 return 0; 1685 } 1686 1687 static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe, 1688 unsigned int rate, 1689 unsigned int channels, 1690 int dai_id) 1691 { 1692 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1693 struct mtk_dai_etdm_priv *etdm_data; 1694 struct etdm_con_reg etdm_reg; 1695 bool slave_mode; 1696 unsigned int data_mode; 1697 unsigned int lrck_width; 1698 unsigned int val = 0; 1699 unsigned int mask = 0; 1700 int i; 1701 int ret; 1702 1703 if (!mt8195_afe_etdm_is_valid(dai_id)) 1704 return -EINVAL; 1705 1706 etdm_data = afe_priv->dai_priv[dai_id]; 1707 slave_mode = etdm_data->slave_mode; 1708 data_mode = etdm_data->data_mode; 1709 lrck_width = etdm_data->lrck_width; 1710 1711 dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 1712 __func__, rate, channels, dai_id); 1713 1714 ret = get_etdm_reg(dai_id, &etdm_reg); 1715 if (ret < 0) 1716 return ret; 1717 1718 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 1719 slave_mode = true; 1720 1721 /* afifo */ 1722 if (slave_mode) 1723 mtk_dai_etdm_fifo_mode(afe, dai_id, 0); 1724 else 1725 mtk_dai_etdm_fifo_mode(afe, dai_id, rate); 1726 1727 /* con1 */ 1728 if (lrck_width > 0) { 1729 mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE | 1730 ETDM_IN_CON1_LRCK_WIDTH_MASK); 1731 val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width); 1732 } 1733 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 1734 1735 mask = 0; 1736 val = 0; 1737 1738 /* con2 */ 1739 if (!slave_mode) { 1740 mask |= ETDM_IN_CON2_UPDATE_GAP_MASK; 1741 if (rate == 352800 || rate == 384000) 1742 val |= ETDM_IN_CON2_UPDATE_GAP(4); 1743 else 1744 val |= ETDM_IN_CON2_UPDATE_GAP(3); 1745 } 1746 mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE | 1747 ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK); 1748 if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) { 1749 val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE | 1750 ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels); 1751 } 1752 regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val); 1753 1754 mask = 0; 1755 val = 0; 1756 1757 /* con3 */ 1758 mask |= ETDM_IN_CON3_DISABLE_OUT_MASK; 1759 for (i = 0; i < channels; i += 2) { 1760 if (etdm_data->in_disable_ch[i] && 1761 etdm_data->in_disable_ch[i + 1]) 1762 val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1); 1763 } 1764 if (!slave_mode) { 1765 mask |= ETDM_IN_CON3_FS_MASK; 1766 val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate)); 1767 } 1768 regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val); 1769 1770 mask = 0; 1771 val = 0; 1772 1773 /* con4 */ 1774 mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV | 1775 ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV); 1776 if (slave_mode) { 1777 if (etdm_data->lrck_inv) 1778 val |= ETDM_IN_CON4_SLAVE_LRCK_INV; 1779 if (etdm_data->bck_inv) 1780 val |= ETDM_IN_CON4_SLAVE_BCK_INV; 1781 } else { 1782 if (etdm_data->lrck_inv) 1783 val |= ETDM_IN_CON4_MASTER_LRCK_INV; 1784 if (etdm_data->bck_inv) 1785 val |= ETDM_IN_CON4_MASTER_BCK_INV; 1786 } 1787 regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 1788 1789 mask = 0; 1790 val = 0; 1791 1792 /* con5 */ 1793 mask |= ETDM_IN_CON5_LR_SWAP_MASK; 1794 mask |= ETDM_IN_CON5_ENABLE_ODD_MASK; 1795 for (i = 0; i < channels; i += 2) { 1796 if (etdm_data->in_disable_ch[i] && 1797 !etdm_data->in_disable_ch[i + 1]) { 1798 if (i == (channels - 2)) 1799 val |= ETDM_IN_CON5_LR_SWAP(15); 1800 else 1801 val |= ETDM_IN_CON5_LR_SWAP(i >> 1); 1802 val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 1803 } else if (!etdm_data->in_disable_ch[i] && 1804 etdm_data->in_disable_ch[i + 1]) { 1805 val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 1806 } 1807 } 1808 regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 1809 return 0; 1810 } 1811 1812 static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe, 1813 unsigned int rate, 1814 unsigned int channels, 1815 int dai_id) 1816 { 1817 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1818 struct mtk_dai_etdm_priv *etdm_data; 1819 struct etdm_con_reg etdm_reg; 1820 bool slave_mode; 1821 unsigned int lrck_width; 1822 unsigned int val = 0; 1823 unsigned int mask = 0; 1824 int ret; 1825 int fs = 0; 1826 1827 if (!mt8195_afe_etdm_is_valid(dai_id)) 1828 return -EINVAL; 1829 1830 etdm_data = afe_priv->dai_priv[dai_id]; 1831 slave_mode = etdm_data->slave_mode; 1832 lrck_width = etdm_data->lrck_width; 1833 1834 dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 1835 __func__, rate, channels, dai_id); 1836 1837 ret = get_etdm_reg(dai_id, &etdm_reg); 1838 if (ret < 0) 1839 return ret; 1840 1841 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 1842 slave_mode = true; 1843 1844 /* con0 */ 1845 mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK; 1846 val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS); 1847 regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 1848 1849 mask = 0; 1850 val = 0; 1851 1852 /* con1 */ 1853 if (lrck_width > 0) { 1854 mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE | 1855 ETDM_OUT_CON1_LRCK_WIDTH_MASK); 1856 val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width); 1857 } 1858 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 1859 1860 mask = 0; 1861 val = 0; 1862 1863 if (slave_mode) { 1864 /* con2 */ 1865 mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 1866 ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 1867 val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 1868 ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 1869 regmap_update_bits(afe->regmap, etdm_reg.con2, 1870 mask, val); 1871 mask = 0; 1872 val = 0; 1873 } else { 1874 /* con4 */ 1875 mask |= ETDM_OUT_CON4_FS_MASK; 1876 val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate)); 1877 } 1878 1879 mask |= ETDM_OUT_CON4_RELATCH_EN_MASK; 1880 if (dai_id == MT8195_AFE_IO_ETDM1_OUT) 1881 fs = MT8195_ETDM_OUT1_1X_EN; 1882 else if (dai_id == MT8195_AFE_IO_ETDM2_OUT) 1883 fs = MT8195_ETDM_OUT2_1X_EN; 1884 1885 val |= ETDM_OUT_CON4_RELATCH_EN(fs); 1886 1887 regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 1888 1889 mask = 0; 1890 val = 0; 1891 1892 /* con5 */ 1893 mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV | 1894 ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV); 1895 if (slave_mode) { 1896 if (etdm_data->lrck_inv) 1897 val |= ETDM_OUT_CON5_SLAVE_LRCK_INV; 1898 if (etdm_data->bck_inv) 1899 val |= ETDM_OUT_CON5_SLAVE_BCK_INV; 1900 } else { 1901 if (etdm_data->lrck_inv) 1902 val |= ETDM_OUT_CON5_MASTER_LRCK_INV; 1903 if (etdm_data->bck_inv) 1904 val |= ETDM_OUT_CON5_MASTER_BCK_INV; 1905 } 1906 regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 1907 1908 return 0; 1909 } 1910 1911 static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id) 1912 { 1913 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1914 struct mtk_dai_etdm_priv *etdm_data; 1915 int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id); 1916 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 1917 int apll; 1918 int apll_clk_id; 1919 struct etdm_con_reg etdm_reg; 1920 unsigned int val = 0; 1921 unsigned int mask = 0; 1922 int ret = 0; 1923 1924 if (clk_id < 0 || clkdiv_id < 0) 1925 return 0; 1926 1927 if (!mt8195_afe_etdm_is_valid(dai_id)) 1928 return -EINVAL; 1929 1930 etdm_data = afe_priv->dai_priv[dai_id]; 1931 ret = get_etdm_reg(dai_id, &etdm_reg); 1932 if (ret < 0) 1933 return ret; 1934 1935 mask |= ETDM_CON1_MCLK_OUTPUT; 1936 if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 1937 val |= ETDM_CON1_MCLK_OUTPUT; 1938 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 1939 1940 if (etdm_data->mclk_freq) { 1941 apll = etdm_data->mclk_apll; 1942 apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll); 1943 if (apll_clk_id < 0) 1944 return apll_clk_id; 1945 1946 /* select apll */ 1947 ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id], 1948 afe_priv->clk[apll_clk_id]); 1949 if (ret) 1950 return ret; 1951 1952 /* set rate */ 1953 ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id], 1954 etdm_data->mclk_freq); 1955 } else { 1956 if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 1957 dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__); 1958 } 1959 return ret; 1960 } 1961 1962 static int mtk_dai_etdm_configure(struct mtk_base_afe *afe, 1963 unsigned int rate, 1964 unsigned int channels, 1965 unsigned int bit_width, 1966 int dai_id) 1967 { 1968 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1969 struct mtk_dai_etdm_priv *etdm_data; 1970 struct etdm_con_reg etdm_reg; 1971 bool slave_mode; 1972 unsigned int etdm_channels; 1973 unsigned int val = 0; 1974 unsigned int mask = 0; 1975 unsigned int bck; 1976 unsigned int wlen = get_etdm_wlen(bit_width); 1977 int ret; 1978 1979 if (!mt8195_afe_etdm_is_valid(dai_id)) 1980 return -EINVAL; 1981 1982 etdm_data = afe_priv->dai_priv[dai_id]; 1983 slave_mode = etdm_data->slave_mode; 1984 ret = get_etdm_reg(dai_id, &etdm_reg); 1985 if (ret < 0) 1986 return ret; 1987 1988 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 1989 slave_mode = true; 1990 1991 dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n", 1992 __func__, etdm_data->format, etdm_data->data_mode, 1993 etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv, 1994 etdm_data->clock_mode, etdm_data->slave_mode); 1995 dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n", 1996 __func__, rate, channels, bit_width, dai_id); 1997 1998 etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ? 1999 get_etdm_ch_fixup(channels) : 2; 2000 2001 bck = rate * etdm_channels * wlen; 2002 if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) { 2003 dev_info(afe->dev, "%s bck rate %u not support\n", 2004 __func__, bck); 2005 return -EINVAL; 2006 } 2007 2008 /* con0 */ 2009 mask |= ETDM_CON0_BIT_LEN_MASK; 2010 val |= ETDM_CON0_BIT_LEN(bit_width); 2011 mask |= ETDM_CON0_WORD_LEN_MASK; 2012 val |= ETDM_CON0_WORD_LEN(wlen); 2013 mask |= ETDM_CON0_FORMAT_MASK; 2014 val |= ETDM_CON0_FORMAT(etdm_data->format); 2015 mask |= ETDM_CON0_CH_NUM_MASK; 2016 val |= ETDM_CON0_CH_NUM(etdm_channels); 2017 2018 mask |= ETDM_CON0_SLAVE_MODE; 2019 if (slave_mode) { 2020 if (dai_id == MT8195_AFE_IO_ETDM1_OUT && 2021 etdm_data->cowork_source_id == COWORK_ETDM_NONE) { 2022 dev_info(afe->dev, "%s id %d only support master mode\n", 2023 __func__, dai_id); 2024 return -EINVAL; 2025 } 2026 val |= ETDM_CON0_SLAVE_MODE; 2027 } 2028 regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 2029 2030 if (get_etdm_dir(dai_id) == ETDM_IN) 2031 mtk_dai_etdm_in_configure(afe, rate, channels, dai_id); 2032 else 2033 mtk_dai_etdm_out_configure(afe, rate, channels, dai_id); 2034 2035 return 0; 2036 } 2037 2038 static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream, 2039 struct snd_pcm_hw_params *params, 2040 struct snd_soc_dai *dai) 2041 { 2042 int ret = 0; 2043 unsigned int rate = params_rate(params); 2044 unsigned int bit_width = params_width(params); 2045 unsigned int channels = params_channels(params); 2046 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2047 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2048 struct mtk_dai_etdm_priv *mst_etdm_data; 2049 int mst_dai_id; 2050 int slv_dai_id; 2051 int i; 2052 2053 dev_dbg(afe->dev, "%s '%s' period %u-%u\n", 2054 __func__, snd_pcm_stream_str(substream), 2055 params_period_size(params), params_periods(params)); 2056 2057 if (is_cowork_mode(dai)) { 2058 mst_dai_id = get_etdm_cowork_master_id(dai); 2059 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2060 return -EINVAL; 2061 2062 ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id); 2063 if (ret) 2064 return ret; 2065 2066 ret = mtk_dai_etdm_configure(afe, rate, channels, 2067 bit_width, mst_dai_id); 2068 if (ret) 2069 return ret; 2070 2071 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 2072 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 2073 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 2074 ret = mtk_dai_etdm_configure(afe, rate, channels, 2075 bit_width, slv_dai_id); 2076 if (ret) 2077 return ret; 2078 2079 ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id); 2080 if (ret) 2081 return ret; 2082 } 2083 } else { 2084 ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 2085 if (ret) 2086 return ret; 2087 2088 ret = mtk_dai_etdm_configure(afe, rate, channels, 2089 bit_width, dai->id); 2090 } 2091 2092 return ret; 2093 } 2094 2095 static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd, 2096 struct snd_soc_dai *dai) 2097 { 2098 int ret = 0; 2099 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2100 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2101 struct mtk_dai_etdm_priv *mst_etdm_data; 2102 int mst_dai_id; 2103 int slv_dai_id; 2104 int i; 2105 2106 dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 2107 switch (cmd) { 2108 case SNDRV_PCM_TRIGGER_START: 2109 case SNDRV_PCM_TRIGGER_RESUME: 2110 if (is_cowork_mode(dai)) { 2111 mst_dai_id = get_etdm_cowork_master_id(dai); 2112 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2113 return -EINVAL; 2114 2115 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 2116 2117 //open master first 2118 ret |= mt8195_afe_enable_etdm(afe, mst_dai_id); 2119 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 2120 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 2121 ret |= mt8195_afe_enable_etdm(afe, slv_dai_id); 2122 } 2123 } else { 2124 ret = mt8195_afe_enable_etdm(afe, dai->id); 2125 } 2126 break; 2127 case SNDRV_PCM_TRIGGER_STOP: 2128 case SNDRV_PCM_TRIGGER_SUSPEND: 2129 if (is_cowork_mode(dai)) { 2130 mst_dai_id = get_etdm_cowork_master_id(dai); 2131 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2132 return -EINVAL; 2133 2134 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 2135 2136 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 2137 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 2138 ret |= mt8195_afe_disable_etdm(afe, slv_dai_id); 2139 } 2140 // close master at last 2141 ret |= mt8195_afe_disable_etdm(afe, mst_dai_id); 2142 } else { 2143 ret = mt8195_afe_disable_etdm(afe, dai->id); 2144 } 2145 break; 2146 default: 2147 break; 2148 } 2149 return ret; 2150 } 2151 2152 static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id) 2153 { 2154 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2155 struct mtk_dai_etdm_priv *etdm_data; 2156 int apll; 2157 int apll_rate; 2158 2159 if (!mt8195_afe_etdm_is_valid(dai_id)) 2160 return -EINVAL; 2161 2162 etdm_data = afe_priv->dai_priv[dai_id]; 2163 if (freq == 0) { 2164 etdm_data->mclk_freq = freq; 2165 return 0; 2166 } 2167 2168 apll = mt8195_afe_get_default_mclk_source_by_rate(freq); 2169 apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll); 2170 2171 if (freq > apll_rate) { 2172 dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate); 2173 return -EINVAL; 2174 } 2175 2176 if (apll_rate % freq != 0) { 2177 dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll); 2178 return -EINVAL; 2179 } 2180 2181 etdm_data->mclk_apll = apll; 2182 etdm_data->mclk_freq = freq; 2183 2184 return 0; 2185 } 2186 2187 static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai, 2188 int clk_id, unsigned int freq, int dir) 2189 { 2190 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2191 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2192 struct mtk_dai_etdm_priv *etdm_data; 2193 int dai_id; 2194 2195 dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 2196 __func__, dai->id, freq, dir); 2197 if (is_cowork_mode(dai)) 2198 dai_id = get_etdm_cowork_master_id(dai); 2199 else 2200 dai_id = dai->id; 2201 2202 if (!mt8195_afe_etdm_is_valid(dai_id)) 2203 return -EINVAL; 2204 2205 etdm_data = afe_priv->dai_priv[dai_id]; 2206 etdm_data->mclk_dir = dir; 2207 return mtk_dai_etdm_cal_mclk(afe, freq, dai_id); 2208 } 2209 2210 static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai, 2211 unsigned int tx_mask, unsigned int rx_mask, 2212 int slots, int slot_width) 2213 { 2214 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2215 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2216 struct mtk_dai_etdm_priv *etdm_data; 2217 2218 if (!mt8195_afe_etdm_is_valid(dai->id)) 2219 return -EINVAL; 2220 2221 etdm_data = afe_priv->dai_priv[dai->id]; 2222 dev_dbg(dai->dev, "%s id %d slot_width %d\n", 2223 __func__, dai->id, slot_width); 2224 2225 etdm_data->slots = slots; 2226 etdm_data->lrck_width = slot_width; 2227 return 0; 2228 } 2229 2230 static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) 2231 { 2232 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2233 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2234 struct mtk_dai_etdm_priv *etdm_data; 2235 2236 if (!mt8195_afe_etdm_is_valid(dai->id)) 2237 return -EINVAL; 2238 2239 etdm_data = afe_priv->dai_priv[dai->id]; 2240 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 2241 case SND_SOC_DAIFMT_I2S: 2242 etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S; 2243 break; 2244 case SND_SOC_DAIFMT_LEFT_J: 2245 etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ; 2246 break; 2247 case SND_SOC_DAIFMT_RIGHT_J: 2248 etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ; 2249 break; 2250 case SND_SOC_DAIFMT_DSP_A: 2251 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA; 2252 break; 2253 case SND_SOC_DAIFMT_DSP_B: 2254 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB; 2255 break; 2256 default: 2257 return -EINVAL; 2258 } 2259 2260 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 2261 case SND_SOC_DAIFMT_NB_NF: 2262 etdm_data->bck_inv = false; 2263 etdm_data->lrck_inv = false; 2264 break; 2265 case SND_SOC_DAIFMT_NB_IF: 2266 etdm_data->bck_inv = false; 2267 etdm_data->lrck_inv = true; 2268 break; 2269 case SND_SOC_DAIFMT_IB_NF: 2270 etdm_data->bck_inv = true; 2271 etdm_data->lrck_inv = false; 2272 break; 2273 case SND_SOC_DAIFMT_IB_IF: 2274 etdm_data->bck_inv = true; 2275 etdm_data->lrck_inv = true; 2276 break; 2277 default: 2278 return -EINVAL; 2279 } 2280 2281 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 2282 case SND_SOC_DAIFMT_BC_FC: 2283 etdm_data->slave_mode = true; 2284 break; 2285 case SND_SOC_DAIFMT_BP_FP: 2286 etdm_data->slave_mode = false; 2287 break; 2288 default: 2289 return -EINVAL; 2290 } 2291 2292 return 0; 2293 } 2294 2295 static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream, 2296 struct snd_soc_dai *dai) 2297 { 2298 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2299 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2300 int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 2301 2302 if (cg_id >= 0) 2303 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 2304 2305 mtk_dai_etdm_enable_mclk(afe, dai->id); 2306 2307 return 0; 2308 } 2309 2310 static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream, 2311 struct snd_soc_dai *dai) 2312 { 2313 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2314 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2315 int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 2316 2317 mtk_dai_etdm_disable_mclk(afe, dai->id); 2318 2319 if (cg_id >= 0) 2320 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 2321 } 2322 2323 static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel) 2324 { 2325 switch (channel) { 2326 case 1 ... 2: 2327 return AFE_DPTX_CON_CH_EN_2CH; 2328 case 3 ... 4: 2329 return AFE_DPTX_CON_CH_EN_4CH; 2330 case 5 ... 6: 2331 return AFE_DPTX_CON_CH_EN_6CH; 2332 case 7 ... 8: 2333 return AFE_DPTX_CON_CH_EN_8CH; 2334 default: 2335 return AFE_DPTX_CON_CH_EN_2CH; 2336 } 2337 } 2338 2339 static unsigned int mtk_dai_get_dptx_ch(unsigned int ch) 2340 { 2341 return (ch > 2) ? 2342 AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH; 2343 } 2344 2345 static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format) 2346 { 2347 return snd_pcm_format_physical_width(format) <= 16 ? 2348 AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT; 2349 } 2350 2351 static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream, 2352 struct snd_pcm_hw_params *params, 2353 struct snd_soc_dai *dai) 2354 { 2355 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2356 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2357 struct mtk_dai_etdm_priv *etdm_data; 2358 unsigned int rate = params_rate(params); 2359 unsigned int channels = params_channels(params); 2360 snd_pcm_format_t format = params_format(params); 2361 int width = snd_pcm_format_physical_width(format); 2362 int ret = 0; 2363 2364 if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 2365 return -EINVAL; 2366 2367 etdm_data = afe_priv->dai_priv[dai->id]; 2368 2369 /* dptx configure */ 2370 if (dai->id == MT8195_AFE_IO_DPTX) { 2371 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2372 AFE_DPTX_CON_CH_EN_MASK, 2373 mtk_dai_get_dptx_ch_en(channels)); 2374 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2375 AFE_DPTX_CON_CH_NUM_MASK, 2376 mtk_dai_get_dptx_ch(channels)); 2377 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2378 AFE_DPTX_CON_16BIT_MASK, 2379 mtk_dai_get_dptx_wlen(format)); 2380 2381 if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) { 2382 etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN; 2383 channels = 8; 2384 } else { 2385 channels = 2; 2386 } 2387 } else { 2388 etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN; 2389 } 2390 2391 ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 2392 if (ret) 2393 return ret; 2394 2395 ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id); 2396 2397 return ret; 2398 } 2399 2400 static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream, 2401 int cmd, 2402 struct snd_soc_dai *dai) 2403 { 2404 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2405 int ret = 0; 2406 2407 dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 2408 2409 switch (cmd) { 2410 case SNDRV_PCM_TRIGGER_START: 2411 case SNDRV_PCM_TRIGGER_RESUME: 2412 /* enable dptx interface */ 2413 if (dai->id == MT8195_AFE_IO_DPTX) 2414 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2415 AFE_DPTX_CON_ON_MASK, 2416 AFE_DPTX_CON_ON); 2417 2418 /* enable etdm_out3 */ 2419 ret = mt8195_afe_enable_etdm(afe, dai->id); 2420 break; 2421 case SNDRV_PCM_TRIGGER_STOP: 2422 case SNDRV_PCM_TRIGGER_SUSPEND: 2423 /* disable etdm_out3 */ 2424 ret = mt8195_afe_disable_etdm(afe, dai->id); 2425 2426 /* disable dptx interface */ 2427 if (dai->id == MT8195_AFE_IO_DPTX) 2428 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2429 AFE_DPTX_CON_ON_MASK, 0); 2430 break; 2431 default: 2432 return -EINVAL; 2433 } 2434 2435 return ret; 2436 } 2437 2438 static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai, 2439 int clk_id, 2440 unsigned int freq, 2441 int dir) 2442 { 2443 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2444 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2445 struct mtk_dai_etdm_priv *etdm_data; 2446 2447 if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 2448 return -EINVAL; 2449 2450 etdm_data = afe_priv->dai_priv[dai->id]; 2451 2452 dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 2453 __func__, dai->id, freq, dir); 2454 2455 etdm_data->mclk_dir = dir; 2456 return mtk_dai_etdm_cal_mclk(afe, freq, dai->id); 2457 } 2458 2459 /* dai driver */ 2460 #define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000) 2461 2462 #define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 2463 SNDRV_PCM_FMTBIT_S24_LE |\ 2464 SNDRV_PCM_FMTBIT_S32_LE) 2465 2466 static int mtk_dai_etdm_probe(struct snd_soc_dai *dai) 2467 { 2468 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2469 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2470 struct mtk_dai_etdm_priv *etdm_data; 2471 2472 dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id); 2473 2474 if (!mt8195_afe_etdm_is_valid(dai->id)) 2475 return -EINVAL; 2476 2477 etdm_data = afe_priv->dai_priv[dai->id]; 2478 if (etdm_data->mclk_freq) { 2479 dev_dbg(afe->dev, "MCLK always on, rate %d\n", 2480 etdm_data->mclk_freq); 2481 pm_runtime_get_sync(afe->dev); 2482 mtk_dai_etdm_mclk_configure(afe, dai->id); 2483 mtk_dai_etdm_enable_mclk(afe, dai->id); 2484 pm_runtime_put_sync(afe->dev); 2485 } 2486 return 0; 2487 } 2488 2489 static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = { 2490 .startup = mtk_dai_hdmitx_dptx_startup, 2491 .shutdown = mtk_dai_hdmitx_dptx_shutdown, 2492 .hw_params = mtk_dai_hdmitx_dptx_hw_params, 2493 .trigger = mtk_dai_hdmitx_dptx_trigger, 2494 .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 2495 .set_fmt = mtk_dai_etdm_set_fmt, 2496 }; 2497 2498 static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = { 2499 .probe = mtk_dai_etdm_probe, 2500 .startup = mtk_dai_hdmitx_dptx_startup, 2501 .shutdown = mtk_dai_hdmitx_dptx_shutdown, 2502 .hw_params = mtk_dai_hdmitx_dptx_hw_params, 2503 .trigger = mtk_dai_hdmitx_dptx_trigger, 2504 .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 2505 .set_fmt = mtk_dai_etdm_set_fmt, 2506 }; 2507 2508 static const struct snd_soc_dai_ops mtk_dai_etdm_ops = { 2509 .probe = mtk_dai_etdm_probe, 2510 .startup = mtk_dai_etdm_startup, 2511 .shutdown = mtk_dai_etdm_shutdown, 2512 .hw_params = mtk_dai_etdm_hw_params, 2513 .trigger = mtk_dai_etdm_trigger, 2514 .set_sysclk = mtk_dai_etdm_set_sysclk, 2515 .set_fmt = mtk_dai_etdm_set_fmt, 2516 .set_tdm_slot = mtk_dai_etdm_set_tdm_slot, 2517 }; 2518 2519 static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = { 2520 { 2521 .name = "DPTX", 2522 .id = MT8195_AFE_IO_DPTX, 2523 .playback = { 2524 .stream_name = "DPTX Playback", 2525 .channels_min = 1, 2526 .channels_max = 8, 2527 .rates = MTK_ETDM_RATES, 2528 .formats = MTK_ETDM_FORMATS, 2529 }, 2530 .ops = &mtk_dai_hdmitx_dptx_ops, 2531 }, 2532 { 2533 .name = "ETDM1_IN", 2534 .id = MT8195_AFE_IO_ETDM1_IN, 2535 .capture = { 2536 .stream_name = "ETDM1 Capture", 2537 .channels_min = 1, 2538 .channels_max = 24, 2539 .rates = MTK_ETDM_RATES, 2540 .formats = MTK_ETDM_FORMATS, 2541 }, 2542 .ops = &mtk_dai_etdm_ops, 2543 }, 2544 { 2545 .name = "ETDM2_IN", 2546 .id = MT8195_AFE_IO_ETDM2_IN, 2547 .capture = { 2548 .stream_name = "ETDM2 Capture", 2549 .channels_min = 1, 2550 .channels_max = 16, 2551 .rates = MTK_ETDM_RATES, 2552 .formats = MTK_ETDM_FORMATS, 2553 }, 2554 .ops = &mtk_dai_etdm_ops, 2555 }, 2556 { 2557 .name = "ETDM1_OUT", 2558 .id = MT8195_AFE_IO_ETDM1_OUT, 2559 .playback = { 2560 .stream_name = "ETDM1 Playback", 2561 .channels_min = 1, 2562 .channels_max = 24, 2563 .rates = MTK_ETDM_RATES, 2564 .formats = MTK_ETDM_FORMATS, 2565 }, 2566 .ops = &mtk_dai_etdm_ops, 2567 }, 2568 { 2569 .name = "ETDM2_OUT", 2570 .id = MT8195_AFE_IO_ETDM2_OUT, 2571 .playback = { 2572 .stream_name = "ETDM2 Playback", 2573 .channels_min = 1, 2574 .channels_max = 24, 2575 .rates = MTK_ETDM_RATES, 2576 .formats = MTK_ETDM_FORMATS, 2577 }, 2578 .ops = &mtk_dai_etdm_ops, 2579 }, 2580 { 2581 .name = "ETDM3_OUT", 2582 .id = MT8195_AFE_IO_ETDM3_OUT, 2583 .playback = { 2584 .stream_name = "ETDM3 Playback", 2585 .channels_min = 1, 2586 .channels_max = 8, 2587 .rates = MTK_ETDM_RATES, 2588 .formats = MTK_ETDM_FORMATS, 2589 }, 2590 .ops = &mtk_dai_hdmitx_dptx_ops2, 2591 }, 2592 }; 2593 2594 static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe) 2595 { 2596 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2597 struct mtk_dai_etdm_priv *etdm_data; 2598 struct mtk_dai_etdm_priv *mst_data; 2599 int i; 2600 int mst_dai_id; 2601 2602 for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 2603 etdm_data = afe_priv->dai_priv[i]; 2604 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) { 2605 mst_dai_id = etdm_data->cowork_source_id; 2606 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) { 2607 dev_err(afe->dev, "%s invalid dai id %d\n", 2608 __func__, mst_dai_id); 2609 return; 2610 } 2611 mst_data = afe_priv->dai_priv[mst_dai_id]; 2612 if (mst_data->cowork_source_id != COWORK_ETDM_NONE) 2613 dev_info(afe->dev, "%s [%d] wrong sync source\n" 2614 , __func__, i); 2615 mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i; 2616 mst_data->cowork_slv_count++; 2617 } 2618 } 2619 } 2620 2621 static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe) 2622 { 2623 const struct device_node *of_node = afe->dev->of_node; 2624 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2625 struct mtk_dai_etdm_priv *etdm_data; 2626 int i, j; 2627 char prop[48]; 2628 u8 disable_chn[MT8195_ETDM_MAX_CHANNELS]; 2629 int max_chn = MT8195_ETDM_MAX_CHANNELS; 2630 u32 sel; 2631 int ret; 2632 int dai_id; 2633 unsigned int sync_id; 2634 struct { 2635 const char *name; 2636 const unsigned int sync_id; 2637 } of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = { 2638 {"etdm-in1", ETDM_SYNC_FROM_IN1}, 2639 {"etdm-in2", ETDM_SYNC_FROM_IN2}, 2640 {"etdm-out1", ETDM_SYNC_FROM_OUT1}, 2641 {"etdm-out2", ETDM_SYNC_FROM_OUT2}, 2642 {"etdm-out3", ETDM_SYNC_FROM_OUT3}, 2643 }; 2644 2645 for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) { 2646 dai_id = ETDM_TO_DAI_ID(i); 2647 if (!mt8195_afe_etdm_is_valid(dai_id)) { 2648 dev_err(afe->dev, "%s invalid dai id %d\n", 2649 __func__, dai_id); 2650 return; 2651 } 2652 2653 etdm_data = afe_priv->dai_priv[dai_id]; 2654 2655 ret = snprintf(prop, sizeof(prop), 2656 "mediatek,%s-mclk-always-on-rate", 2657 of_afe_etdms[i].name); 2658 if (ret < 0) { 2659 dev_info(afe->dev, "%s snprintf err=%d\n", 2660 __func__, ret); 2661 return; 2662 } 2663 ret = of_property_read_u32(of_node, prop, &sel); 2664 if (ret == 0) { 2665 etdm_data->mclk_dir = SND_SOC_CLOCK_OUT; 2666 if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id)) 2667 dev_info(afe->dev, "%s unsupported mclk %uHz\n", 2668 __func__, sel); 2669 } 2670 2671 ret = snprintf(prop, sizeof(prop), 2672 "mediatek,%s-multi-pin-mode", 2673 of_afe_etdms[i].name); 2674 if (ret < 0) { 2675 dev_info(afe->dev, "%s snprintf err=%d\n", 2676 __func__, ret); 2677 return; 2678 } 2679 etdm_data->data_mode = of_property_read_bool(of_node, prop); 2680 2681 ret = snprintf(prop, sizeof(prop), 2682 "mediatek,%s-cowork-source", 2683 of_afe_etdms[i].name); 2684 if (ret < 0) { 2685 dev_info(afe->dev, "%s snprintf err=%d\n", 2686 __func__, ret); 2687 return; 2688 } 2689 ret = of_property_read_u32(of_node, prop, &sel); 2690 if (ret == 0) { 2691 if (sel >= MT8195_AFE_IO_ETDM_NUM) { 2692 dev_info(afe->dev, "%s invalid id=%d\n", 2693 __func__, sel); 2694 etdm_data->cowork_source_id = COWORK_ETDM_NONE; 2695 } else { 2696 sync_id = of_afe_etdms[sel].sync_id; 2697 etdm_data->cowork_source_id = 2698 sync_to_dai_id(sync_id); 2699 } 2700 } else { 2701 etdm_data->cowork_source_id = COWORK_ETDM_NONE; 2702 } 2703 } 2704 2705 /* etdm in only */ 2706 for (i = 0; i < 2; i++) { 2707 dai_id = ETDM_TO_DAI_ID(i); 2708 etdm_data = afe_priv->dai_priv[dai_id]; 2709 2710 ret = snprintf(prop, sizeof(prop), 2711 "mediatek,%s-chn-disabled", 2712 of_afe_etdms[i].name); 2713 if (ret < 0) { 2714 dev_info(afe->dev, "%s snprintf err=%d\n", 2715 __func__, ret); 2716 return; 2717 } 2718 ret = of_property_read_variable_u8_array(of_node, prop, 2719 disable_chn, 2720 1, max_chn); 2721 if (ret < 0) 2722 continue; 2723 2724 for (j = 0; j < ret; j++) { 2725 if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS) 2726 dev_info(afe->dev, "%s [%d] invalid chn %u\n", 2727 __func__, j, disable_chn[j]); 2728 else 2729 etdm_data->in_disable_ch[disable_chn[j]] = true; 2730 } 2731 } 2732 mt8195_etdm_update_sync_info(afe); 2733 } 2734 2735 static int init_etdm_priv_data(struct mtk_base_afe *afe) 2736 { 2737 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2738 struct mtk_dai_etdm_priv *etdm_priv; 2739 int i; 2740 2741 for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 2742 etdm_priv = devm_kzalloc(afe->dev, 2743 sizeof(struct mtk_dai_etdm_priv), 2744 GFP_KERNEL); 2745 if (!etdm_priv) 2746 return -ENOMEM; 2747 2748 afe_priv->dai_priv[i] = etdm_priv; 2749 } 2750 2751 afe_priv->dai_priv[MT8195_AFE_IO_DPTX] = 2752 afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT]; 2753 2754 mt8195_dai_etdm_parse_of(afe); 2755 return 0; 2756 } 2757 2758 int mt8195_dai_etdm_register(struct mtk_base_afe *afe) 2759 { 2760 struct mtk_base_afe_dai *dai; 2761 2762 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 2763 if (!dai) 2764 return -ENOMEM; 2765 2766 list_add(&dai->list, &afe->sub_dais); 2767 2768 dai->dai_drivers = mtk_dai_etdm_driver; 2769 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver); 2770 2771 dai->dapm_widgets = mtk_dai_etdm_widgets; 2772 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets); 2773 dai->dapm_routes = mtk_dai_etdm_routes; 2774 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes); 2775 dai->controls = mtk_dai_etdm_controls; 2776 dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls); 2777 2778 return init_etdm_priv_data(afe); 2779 } 2780
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.