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 = snd_kcontrol_chip(kcontrol); 742 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 743 unsigned int value = 0; 744 unsigned int reg = 0; 745 unsigned int mask = 0; 746 unsigned int shift = 0; 747 748 if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 749 reg = ETDM_OUT1_CON4; 750 mask = ETDM_OUT_CON4_CLOCK_MASK; 751 shift = ETDM_OUT_CON4_CLOCK_SHIFT; 752 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 753 reg = ETDM_OUT2_CON4; 754 mask = ETDM_OUT_CON4_CLOCK_MASK; 755 shift = ETDM_OUT_CON4_CLOCK_SHIFT; 756 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 757 reg = ETDM_OUT3_CON4; 758 mask = ETDM_OUT_CON4_CLOCK_MASK; 759 shift = ETDM_OUT_CON4_CLOCK_SHIFT; 760 } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 761 reg = ETDM_IN1_CON2; 762 mask = ETDM_IN_CON2_CLOCK_MASK; 763 shift = ETDM_IN_CON2_CLOCK_SHIFT; 764 } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 765 reg = ETDM_IN2_CON2; 766 mask = ETDM_IN_CON2_CLOCK_MASK; 767 shift = ETDM_IN_CON2_CLOCK_SHIFT; 768 } 769 770 if (reg) 771 regmap_read(afe->regmap, reg, &value); 772 773 value &= mask; 774 value >>= shift; 775 ucontrol->value.enumerated.item[0] = value; 776 return 0; 777 } 778 779 static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = { 780 SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", 781 etdmout_clk_src_enum, 782 mt8195_etdm_clk_src_sel_get, 783 mt8195_etdm_clk_src_sel_put), 784 SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", 785 etdmout_clk_src_enum, 786 mt8195_etdm_clk_src_sel_get, 787 mt8195_etdm_clk_src_sel_put), 788 SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", 789 etdmout_clk_src_enum, 790 mt8195_etdm_clk_src_sel_get, 791 mt8195_etdm_clk_src_sel_put), 792 SOC_ENUM_EXT("ETDM_IN1_Clock_Source", 793 etdmout_clk_src_enum, 794 mt8195_etdm_clk_src_sel_get, 795 mt8195_etdm_clk_src_sel_put), 796 SOC_ENUM_EXT("ETDM_IN2_Clock_Source", 797 etdmout_clk_src_enum, 798 mt8195_etdm_clk_src_sel_get, 799 mt8195_etdm_clk_src_sel_put), 800 }; 801 802 static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = { 803 /* eTDM_IN2 */ 804 SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0), 805 SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0), 806 SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0), 807 SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0), 808 SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0), 809 SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0), 810 SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0), 811 SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0), 812 813 /* eTDM_IN1 */ 814 SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0), 815 SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0), 816 SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0), 817 SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0), 818 SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0), 819 SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0), 820 SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0), 821 SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0), 822 SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0), 823 SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0), 824 SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0), 825 SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0), 826 SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0), 827 SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0), 828 SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0), 829 SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0), 830 SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0), 831 SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0), 832 SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0), 833 SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0), 834 SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0), 835 SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0), 836 SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0), 837 SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0), 838 839 /* eTDM_OUT2 */ 840 SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0, 841 mtk_dai_etdm_o048_mix, 842 ARRAY_SIZE(mtk_dai_etdm_o048_mix)), 843 SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0, 844 mtk_dai_etdm_o049_mix, 845 ARRAY_SIZE(mtk_dai_etdm_o049_mix)), 846 SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0, 847 mtk_dai_etdm_o050_mix, 848 ARRAY_SIZE(mtk_dai_etdm_o050_mix)), 849 SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0, 850 mtk_dai_etdm_o051_mix, 851 ARRAY_SIZE(mtk_dai_etdm_o051_mix)), 852 SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0, 853 mtk_dai_etdm_o052_mix, 854 ARRAY_SIZE(mtk_dai_etdm_o052_mix)), 855 SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0, 856 mtk_dai_etdm_o053_mix, 857 ARRAY_SIZE(mtk_dai_etdm_o053_mix)), 858 SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0, 859 mtk_dai_etdm_o054_mix, 860 ARRAY_SIZE(mtk_dai_etdm_o054_mix)), 861 SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0, 862 mtk_dai_etdm_o055_mix, 863 ARRAY_SIZE(mtk_dai_etdm_o055_mix)), 864 SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0, 865 mtk_dai_etdm_o056_mix, 866 ARRAY_SIZE(mtk_dai_etdm_o056_mix)), 867 SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0, 868 mtk_dai_etdm_o057_mix, 869 ARRAY_SIZE(mtk_dai_etdm_o057_mix)), 870 SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0, 871 mtk_dai_etdm_o058_mix, 872 ARRAY_SIZE(mtk_dai_etdm_o058_mix)), 873 SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0, 874 mtk_dai_etdm_o059_mix, 875 ARRAY_SIZE(mtk_dai_etdm_o059_mix)), 876 SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0, 877 mtk_dai_etdm_o060_mix, 878 ARRAY_SIZE(mtk_dai_etdm_o060_mix)), 879 SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0, 880 mtk_dai_etdm_o061_mix, 881 ARRAY_SIZE(mtk_dai_etdm_o061_mix)), 882 SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0, 883 mtk_dai_etdm_o062_mix, 884 ARRAY_SIZE(mtk_dai_etdm_o062_mix)), 885 SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0, 886 mtk_dai_etdm_o063_mix, 887 ARRAY_SIZE(mtk_dai_etdm_o063_mix)), 888 SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0, 889 mtk_dai_etdm_o064_mix, 890 ARRAY_SIZE(mtk_dai_etdm_o064_mix)), 891 SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0, 892 mtk_dai_etdm_o065_mix, 893 ARRAY_SIZE(mtk_dai_etdm_o065_mix)), 894 SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0, 895 mtk_dai_etdm_o066_mix, 896 ARRAY_SIZE(mtk_dai_etdm_o066_mix)), 897 SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0, 898 mtk_dai_etdm_o067_mix, 899 ARRAY_SIZE(mtk_dai_etdm_o067_mix)), 900 SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0, 901 mtk_dai_etdm_o068_mix, 902 ARRAY_SIZE(mtk_dai_etdm_o068_mix)), 903 SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0, 904 mtk_dai_etdm_o069_mix, 905 ARRAY_SIZE(mtk_dai_etdm_o069_mix)), 906 SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0, 907 mtk_dai_etdm_o070_mix, 908 ARRAY_SIZE(mtk_dai_etdm_o070_mix)), 909 SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0, 910 mtk_dai_etdm_o071_mix, 911 ARRAY_SIZE(mtk_dai_etdm_o071_mix)), 912 913 /* eTDM_OUT1 */ 914 SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0, 915 mtk_dai_etdm_o072_mix, 916 ARRAY_SIZE(mtk_dai_etdm_o072_mix)), 917 SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0, 918 mtk_dai_etdm_o073_mix, 919 ARRAY_SIZE(mtk_dai_etdm_o073_mix)), 920 SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0, 921 mtk_dai_etdm_o074_mix, 922 ARRAY_SIZE(mtk_dai_etdm_o074_mix)), 923 SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0, 924 mtk_dai_etdm_o075_mix, 925 ARRAY_SIZE(mtk_dai_etdm_o075_mix)), 926 SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0, 927 mtk_dai_etdm_o076_mix, 928 ARRAY_SIZE(mtk_dai_etdm_o076_mix)), 929 SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0, 930 mtk_dai_etdm_o077_mix, 931 ARRAY_SIZE(mtk_dai_etdm_o077_mix)), 932 SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0, 933 mtk_dai_etdm_o078_mix, 934 ARRAY_SIZE(mtk_dai_etdm_o078_mix)), 935 SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0, 936 mtk_dai_etdm_o079_mix, 937 ARRAY_SIZE(mtk_dai_etdm_o079_mix)), 938 SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0, 939 mtk_dai_etdm_o080_mix, 940 ARRAY_SIZE(mtk_dai_etdm_o080_mix)), 941 SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0, 942 mtk_dai_etdm_o081_mix, 943 ARRAY_SIZE(mtk_dai_etdm_o081_mix)), 944 SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0, 945 mtk_dai_etdm_o082_mix, 946 ARRAY_SIZE(mtk_dai_etdm_o082_mix)), 947 SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0, 948 mtk_dai_etdm_o083_mix, 949 ARRAY_SIZE(mtk_dai_etdm_o083_mix)), 950 SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0, 951 mtk_dai_etdm_o084_mix, 952 ARRAY_SIZE(mtk_dai_etdm_o084_mix)), 953 SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0, 954 mtk_dai_etdm_o085_mix, 955 ARRAY_SIZE(mtk_dai_etdm_o085_mix)), 956 SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0, 957 mtk_dai_etdm_o086_mix, 958 ARRAY_SIZE(mtk_dai_etdm_o086_mix)), 959 SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0, 960 mtk_dai_etdm_o087_mix, 961 ARRAY_SIZE(mtk_dai_etdm_o087_mix)), 962 SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0, 963 mtk_dai_etdm_o088_mix, 964 ARRAY_SIZE(mtk_dai_etdm_o088_mix)), 965 SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0, 966 mtk_dai_etdm_o089_mix, 967 ARRAY_SIZE(mtk_dai_etdm_o089_mix)), 968 SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0, 969 mtk_dai_etdm_o090_mix, 970 ARRAY_SIZE(mtk_dai_etdm_o090_mix)), 971 SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0, 972 mtk_dai_etdm_o091_mix, 973 ARRAY_SIZE(mtk_dai_etdm_o091_mix)), 974 SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0, 975 mtk_dai_etdm_o092_mix, 976 ARRAY_SIZE(mtk_dai_etdm_o092_mix)), 977 SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0, 978 mtk_dai_etdm_o093_mix, 979 ARRAY_SIZE(mtk_dai_etdm_o093_mix)), 980 SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0, 981 mtk_dai_etdm_o094_mix, 982 ARRAY_SIZE(mtk_dai_etdm_o094_mix)), 983 SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0, 984 mtk_dai_etdm_o095_mix, 985 ARRAY_SIZE(mtk_dai_etdm_o095_mix)), 986 987 /* eTDM_OUT3 */ 988 SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0, 989 &hdmi_out_mux_control), 990 SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0, 991 &dptx_out_mux_control), 992 993 SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0, 994 &hdmi_ch0_mux_control), 995 SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0, 996 &hdmi_ch1_mux_control), 997 SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0, 998 &hdmi_ch2_mux_control), 999 SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0, 1000 &hdmi_ch3_mux_control), 1001 SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0, 1002 &hdmi_ch4_mux_control), 1003 SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0, 1004 &hdmi_ch5_mux_control), 1005 SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0, 1006 &hdmi_ch6_mux_control), 1007 SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0, 1008 &hdmi_ch7_mux_control), 1009 1010 SND_SOC_DAPM_INPUT("ETDM_INPUT"), 1011 SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"), 1012 }; 1013 1014 static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = { 1015 {"I012", NULL, "ETDM2 Capture"}, 1016 {"I013", NULL, "ETDM2 Capture"}, 1017 {"I014", NULL, "ETDM2 Capture"}, 1018 {"I015", NULL, "ETDM2 Capture"}, 1019 {"I016", NULL, "ETDM2 Capture"}, 1020 {"I017", NULL, "ETDM2 Capture"}, 1021 {"I018", NULL, "ETDM2 Capture"}, 1022 {"I019", NULL, "ETDM2 Capture"}, 1023 1024 {"I072", NULL, "ETDM1 Capture"}, 1025 {"I073", NULL, "ETDM1 Capture"}, 1026 {"I074", NULL, "ETDM1 Capture"}, 1027 {"I075", NULL, "ETDM1 Capture"}, 1028 {"I076", NULL, "ETDM1 Capture"}, 1029 {"I077", NULL, "ETDM1 Capture"}, 1030 {"I078", NULL, "ETDM1 Capture"}, 1031 {"I079", NULL, "ETDM1 Capture"}, 1032 {"I080", NULL, "ETDM1 Capture"}, 1033 {"I081", NULL, "ETDM1 Capture"}, 1034 {"I082", NULL, "ETDM1 Capture"}, 1035 {"I083", NULL, "ETDM1 Capture"}, 1036 {"I084", NULL, "ETDM1 Capture"}, 1037 {"I085", NULL, "ETDM1 Capture"}, 1038 {"I086", NULL, "ETDM1 Capture"}, 1039 {"I087", NULL, "ETDM1 Capture"}, 1040 {"I088", NULL, "ETDM1 Capture"}, 1041 {"I089", NULL, "ETDM1 Capture"}, 1042 {"I090", NULL, "ETDM1 Capture"}, 1043 {"I091", NULL, "ETDM1 Capture"}, 1044 {"I092", NULL, "ETDM1 Capture"}, 1045 {"I093", NULL, "ETDM1 Capture"}, 1046 {"I094", NULL, "ETDM1 Capture"}, 1047 {"I095", NULL, "ETDM1 Capture"}, 1048 1049 {"UL8", NULL, "ETDM1 Capture"}, 1050 {"UL3", NULL, "ETDM2 Capture"}, 1051 1052 {"ETDM2 Playback", NULL, "O048"}, 1053 {"ETDM2 Playback", NULL, "O049"}, 1054 {"ETDM2 Playback", NULL, "O050"}, 1055 {"ETDM2 Playback", NULL, "O051"}, 1056 {"ETDM2 Playback", NULL, "O052"}, 1057 {"ETDM2 Playback", NULL, "O053"}, 1058 {"ETDM2 Playback", NULL, "O054"}, 1059 {"ETDM2 Playback", NULL, "O055"}, 1060 {"ETDM2 Playback", NULL, "O056"}, 1061 {"ETDM2 Playback", NULL, "O057"}, 1062 {"ETDM2 Playback", NULL, "O058"}, 1063 {"ETDM2 Playback", NULL, "O059"}, 1064 {"ETDM2 Playback", NULL, "O060"}, 1065 {"ETDM2 Playback", NULL, "O061"}, 1066 {"ETDM2 Playback", NULL, "O062"}, 1067 {"ETDM2 Playback", NULL, "O063"}, 1068 {"ETDM2 Playback", NULL, "O064"}, 1069 {"ETDM2 Playback", NULL, "O065"}, 1070 {"ETDM2 Playback", NULL, "O066"}, 1071 {"ETDM2 Playback", NULL, "O067"}, 1072 {"ETDM2 Playback", NULL, "O068"}, 1073 {"ETDM2 Playback", NULL, "O069"}, 1074 {"ETDM2 Playback", NULL, "O070"}, 1075 {"ETDM2 Playback", NULL, "O071"}, 1076 1077 {"ETDM1 Playback", NULL, "O072"}, 1078 {"ETDM1 Playback", NULL, "O073"}, 1079 {"ETDM1 Playback", NULL, "O074"}, 1080 {"ETDM1 Playback", NULL, "O075"}, 1081 {"ETDM1 Playback", NULL, "O076"}, 1082 {"ETDM1 Playback", NULL, "O077"}, 1083 {"ETDM1 Playback", NULL, "O078"}, 1084 {"ETDM1 Playback", NULL, "O079"}, 1085 {"ETDM1 Playback", NULL, "O080"}, 1086 {"ETDM1 Playback", NULL, "O081"}, 1087 {"ETDM1 Playback", NULL, "O082"}, 1088 {"ETDM1 Playback", NULL, "O083"}, 1089 {"ETDM1 Playback", NULL, "O084"}, 1090 {"ETDM1 Playback", NULL, "O085"}, 1091 {"ETDM1 Playback", NULL, "O086"}, 1092 {"ETDM1 Playback", NULL, "O087"}, 1093 {"ETDM1 Playback", NULL, "O088"}, 1094 {"ETDM1 Playback", NULL, "O089"}, 1095 {"ETDM1 Playback", NULL, "O090"}, 1096 {"ETDM1 Playback", NULL, "O091"}, 1097 {"ETDM1 Playback", NULL, "O092"}, 1098 {"ETDM1 Playback", NULL, "O093"}, 1099 {"ETDM1 Playback", NULL, "O094"}, 1100 {"ETDM1 Playback", NULL, "O095"}, 1101 1102 {"O048", "I020 Switch", "I020"}, 1103 {"O049", "I021 Switch", "I021"}, 1104 1105 {"O048", "I022 Switch", "I022"}, 1106 {"O049", "I023 Switch", "I023"}, 1107 {"O050", "I024 Switch", "I024"}, 1108 {"O051", "I025 Switch", "I025"}, 1109 {"O052", "I026 Switch", "I026"}, 1110 {"O053", "I027 Switch", "I027"}, 1111 {"O054", "I028 Switch", "I028"}, 1112 {"O055", "I029 Switch", "I029"}, 1113 {"O056", "I030 Switch", "I030"}, 1114 {"O057", "I031 Switch", "I031"}, 1115 {"O058", "I032 Switch", "I032"}, 1116 {"O059", "I033 Switch", "I033"}, 1117 {"O060", "I034 Switch", "I034"}, 1118 {"O061", "I035 Switch", "I035"}, 1119 {"O062", "I036 Switch", "I036"}, 1120 {"O063", "I037 Switch", "I037"}, 1121 {"O064", "I038 Switch", "I038"}, 1122 {"O065", "I039 Switch", "I039"}, 1123 {"O066", "I040 Switch", "I040"}, 1124 {"O067", "I041 Switch", "I041"}, 1125 {"O068", "I042 Switch", "I042"}, 1126 {"O069", "I043 Switch", "I043"}, 1127 {"O070", "I044 Switch", "I044"}, 1128 {"O071", "I045 Switch", "I045"}, 1129 1130 {"O048", "I046 Switch", "I046"}, 1131 {"O049", "I047 Switch", "I047"}, 1132 {"O050", "I048 Switch", "I048"}, 1133 {"O051", "I049 Switch", "I049"}, 1134 {"O052", "I050 Switch", "I050"}, 1135 {"O053", "I051 Switch", "I051"}, 1136 {"O054", "I052 Switch", "I052"}, 1137 {"O055", "I053 Switch", "I053"}, 1138 {"O056", "I054 Switch", "I054"}, 1139 {"O057", "I055 Switch", "I055"}, 1140 {"O058", "I056 Switch", "I056"}, 1141 {"O059", "I057 Switch", "I057"}, 1142 {"O060", "I058 Switch", "I058"}, 1143 {"O061", "I059 Switch", "I059"}, 1144 {"O062", "I060 Switch", "I060"}, 1145 {"O063", "I061 Switch", "I061"}, 1146 {"O064", "I062 Switch", "I062"}, 1147 {"O065", "I063 Switch", "I063"}, 1148 {"O066", "I064 Switch", "I064"}, 1149 {"O067", "I065 Switch", "I065"}, 1150 {"O068", "I066 Switch", "I066"}, 1151 {"O069", "I067 Switch", "I067"}, 1152 {"O070", "I068 Switch", "I068"}, 1153 {"O071", "I069 Switch", "I069"}, 1154 1155 {"O048", "I070 Switch", "I070"}, 1156 {"O049", "I071 Switch", "I071"}, 1157 1158 {"O072", "I020 Switch", "I020"}, 1159 {"O073", "I021 Switch", "I021"}, 1160 1161 {"O072", "I022 Switch", "I022"}, 1162 {"O073", "I023 Switch", "I023"}, 1163 {"O074", "I024 Switch", "I024"}, 1164 {"O075", "I025 Switch", "I025"}, 1165 {"O076", "I026 Switch", "I026"}, 1166 {"O077", "I027 Switch", "I027"}, 1167 {"O078", "I028 Switch", "I028"}, 1168 {"O079", "I029 Switch", "I029"}, 1169 {"O080", "I030 Switch", "I030"}, 1170 {"O081", "I031 Switch", "I031"}, 1171 {"O082", "I032 Switch", "I032"}, 1172 {"O083", "I033 Switch", "I033"}, 1173 {"O084", "I034 Switch", "I034"}, 1174 {"O085", "I035 Switch", "I035"}, 1175 {"O086", "I036 Switch", "I036"}, 1176 {"O087", "I037 Switch", "I037"}, 1177 {"O088", "I038 Switch", "I038"}, 1178 {"O089", "I039 Switch", "I039"}, 1179 {"O090", "I040 Switch", "I040"}, 1180 {"O091", "I041 Switch", "I041"}, 1181 {"O092", "I042 Switch", "I042"}, 1182 {"O093", "I043 Switch", "I043"}, 1183 {"O094", "I044 Switch", "I044"}, 1184 {"O095", "I045 Switch", "I045"}, 1185 1186 {"O072", "I046 Switch", "I046"}, 1187 {"O073", "I047 Switch", "I047"}, 1188 {"O074", "I048 Switch", "I048"}, 1189 {"O075", "I049 Switch", "I049"}, 1190 {"O076", "I050 Switch", "I050"}, 1191 {"O077", "I051 Switch", "I051"}, 1192 {"O078", "I052 Switch", "I052"}, 1193 {"O079", "I053 Switch", "I053"}, 1194 {"O080", "I054 Switch", "I054"}, 1195 {"O081", "I055 Switch", "I055"}, 1196 {"O082", "I056 Switch", "I056"}, 1197 {"O083", "I057 Switch", "I057"}, 1198 {"O084", "I058 Switch", "I058"}, 1199 {"O085", "I059 Switch", "I059"}, 1200 {"O086", "I060 Switch", "I060"}, 1201 {"O087", "I061 Switch", "I061"}, 1202 {"O088", "I062 Switch", "I062"}, 1203 {"O089", "I063 Switch", "I063"}, 1204 {"O090", "I064 Switch", "I064"}, 1205 {"O091", "I065 Switch", "I065"}, 1206 {"O092", "I066 Switch", "I066"}, 1207 {"O093", "I067 Switch", "I067"}, 1208 {"O094", "I068 Switch", "I068"}, 1209 {"O095", "I069 Switch", "I069"}, 1210 1211 {"O072", "I070 Switch", "I070"}, 1212 {"O073", "I071 Switch", "I071"}, 1213 1214 {"HDMI_CH0_MUX", "CH0", "DL10"}, 1215 {"HDMI_CH0_MUX", "CH1", "DL10"}, 1216 {"HDMI_CH0_MUX", "CH2", "DL10"}, 1217 {"HDMI_CH0_MUX", "CH3", "DL10"}, 1218 {"HDMI_CH0_MUX", "CH4", "DL10"}, 1219 {"HDMI_CH0_MUX", "CH5", "DL10"}, 1220 {"HDMI_CH0_MUX", "CH6", "DL10"}, 1221 {"HDMI_CH0_MUX", "CH7", "DL10"}, 1222 1223 {"HDMI_CH1_MUX", "CH0", "DL10"}, 1224 {"HDMI_CH1_MUX", "CH1", "DL10"}, 1225 {"HDMI_CH1_MUX", "CH2", "DL10"}, 1226 {"HDMI_CH1_MUX", "CH3", "DL10"}, 1227 {"HDMI_CH1_MUX", "CH4", "DL10"}, 1228 {"HDMI_CH1_MUX", "CH5", "DL10"}, 1229 {"HDMI_CH1_MUX", "CH6", "DL10"}, 1230 {"HDMI_CH1_MUX", "CH7", "DL10"}, 1231 1232 {"HDMI_CH2_MUX", "CH0", "DL10"}, 1233 {"HDMI_CH2_MUX", "CH1", "DL10"}, 1234 {"HDMI_CH2_MUX", "CH2", "DL10"}, 1235 {"HDMI_CH2_MUX", "CH3", "DL10"}, 1236 {"HDMI_CH2_MUX", "CH4", "DL10"}, 1237 {"HDMI_CH2_MUX", "CH5", "DL10"}, 1238 {"HDMI_CH2_MUX", "CH6", "DL10"}, 1239 {"HDMI_CH2_MUX", "CH7", "DL10"}, 1240 1241 {"HDMI_CH3_MUX", "CH0", "DL10"}, 1242 {"HDMI_CH3_MUX", "CH1", "DL10"}, 1243 {"HDMI_CH3_MUX", "CH2", "DL10"}, 1244 {"HDMI_CH3_MUX", "CH3", "DL10"}, 1245 {"HDMI_CH3_MUX", "CH4", "DL10"}, 1246 {"HDMI_CH3_MUX", "CH5", "DL10"}, 1247 {"HDMI_CH3_MUX", "CH6", "DL10"}, 1248 {"HDMI_CH3_MUX", "CH7", "DL10"}, 1249 1250 {"HDMI_CH4_MUX", "CH0", "DL10"}, 1251 {"HDMI_CH4_MUX", "CH1", "DL10"}, 1252 {"HDMI_CH4_MUX", "CH2", "DL10"}, 1253 {"HDMI_CH4_MUX", "CH3", "DL10"}, 1254 {"HDMI_CH4_MUX", "CH4", "DL10"}, 1255 {"HDMI_CH4_MUX", "CH5", "DL10"}, 1256 {"HDMI_CH4_MUX", "CH6", "DL10"}, 1257 {"HDMI_CH4_MUX", "CH7", "DL10"}, 1258 1259 {"HDMI_CH5_MUX", "CH0", "DL10"}, 1260 {"HDMI_CH5_MUX", "CH1", "DL10"}, 1261 {"HDMI_CH5_MUX", "CH2", "DL10"}, 1262 {"HDMI_CH5_MUX", "CH3", "DL10"}, 1263 {"HDMI_CH5_MUX", "CH4", "DL10"}, 1264 {"HDMI_CH5_MUX", "CH5", "DL10"}, 1265 {"HDMI_CH5_MUX", "CH6", "DL10"}, 1266 {"HDMI_CH5_MUX", "CH7", "DL10"}, 1267 1268 {"HDMI_CH6_MUX", "CH0", "DL10"}, 1269 {"HDMI_CH6_MUX", "CH1", "DL10"}, 1270 {"HDMI_CH6_MUX", "CH2", "DL10"}, 1271 {"HDMI_CH6_MUX", "CH3", "DL10"}, 1272 {"HDMI_CH6_MUX", "CH4", "DL10"}, 1273 {"HDMI_CH6_MUX", "CH5", "DL10"}, 1274 {"HDMI_CH6_MUX", "CH6", "DL10"}, 1275 {"HDMI_CH6_MUX", "CH7", "DL10"}, 1276 1277 {"HDMI_CH7_MUX", "CH0", "DL10"}, 1278 {"HDMI_CH7_MUX", "CH1", "DL10"}, 1279 {"HDMI_CH7_MUX", "CH2", "DL10"}, 1280 {"HDMI_CH7_MUX", "CH3", "DL10"}, 1281 {"HDMI_CH7_MUX", "CH4", "DL10"}, 1282 {"HDMI_CH7_MUX", "CH5", "DL10"}, 1283 {"HDMI_CH7_MUX", "CH6", "DL10"}, 1284 {"HDMI_CH7_MUX", "CH7", "DL10"}, 1285 1286 {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 1287 {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 1288 {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 1289 {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 1290 {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 1291 {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 1292 {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 1293 {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 1294 1295 {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 1296 {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 1297 {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 1298 {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 1299 {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 1300 {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 1301 {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 1302 {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 1303 1304 {"ETDM3 Playback", NULL, "HDMI_OUT_MUX"}, 1305 {"DPTX Playback", NULL, "DPTX_OUT_MUX"}, 1306 1307 {"ETDM_OUTPUT", NULL, "DPTX Playback"}, 1308 {"ETDM_OUTPUT", NULL, "ETDM1 Playback"}, 1309 {"ETDM_OUTPUT", NULL, "ETDM2 Playback"}, 1310 {"ETDM_OUTPUT", NULL, "ETDM3 Playback"}, 1311 {"ETDM1 Capture", NULL, "ETDM_INPUT"}, 1312 {"ETDM2 Capture", NULL, "ETDM_INPUT"}, 1313 }; 1314 1315 static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id) 1316 { 1317 int ret = 0; 1318 struct etdm_con_reg etdm_reg; 1319 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1320 struct mtk_dai_etdm_priv *etdm_data; 1321 unsigned long flags; 1322 1323 if (!mt8195_afe_etdm_is_valid(dai_id)) 1324 return -EINVAL; 1325 1326 etdm_data = afe_priv->dai_priv[dai_id]; 1327 spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 1328 etdm_data->en_ref_cnt++; 1329 if (etdm_data->en_ref_cnt == 1) { 1330 ret = get_etdm_reg(dai_id, &etdm_reg); 1331 if (ret < 0) 1332 goto out; 1333 1334 regmap_update_bits(afe->regmap, etdm_reg.con0, 1335 ETDM_CON0_EN, ETDM_CON0_EN); 1336 } 1337 out: 1338 spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 1339 return ret; 1340 } 1341 1342 static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id) 1343 { 1344 int ret = 0; 1345 struct etdm_con_reg etdm_reg; 1346 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1347 struct mtk_dai_etdm_priv *etdm_data; 1348 unsigned long flags; 1349 1350 if (!mt8195_afe_etdm_is_valid(dai_id)) 1351 return -EINVAL; 1352 1353 etdm_data = afe_priv->dai_priv[dai_id]; 1354 spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 1355 if (etdm_data->en_ref_cnt > 0) { 1356 etdm_data->en_ref_cnt--; 1357 if (etdm_data->en_ref_cnt == 0) { 1358 ret = get_etdm_reg(dai_id, &etdm_reg); 1359 if (ret < 0) 1360 goto out; 1361 1362 regmap_update_bits(afe->regmap, etdm_reg.con0, 1363 ETDM_CON0_EN, 0); 1364 } 1365 } 1366 out: 1367 spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 1368 return ret; 1369 } 1370 1371 static int etdm_cowork_slv_sel(int id, int slave_mode) 1372 { 1373 if (slave_mode) { 1374 switch (id) { 1375 case MT8195_AFE_IO_ETDM1_IN: 1376 return COWORK_ETDM_IN1_S; 1377 case MT8195_AFE_IO_ETDM2_IN: 1378 return COWORK_ETDM_IN2_S; 1379 case MT8195_AFE_IO_ETDM1_OUT: 1380 return COWORK_ETDM_OUT1_S; 1381 case MT8195_AFE_IO_ETDM2_OUT: 1382 return COWORK_ETDM_OUT2_S; 1383 case MT8195_AFE_IO_ETDM3_OUT: 1384 return COWORK_ETDM_OUT3_S; 1385 default: 1386 return -EINVAL; 1387 } 1388 } else { 1389 switch (id) { 1390 case MT8195_AFE_IO_ETDM1_IN: 1391 return COWORK_ETDM_IN1_M; 1392 case MT8195_AFE_IO_ETDM2_IN: 1393 return COWORK_ETDM_IN2_M; 1394 case MT8195_AFE_IO_ETDM1_OUT: 1395 return COWORK_ETDM_OUT1_M; 1396 case MT8195_AFE_IO_ETDM2_OUT: 1397 return COWORK_ETDM_OUT2_M; 1398 case MT8195_AFE_IO_ETDM3_OUT: 1399 return COWORK_ETDM_OUT3_M; 1400 default: 1401 return -EINVAL; 1402 } 1403 } 1404 } 1405 1406 static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id) 1407 { 1408 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1409 struct mtk_dai_etdm_priv *etdm_data; 1410 unsigned int reg = 0; 1411 unsigned int mask; 1412 unsigned int val; 1413 int cowork_source_sel; 1414 1415 if (!mt8195_afe_etdm_is_valid(dai_id)) 1416 return -EINVAL; 1417 1418 etdm_data = afe_priv->dai_priv[dai_id]; 1419 if (etdm_data->cowork_source_id == COWORK_ETDM_NONE) 1420 return 0; 1421 1422 cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id, 1423 etdm_data->slave_mode); 1424 if (cowork_source_sel < 0) 1425 return cowork_source_sel; 1426 1427 switch (dai_id) { 1428 case MT8195_AFE_IO_ETDM1_IN: 1429 reg = ETDM_COWORK_CON1; 1430 mask = ETDM_IN1_SLAVE_SEL_MASK; 1431 val = ETDM_IN1_SLAVE_SEL(cowork_source_sel); 1432 break; 1433 case MT8195_AFE_IO_ETDM2_IN: 1434 reg = ETDM_COWORK_CON2; 1435 mask = ETDM_IN2_SLAVE_SEL_MASK; 1436 val = ETDM_IN2_SLAVE_SEL(cowork_source_sel); 1437 break; 1438 case MT8195_AFE_IO_ETDM1_OUT: 1439 reg = ETDM_COWORK_CON0; 1440 mask = ETDM_OUT1_SLAVE_SEL_MASK; 1441 val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel); 1442 break; 1443 case MT8195_AFE_IO_ETDM2_OUT: 1444 reg = ETDM_COWORK_CON2; 1445 mask = ETDM_OUT2_SLAVE_SEL_MASK; 1446 val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel); 1447 break; 1448 case MT8195_AFE_IO_ETDM3_OUT: 1449 reg = ETDM_COWORK_CON2; 1450 mask = ETDM_OUT3_SLAVE_SEL_MASK; 1451 val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel); 1452 break; 1453 default: 1454 return 0; 1455 } 1456 1457 regmap_update_bits(afe->regmap, reg, mask, val); 1458 1459 return 0; 1460 } 1461 1462 static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id) 1463 { 1464 int cg_id = -1; 1465 1466 switch (dai_id) { 1467 case MT8195_AFE_IO_DPTX: 1468 cg_id = MT8195_CLK_AUD_HDMI_OUT; 1469 break; 1470 case MT8195_AFE_IO_ETDM1_IN: 1471 cg_id = MT8195_CLK_AUD_TDM_IN; 1472 break; 1473 case MT8195_AFE_IO_ETDM2_IN: 1474 cg_id = MT8195_CLK_AUD_I2SIN; 1475 break; 1476 case MT8195_AFE_IO_ETDM1_OUT: 1477 cg_id = MT8195_CLK_AUD_TDM_OUT; 1478 break; 1479 case MT8195_AFE_IO_ETDM2_OUT: 1480 cg_id = MT8195_CLK_AUD_I2S_OUT; 1481 break; 1482 case MT8195_AFE_IO_ETDM3_OUT: 1483 cg_id = MT8195_CLK_AUD_HDMI_OUT; 1484 break; 1485 default: 1486 break; 1487 } 1488 1489 return cg_id; 1490 } 1491 1492 static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id) 1493 { 1494 int clk_id = -1; 1495 1496 switch (dai_id) { 1497 case MT8195_AFE_IO_DPTX: 1498 clk_id = MT8195_CLK_TOP_DPTX_M_SEL; 1499 break; 1500 case MT8195_AFE_IO_ETDM1_IN: 1501 clk_id = MT8195_CLK_TOP_I2SI1_M_SEL; 1502 break; 1503 case MT8195_AFE_IO_ETDM2_IN: 1504 clk_id = MT8195_CLK_TOP_I2SI2_M_SEL; 1505 break; 1506 case MT8195_AFE_IO_ETDM1_OUT: 1507 clk_id = MT8195_CLK_TOP_I2SO1_M_SEL; 1508 break; 1509 case MT8195_AFE_IO_ETDM2_OUT: 1510 clk_id = MT8195_CLK_TOP_I2SO2_M_SEL; 1511 break; 1512 case MT8195_AFE_IO_ETDM3_OUT: 1513 default: 1514 break; 1515 } 1516 1517 return clk_id; 1518 } 1519 1520 static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id) 1521 { 1522 int clk_id = -1; 1523 1524 switch (dai_id) { 1525 case MT8195_AFE_IO_DPTX: 1526 clk_id = MT8195_CLK_TOP_APLL12_DIV9; 1527 break; 1528 case MT8195_AFE_IO_ETDM1_IN: 1529 clk_id = MT8195_CLK_TOP_APLL12_DIV0; 1530 break; 1531 case MT8195_AFE_IO_ETDM2_IN: 1532 clk_id = MT8195_CLK_TOP_APLL12_DIV1; 1533 break; 1534 case MT8195_AFE_IO_ETDM1_OUT: 1535 clk_id = MT8195_CLK_TOP_APLL12_DIV2; 1536 break; 1537 case MT8195_AFE_IO_ETDM2_OUT: 1538 clk_id = MT8195_CLK_TOP_APLL12_DIV3; 1539 break; 1540 case MT8195_AFE_IO_ETDM3_OUT: 1541 default: 1542 break; 1543 } 1544 1545 return clk_id; 1546 } 1547 1548 static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id) 1549 { 1550 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1551 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 1552 1553 if (clkdiv_id < 0) 1554 return -EINVAL; 1555 1556 mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]); 1557 1558 return 0; 1559 } 1560 1561 static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id) 1562 { 1563 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1564 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 1565 1566 if (clkdiv_id < 0) 1567 return -EINVAL; 1568 1569 mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]); 1570 1571 return 0; 1572 } 1573 1574 /* dai ops */ 1575 static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream, 1576 struct snd_soc_dai *dai) 1577 { 1578 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1579 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1580 struct mtk_dai_etdm_priv *mst_etdm_data; 1581 int cg_id; 1582 int mst_dai_id; 1583 int slv_dai_id; 1584 int i; 1585 1586 if (is_cowork_mode(dai)) { 1587 mst_dai_id = get_etdm_cowork_master_id(dai); 1588 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 1589 return -EINVAL; 1590 1591 mtk_dai_etdm_enable_mclk(afe, mst_dai_id); 1592 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 1593 if (cg_id >= 0) 1594 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 1595 1596 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 1597 1598 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 1599 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 1600 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 1601 if (cg_id >= 0) 1602 mt8195_afe_enable_clk(afe, 1603 afe_priv->clk[cg_id]); 1604 } 1605 } else { 1606 mtk_dai_etdm_enable_mclk(afe, dai->id); 1607 1608 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 1609 if (cg_id >= 0) 1610 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 1611 } 1612 1613 return 0; 1614 } 1615 1616 static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream, 1617 struct snd_soc_dai *dai) 1618 { 1619 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1620 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1621 struct mtk_dai_etdm_priv *mst_etdm_data; 1622 int cg_id; 1623 int mst_dai_id; 1624 int slv_dai_id; 1625 int i; 1626 1627 if (is_cowork_mode(dai)) { 1628 mst_dai_id = get_etdm_cowork_master_id(dai); 1629 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 1630 return; 1631 1632 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 1633 if (cg_id >= 0) 1634 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 1635 1636 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 1637 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 1638 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 1639 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 1640 if (cg_id >= 0) 1641 mt8195_afe_disable_clk(afe, 1642 afe_priv->clk[cg_id]); 1643 } 1644 mtk_dai_etdm_disable_mclk(afe, mst_dai_id); 1645 } else { 1646 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 1647 if (cg_id >= 0) 1648 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 1649 1650 mtk_dai_etdm_disable_mclk(afe, dai->id); 1651 } 1652 } 1653 1654 static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe, 1655 int dai_id, unsigned int rate) 1656 { 1657 unsigned int mode = 0; 1658 unsigned int reg = 0; 1659 unsigned int val = 0; 1660 unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO); 1661 1662 if (rate != 0) 1663 mode = mt8195_afe_fs_timing(rate); 1664 1665 switch (dai_id) { 1666 case MT8195_AFE_IO_ETDM1_IN: 1667 reg = ETDM_IN1_AFIFO_CON; 1668 if (rate == 0) 1669 mode = MT8195_ETDM_IN1_1X_EN; 1670 break; 1671 case MT8195_AFE_IO_ETDM2_IN: 1672 reg = ETDM_IN2_AFIFO_CON; 1673 if (rate == 0) 1674 mode = MT8195_ETDM_IN2_1X_EN; 1675 break; 1676 default: 1677 return -EINVAL; 1678 } 1679 1680 val = (mode | ETDM_IN_USE_AFIFO); 1681 1682 regmap_update_bits(afe->regmap, reg, mask, val); 1683 return 0; 1684 } 1685 1686 static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe, 1687 unsigned int rate, 1688 unsigned int channels, 1689 int dai_id) 1690 { 1691 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1692 struct mtk_dai_etdm_priv *etdm_data; 1693 struct etdm_con_reg etdm_reg; 1694 bool slave_mode; 1695 unsigned int data_mode; 1696 unsigned int lrck_width; 1697 unsigned int val = 0; 1698 unsigned int mask = 0; 1699 int i; 1700 int ret; 1701 1702 if (!mt8195_afe_etdm_is_valid(dai_id)) 1703 return -EINVAL; 1704 1705 etdm_data = afe_priv->dai_priv[dai_id]; 1706 slave_mode = etdm_data->slave_mode; 1707 data_mode = etdm_data->data_mode; 1708 lrck_width = etdm_data->lrck_width; 1709 1710 dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 1711 __func__, rate, channels, dai_id); 1712 1713 ret = get_etdm_reg(dai_id, &etdm_reg); 1714 if (ret < 0) 1715 return ret; 1716 1717 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 1718 slave_mode = true; 1719 1720 /* afifo */ 1721 if (slave_mode) 1722 mtk_dai_etdm_fifo_mode(afe, dai_id, 0); 1723 else 1724 mtk_dai_etdm_fifo_mode(afe, dai_id, rate); 1725 1726 /* con1 */ 1727 if (lrck_width > 0) { 1728 mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE | 1729 ETDM_IN_CON1_LRCK_WIDTH_MASK); 1730 val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width); 1731 } 1732 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 1733 1734 mask = 0; 1735 val = 0; 1736 1737 /* con2 */ 1738 if (!slave_mode) { 1739 mask |= ETDM_IN_CON2_UPDATE_GAP_MASK; 1740 if (rate == 352800 || rate == 384000) 1741 val |= ETDM_IN_CON2_UPDATE_GAP(4); 1742 else 1743 val |= ETDM_IN_CON2_UPDATE_GAP(3); 1744 } 1745 mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE | 1746 ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK); 1747 if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) { 1748 val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE | 1749 ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels); 1750 } 1751 regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val); 1752 1753 mask = 0; 1754 val = 0; 1755 1756 /* con3 */ 1757 mask |= ETDM_IN_CON3_DISABLE_OUT_MASK; 1758 for (i = 0; i < channels; i += 2) { 1759 if (etdm_data->in_disable_ch[i] && 1760 etdm_data->in_disable_ch[i + 1]) 1761 val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1); 1762 } 1763 if (!slave_mode) { 1764 mask |= ETDM_IN_CON3_FS_MASK; 1765 val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate)); 1766 } 1767 regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val); 1768 1769 mask = 0; 1770 val = 0; 1771 1772 /* con4 */ 1773 mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV | 1774 ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV); 1775 if (slave_mode) { 1776 if (etdm_data->lrck_inv) 1777 val |= ETDM_IN_CON4_SLAVE_LRCK_INV; 1778 if (etdm_data->bck_inv) 1779 val |= ETDM_IN_CON4_SLAVE_BCK_INV; 1780 } else { 1781 if (etdm_data->lrck_inv) 1782 val |= ETDM_IN_CON4_MASTER_LRCK_INV; 1783 if (etdm_data->bck_inv) 1784 val |= ETDM_IN_CON4_MASTER_BCK_INV; 1785 } 1786 regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 1787 1788 mask = 0; 1789 val = 0; 1790 1791 /* con5 */ 1792 mask |= ETDM_IN_CON5_LR_SWAP_MASK; 1793 mask |= ETDM_IN_CON5_ENABLE_ODD_MASK; 1794 for (i = 0; i < channels; i += 2) { 1795 if (etdm_data->in_disable_ch[i] && 1796 !etdm_data->in_disable_ch[i + 1]) { 1797 if (i == (channels - 2)) 1798 val |= ETDM_IN_CON5_LR_SWAP(15); 1799 else 1800 val |= ETDM_IN_CON5_LR_SWAP(i >> 1); 1801 val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 1802 } else if (!etdm_data->in_disable_ch[i] && 1803 etdm_data->in_disable_ch[i + 1]) { 1804 val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 1805 } 1806 } 1807 regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 1808 return 0; 1809 } 1810 1811 static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe, 1812 unsigned int rate, 1813 unsigned int channels, 1814 int dai_id) 1815 { 1816 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1817 struct mtk_dai_etdm_priv *etdm_data; 1818 struct etdm_con_reg etdm_reg; 1819 bool slave_mode; 1820 unsigned int lrck_width; 1821 unsigned int val = 0; 1822 unsigned int mask = 0; 1823 int ret; 1824 int fs = 0; 1825 1826 if (!mt8195_afe_etdm_is_valid(dai_id)) 1827 return -EINVAL; 1828 1829 etdm_data = afe_priv->dai_priv[dai_id]; 1830 slave_mode = etdm_data->slave_mode; 1831 lrck_width = etdm_data->lrck_width; 1832 1833 dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 1834 __func__, rate, channels, dai_id); 1835 1836 ret = get_etdm_reg(dai_id, &etdm_reg); 1837 if (ret < 0) 1838 return ret; 1839 1840 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 1841 slave_mode = true; 1842 1843 /* con0 */ 1844 mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK; 1845 val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS); 1846 regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 1847 1848 mask = 0; 1849 val = 0; 1850 1851 /* con1 */ 1852 if (lrck_width > 0) { 1853 mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE | 1854 ETDM_OUT_CON1_LRCK_WIDTH_MASK); 1855 val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width); 1856 } 1857 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 1858 1859 mask = 0; 1860 val = 0; 1861 1862 if (slave_mode) { 1863 /* con2 */ 1864 mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 1865 ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 1866 val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 1867 ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 1868 regmap_update_bits(afe->regmap, etdm_reg.con2, 1869 mask, val); 1870 mask = 0; 1871 val = 0; 1872 } else { 1873 /* con4 */ 1874 mask |= ETDM_OUT_CON4_FS_MASK; 1875 val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate)); 1876 } 1877 1878 mask |= ETDM_OUT_CON4_RELATCH_EN_MASK; 1879 if (dai_id == MT8195_AFE_IO_ETDM1_OUT) 1880 fs = MT8195_ETDM_OUT1_1X_EN; 1881 else if (dai_id == MT8195_AFE_IO_ETDM2_OUT) 1882 fs = MT8195_ETDM_OUT2_1X_EN; 1883 1884 val |= ETDM_OUT_CON4_RELATCH_EN(fs); 1885 1886 regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 1887 1888 mask = 0; 1889 val = 0; 1890 1891 /* con5 */ 1892 mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV | 1893 ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV); 1894 if (slave_mode) { 1895 if (etdm_data->lrck_inv) 1896 val |= ETDM_OUT_CON5_SLAVE_LRCK_INV; 1897 if (etdm_data->bck_inv) 1898 val |= ETDM_OUT_CON5_SLAVE_BCK_INV; 1899 } else { 1900 if (etdm_data->lrck_inv) 1901 val |= ETDM_OUT_CON5_MASTER_LRCK_INV; 1902 if (etdm_data->bck_inv) 1903 val |= ETDM_OUT_CON5_MASTER_BCK_INV; 1904 } 1905 regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 1906 1907 return 0; 1908 } 1909 1910 static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id) 1911 { 1912 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1913 struct mtk_dai_etdm_priv *etdm_data; 1914 int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id); 1915 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 1916 int apll; 1917 int apll_clk_id; 1918 struct etdm_con_reg etdm_reg; 1919 unsigned int val = 0; 1920 unsigned int mask = 0; 1921 int ret = 0; 1922 1923 if (clk_id < 0 || clkdiv_id < 0) 1924 return 0; 1925 1926 if (!mt8195_afe_etdm_is_valid(dai_id)) 1927 return -EINVAL; 1928 1929 etdm_data = afe_priv->dai_priv[dai_id]; 1930 ret = get_etdm_reg(dai_id, &etdm_reg); 1931 if (ret < 0) 1932 return ret; 1933 1934 mask |= ETDM_CON1_MCLK_OUTPUT; 1935 if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 1936 val |= ETDM_CON1_MCLK_OUTPUT; 1937 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 1938 1939 if (etdm_data->mclk_freq) { 1940 apll = etdm_data->mclk_apll; 1941 apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll); 1942 if (apll_clk_id < 0) 1943 return apll_clk_id; 1944 1945 /* select apll */ 1946 ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id], 1947 afe_priv->clk[apll_clk_id]); 1948 if (ret) 1949 return ret; 1950 1951 /* set rate */ 1952 ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id], 1953 etdm_data->mclk_freq); 1954 } else { 1955 if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 1956 dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__); 1957 } 1958 return ret; 1959 } 1960 1961 static int mtk_dai_etdm_configure(struct mtk_base_afe *afe, 1962 unsigned int rate, 1963 unsigned int channels, 1964 unsigned int bit_width, 1965 int dai_id) 1966 { 1967 struct mt8195_afe_private *afe_priv = afe->platform_priv; 1968 struct mtk_dai_etdm_priv *etdm_data; 1969 struct etdm_con_reg etdm_reg; 1970 bool slave_mode; 1971 unsigned int etdm_channels; 1972 unsigned int val = 0; 1973 unsigned int mask = 0; 1974 unsigned int bck; 1975 unsigned int wlen = get_etdm_wlen(bit_width); 1976 int ret; 1977 1978 if (!mt8195_afe_etdm_is_valid(dai_id)) 1979 return -EINVAL; 1980 1981 etdm_data = afe_priv->dai_priv[dai_id]; 1982 slave_mode = etdm_data->slave_mode; 1983 ret = get_etdm_reg(dai_id, &etdm_reg); 1984 if (ret < 0) 1985 return ret; 1986 1987 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 1988 slave_mode = true; 1989 1990 dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n", 1991 __func__, etdm_data->format, etdm_data->data_mode, 1992 etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv, 1993 etdm_data->clock_mode, etdm_data->slave_mode); 1994 dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n", 1995 __func__, rate, channels, bit_width, dai_id); 1996 1997 etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ? 1998 get_etdm_ch_fixup(channels) : 2; 1999 2000 bck = rate * etdm_channels * wlen; 2001 if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) { 2002 dev_info(afe->dev, "%s bck rate %u not support\n", 2003 __func__, bck); 2004 return -EINVAL; 2005 } 2006 2007 /* con0 */ 2008 mask |= ETDM_CON0_BIT_LEN_MASK; 2009 val |= ETDM_CON0_BIT_LEN(bit_width); 2010 mask |= ETDM_CON0_WORD_LEN_MASK; 2011 val |= ETDM_CON0_WORD_LEN(wlen); 2012 mask |= ETDM_CON0_FORMAT_MASK; 2013 val |= ETDM_CON0_FORMAT(etdm_data->format); 2014 mask |= ETDM_CON0_CH_NUM_MASK; 2015 val |= ETDM_CON0_CH_NUM(etdm_channels); 2016 2017 mask |= ETDM_CON0_SLAVE_MODE; 2018 if (slave_mode) { 2019 if (dai_id == MT8195_AFE_IO_ETDM1_OUT && 2020 etdm_data->cowork_source_id == COWORK_ETDM_NONE) { 2021 dev_info(afe->dev, "%s id %d only support master mode\n", 2022 __func__, dai_id); 2023 return -EINVAL; 2024 } 2025 val |= ETDM_CON0_SLAVE_MODE; 2026 } 2027 regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 2028 2029 if (get_etdm_dir(dai_id) == ETDM_IN) 2030 mtk_dai_etdm_in_configure(afe, rate, channels, dai_id); 2031 else 2032 mtk_dai_etdm_out_configure(afe, rate, channels, dai_id); 2033 2034 return 0; 2035 } 2036 2037 static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream, 2038 struct snd_pcm_hw_params *params, 2039 struct snd_soc_dai *dai) 2040 { 2041 int ret = 0; 2042 unsigned int rate = params_rate(params); 2043 unsigned int bit_width = params_width(params); 2044 unsigned int channels = params_channels(params); 2045 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2046 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2047 struct mtk_dai_etdm_priv *mst_etdm_data; 2048 int mst_dai_id; 2049 int slv_dai_id; 2050 int i; 2051 2052 dev_dbg(afe->dev, "%s '%s' period %u-%u\n", 2053 __func__, snd_pcm_stream_str(substream), 2054 params_period_size(params), params_periods(params)); 2055 2056 if (is_cowork_mode(dai)) { 2057 mst_dai_id = get_etdm_cowork_master_id(dai); 2058 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2059 return -EINVAL; 2060 2061 ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id); 2062 if (ret) 2063 return ret; 2064 2065 ret = mtk_dai_etdm_configure(afe, rate, channels, 2066 bit_width, mst_dai_id); 2067 if (ret) 2068 return ret; 2069 2070 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 2071 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 2072 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 2073 ret = mtk_dai_etdm_configure(afe, rate, channels, 2074 bit_width, slv_dai_id); 2075 if (ret) 2076 return ret; 2077 2078 ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id); 2079 if (ret) 2080 return ret; 2081 } 2082 } else { 2083 ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 2084 if (ret) 2085 return ret; 2086 2087 ret = mtk_dai_etdm_configure(afe, rate, channels, 2088 bit_width, dai->id); 2089 } 2090 2091 return ret; 2092 } 2093 2094 static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd, 2095 struct snd_soc_dai *dai) 2096 { 2097 int ret = 0; 2098 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2099 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2100 struct mtk_dai_etdm_priv *mst_etdm_data; 2101 int mst_dai_id; 2102 int slv_dai_id; 2103 int i; 2104 2105 dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 2106 switch (cmd) { 2107 case SNDRV_PCM_TRIGGER_START: 2108 case SNDRV_PCM_TRIGGER_RESUME: 2109 if (is_cowork_mode(dai)) { 2110 mst_dai_id = get_etdm_cowork_master_id(dai); 2111 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2112 return -EINVAL; 2113 2114 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 2115 2116 //open master first 2117 ret |= mt8195_afe_enable_etdm(afe, mst_dai_id); 2118 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 2119 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 2120 ret |= mt8195_afe_enable_etdm(afe, slv_dai_id); 2121 } 2122 } else { 2123 ret = mt8195_afe_enable_etdm(afe, dai->id); 2124 } 2125 break; 2126 case SNDRV_PCM_TRIGGER_STOP: 2127 case SNDRV_PCM_TRIGGER_SUSPEND: 2128 if (is_cowork_mode(dai)) { 2129 mst_dai_id = get_etdm_cowork_master_id(dai); 2130 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2131 return -EINVAL; 2132 2133 mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 2134 2135 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 2136 slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 2137 ret |= mt8195_afe_disable_etdm(afe, slv_dai_id); 2138 } 2139 // close master at last 2140 ret |= mt8195_afe_disable_etdm(afe, mst_dai_id); 2141 } else { 2142 ret = mt8195_afe_disable_etdm(afe, dai->id); 2143 } 2144 break; 2145 default: 2146 break; 2147 } 2148 return ret; 2149 } 2150 2151 static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id) 2152 { 2153 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2154 struct mtk_dai_etdm_priv *etdm_data; 2155 int apll; 2156 int apll_rate; 2157 2158 if (!mt8195_afe_etdm_is_valid(dai_id)) 2159 return -EINVAL; 2160 2161 etdm_data = afe_priv->dai_priv[dai_id]; 2162 if (freq == 0) { 2163 etdm_data->mclk_freq = freq; 2164 return 0; 2165 } 2166 2167 apll = mt8195_afe_get_default_mclk_source_by_rate(freq); 2168 apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll); 2169 2170 if (freq > apll_rate) { 2171 dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate); 2172 return -EINVAL; 2173 } 2174 2175 if (apll_rate % freq != 0) { 2176 dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll); 2177 return -EINVAL; 2178 } 2179 2180 etdm_data->mclk_apll = apll; 2181 etdm_data->mclk_freq = freq; 2182 2183 return 0; 2184 } 2185 2186 static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai, 2187 int clk_id, unsigned int freq, int dir) 2188 { 2189 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2190 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2191 struct mtk_dai_etdm_priv *etdm_data; 2192 int dai_id; 2193 2194 dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 2195 __func__, dai->id, freq, dir); 2196 if (is_cowork_mode(dai)) 2197 dai_id = get_etdm_cowork_master_id(dai); 2198 else 2199 dai_id = dai->id; 2200 2201 if (!mt8195_afe_etdm_is_valid(dai_id)) 2202 return -EINVAL; 2203 2204 etdm_data = afe_priv->dai_priv[dai_id]; 2205 etdm_data->mclk_dir = dir; 2206 return mtk_dai_etdm_cal_mclk(afe, freq, dai_id); 2207 } 2208 2209 static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai, 2210 unsigned int tx_mask, unsigned int rx_mask, 2211 int slots, int slot_width) 2212 { 2213 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2214 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2215 struct mtk_dai_etdm_priv *etdm_data; 2216 2217 if (!mt8195_afe_etdm_is_valid(dai->id)) 2218 return -EINVAL; 2219 2220 etdm_data = afe_priv->dai_priv[dai->id]; 2221 dev_dbg(dai->dev, "%s id %d slot_width %d\n", 2222 __func__, dai->id, slot_width); 2223 2224 etdm_data->slots = slots; 2225 etdm_data->lrck_width = slot_width; 2226 return 0; 2227 } 2228 2229 static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) 2230 { 2231 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2232 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2233 struct mtk_dai_etdm_priv *etdm_data; 2234 2235 if (!mt8195_afe_etdm_is_valid(dai->id)) 2236 return -EINVAL; 2237 2238 etdm_data = afe_priv->dai_priv[dai->id]; 2239 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 2240 case SND_SOC_DAIFMT_I2S: 2241 etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S; 2242 break; 2243 case SND_SOC_DAIFMT_LEFT_J: 2244 etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ; 2245 break; 2246 case SND_SOC_DAIFMT_RIGHT_J: 2247 etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ; 2248 break; 2249 case SND_SOC_DAIFMT_DSP_A: 2250 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA; 2251 break; 2252 case SND_SOC_DAIFMT_DSP_B: 2253 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB; 2254 break; 2255 default: 2256 return -EINVAL; 2257 } 2258 2259 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 2260 case SND_SOC_DAIFMT_NB_NF: 2261 etdm_data->bck_inv = false; 2262 etdm_data->lrck_inv = false; 2263 break; 2264 case SND_SOC_DAIFMT_NB_IF: 2265 etdm_data->bck_inv = false; 2266 etdm_data->lrck_inv = true; 2267 break; 2268 case SND_SOC_DAIFMT_IB_NF: 2269 etdm_data->bck_inv = true; 2270 etdm_data->lrck_inv = false; 2271 break; 2272 case SND_SOC_DAIFMT_IB_IF: 2273 etdm_data->bck_inv = true; 2274 etdm_data->lrck_inv = true; 2275 break; 2276 default: 2277 return -EINVAL; 2278 } 2279 2280 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 2281 case SND_SOC_DAIFMT_BC_FC: 2282 etdm_data->slave_mode = true; 2283 break; 2284 case SND_SOC_DAIFMT_BP_FP: 2285 etdm_data->slave_mode = false; 2286 break; 2287 default: 2288 return -EINVAL; 2289 } 2290 2291 return 0; 2292 } 2293 2294 static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream, 2295 struct snd_soc_dai *dai) 2296 { 2297 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2298 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2299 int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 2300 2301 if (cg_id >= 0) 2302 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 2303 2304 mtk_dai_etdm_enable_mclk(afe, dai->id); 2305 2306 return 0; 2307 } 2308 2309 static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream, 2310 struct snd_soc_dai *dai) 2311 { 2312 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2313 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2314 int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 2315 2316 mtk_dai_etdm_disable_mclk(afe, dai->id); 2317 2318 if (cg_id >= 0) 2319 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 2320 } 2321 2322 static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel) 2323 { 2324 switch (channel) { 2325 case 1 ... 2: 2326 return AFE_DPTX_CON_CH_EN_2CH; 2327 case 3 ... 4: 2328 return AFE_DPTX_CON_CH_EN_4CH; 2329 case 5 ... 6: 2330 return AFE_DPTX_CON_CH_EN_6CH; 2331 case 7 ... 8: 2332 return AFE_DPTX_CON_CH_EN_8CH; 2333 default: 2334 return AFE_DPTX_CON_CH_EN_2CH; 2335 } 2336 } 2337 2338 static unsigned int mtk_dai_get_dptx_ch(unsigned int ch) 2339 { 2340 return (ch > 2) ? 2341 AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH; 2342 } 2343 2344 static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format) 2345 { 2346 return snd_pcm_format_physical_width(format) <= 16 ? 2347 AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT; 2348 } 2349 2350 static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream, 2351 struct snd_pcm_hw_params *params, 2352 struct snd_soc_dai *dai) 2353 { 2354 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2355 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2356 struct mtk_dai_etdm_priv *etdm_data; 2357 unsigned int rate = params_rate(params); 2358 unsigned int channels = params_channels(params); 2359 snd_pcm_format_t format = params_format(params); 2360 int width = snd_pcm_format_physical_width(format); 2361 int ret = 0; 2362 2363 if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 2364 return -EINVAL; 2365 2366 etdm_data = afe_priv->dai_priv[dai->id]; 2367 2368 /* dptx configure */ 2369 if (dai->id == MT8195_AFE_IO_DPTX) { 2370 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2371 AFE_DPTX_CON_CH_EN_MASK, 2372 mtk_dai_get_dptx_ch_en(channels)); 2373 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2374 AFE_DPTX_CON_CH_NUM_MASK, 2375 mtk_dai_get_dptx_ch(channels)); 2376 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2377 AFE_DPTX_CON_16BIT_MASK, 2378 mtk_dai_get_dptx_wlen(format)); 2379 2380 if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) { 2381 etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN; 2382 channels = 8; 2383 } else { 2384 channels = 2; 2385 } 2386 } else { 2387 etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN; 2388 } 2389 2390 ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 2391 if (ret) 2392 return ret; 2393 2394 ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id); 2395 2396 return ret; 2397 } 2398 2399 static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream, 2400 int cmd, 2401 struct snd_soc_dai *dai) 2402 { 2403 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2404 int ret = 0; 2405 2406 dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 2407 2408 switch (cmd) { 2409 case SNDRV_PCM_TRIGGER_START: 2410 case SNDRV_PCM_TRIGGER_RESUME: 2411 /* enable dptx interface */ 2412 if (dai->id == MT8195_AFE_IO_DPTX) 2413 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2414 AFE_DPTX_CON_ON_MASK, 2415 AFE_DPTX_CON_ON); 2416 2417 /* enable etdm_out3 */ 2418 ret = mt8195_afe_enable_etdm(afe, dai->id); 2419 break; 2420 case SNDRV_PCM_TRIGGER_STOP: 2421 case SNDRV_PCM_TRIGGER_SUSPEND: 2422 /* disable etdm_out3 */ 2423 ret = mt8195_afe_disable_etdm(afe, dai->id); 2424 2425 /* disable dptx interface */ 2426 if (dai->id == MT8195_AFE_IO_DPTX) 2427 regmap_update_bits(afe->regmap, AFE_DPTX_CON, 2428 AFE_DPTX_CON_ON_MASK, 0); 2429 break; 2430 default: 2431 return -EINVAL; 2432 } 2433 2434 return ret; 2435 } 2436 2437 static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai, 2438 int clk_id, 2439 unsigned int freq, 2440 int dir) 2441 { 2442 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2443 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2444 struct mtk_dai_etdm_priv *etdm_data; 2445 2446 if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 2447 return -EINVAL; 2448 2449 etdm_data = afe_priv->dai_priv[dai->id]; 2450 2451 dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 2452 __func__, dai->id, freq, dir); 2453 2454 etdm_data->mclk_dir = dir; 2455 return mtk_dai_etdm_cal_mclk(afe, freq, dai->id); 2456 } 2457 2458 /* dai driver */ 2459 #define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000) 2460 2461 #define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 2462 SNDRV_PCM_FMTBIT_S24_LE |\ 2463 SNDRV_PCM_FMTBIT_S32_LE) 2464 2465 static int mtk_dai_etdm_probe(struct snd_soc_dai *dai) 2466 { 2467 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2468 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2469 struct mtk_dai_etdm_priv *etdm_data; 2470 2471 dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id); 2472 2473 if (!mt8195_afe_etdm_is_valid(dai->id)) 2474 return -EINVAL; 2475 2476 etdm_data = afe_priv->dai_priv[dai->id]; 2477 if (etdm_data->mclk_freq) { 2478 dev_dbg(afe->dev, "MCLK always on, rate %d\n", 2479 etdm_data->mclk_freq); 2480 pm_runtime_get_sync(afe->dev); 2481 mtk_dai_etdm_mclk_configure(afe, dai->id); 2482 mtk_dai_etdm_enable_mclk(afe, dai->id); 2483 pm_runtime_put_sync(afe->dev); 2484 } 2485 return 0; 2486 } 2487 2488 static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = { 2489 .startup = mtk_dai_hdmitx_dptx_startup, 2490 .shutdown = mtk_dai_hdmitx_dptx_shutdown, 2491 .hw_params = mtk_dai_hdmitx_dptx_hw_params, 2492 .trigger = mtk_dai_hdmitx_dptx_trigger, 2493 .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 2494 .set_fmt = mtk_dai_etdm_set_fmt, 2495 }; 2496 2497 static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = { 2498 .probe = mtk_dai_etdm_probe, 2499 .startup = mtk_dai_hdmitx_dptx_startup, 2500 .shutdown = mtk_dai_hdmitx_dptx_shutdown, 2501 .hw_params = mtk_dai_hdmitx_dptx_hw_params, 2502 .trigger = mtk_dai_hdmitx_dptx_trigger, 2503 .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 2504 .set_fmt = mtk_dai_etdm_set_fmt, 2505 }; 2506 2507 static const struct snd_soc_dai_ops mtk_dai_etdm_ops = { 2508 .probe = mtk_dai_etdm_probe, 2509 .startup = mtk_dai_etdm_startup, 2510 .shutdown = mtk_dai_etdm_shutdown, 2511 .hw_params = mtk_dai_etdm_hw_params, 2512 .trigger = mtk_dai_etdm_trigger, 2513 .set_sysclk = mtk_dai_etdm_set_sysclk, 2514 .set_fmt = mtk_dai_etdm_set_fmt, 2515 .set_tdm_slot = mtk_dai_etdm_set_tdm_slot, 2516 }; 2517 2518 static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = { 2519 { 2520 .name = "DPTX", 2521 .id = MT8195_AFE_IO_DPTX, 2522 .playback = { 2523 .stream_name = "DPTX Playback", 2524 .channels_min = 1, 2525 .channels_max = 8, 2526 .rates = MTK_ETDM_RATES, 2527 .formats = MTK_ETDM_FORMATS, 2528 }, 2529 .ops = &mtk_dai_hdmitx_dptx_ops, 2530 }, 2531 { 2532 .name = "ETDM1_IN", 2533 .id = MT8195_AFE_IO_ETDM1_IN, 2534 .capture = { 2535 .stream_name = "ETDM1 Capture", 2536 .channels_min = 1, 2537 .channels_max = 24, 2538 .rates = MTK_ETDM_RATES, 2539 .formats = MTK_ETDM_FORMATS, 2540 }, 2541 .ops = &mtk_dai_etdm_ops, 2542 }, 2543 { 2544 .name = "ETDM2_IN", 2545 .id = MT8195_AFE_IO_ETDM2_IN, 2546 .capture = { 2547 .stream_name = "ETDM2 Capture", 2548 .channels_min = 1, 2549 .channels_max = 16, 2550 .rates = MTK_ETDM_RATES, 2551 .formats = MTK_ETDM_FORMATS, 2552 }, 2553 .ops = &mtk_dai_etdm_ops, 2554 }, 2555 { 2556 .name = "ETDM1_OUT", 2557 .id = MT8195_AFE_IO_ETDM1_OUT, 2558 .playback = { 2559 .stream_name = "ETDM1 Playback", 2560 .channels_min = 1, 2561 .channels_max = 24, 2562 .rates = MTK_ETDM_RATES, 2563 .formats = MTK_ETDM_FORMATS, 2564 }, 2565 .ops = &mtk_dai_etdm_ops, 2566 }, 2567 { 2568 .name = "ETDM2_OUT", 2569 .id = MT8195_AFE_IO_ETDM2_OUT, 2570 .playback = { 2571 .stream_name = "ETDM2 Playback", 2572 .channels_min = 1, 2573 .channels_max = 24, 2574 .rates = MTK_ETDM_RATES, 2575 .formats = MTK_ETDM_FORMATS, 2576 }, 2577 .ops = &mtk_dai_etdm_ops, 2578 }, 2579 { 2580 .name = "ETDM3_OUT", 2581 .id = MT8195_AFE_IO_ETDM3_OUT, 2582 .playback = { 2583 .stream_name = "ETDM3 Playback", 2584 .channels_min = 1, 2585 .channels_max = 8, 2586 .rates = MTK_ETDM_RATES, 2587 .formats = MTK_ETDM_FORMATS, 2588 }, 2589 .ops = &mtk_dai_hdmitx_dptx_ops2, 2590 }, 2591 }; 2592 2593 static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe) 2594 { 2595 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2596 struct mtk_dai_etdm_priv *etdm_data; 2597 struct mtk_dai_etdm_priv *mst_data; 2598 int i; 2599 int mst_dai_id; 2600 2601 for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 2602 etdm_data = afe_priv->dai_priv[i]; 2603 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) { 2604 mst_dai_id = etdm_data->cowork_source_id; 2605 if (!mt8195_afe_etdm_is_valid(mst_dai_id)) { 2606 dev_err(afe->dev, "%s invalid dai id %d\n", 2607 __func__, mst_dai_id); 2608 return; 2609 } 2610 mst_data = afe_priv->dai_priv[mst_dai_id]; 2611 if (mst_data->cowork_source_id != COWORK_ETDM_NONE) 2612 dev_info(afe->dev, "%s [%d] wrong sync source\n" 2613 , __func__, i); 2614 mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i; 2615 mst_data->cowork_slv_count++; 2616 } 2617 } 2618 } 2619 2620 static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe) 2621 { 2622 const struct device_node *of_node = afe->dev->of_node; 2623 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2624 struct mtk_dai_etdm_priv *etdm_data; 2625 int i, j; 2626 char prop[48]; 2627 u8 disable_chn[MT8195_ETDM_MAX_CHANNELS]; 2628 int max_chn = MT8195_ETDM_MAX_CHANNELS; 2629 u32 sel; 2630 int ret; 2631 int dai_id; 2632 unsigned int sync_id; 2633 struct { 2634 const char *name; 2635 const unsigned int sync_id; 2636 } of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = { 2637 {"etdm-in1", ETDM_SYNC_FROM_IN1}, 2638 {"etdm-in2", ETDM_SYNC_FROM_IN2}, 2639 {"etdm-out1", ETDM_SYNC_FROM_OUT1}, 2640 {"etdm-out2", ETDM_SYNC_FROM_OUT2}, 2641 {"etdm-out3", ETDM_SYNC_FROM_OUT3}, 2642 }; 2643 2644 for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) { 2645 dai_id = ETDM_TO_DAI_ID(i); 2646 if (!mt8195_afe_etdm_is_valid(dai_id)) { 2647 dev_err(afe->dev, "%s invalid dai id %d\n", 2648 __func__, dai_id); 2649 return; 2650 } 2651 2652 etdm_data = afe_priv->dai_priv[dai_id]; 2653 2654 ret = snprintf(prop, sizeof(prop), 2655 "mediatek,%s-mclk-always-on-rate", 2656 of_afe_etdms[i].name); 2657 if (ret < 0) { 2658 dev_info(afe->dev, "%s snprintf err=%d\n", 2659 __func__, ret); 2660 return; 2661 } 2662 ret = of_property_read_u32(of_node, prop, &sel); 2663 if (ret == 0) { 2664 etdm_data->mclk_dir = SND_SOC_CLOCK_OUT; 2665 if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id)) 2666 dev_info(afe->dev, "%s unsupported mclk %uHz\n", 2667 __func__, sel); 2668 } 2669 2670 ret = snprintf(prop, sizeof(prop), 2671 "mediatek,%s-multi-pin-mode", 2672 of_afe_etdms[i].name); 2673 if (ret < 0) { 2674 dev_info(afe->dev, "%s snprintf err=%d\n", 2675 __func__, ret); 2676 return; 2677 } 2678 etdm_data->data_mode = of_property_read_bool(of_node, prop); 2679 2680 ret = snprintf(prop, sizeof(prop), 2681 "mediatek,%s-cowork-source", 2682 of_afe_etdms[i].name); 2683 if (ret < 0) { 2684 dev_info(afe->dev, "%s snprintf err=%d\n", 2685 __func__, ret); 2686 return; 2687 } 2688 ret = of_property_read_u32(of_node, prop, &sel); 2689 if (ret == 0) { 2690 if (sel >= MT8195_AFE_IO_ETDM_NUM) { 2691 dev_info(afe->dev, "%s invalid id=%d\n", 2692 __func__, sel); 2693 etdm_data->cowork_source_id = COWORK_ETDM_NONE; 2694 } else { 2695 sync_id = of_afe_etdms[sel].sync_id; 2696 etdm_data->cowork_source_id = 2697 sync_to_dai_id(sync_id); 2698 } 2699 } else { 2700 etdm_data->cowork_source_id = COWORK_ETDM_NONE; 2701 } 2702 } 2703 2704 /* etdm in only */ 2705 for (i = 0; i < 2; i++) { 2706 dai_id = ETDM_TO_DAI_ID(i); 2707 etdm_data = afe_priv->dai_priv[dai_id]; 2708 2709 ret = snprintf(prop, sizeof(prop), 2710 "mediatek,%s-chn-disabled", 2711 of_afe_etdms[i].name); 2712 if (ret < 0) { 2713 dev_info(afe->dev, "%s snprintf err=%d\n", 2714 __func__, ret); 2715 return; 2716 } 2717 ret = of_property_read_variable_u8_array(of_node, prop, 2718 disable_chn, 2719 1, max_chn); 2720 if (ret < 0) 2721 continue; 2722 2723 for (j = 0; j < ret; j++) { 2724 if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS) 2725 dev_info(afe->dev, "%s [%d] invalid chn %u\n", 2726 __func__, j, disable_chn[j]); 2727 else 2728 etdm_data->in_disable_ch[disable_chn[j]] = true; 2729 } 2730 } 2731 mt8195_etdm_update_sync_info(afe); 2732 } 2733 2734 static int init_etdm_priv_data(struct mtk_base_afe *afe) 2735 { 2736 struct mt8195_afe_private *afe_priv = afe->platform_priv; 2737 struct mtk_dai_etdm_priv *etdm_priv; 2738 int i; 2739 2740 for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 2741 etdm_priv = devm_kzalloc(afe->dev, 2742 sizeof(struct mtk_dai_etdm_priv), 2743 GFP_KERNEL); 2744 if (!etdm_priv) 2745 return -ENOMEM; 2746 2747 afe_priv->dai_priv[i] = etdm_priv; 2748 } 2749 2750 afe_priv->dai_priv[MT8195_AFE_IO_DPTX] = 2751 afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT]; 2752 2753 mt8195_dai_etdm_parse_of(afe); 2754 return 0; 2755 } 2756 2757 int mt8195_dai_etdm_register(struct mtk_base_afe *afe) 2758 { 2759 struct mtk_base_afe_dai *dai; 2760 2761 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 2762 if (!dai) 2763 return -ENOMEM; 2764 2765 list_add(&dai->list, &afe->sub_dais); 2766 2767 dai->dai_drivers = mtk_dai_etdm_driver; 2768 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver); 2769 2770 dai->dapm_widgets = mtk_dai_etdm_widgets; 2771 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets); 2772 dai->dapm_routes = mtk_dai_etdm_routes; 2773 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes); 2774 dai->controls = mtk_dai_etdm_controls; 2775 dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls); 2776 2777 return init_etdm_priv_data(afe); 2778 } 2779