1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * MediaTek 8365 ALSA SoC AFE platform driver 4 * 5 * Copyright (c) 2024 MediaTek Inc. 6 * Authors: Jia Zeng <jia.zeng@mediatek.com> 7 * Alexandre Mergnat <amergnat@baylibre.com> 8 */ 9 10 #include <linux/delay.h> 11 #include <linux/module.h> 12 #include <linux/of.h> 13 #include <linux/of_address.h> 14 #include <linux/dma-mapping.h> 15 #include <linux/pm_runtime.h> 16 #include <sound/soc.h> 17 #include <sound/pcm_params.h> 18 #include "mt8365-afe-common.h" 19 #include "mt8365-afe-clk.h" 20 #include "mt8365-reg.h" 21 #include "../common/mtk-base-afe.h" 22 #include "../common/mtk-afe-platform-driver.h" 23 #include "../common/mtk-afe-fe-dai.h" 24 25 #define AFE_BASE_END_OFFSET 8 26 27 static unsigned int mCM2Input; 28 29 static const unsigned int mt8365_afe_backup_list[] = { 30 AUDIO_TOP_CON0, 31 AFE_CONN0, 32 AFE_CONN1, 33 AFE_CONN3, 34 AFE_CONN4, 35 AFE_CONN5, 36 AFE_CONN6, 37 AFE_CONN7, 38 AFE_CONN8, 39 AFE_CONN9, 40 AFE_CONN10, 41 AFE_CONN11, 42 AFE_CONN12, 43 AFE_CONN13, 44 AFE_CONN14, 45 AFE_CONN15, 46 AFE_CONN16, 47 AFE_CONN17, 48 AFE_CONN18, 49 AFE_CONN19, 50 AFE_CONN20, 51 AFE_CONN21, 52 AFE_CONN26, 53 AFE_CONN27, 54 AFE_CONN28, 55 AFE_CONN29, 56 AFE_CONN30, 57 AFE_CONN31, 58 AFE_CONN32, 59 AFE_CONN33, 60 AFE_CONN34, 61 AFE_CONN35, 62 AFE_CONN36, 63 AFE_CONN_24BIT, 64 AFE_CONN_24BIT_1, 65 AFE_DAC_CON0, 66 AFE_DAC_CON1, 67 AFE_DL1_BASE, 68 AFE_DL1_END, 69 AFE_DL2_BASE, 70 AFE_DL2_END, 71 AFE_VUL_BASE, 72 AFE_VUL_END, 73 AFE_AWB_BASE, 74 AFE_AWB_END, 75 AFE_VUL3_BASE, 76 AFE_VUL3_END, 77 AFE_HDMI_OUT_BASE, 78 AFE_HDMI_OUT_END, 79 AFE_HDMI_IN_2CH_BASE, 80 AFE_HDMI_IN_2CH_END, 81 AFE_ADDA_UL_DL_CON0, 82 AFE_ADDA_DL_SRC2_CON0, 83 AFE_ADDA_DL_SRC2_CON1, 84 AFE_I2S_CON, 85 AFE_I2S_CON1, 86 AFE_I2S_CON2, 87 AFE_I2S_CON3, 88 AFE_ADDA_UL_SRC_CON0, 89 AFE_AUD_PAD_TOP, 90 AFE_HD_ENGEN_ENABLE, 91 }; 92 93 static const struct snd_pcm_hardware mt8365_afe_hardware = { 94 .info = (SNDRV_PCM_INFO_MMAP | 95 SNDRV_PCM_INFO_INTERLEAVED | 96 SNDRV_PCM_INFO_MMAP_VALID), 97 .buffer_bytes_max = 256 * 1024, 98 .period_bytes_min = 512, 99 .period_bytes_max = 128 * 1024, 100 .periods_min = 2, 101 .periods_max = 256, 102 .fifo_size = 0, 103 }; 104 105 struct mt8365_afe_rate { 106 unsigned int rate; 107 unsigned int reg_val; 108 }; 109 110 static const struct mt8365_afe_rate mt8365_afe_fs_rates[] = { 111 { .rate = 8000, .reg_val = MT8365_FS_8K }, 112 { .rate = 11025, .reg_val = MT8365_FS_11D025K }, 113 { .rate = 12000, .reg_val = MT8365_FS_12K }, 114 { .rate = 16000, .reg_val = MT8365_FS_16K }, 115 { .rate = 22050, .reg_val = MT8365_FS_22D05K }, 116 { .rate = 24000, .reg_val = MT8365_FS_24K }, 117 { .rate = 32000, .reg_val = MT8365_FS_32K }, 118 { .rate = 44100, .reg_val = MT8365_FS_44D1K }, 119 { .rate = 48000, .reg_val = MT8365_FS_48K }, 120 { .rate = 88200, .reg_val = MT8365_FS_88D2K }, 121 { .rate = 96000, .reg_val = MT8365_FS_96K }, 122 { .rate = 176400, .reg_val = MT8365_FS_176D4K }, 123 { .rate = 192000, .reg_val = MT8365_FS_192K }, 124 }; 125 126 int mt8365_afe_fs_timing(unsigned int rate) 127 { 128 int i; 129 130 for (i = 0; i < ARRAY_SIZE(mt8365_afe_fs_rates); i++) 131 if (mt8365_afe_fs_rates[i].rate == rate) 132 return mt8365_afe_fs_rates[i].reg_val; 133 134 return -EINVAL; 135 } 136 137 bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id) 138 { 139 switch (id) { 140 case MT8365_AFE_IO_TDM_IN: 141 if (rate >= 8000 && rate <= 192000) 142 return true; 143 break; 144 case MT8365_AFE_IO_DMIC: 145 if (rate >= 8000 && rate <= 48000) 146 return true; 147 break; 148 default: 149 break; 150 } 151 152 return false; 153 } 154 155 bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id) 156 { 157 switch (id) { 158 case MT8365_AFE_IO_TDM_IN: 159 if (channel >= 1 && channel <= 8) 160 return true; 161 break; 162 case MT8365_AFE_IO_DMIC: 163 if (channel >= 1 && channel <= 8) 164 return true; 165 break; 166 default: 167 break; 168 } 169 170 return false; 171 } 172 173 static bool mt8365_afe_clk_group_44k(int sample_rate) 174 { 175 if (sample_rate == 11025 || 176 sample_rate == 22050 || 177 sample_rate == 44100 || 178 sample_rate == 88200 || 179 sample_rate == 176400) 180 return true; 181 else 182 return false; 183 } 184 185 static bool mt8365_afe_clk_group_48k(int sample_rate) 186 { 187 return (!mt8365_afe_clk_group_44k(sample_rate)); 188 } 189 190 int mt8365_dai_set_priv(struct mtk_base_afe *afe, int id, 191 int priv_size, const void *priv_data) 192 { 193 struct mt8365_afe_private *afe_priv = afe->platform_priv; 194 void *temp_data; 195 196 temp_data = devm_kzalloc(afe->dev, priv_size, GFP_KERNEL); 197 if (!temp_data) 198 return -ENOMEM; 199 200 if (priv_data) 201 memcpy(temp_data, priv_data, priv_size); 202 203 afe_priv->dai_priv[id] = temp_data; 204 205 return 0; 206 } 207 208 static int mt8365_afe_irq_direction_enable(struct mtk_base_afe *afe, 209 int irq_id, int direction) 210 { 211 struct mtk_base_afe_irq *irq; 212 213 if (irq_id >= MT8365_AFE_IRQ_NUM) 214 return -1; 215 216 irq = &afe->irqs[irq_id]; 217 218 if (direction == MT8365_AFE_IRQ_DIR_MCU) { 219 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_DSP_EN, 220 (1 << irq->irq_data->irq_clr_shift), 221 0); 222 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN, 223 (1 << irq->irq_data->irq_clr_shift), 224 (1 << irq->irq_data->irq_clr_shift)); 225 } else if (direction == MT8365_AFE_IRQ_DIR_DSP) { 226 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_DSP_EN, 227 (1 << irq->irq_data->irq_clr_shift), 228 (1 << irq->irq_data->irq_clr_shift)); 229 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN, 230 (1 << irq->irq_data->irq_clr_shift), 231 0); 232 } else { 233 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_DSP_EN, 234 (1 << irq->irq_data->irq_clr_shift), 235 (1 << irq->irq_data->irq_clr_shift)); 236 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN, 237 (1 << irq->irq_data->irq_clr_shift), 238 (1 << irq->irq_data->irq_clr_shift)); 239 } 240 return 0; 241 } 242 243 static int mt8365_memif_fs(struct snd_pcm_substream *substream, 244 unsigned int rate) 245 { 246 return mt8365_afe_fs_timing(rate); 247 } 248 249 static int mt8365_irq_fs(struct snd_pcm_substream *substream, 250 unsigned int rate) 251 { 252 return mt8365_memif_fs(substream, rate); 253 } 254 255 static const struct mt8365_cm_ctrl_reg cm_ctrl_reg[MT8365_CM_NUM] = { 256 [MT8365_CM1] = { 257 .con0 = AFE_CM1_CON0, 258 .con1 = AFE_CM1_CON1, 259 .con2 = AFE_CM1_CON2, 260 .con3 = AFE_CM1_CON3, 261 .con4 = AFE_CM1_CON4, 262 }, 263 [MT8365_CM2] = { 264 .con0 = AFE_CM2_CON0, 265 .con1 = AFE_CM2_CON1, 266 .con2 = AFE_CM2_CON2, 267 .con3 = AFE_CM2_CON3, 268 .con4 = AFE_CM2_CON4, 269 } 270 }; 271 272 static int mt8365_afe_cm2_mux_conn(struct mtk_base_afe *afe) 273 { 274 struct mt8365_afe_private *afe_priv = afe->platform_priv; 275 unsigned int input = afe_priv->cm2_mux_input; 276 277 /* TDM_IN interconnect to CM2 */ 278 regmap_update_bits(afe->regmap, AFE_CM2_CONN0, 279 CM2_AFE_CM2_CONN_CFG1_MASK, 280 CM2_AFE_CM2_CONN_CFG1(TDM_IN_CH0)); 281 regmap_update_bits(afe->regmap, AFE_CM2_CONN0, 282 CM2_AFE_CM2_CONN_CFG2_MASK, 283 CM2_AFE_CM2_CONN_CFG2(TDM_IN_CH1)); 284 regmap_update_bits(afe->regmap, AFE_CM2_CONN0, 285 CM2_AFE_CM2_CONN_CFG3_MASK, 286 CM2_AFE_CM2_CONN_CFG3(TDM_IN_CH2)); 287 regmap_update_bits(afe->regmap, AFE_CM2_CONN0, 288 CM2_AFE_CM2_CONN_CFG4_MASK, 289 CM2_AFE_CM2_CONN_CFG4(TDM_IN_CH3)); 290 regmap_update_bits(afe->regmap, AFE_CM2_CONN0, 291 CM2_AFE_CM2_CONN_CFG5_MASK, 292 CM2_AFE_CM2_CONN_CFG5(TDM_IN_CH4)); 293 regmap_update_bits(afe->regmap, AFE_CM2_CONN0, 294 CM2_AFE_CM2_CONN_CFG6_MASK, 295 CM2_AFE_CM2_CONN_CFG6(TDM_IN_CH5)); 296 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 297 CM2_AFE_CM2_CONN_CFG7_MASK, 298 CM2_AFE_CM2_CONN_CFG7(TDM_IN_CH6)); 299 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 300 CM2_AFE_CM2_CONN_CFG8_MASK, 301 CM2_AFE_CM2_CONN_CFG8(TDM_IN_CH7)); 302 303 /* ref data interconnect to CM2 */ 304 if (input == MT8365_FROM_GASRC1) { 305 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 306 CM2_AFE_CM2_CONN_CFG9_MASK, 307 CM2_AFE_CM2_CONN_CFG9(GENERAL1_ASRC_OUT_LCH)); 308 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 309 CM2_AFE_CM2_CONN_CFG10_MASK, 310 CM2_AFE_CM2_CONN_CFG10(GENERAL1_ASRC_OUT_RCH)); 311 } else if (input == MT8365_FROM_GASRC2) { 312 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 313 CM2_AFE_CM2_CONN_CFG9_MASK, 314 CM2_AFE_CM2_CONN_CFG9(GENERAL2_ASRC_OUT_LCH)); 315 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 316 CM2_AFE_CM2_CONN_CFG10_MASK, 317 CM2_AFE_CM2_CONN_CFG10(GENERAL2_ASRC_OUT_RCH)); 318 } else if (input == MT8365_FROM_TDM_ASRC) { 319 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 320 CM2_AFE_CM2_CONN_CFG9_MASK, 321 CM2_AFE_CM2_CONN_CFG9(TDM_OUT_ASRC_CH0)); 322 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 323 CM2_AFE_CM2_CONN_CFG10_MASK, 324 CM2_AFE_CM2_CONN_CFG10(TDM_OUT_ASRC_CH1)); 325 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 326 CM2_AFE_CM2_CONN_CFG11_MASK, 327 CM2_AFE_CM2_CONN_CFG11(TDM_OUT_ASRC_CH2)); 328 regmap_update_bits(afe->regmap, AFE_CM2_CONN1, 329 CM2_AFE_CM2_CONN_CFG12_MASK, 330 CM2_AFE_CM2_CONN_CFG12(TDM_OUT_ASRC_CH3)); 331 regmap_update_bits(afe->regmap, AFE_CM2_CONN2, 332 CM2_AFE_CM2_CONN_CFG13_MASK, 333 CM2_AFE_CM2_CONN_CFG13(TDM_OUT_ASRC_CH4)); 334 regmap_update_bits(afe->regmap, AFE_CM2_CONN2, 335 CM2_AFE_CM2_CONN_CFG14_MASK, 336 CM2_AFE_CM2_CONN_CFG14(TDM_OUT_ASRC_CH5)); 337 regmap_update_bits(afe->regmap, AFE_CM2_CONN2, 338 CM2_AFE_CM2_CONN_CFG15_MASK, 339 CM2_AFE_CM2_CONN_CFG15(TDM_OUT_ASRC_CH6)); 340 regmap_update_bits(afe->regmap, AFE_CM2_CONN2, 341 CM2_AFE_CM2_CONN_CFG16_MASK, 342 CM2_AFE_CM2_CONN_CFG16(TDM_OUT_ASRC_CH7)); 343 } else { 344 dev_err(afe->dev, "%s wrong CM2 input %d\n", __func__, input); 345 return -1; 346 } 347 348 return 0; 349 } 350 351 static int mt8365_afe_get_cm_update_cnt(struct mtk_base_afe *afe, 352 enum mt8365_cm_num cmNum, 353 unsigned int rate, unsigned int channel) 354 { 355 unsigned int total_cnt, div_cnt, ch_pair, best_cnt; 356 unsigned int ch_update_cnt[MT8365_CM_UPDATA_CNT_SET]; 357 int i; 358 359 /* calculate cm update cnt 360 * total_cnt = clk / fs, clk is 26m or 24m or 22m 361 * div_cnt = total_cnt / ch_pair, max ch 16ch ,2ch is a set 362 * best_cnt < div_cnt ,we set best_cnt = div_cnt -10 363 * ch01 = best_cnt, ch23 = 2* ch01_up_cnt 364 * ch45 = 3* ch01_up_cnt ...ch1415 = 8* ch01_up_cnt 365 */ 366 367 if (cmNum == MT8365_CM1) { 368 total_cnt = MT8365_CLK_26M / rate; 369 } else if (cmNum == MT8365_CM2) { 370 if (mt8365_afe_clk_group_48k(rate)) 371 total_cnt = MT8365_CLK_24M / rate; 372 else 373 total_cnt = MT8365_CLK_22M / rate; 374 } else { 375 return -1; 376 } 377 378 if (channel % 2) 379 ch_pair = (channel / 2) + 1; 380 else 381 ch_pair = channel / 2; 382 383 div_cnt = total_cnt / ch_pair; 384 best_cnt = div_cnt - 10; 385 386 if (best_cnt <= 0) 387 return -1; 388 389 for (i = 0; i < ch_pair; i++) 390 ch_update_cnt[i] = (i + 1) * best_cnt; 391 392 switch (channel) { 393 case 16: 394 fallthrough; 395 case 15: 396 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con4, 397 CM_AFE_CM_UPDATE_CNT2_MASK, 398 CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[7])); 399 fallthrough; 400 case 14: 401 fallthrough; 402 case 13: 403 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con4, 404 CM_AFE_CM_UPDATE_CNT1_MASK, 405 CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[6])); 406 fallthrough; 407 case 12: 408 fallthrough; 409 case 11: 410 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con3, 411 CM_AFE_CM_UPDATE_CNT2_MASK, 412 CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[5])); 413 fallthrough; 414 case 10: 415 fallthrough; 416 case 9: 417 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con3, 418 CM_AFE_CM_UPDATE_CNT1_MASK, 419 CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[4])); 420 fallthrough; 421 case 8: 422 fallthrough; 423 case 7: 424 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con2, 425 CM_AFE_CM_UPDATE_CNT2_MASK, 426 CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[3])); 427 fallthrough; 428 case 6: 429 fallthrough; 430 case 5: 431 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con2, 432 CM_AFE_CM_UPDATE_CNT1_MASK, 433 CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[2])); 434 fallthrough; 435 case 4: 436 fallthrough; 437 case 3: 438 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con1, 439 CM_AFE_CM_UPDATE_CNT2_MASK, 440 CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[1])); 441 fallthrough; 442 case 2: 443 fallthrough; 444 case 1: 445 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con1, 446 CM_AFE_CM_UPDATE_CNT1_MASK, 447 CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[0])); 448 break; 449 default: 450 return -1; 451 } 452 453 return 0; 454 } 455 456 static int mt8365_afe_configure_cm(struct mtk_base_afe *afe, 457 enum mt8365_cm_num cmNum, 458 unsigned int channels, 459 unsigned int rate) 460 { 461 unsigned int val, mask; 462 unsigned int fs = mt8365_afe_fs_timing(rate); 463 464 val = FIELD_PREP(CM_AFE_CM_CH_NUM_MASK, (channels - 1)) | 465 FIELD_PREP(CM_AFE_CM_START_DATA_MASK, 0); 466 467 mask = CM_AFE_CM_CH_NUM_MASK | 468 CM_AFE_CM_START_DATA_MASK; 469 470 if (cmNum == MT8365_CM1) { 471 val |= FIELD_PREP(CM_AFE_CM1_IN_MODE_MASK, fs); 472 473 mask |= CM_AFE_CM1_VUL_SEL | 474 CM_AFE_CM1_IN_MODE_MASK; 475 } else if (cmNum == MT8365_CM2) { 476 if (mt8365_afe_clk_group_48k(rate)) 477 val |= FIELD_PREP(CM_AFE_CM2_CLK_SEL, 0); 478 else 479 val |= FIELD_PREP(CM_AFE_CM2_CLK_SEL, 1); 480 481 val |= FIELD_PREP(CM_AFE_CM2_TDM_SEL, 1); 482 483 mask |= CM_AFE_CM2_TDM_SEL | 484 CM_AFE_CM1_IN_MODE_MASK | 485 CM_AFE_CM2_CLK_SEL; 486 487 mt8365_afe_cm2_mux_conn(afe); 488 } else { 489 return -1; 490 } 491 492 regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con0, mask, val); 493 494 mt8365_afe_get_cm_update_cnt(afe, cmNum, rate, channels); 495 496 return 0; 497 } 498 499 static int mt8365_afe_fe_startup(struct snd_pcm_substream *substream, 500 struct snd_soc_dai *dai) 501 { 502 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 503 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 504 struct snd_pcm_runtime *runtime = substream->runtime; 505 int memif_num = snd_soc_rtd_to_cpu(rtd, 0)->id; 506 struct mtk_base_afe_memif *memif = &afe->memif[memif_num]; 507 int ret; 508 509 memif->substream = substream; 510 511 snd_pcm_hw_constraint_step(substream->runtime, 0, 512 SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16); 513 514 snd_soc_set_runtime_hwparams(substream, afe->mtk_afe_hardware); 515 516 ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 517 if (ret < 0) 518 dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n"); 519 520 mt8365_afe_enable_main_clk(afe); 521 return ret; 522 } 523 524 static void mt8365_afe_fe_shutdown(struct snd_pcm_substream *substream, 525 struct snd_soc_dai *dai) 526 { 527 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 528 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 529 int memif_num = snd_soc_rtd_to_cpu(rtd, 0)->id; 530 struct mtk_base_afe_memif *memif = &afe->memif[memif_num]; 531 532 memif->substream = NULL; 533 534 mt8365_afe_disable_main_clk(afe); 535 } 536 537 static int mt8365_afe_fe_hw_params(struct snd_pcm_substream *substream, 538 struct snd_pcm_hw_params *params, 539 struct snd_soc_dai *dai) 540 { 541 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 542 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 543 struct mt8365_afe_private *afe_priv = afe->platform_priv; 544 struct mt8365_control_data *ctrl_data = &afe_priv->ctrl_data; 545 int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id; 546 struct mtk_base_afe_memif *memif = &afe->memif[dai_id]; 547 struct mt8365_fe_dai_data *fe_data = &afe_priv->fe_data[dai_id]; 548 size_t request_size = params_buffer_bytes(params); 549 unsigned int channels = params_channels(params); 550 unsigned int rate = params_rate(params); 551 unsigned int base_end_offset = 8; 552 int ret, fs; 553 554 dev_info(afe->dev, "%s %s period = %d rate = %d channels = %d\n", 555 __func__, memif->data->name, params_period_size(params), 556 rate, channels); 557 558 if (dai_id == MT8365_AFE_MEMIF_VUL2) { 559 if (!ctrl_data->bypass_cm1) 560 /* configure cm1 */ 561 mt8365_afe_configure_cm(afe, MT8365_CM1, 562 channels, rate); 563 else 564 regmap_update_bits(afe->regmap, AFE_CM1_CON0, 565 CM_AFE_CM1_VUL_SEL, 566 CM_AFE_CM1_VUL_SEL); 567 } else if (dai_id == MT8365_AFE_MEMIF_TDM_IN) { 568 if (!ctrl_data->bypass_cm2) 569 /* configure cm2 */ 570 mt8365_afe_configure_cm(afe, MT8365_CM2, 571 channels, rate); 572 else 573 regmap_update_bits(afe->regmap, AFE_CM2_CON0, 574 CM_AFE_CM2_TDM_SEL, 575 ~CM_AFE_CM2_TDM_SEL); 576 577 base_end_offset = 4; 578 } 579 580 if (request_size > fe_data->sram_size) { 581 ret = snd_pcm_lib_malloc_pages(substream, request_size); 582 if (ret < 0) { 583 dev_err(afe->dev, 584 "%s %s malloc pages %zu bytes failed %d\n", 585 __func__, memif->data->name, request_size, ret); 586 return ret; 587 } 588 589 fe_data->use_sram = false; 590 591 mt8365_afe_emi_clk_on(afe); 592 } else { 593 struct snd_dma_buffer *dma_buf = &substream->dma_buffer; 594 595 dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; 596 dma_buf->dev.dev = substream->pcm->card->dev; 597 dma_buf->area = (unsigned char *)fe_data->sram_vir_addr; 598 dma_buf->addr = fe_data->sram_phy_addr; 599 dma_buf->bytes = request_size; 600 snd_pcm_set_runtime_buffer(substream, dma_buf); 601 602 fe_data->use_sram = true; 603 } 604 605 memif->phys_buf_addr = lower_32_bits(substream->runtime->dma_addr); 606 memif->buffer_size = substream->runtime->dma_bytes; 607 608 /* start */ 609 regmap_write(afe->regmap, memif->data->reg_ofs_base, 610 memif->phys_buf_addr); 611 /* end */ 612 regmap_write(afe->regmap, 613 memif->data->reg_ofs_base + base_end_offset, 614 memif->phys_buf_addr + memif->buffer_size - 1); 615 616 /* set channel */ 617 if (memif->data->mono_shift >= 0) { 618 unsigned int mono = (params_channels(params) == 1) ? 1 : 0; 619 620 if (memif->data->mono_reg < 0) 621 dev_info(afe->dev, "%s mono_reg is NULL\n", __func__); 622 else 623 regmap_update_bits(afe->regmap, memif->data->mono_reg, 624 1 << memif->data->mono_shift, 625 mono << memif->data->mono_shift); 626 } 627 628 /* set rate */ 629 if (memif->data->fs_shift < 0) 630 return 0; 631 632 fs = afe->memif_fs(substream, params_rate(params)); 633 634 if (fs < 0) 635 return -EINVAL; 636 637 if (memif->data->fs_reg < 0) 638 dev_info(afe->dev, "%s fs_reg is NULL\n", __func__); 639 else 640 regmap_update_bits(afe->regmap, memif->data->fs_reg, 641 memif->data->fs_maskbit << memif->data->fs_shift, 642 fs << memif->data->fs_shift); 643 644 return 0; 645 } 646 647 static int mt8365_afe_fe_hw_free(struct snd_pcm_substream *substream, 648 struct snd_soc_dai *dai) 649 { 650 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 651 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 652 struct mt8365_afe_private *afe_priv = afe->platform_priv; 653 int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id; 654 struct mt8365_fe_dai_data *fe_data = &afe_priv->fe_data[dai_id]; 655 int ret = 0; 656 657 if (fe_data->use_sram) { 658 snd_pcm_set_runtime_buffer(substream, NULL); 659 } else { 660 ret = snd_pcm_lib_free_pages(substream); 661 662 mt8365_afe_emi_clk_off(afe); 663 } 664 665 return ret; 666 } 667 668 static int mt8365_afe_fe_prepare(struct snd_pcm_substream *substream, 669 struct snd_soc_dai *dai) 670 { 671 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 672 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 673 int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id; 674 struct mtk_base_afe_memif *memif = &afe->memif[dai_id]; 675 676 /* set format */ 677 if (memif->data->hd_reg >= 0) { 678 switch (substream->runtime->format) { 679 case SNDRV_PCM_FORMAT_S16_LE: 680 regmap_update_bits(afe->regmap, memif->data->hd_reg, 681 3 << memif->data->hd_shift, 682 0 << memif->data->hd_shift); 683 break; 684 case SNDRV_PCM_FORMAT_S32_LE: 685 regmap_update_bits(afe->regmap, memif->data->hd_reg, 686 3 << memif->data->hd_shift, 687 3 << memif->data->hd_shift); 688 689 if (dai_id == MT8365_AFE_MEMIF_TDM_IN) { 690 regmap_update_bits(afe->regmap, 691 memif->data->hd_reg, 692 3 << memif->data->hd_shift, 693 1 << memif->data->hd_shift); 694 regmap_update_bits(afe->regmap, 695 memif->data->hd_reg, 696 1 << memif->data->hd_align_mshift, 697 1 << memif->data->hd_align_mshift); 698 } 699 break; 700 case SNDRV_PCM_FORMAT_S24_LE: 701 regmap_update_bits(afe->regmap, memif->data->hd_reg, 702 3 << memif->data->hd_shift, 703 1 << memif->data->hd_shift); 704 break; 705 default: 706 return -EINVAL; 707 } 708 } 709 710 mt8365_afe_irq_direction_enable(afe, memif->irq_usage, 711 MT8365_AFE_IRQ_DIR_MCU); 712 713 return 0; 714 } 715 716 static int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd, 717 struct snd_soc_dai *dai) 718 { 719 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 720 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 721 struct mt8365_afe_private *afe_priv = afe->platform_priv; 722 int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id; 723 struct mt8365_control_data *ctrl_data = &afe_priv->ctrl_data; 724 725 switch (cmd) { 726 case SNDRV_PCM_TRIGGER_START: 727 case SNDRV_PCM_TRIGGER_RESUME: 728 /* enable channel merge */ 729 if (dai_id == MT8365_AFE_MEMIF_VUL2 && 730 !ctrl_data->bypass_cm1) { 731 regmap_update_bits(afe->regmap, AFE_CM1_CON0, 732 CM_AFE_CM_ON, CM_AFE_CM_ON); 733 } else if (dai_id == MT8365_AFE_MEMIF_TDM_IN && 734 !ctrl_data->bypass_cm2) { 735 regmap_update_bits(afe->regmap, AFE_CM2_CON0, 736 CM_AFE_CM_ON, CM_AFE_CM_ON); 737 } 738 break; 739 case SNDRV_PCM_TRIGGER_STOP: 740 case SNDRV_PCM_TRIGGER_SUSPEND: 741 /* disable channel merge */ 742 if (dai_id == MT8365_AFE_MEMIF_VUL2 && 743 !ctrl_data->bypass_cm1) { 744 regmap_update_bits(afe->regmap, AFE_CM1_CON0, 745 CM_AFE_CM_ON, ~CM_AFE_CM_ON); 746 } else if (dai_id == MT8365_AFE_MEMIF_TDM_IN && 747 !ctrl_data->bypass_cm2) { 748 regmap_update_bits(afe->regmap, AFE_CM2_CON0, 749 CM_AFE_CM_ON, ~CM_AFE_CM_ON); 750 } 751 break; 752 default: 753 break; 754 } 755 756 return mtk_afe_fe_trigger(substream, cmd, dai); 757 } 758 759 static int mt8365_afe_hw_gain1_startup(struct snd_pcm_substream *substream, 760 struct snd_soc_dai *dai) 761 { 762 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 763 764 mt8365_afe_enable_main_clk(afe); 765 return 0; 766 } 767 768 static void mt8365_afe_hw_gain1_shutdown(struct snd_pcm_substream *substream, 769 struct snd_soc_dai *dai) 770 { 771 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 772 struct mt8365_afe_private *afe_priv = afe->platform_priv; 773 struct mt8365_be_dai_data *be = 774 &afe_priv->be_data[dai->id - MT8365_AFE_BACKEND_BASE]; 775 776 if (be->prepared[substream->stream]) { 777 regmap_update_bits(afe->regmap, AFE_GAIN1_CON0, 778 AFE_GAIN1_CON0_EN_MASK, 0); 779 be->prepared[substream->stream] = false; 780 } 781 mt8365_afe_disable_main_clk(afe); 782 } 783 784 static int mt8365_afe_hw_gain1_prepare(struct snd_pcm_substream *substream, 785 struct snd_soc_dai *dai) 786 { 787 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 788 struct mt8365_afe_private *afe_priv = afe->platform_priv; 789 struct mt8365_be_dai_data *be = 790 &afe_priv->be_data[dai->id - MT8365_AFE_BACKEND_BASE]; 791 792 int fs; 793 unsigned int val1 = 0, val2 = 0; 794 795 if (be->prepared[substream->stream]) { 796 dev_info(afe->dev, "%s prepared already\n", __func__); 797 return 0; 798 } 799 800 fs = mt8365_afe_fs_timing(substream->runtime->rate); 801 regmap_update_bits(afe->regmap, AFE_GAIN1_CON0, 802 AFE_GAIN1_CON0_MODE_MASK, (unsigned int)fs << 4); 803 804 regmap_read(afe->regmap, AFE_GAIN1_CON1, &val1); 805 regmap_read(afe->regmap, AFE_GAIN1_CUR, &val2); 806 if ((val1 & AFE_GAIN1_CON1_MASK) != (val2 & AFE_GAIN1_CUR_MASK)) 807 regmap_update_bits(afe->regmap, AFE_GAIN1_CUR, 808 AFE_GAIN1_CUR_MASK, val1); 809 810 regmap_update_bits(afe->regmap, AFE_GAIN1_CON0, 811 AFE_GAIN1_CON0_EN_MASK, 1); 812 be->prepared[substream->stream] = true; 813 814 return 0; 815 } 816 817 static const struct snd_pcm_hardware mt8365_hostless_hardware = { 818 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 819 SNDRV_PCM_INFO_MMAP_VALID), 820 .period_bytes_min = 256, 821 .period_bytes_max = 4 * 48 * 1024, 822 .periods_min = 2, 823 .periods_max = 256, 824 .buffer_bytes_max = 8 * 48 * 1024, 825 .fifo_size = 0, 826 }; 827 828 /* dai ops */ 829 static int mtk_dai_hostless_startup(struct snd_pcm_substream *substream, 830 struct snd_soc_dai *dai) 831 { 832 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 833 struct snd_pcm_runtime *runtime = substream->runtime; 834 int ret; 835 836 snd_soc_set_runtime_hwparams(substream, &mt8365_hostless_hardware); 837 838 ret = snd_pcm_hw_constraint_integer(runtime, 839 SNDRV_PCM_HW_PARAM_PERIODS); 840 if (ret < 0) 841 dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n"); 842 return ret; 843 } 844 845 /* FE DAIs */ 846 static const struct snd_soc_dai_ops mt8365_afe_fe_dai_ops = { 847 .startup = mt8365_afe_fe_startup, 848 .shutdown = mt8365_afe_fe_shutdown, 849 .hw_params = mt8365_afe_fe_hw_params, 850 .hw_free = mt8365_afe_fe_hw_free, 851 .prepare = mt8365_afe_fe_prepare, 852 .trigger = mt8365_afe_fe_trigger, 853 }; 854 855 static const struct snd_soc_dai_ops mt8365_dai_hostless_ops = { 856 .startup = mtk_dai_hostless_startup, 857 }; 858 859 static const struct snd_soc_dai_ops mt8365_afe_hw_gain1_ops = { 860 .startup = mt8365_afe_hw_gain1_startup, 861 .shutdown = mt8365_afe_hw_gain1_shutdown, 862 .prepare = mt8365_afe_hw_gain1_prepare, 863 }; 864 865 static struct snd_soc_dai_driver mt8365_memif_dai_driver[] = { 866 /* FE DAIs: memory intefaces to CPU */ 867 { 868 .name = "DL1", 869 .id = MT8365_AFE_MEMIF_DL1, 870 .playback = { 871 .stream_name = "DL1", 872 .channels_min = 1, 873 .channels_max = 2, 874 .rates = SNDRV_PCM_RATE_8000_192000, 875 .formats = SNDRV_PCM_FMTBIT_S16_LE | 876 SNDRV_PCM_FMTBIT_S32_LE, 877 }, 878 .ops = &mt8365_afe_fe_dai_ops, 879 }, { 880 .name = "DL2", 881 .id = MT8365_AFE_MEMIF_DL2, 882 .playback = { 883 .stream_name = "DL2", 884 .channels_min = 1, 885 .channels_max = 2, 886 .rates = SNDRV_PCM_RATE_8000_192000, 887 .formats = SNDRV_PCM_FMTBIT_S16_LE | 888 SNDRV_PCM_FMTBIT_S32_LE, 889 }, 890 .ops = &mt8365_afe_fe_dai_ops, 891 }, { 892 .name = "TDM_OUT", 893 .id = MT8365_AFE_MEMIF_TDM_OUT, 894 .playback = { 895 .stream_name = "TDM_OUT", 896 .channels_min = 1, 897 .channels_max = 8, 898 .rates = SNDRV_PCM_RATE_8000_192000, 899 .formats = SNDRV_PCM_FMTBIT_S16_LE | 900 SNDRV_PCM_FMTBIT_S32_LE, 901 }, 902 .ops = &mt8365_afe_fe_dai_ops, 903 }, { 904 .name = "AWB", 905 .id = MT8365_AFE_MEMIF_AWB, 906 .capture = { 907 .stream_name = "AWB", 908 .channels_min = 1, 909 .channels_max = 2, 910 .rates = SNDRV_PCM_RATE_8000_192000, 911 .formats = SNDRV_PCM_FMTBIT_S16_LE | 912 SNDRV_PCM_FMTBIT_S32_LE, 913 }, 914 .ops = &mt8365_afe_fe_dai_ops, 915 }, { 916 .name = "VUL", 917 .id = MT8365_AFE_MEMIF_VUL, 918 .capture = { 919 .stream_name = "VUL", 920 .channels_min = 1, 921 .channels_max = 2, 922 .rates = SNDRV_PCM_RATE_8000_192000, 923 .formats = SNDRV_PCM_FMTBIT_S16_LE | 924 SNDRV_PCM_FMTBIT_S32_LE, 925 }, 926 .ops = &mt8365_afe_fe_dai_ops, 927 }, { 928 .name = "VUL2", 929 .id = MT8365_AFE_MEMIF_VUL2, 930 .capture = { 931 .stream_name = "VUL2", 932 .channels_min = 1, 933 .channels_max = 16, 934 .rates = SNDRV_PCM_RATE_8000_192000, 935 .formats = SNDRV_PCM_FMTBIT_S16_LE | 936 SNDRV_PCM_FMTBIT_S32_LE, 937 }, 938 .ops = &mt8365_afe_fe_dai_ops, 939 }, { 940 .name = "VUL3", 941 .id = MT8365_AFE_MEMIF_VUL3, 942 .capture = { 943 .stream_name = "VUL3", 944 .channels_min = 1, 945 .channels_max = 2, 946 .rates = SNDRV_PCM_RATE_8000_192000, 947 .formats = SNDRV_PCM_FMTBIT_S16_LE | 948 SNDRV_PCM_FMTBIT_S32_LE, 949 }, 950 .ops = &mt8365_afe_fe_dai_ops, 951 }, { 952 .name = "TDM_IN", 953 .id = MT8365_AFE_MEMIF_TDM_IN, 954 .capture = { 955 .stream_name = "TDM_IN", 956 .channels_min = 1, 957 .channels_max = 16, 958 .rates = SNDRV_PCM_RATE_8000_192000, 959 .formats = SNDRV_PCM_FMTBIT_S16_LE | 960 SNDRV_PCM_FMTBIT_S32_LE, 961 }, 962 .ops = &mt8365_afe_fe_dai_ops, 963 }, { 964 .name = "Hostless FM DAI", 965 .id = MT8365_AFE_IO_VIRTUAL_FM, 966 .playback = { 967 .stream_name = "Hostless FM DL", 968 .channels_min = 1, 969 .channels_max = 2, 970 .rates = SNDRV_PCM_RATE_8000_192000, 971 .formats = SNDRV_PCM_FMTBIT_S16_LE | 972 SNDRV_PCM_FMTBIT_S24_LE | 973 SNDRV_PCM_FMTBIT_S32_LE, 974 }, 975 .capture = { 976 .stream_name = "Hostless FM UL", 977 .channels_min = 1, 978 .channels_max = 2, 979 .rates = SNDRV_PCM_RATE_8000_192000, 980 .formats = SNDRV_PCM_FMTBIT_S16_LE | 981 SNDRV_PCM_FMTBIT_S24_LE | 982 SNDRV_PCM_FMTBIT_S32_LE, 983 }, 984 .ops = &mt8365_dai_hostless_ops, 985 }, { 986 .name = "HW_GAIN1", 987 .id = MT8365_AFE_IO_HW_GAIN1, 988 .playback = { 989 .stream_name = "HW Gain 1 In", 990 .channels_min = 1, 991 .channels_max = 2, 992 .rates = SNDRV_PCM_RATE_8000_192000, 993 .formats = SNDRV_PCM_FMTBIT_S16_LE | 994 SNDRV_PCM_FMTBIT_S24_LE | 995 SNDRV_PCM_FMTBIT_S32_LE, 996 }, 997 .capture = { 998 .stream_name = "HW Gain 1 Out", 999 .channels_min = 1, 1000 .channels_max = 2, 1001 .rates = SNDRV_PCM_RATE_8000_192000, 1002 .formats = SNDRV_PCM_FMTBIT_S16_LE | 1003 SNDRV_PCM_FMTBIT_S24_LE | 1004 SNDRV_PCM_FMTBIT_S32_LE, 1005 }, 1006 .ops = &mt8365_afe_hw_gain1_ops, 1007 .symmetric_rate = 1, 1008 .symmetric_channels = 1, 1009 .symmetric_sample_bits = 1, 1010 }, 1011 }; 1012 1013 static const struct snd_kcontrol_new mt8365_afe_o00_mix[] = { 1014 SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN0, 5, 1, 0), 1015 SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN0, 7, 1, 0), 1016 }; 1017 1018 static const struct snd_kcontrol_new mt8365_afe_o01_mix[] = { 1019 SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN1, 6, 1, 0), 1020 SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN1, 8, 1, 0), 1021 }; 1022 1023 static const struct snd_kcontrol_new mt8365_afe_o03_mix[] = { 1024 SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN3, 5, 1, 0), 1025 SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN3, 7, 1, 0), 1026 SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN3, 0, 1, 0), 1027 SOC_DAPM_SINGLE_AUTODISABLE("I10 Switch", AFE_CONN3, 10, 1, 0), 1028 }; 1029 1030 static const struct snd_kcontrol_new mt8365_afe_o04_mix[] = { 1031 SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN4, 6, 1, 0), 1032 SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN4, 8, 1, 0), 1033 SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN4, 1, 1, 0), 1034 SOC_DAPM_SINGLE_AUTODISABLE("I11 Switch", AFE_CONN4, 11, 1, 0), 1035 }; 1036 1037 static const struct snd_kcontrol_new mt8365_afe_o05_mix[] = { 1038 SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN5, 0, 1, 0), 1039 SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN5, 3, 1, 0), 1040 SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN5, 5, 1, 0), 1041 SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN5, 7, 1, 0), 1042 SOC_DAPM_SINGLE_AUTODISABLE("I09 Switch", AFE_CONN5, 9, 1, 0), 1043 SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN5, 14, 1, 0), 1044 SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN5, 16, 1, 0), 1045 SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN5, 18, 1, 0), 1046 SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN5, 20, 1, 0), 1047 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN5, 23, 1, 0), 1048 SOC_DAPM_SINGLE_AUTODISABLE("I10L Switch", AFE_CONN5, 10, 1, 0), 1049 }; 1050 1051 static const struct snd_kcontrol_new mt8365_afe_o06_mix[] = { 1052 SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN6, 1, 1, 0), 1053 SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN6, 4, 1, 0), 1054 SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN6, 6, 1, 0), 1055 SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN6, 8, 1, 0), 1056 SOC_DAPM_SINGLE_AUTODISABLE("I22 Switch", AFE_CONN6, 22, 1, 0), 1057 SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN6, 15, 1, 0), 1058 SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN6, 17, 1, 0), 1059 SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN6, 19, 1, 0), 1060 SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN6, 21, 1, 0), 1061 SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN6, 24, 1, 0), 1062 SOC_DAPM_SINGLE_AUTODISABLE("I11L Switch", AFE_CONN6, 11, 1, 0), 1063 }; 1064 1065 static const struct snd_kcontrol_new mt8365_afe_o07_mix[] = { 1066 SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN7, 5, 1, 0), 1067 SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN7, 7, 1, 0), 1068 }; 1069 1070 static const struct snd_kcontrol_new mt8365_afe_o08_mix[] = { 1071 SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN8, 6, 1, 0), 1072 SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN8, 8, 1, 0), 1073 }; 1074 1075 static const struct snd_kcontrol_new mt8365_afe_o09_mix[] = { 1076 SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN9, 0, 1, 0), 1077 SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN9, 3, 1, 0), 1078 SOC_DAPM_SINGLE_AUTODISABLE("I09 Switch", AFE_CONN9, 9, 1, 0), 1079 SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN9, 14, 1, 0), 1080 SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN9, 16, 1, 0), 1081 SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN9, 18, 1, 0), 1082 SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN9, 20, 1, 0), 1083 }; 1084 1085 static const struct snd_kcontrol_new mt8365_afe_o10_mix[] = { 1086 SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN10, 1, 1, 0), 1087 SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN10, 4, 1, 0), 1088 SOC_DAPM_SINGLE_AUTODISABLE("I22 Switch", AFE_CONN10, 22, 1, 0), 1089 SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN10, 15, 1, 0), 1090 SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN10, 17, 1, 0), 1091 SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN10, 19, 1, 0), 1092 SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN10, 21, 1, 0), 1093 }; 1094 1095 static const struct snd_kcontrol_new mt8365_afe_o11_mix[] = { 1096 SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN11, 0, 1, 0), 1097 SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN11, 3, 1, 0), 1098 SOC_DAPM_SINGLE_AUTODISABLE("I09 Switch", AFE_CONN11, 9, 1, 0), 1099 SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN11, 14, 1, 0), 1100 SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN11, 16, 1, 0), 1101 SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN11, 18, 1, 0), 1102 SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN11, 20, 1, 0), 1103 }; 1104 1105 static const struct snd_kcontrol_new mt8365_afe_o12_mix[] = { 1106 SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN12, 1, 1, 0), 1107 SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN12, 4, 1, 0), 1108 SOC_DAPM_SINGLE_AUTODISABLE("I22 Switch", AFE_CONN12, 22, 1, 0), 1109 SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN12, 15, 1, 0), 1110 SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN12, 17, 1, 0), 1111 SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN12, 19, 1, 0), 1112 SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN12, 21, 1, 0), 1113 }; 1114 1115 static const struct snd_kcontrol_new mt8365_afe_o13_mix[] = { 1116 SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN13, 0, 1, 0), 1117 }; 1118 1119 static const struct snd_kcontrol_new mt8365_afe_o14_mix[] = { 1120 SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN14, 1, 1, 0), 1121 }; 1122 1123 static const struct snd_kcontrol_new mt8365_afe_o15_mix[] = { 1124 }; 1125 1126 static const struct snd_kcontrol_new mt8365_afe_o16_mix[] = { 1127 }; 1128 1129 static const struct snd_kcontrol_new mt8365_afe_o17_mix[] = { 1130 SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN17, 3, 1, 0), 1131 SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN17, 14, 1, 0), 1132 }; 1133 1134 static const struct snd_kcontrol_new mt8365_afe_o18_mix[] = { 1135 SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN18, 4, 1, 0), 1136 SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN18, 15, 1, 0), 1137 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN18, 23, 1, 0), 1138 SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN18, 25, 1, 0), 1139 }; 1140 1141 static const struct snd_kcontrol_new mt8365_afe_o19_mix[] = { 1142 SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN19, 4, 1, 0), 1143 SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN19, 16, 1, 0), 1144 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN19, 23, 1, 0), 1145 SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN19, 24, 1, 0), 1146 SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN19, 25, 1, 0), 1147 SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN19, 26, 1, 0), 1148 }; 1149 1150 static const struct snd_kcontrol_new mt8365_afe_o20_mix[] = { 1151 SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN20, 17, 1, 0), 1152 SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN20, 24, 1, 0), 1153 SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN20, 26, 1, 0), 1154 }; 1155 1156 static const struct snd_kcontrol_new mt8365_afe_o21_mix[] = { 1157 SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN21, 18, 1, 0), 1158 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN21, 23, 1, 0), 1159 SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN21, 25, 1, 0), 1160 }; 1161 1162 static const struct snd_kcontrol_new mt8365_afe_o22_mix[] = { 1163 SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN22, 19, 1, 0), 1164 SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN22, 24, 1, 0), 1165 SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN22, 26, 1, 0), 1166 }; 1167 1168 static const struct snd_kcontrol_new mt8365_afe_o23_mix[] = { 1169 SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN23, 20, 1, 0), 1170 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN23, 23, 1, 0), 1171 SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN23, 25, 1, 0), 1172 }; 1173 1174 static const struct snd_kcontrol_new mt8365_afe_o24_mix[] = { 1175 SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN24, 21, 1, 0), 1176 SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN24, 24, 1, 0), 1177 SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN24, 26, 1, 0), 1178 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN24, 23, 1, 0), 1179 SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN24, 25, 1, 0), 1180 }; 1181 1182 static const struct snd_kcontrol_new mt8365_afe_o25_mix[] = { 1183 SOC_DAPM_SINGLE_AUTODISABLE("I27 Switch", AFE_CONN25, 27, 1, 0), 1184 SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN25, 23, 1, 0), 1185 SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN25, 25, 1, 0), 1186 }; 1187 1188 static const struct snd_kcontrol_new mt8365_afe_o26_mix[] = { 1189 SOC_DAPM_SINGLE_AUTODISABLE("I28 Switch", AFE_CONN26, 28, 1, 0), 1190 SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN26, 24, 1, 0), 1191 SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN26, 26, 1, 0), 1192 }; 1193 1194 static const struct snd_kcontrol_new mt8365_afe_o27_mix[] = { 1195 SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN27, 5, 1, 0), 1196 SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN27, 7, 1, 0), 1197 }; 1198 1199 static const struct snd_kcontrol_new mt8365_afe_o28_mix[] = { 1200 SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN28, 6, 1, 0), 1201 SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN28, 8, 1, 0), 1202 }; 1203 1204 static const struct snd_kcontrol_new mt8365_afe_o29_mix[] = { 1205 SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN29, 5, 1, 0), 1206 SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN29, 7, 1, 0), 1207 }; 1208 1209 static const struct snd_kcontrol_new mt8365_afe_o30_mix[] = { 1210 SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN30, 6, 1, 0), 1211 SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN30, 8, 1, 0), 1212 }; 1213 1214 static const struct snd_kcontrol_new mt8365_afe_o31_mix[] = { 1215 SOC_DAPM_SINGLE_AUTODISABLE("I29 Switch", AFE_CONN31, 29, 1, 0), 1216 }; 1217 1218 static const struct snd_kcontrol_new mt8365_afe_o32_mix[] = { 1219 SOC_DAPM_SINGLE_AUTODISABLE("I30 Switch", AFE_CONN32, 30, 1, 0), 1220 }; 1221 1222 static const struct snd_kcontrol_new mt8365_afe_o33_mix[] = { 1223 SOC_DAPM_SINGLE_AUTODISABLE("I31 Switch", AFE_CONN33, 31, 1, 0), 1224 }; 1225 1226 static const struct snd_kcontrol_new mt8365_afe_o34_mix[] = { 1227 SOC_DAPM_SINGLE_AUTODISABLE("I32 Switch", AFE_CONN34_1, 0, 1, 0), 1228 }; 1229 1230 static const struct snd_kcontrol_new mt8365_afe_o35_mix[] = { 1231 SOC_DAPM_SINGLE_AUTODISABLE("I33 Switch", AFE_CONN35_1, 1, 1, 0), 1232 }; 1233 1234 static const struct snd_kcontrol_new mt8365_afe_o36_mix[] = { 1235 SOC_DAPM_SINGLE_AUTODISABLE("I34 Switch", AFE_CONN36_1, 2, 1, 0), 1236 }; 1237 1238 static const struct snd_kcontrol_new mtk_hw_gain1_in_ch1_mix[] = { 1239 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN13, 1240 0, 1, 0), 1241 }; 1242 1243 static const struct snd_kcontrol_new mtk_hw_gain1_in_ch2_mix[] = { 1244 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN14, 1245 1, 1, 0), 1246 }; 1247 1248 static int mt8365_afe_cm2_io_input_mux_get(struct snd_kcontrol *kcontrol, 1249 struct snd_ctl_elem_value *ucontrol) 1250 { 1251 ucontrol->value.integer.value[0] = mCM2Input; 1252 1253 return 0; 1254 } 1255 1256 static int mt8365_afe_cm2_io_input_mux_put(struct snd_kcontrol *kcontrol, 1257 struct snd_ctl_elem_value *ucontrol) 1258 { 1259 struct snd_soc_dapm_context *dapm = 1260 snd_soc_dapm_kcontrol_dapm(kcontrol); 1261 struct snd_soc_component *comp = snd_soc_dapm_to_component(dapm); 1262 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(comp); 1263 struct mt8365_afe_private *afe_priv = afe->platform_priv; 1264 int ret; 1265 1266 mCM2Input = ucontrol->value.enumerated.item[0]; 1267 1268 afe_priv->cm2_mux_input = mCM2Input; 1269 ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol); 1270 1271 return ret; 1272 } 1273 1274 static const char * const fmhwgain_text[] = { 1275 "OPEN", "FM_HW_GAIN_IO" 1276 }; 1277 1278 static const char * const ain_text[] = { 1279 "INT ADC", "EXT ADC", 1280 }; 1281 1282 static const char * const vul2_in_input_text[] = { 1283 "VUL2_IN_FROM_O17O18", "VUL2_IN_FROM_CM1", 1284 }; 1285 1286 static const char * const mt8365_afe_cm2_mux_text[] = { 1287 "OPEN", "FROM_GASRC1_OUT", "FROM_GASRC2_OUT", "FROM_TDM_ASRC_OUT", 1288 }; 1289 1290 static SOC_ENUM_SINGLE_VIRT_DECL(fmhwgain_enum, fmhwgain_text); 1291 static SOC_ENUM_SINGLE_DECL(ain_enum, AFE_ADDA_TOP_CON0, 0, ain_text); 1292 static SOC_ENUM_SINGLE_VIRT_DECL(vul2_in_input_enum, vul2_in_input_text); 1293 static SOC_ENUM_SINGLE_VIRT_DECL(mt8365_afe_cm2_mux_input_enum, 1294 mt8365_afe_cm2_mux_text); 1295 1296 static const struct snd_kcontrol_new fmhwgain_mux = 1297 SOC_DAPM_ENUM("FM HW Gain Source", fmhwgain_enum); 1298 1299 static const struct snd_kcontrol_new ain_mux = 1300 SOC_DAPM_ENUM("AIN Source", ain_enum); 1301 1302 static const struct snd_kcontrol_new vul2_in_input_mux = 1303 SOC_DAPM_ENUM("VUL2 Input", vul2_in_input_enum); 1304 1305 static const struct snd_kcontrol_new mt8365_afe_cm2_mux_input_mux = 1306 SOC_DAPM_ENUM_EXT("CM2_MUX Source", mt8365_afe_cm2_mux_input_enum, 1307 mt8365_afe_cm2_io_input_mux_get, 1308 mt8365_afe_cm2_io_input_mux_put); 1309 1310 static const struct snd_soc_dapm_widget mt8365_memif_widgets[] = { 1311 /* inter-connections */ 1312 SND_SOC_DAPM_MIXER("I00", SND_SOC_NOPM, 0, 0, NULL, 0), 1313 SND_SOC_DAPM_MIXER("I01", SND_SOC_NOPM, 0, 0, NULL, 0), 1314 SND_SOC_DAPM_MIXER("I03", SND_SOC_NOPM, 0, 0, NULL, 0), 1315 SND_SOC_DAPM_MIXER("I04", SND_SOC_NOPM, 0, 0, NULL, 0), 1316 SND_SOC_DAPM_MIXER("I05", SND_SOC_NOPM, 0, 0, NULL, 0), 1317 SND_SOC_DAPM_MIXER("I06", SND_SOC_NOPM, 0, 0, NULL, 0), 1318 SND_SOC_DAPM_MIXER("I07", SND_SOC_NOPM, 0, 0, NULL, 0), 1319 SND_SOC_DAPM_MIXER("I08", SND_SOC_NOPM, 0, 0, NULL, 0), 1320 SND_SOC_DAPM_MIXER("I05L", SND_SOC_NOPM, 0, 0, NULL, 0), 1321 SND_SOC_DAPM_MIXER("I06L", SND_SOC_NOPM, 0, 0, NULL, 0), 1322 SND_SOC_DAPM_MIXER("I07L", SND_SOC_NOPM, 0, 0, NULL, 0), 1323 SND_SOC_DAPM_MIXER("I08L", SND_SOC_NOPM, 0, 0, NULL, 0), 1324 SND_SOC_DAPM_MIXER("I09", SND_SOC_NOPM, 0, 0, NULL, 0), 1325 SND_SOC_DAPM_MIXER("I10", SND_SOC_NOPM, 0, 0, NULL, 0), 1326 SND_SOC_DAPM_MIXER("I11", SND_SOC_NOPM, 0, 0, NULL, 0), 1327 SND_SOC_DAPM_MIXER("I10L", SND_SOC_NOPM, 0, 0, NULL, 0), 1328 SND_SOC_DAPM_MIXER("I11L", SND_SOC_NOPM, 0, 0, NULL, 0), 1329 SND_SOC_DAPM_MIXER("I12", SND_SOC_NOPM, 0, 0, NULL, 0), 1330 SND_SOC_DAPM_MIXER("I13", SND_SOC_NOPM, 0, 0, NULL, 0), 1331 SND_SOC_DAPM_MIXER("I14", SND_SOC_NOPM, 0, 0, NULL, 0), 1332 SND_SOC_DAPM_MIXER("I15", SND_SOC_NOPM, 0, 0, NULL, 0), 1333 SND_SOC_DAPM_MIXER("I16", SND_SOC_NOPM, 0, 0, NULL, 0), 1334 SND_SOC_DAPM_MIXER("I17", SND_SOC_NOPM, 0, 0, NULL, 0), 1335 SND_SOC_DAPM_MIXER("I18", SND_SOC_NOPM, 0, 0, NULL, 0), 1336 SND_SOC_DAPM_MIXER("I19", SND_SOC_NOPM, 0, 0, NULL, 0), 1337 SND_SOC_DAPM_MIXER("I20", SND_SOC_NOPM, 0, 0, NULL, 0), 1338 SND_SOC_DAPM_MIXER("I21", SND_SOC_NOPM, 0, 0, NULL, 0), 1339 SND_SOC_DAPM_MIXER("I22", SND_SOC_NOPM, 0, 0, NULL, 0), 1340 SND_SOC_DAPM_MIXER("I23", SND_SOC_NOPM, 0, 0, NULL, 0), 1341 SND_SOC_DAPM_MIXER("I24", SND_SOC_NOPM, 0, 0, NULL, 0), 1342 SND_SOC_DAPM_MIXER("I25", SND_SOC_NOPM, 0, 0, NULL, 0), 1343 SND_SOC_DAPM_MIXER("I26", SND_SOC_NOPM, 0, 0, NULL, 0), 1344 SND_SOC_DAPM_MIXER("I27", SND_SOC_NOPM, 0, 0, NULL, 0), 1345 SND_SOC_DAPM_MIXER("I28", SND_SOC_NOPM, 0, 0, NULL, 0), 1346 SND_SOC_DAPM_MIXER("I29", SND_SOC_NOPM, 0, 0, NULL, 0), 1347 SND_SOC_DAPM_MIXER("I30", SND_SOC_NOPM, 0, 0, NULL, 0), 1348 SND_SOC_DAPM_MIXER("I31", SND_SOC_NOPM, 0, 0, NULL, 0), 1349 SND_SOC_DAPM_MIXER("I32", SND_SOC_NOPM, 0, 0, NULL, 0), 1350 SND_SOC_DAPM_MIXER("I33", SND_SOC_NOPM, 0, 0, NULL, 0), 1351 SND_SOC_DAPM_MIXER("I34", SND_SOC_NOPM, 0, 0, NULL, 0), 1352 SND_SOC_DAPM_MIXER("O00", SND_SOC_NOPM, 0, 0, 1353 mt8365_afe_o00_mix, ARRAY_SIZE(mt8365_afe_o00_mix)), 1354 SND_SOC_DAPM_MIXER("O01", SND_SOC_NOPM, 0, 0, 1355 mt8365_afe_o01_mix, ARRAY_SIZE(mt8365_afe_o01_mix)), 1356 SND_SOC_DAPM_MIXER("O03", SND_SOC_NOPM, 0, 0, 1357 mt8365_afe_o03_mix, ARRAY_SIZE(mt8365_afe_o03_mix)), 1358 SND_SOC_DAPM_MIXER("O04", SND_SOC_NOPM, 0, 0, 1359 mt8365_afe_o04_mix, ARRAY_SIZE(mt8365_afe_o04_mix)), 1360 SND_SOC_DAPM_MIXER("O05", SND_SOC_NOPM, 0, 0, 1361 mt8365_afe_o05_mix, ARRAY_SIZE(mt8365_afe_o05_mix)), 1362 SND_SOC_DAPM_MIXER("O06", SND_SOC_NOPM, 0, 0, 1363 mt8365_afe_o06_mix, ARRAY_SIZE(mt8365_afe_o06_mix)), 1364 SND_SOC_DAPM_MIXER("O07", SND_SOC_NOPM, 0, 0, 1365 mt8365_afe_o07_mix, ARRAY_SIZE(mt8365_afe_o07_mix)), 1366 SND_SOC_DAPM_MIXER("O08", SND_SOC_NOPM, 0, 0, 1367 mt8365_afe_o08_mix, ARRAY_SIZE(mt8365_afe_o08_mix)), 1368 SND_SOC_DAPM_MIXER("O09", SND_SOC_NOPM, 0, 0, 1369 mt8365_afe_o09_mix, ARRAY_SIZE(mt8365_afe_o09_mix)), 1370 SND_SOC_DAPM_MIXER("O10", SND_SOC_NOPM, 0, 0, 1371 mt8365_afe_o10_mix, ARRAY_SIZE(mt8365_afe_o10_mix)), 1372 SND_SOC_DAPM_MIXER("O11", SND_SOC_NOPM, 0, 0, 1373 mt8365_afe_o11_mix, ARRAY_SIZE(mt8365_afe_o11_mix)), 1374 SND_SOC_DAPM_MIXER("O12", SND_SOC_NOPM, 0, 0, 1375 mt8365_afe_o12_mix, ARRAY_SIZE(mt8365_afe_o12_mix)), 1376 SND_SOC_DAPM_MIXER("O13", SND_SOC_NOPM, 0, 0, 1377 mt8365_afe_o13_mix, ARRAY_SIZE(mt8365_afe_o13_mix)), 1378 SND_SOC_DAPM_MIXER("O14", SND_SOC_NOPM, 0, 0, 1379 mt8365_afe_o14_mix, ARRAY_SIZE(mt8365_afe_o14_mix)), 1380 SND_SOC_DAPM_MIXER("O15", SND_SOC_NOPM, 0, 0, 1381 mt8365_afe_o15_mix, ARRAY_SIZE(mt8365_afe_o15_mix)), 1382 SND_SOC_DAPM_MIXER("O16", SND_SOC_NOPM, 0, 0, 1383 mt8365_afe_o16_mix, ARRAY_SIZE(mt8365_afe_o16_mix)), 1384 SND_SOC_DAPM_MIXER("O17", SND_SOC_NOPM, 0, 0, 1385 mt8365_afe_o17_mix, ARRAY_SIZE(mt8365_afe_o17_mix)), 1386 SND_SOC_DAPM_MIXER("O18", SND_SOC_NOPM, 0, 0, 1387 mt8365_afe_o18_mix, ARRAY_SIZE(mt8365_afe_o18_mix)), 1388 SND_SOC_DAPM_MIXER("O19", SND_SOC_NOPM, 0, 0, 1389 mt8365_afe_o19_mix, ARRAY_SIZE(mt8365_afe_o19_mix)), 1390 SND_SOC_DAPM_MIXER("O20", SND_SOC_NOPM, 0, 0, 1391 mt8365_afe_o20_mix, ARRAY_SIZE(mt8365_afe_o20_mix)), 1392 SND_SOC_DAPM_MIXER("O21", SND_SOC_NOPM, 0, 0, 1393 mt8365_afe_o21_mix, ARRAY_SIZE(mt8365_afe_o21_mix)), 1394 SND_SOC_DAPM_MIXER("O22", SND_SOC_NOPM, 0, 0, 1395 mt8365_afe_o22_mix, ARRAY_SIZE(mt8365_afe_o22_mix)), 1396 SND_SOC_DAPM_MIXER("O23", SND_SOC_NOPM, 0, 0, 1397 mt8365_afe_o23_mix, ARRAY_SIZE(mt8365_afe_o23_mix)), 1398 SND_SOC_DAPM_MIXER("O24", SND_SOC_NOPM, 0, 0, 1399 mt8365_afe_o24_mix, ARRAY_SIZE(mt8365_afe_o24_mix)), 1400 SND_SOC_DAPM_MIXER("O25", SND_SOC_NOPM, 0, 0, 1401 mt8365_afe_o25_mix, ARRAY_SIZE(mt8365_afe_o25_mix)), 1402 SND_SOC_DAPM_MIXER("O26", SND_SOC_NOPM, 0, 0, 1403 mt8365_afe_o26_mix, ARRAY_SIZE(mt8365_afe_o26_mix)), 1404 SND_SOC_DAPM_MIXER("O27", SND_SOC_NOPM, 0, 0, 1405 mt8365_afe_o27_mix, ARRAY_SIZE(mt8365_afe_o27_mix)), 1406 SND_SOC_DAPM_MIXER("O28", SND_SOC_NOPM, 0, 0, 1407 mt8365_afe_o28_mix, ARRAY_SIZE(mt8365_afe_o28_mix)), 1408 SND_SOC_DAPM_MIXER("O29", SND_SOC_NOPM, 0, 0, 1409 mt8365_afe_o29_mix, ARRAY_SIZE(mt8365_afe_o29_mix)), 1410 SND_SOC_DAPM_MIXER("O30", SND_SOC_NOPM, 0, 0, 1411 mt8365_afe_o30_mix, ARRAY_SIZE(mt8365_afe_o30_mix)), 1412 SND_SOC_DAPM_MIXER("O31", SND_SOC_NOPM, 0, 0, 1413 mt8365_afe_o31_mix, ARRAY_SIZE(mt8365_afe_o31_mix)), 1414 SND_SOC_DAPM_MIXER("O32", SND_SOC_NOPM, 0, 0, 1415 mt8365_afe_o32_mix, ARRAY_SIZE(mt8365_afe_o32_mix)), 1416 SND_SOC_DAPM_MIXER("O33", SND_SOC_NOPM, 0, 0, 1417 mt8365_afe_o33_mix, ARRAY_SIZE(mt8365_afe_o33_mix)), 1418 SND_SOC_DAPM_MIXER("O34", SND_SOC_NOPM, 0, 0, 1419 mt8365_afe_o34_mix, ARRAY_SIZE(mt8365_afe_o34_mix)), 1420 SND_SOC_DAPM_MIXER("O35", SND_SOC_NOPM, 0, 0, 1421 mt8365_afe_o35_mix, ARRAY_SIZE(mt8365_afe_o35_mix)), 1422 SND_SOC_DAPM_MIXER("O36", SND_SOC_NOPM, 0, 0, 1423 mt8365_afe_o36_mix, ARRAY_SIZE(mt8365_afe_o36_mix)), 1424 SND_SOC_DAPM_MIXER("CM2_Mux IO", SND_SOC_NOPM, 0, 0, NULL, 0), 1425 SND_SOC_DAPM_MIXER("CM1_IO", SND_SOC_NOPM, 0, 0, NULL, 0), 1426 SND_SOC_DAPM_MIXER("O17O18", SND_SOC_NOPM, 0, 0, NULL, 0), 1427 /* inter-connections */ 1428 SND_SOC_DAPM_MIXER("HW_GAIN1_IN_CH1", SND_SOC_NOPM, 0, 0, 1429 mtk_hw_gain1_in_ch1_mix, 1430 ARRAY_SIZE(mtk_hw_gain1_in_ch1_mix)), 1431 SND_SOC_DAPM_MIXER("HW_GAIN1_IN_CH2", SND_SOC_NOPM, 0, 0, 1432 mtk_hw_gain1_in_ch2_mix, 1433 ARRAY_SIZE(mtk_hw_gain1_in_ch2_mix)), 1434 1435 SND_SOC_DAPM_INPUT("DL Source"), 1436 1437 SND_SOC_DAPM_MUX("CM2_Mux_IO Input Mux", SND_SOC_NOPM, 0, 0, 1438 &mt8365_afe_cm2_mux_input_mux), 1439 1440 SND_SOC_DAPM_MUX("AIN Mux", SND_SOC_NOPM, 0, 0, &ain_mux), 1441 SND_SOC_DAPM_MUX("VUL2 Input Mux", SND_SOC_NOPM, 0, 0, 1442 &vul2_in_input_mux), 1443 1444 SND_SOC_DAPM_MUX("FM HW Gain Mux", SND_SOC_NOPM, 0, 0, &fmhwgain_mux), 1445 1446 SND_SOC_DAPM_INPUT("HW Gain 1 Out Endpoint"), 1447 SND_SOC_DAPM_OUTPUT("HW Gain 1 In Endpoint"), 1448 }; 1449 1450 static const struct snd_soc_dapm_route mt8365_memif_routes[] = { 1451 /* downlink */ 1452 {"I00", NULL, "2ND I2S Capture"}, 1453 {"I01", NULL, "2ND I2S Capture"}, 1454 {"I05", NULL, "DL1"}, 1455 {"I06", NULL, "DL1"}, 1456 {"I07", NULL, "DL2"}, 1457 {"I08", NULL, "DL2"}, 1458 1459 {"O03", "I05 Switch", "I05"}, 1460 {"O04", "I06 Switch", "I06"}, 1461 {"O00", "I05 Switch", "I05"}, 1462 {"O01", "I06 Switch", "I06"}, 1463 {"O07", "I05 Switch", "I05"}, 1464 {"O08", "I06 Switch", "I06"}, 1465 {"O27", "I05 Switch", "I05"}, 1466 {"O28", "I06 Switch", "I06"}, 1467 {"O29", "I05 Switch", "I05"}, 1468 {"O30", "I06 Switch", "I06"}, 1469 1470 {"O03", "I07 Switch", "I07"}, 1471 {"O04", "I08 Switch", "I08"}, 1472 {"O00", "I07 Switch", "I07"}, 1473 {"O01", "I08 Switch", "I08"}, 1474 {"O07", "I07 Switch", "I07"}, 1475 {"O08", "I08 Switch", "I08"}, 1476 1477 /* uplink */ 1478 {"AWB", NULL, "O05"}, 1479 {"AWB", NULL, "O06"}, 1480 {"VUL", NULL, "O09"}, 1481 {"VUL", NULL, "O10"}, 1482 {"VUL3", NULL, "O11"}, 1483 {"VUL3", NULL, "O12"}, 1484 1485 {"AIN Mux", "EXT ADC", "I2S Capture"}, 1486 {"I03", NULL, "AIN Mux"}, 1487 {"I04", NULL, "AIN Mux"}, 1488 1489 {"HW_GAIN1_IN_CH1", "CONNSYS_I2S_CH1", "Hostless FM DL"}, 1490 {"HW_GAIN1_IN_CH2", "CONNSYS_I2S_CH2", "Hostless FM DL"}, 1491 1492 {"HW Gain 1 In Endpoint", NULL, "HW Gain 1 In"}, 1493 {"HW Gain 1 Out", NULL, "HW Gain 1 Out Endpoint"}, 1494 {"HW Gain 1 In", NULL, "HW_GAIN1_IN_CH1"}, 1495 {"HW Gain 1 In", NULL, "HW_GAIN1_IN_CH2"}, 1496 1497 {"FM HW Gain Mux", "FM_HW_GAIN_IO", "HW Gain 1 Out"}, 1498 {"Hostless FM UL", NULL, "FM HW Gain Mux"}, 1499 {"Hostless FM UL", NULL, "FM 2ND I2S Mux"}, 1500 1501 {"O05", "I05 Switch", "I05L"}, 1502 {"O06", "I06 Switch", "I06L"}, 1503 {"O05", "I07 Switch", "I07L"}, 1504 {"O06", "I08 Switch", "I08L"}, 1505 1506 {"O05", "I03 Switch", "I03"}, 1507 {"O06", "I04 Switch", "I04"}, 1508 {"O05", "I00 Switch", "I00"}, 1509 {"O06", "I01 Switch", "I01"}, 1510 {"O05", "I09 Switch", "I09"}, 1511 {"O06", "I22 Switch", "I22"}, 1512 {"O05", "I14 Switch", "I14"}, 1513 {"O06", "I15 Switch", "I15"}, 1514 {"O05", "I16 Switch", "I16"}, 1515 {"O06", "I17 Switch", "I17"}, 1516 {"O05", "I18 Switch", "I18"}, 1517 {"O06", "I19 Switch", "I19"}, 1518 {"O05", "I20 Switch", "I20"}, 1519 {"O06", "I21 Switch", "I21"}, 1520 {"O05", "I23 Switch", "I23"}, 1521 {"O06", "I24 Switch", "I24"}, 1522 1523 {"O09", "I03 Switch", "I03"}, 1524 {"O10", "I04 Switch", "I04"}, 1525 {"O09", "I00 Switch", "I00"}, 1526 {"O10", "I01 Switch", "I01"}, 1527 {"O09", "I09 Switch", "I09"}, 1528 {"O10", "I22 Switch", "I22"}, 1529 {"O09", "I14 Switch", "I14"}, 1530 {"O10", "I15 Switch", "I15"}, 1531 {"O09", "I16 Switch", "I16"}, 1532 {"O10", "I17 Switch", "I17"}, 1533 {"O09", "I18 Switch", "I18"}, 1534 {"O10", "I19 Switch", "I19"}, 1535 {"O09", "I20 Switch", "I20"}, 1536 {"O10", "I21 Switch", "I21"}, 1537 1538 {"O11", "I03 Switch", "I03"}, 1539 {"O12", "I04 Switch", "I04"}, 1540 {"O11", "I00 Switch", "I00"}, 1541 {"O12", "I01 Switch", "I01"}, 1542 {"O11", "I09 Switch", "I09"}, 1543 {"O12", "I22 Switch", "I22"}, 1544 {"O11", "I14 Switch", "I14"}, 1545 {"O12", "I15 Switch", "I15"}, 1546 {"O11", "I16 Switch", "I16"}, 1547 {"O12", "I17 Switch", "I17"}, 1548 {"O11", "I18 Switch", "I18"}, 1549 {"O12", "I19 Switch", "I19"}, 1550 {"O11", "I20 Switch", "I20"}, 1551 {"O12", "I21 Switch", "I21"}, 1552 1553 /* CM2_Mux*/ 1554 {"CM2_Mux IO", NULL, "CM2_Mux_IO Input Mux"}, 1555 1556 /* VUL2 */ 1557 {"VUL2", NULL, "VUL2 Input Mux"}, 1558 {"VUL2 Input Mux", "VUL2_IN_FROM_O17O18", "O17O18"}, 1559 {"VUL2 Input Mux", "VUL2_IN_FROM_CM1", "CM1_IO"}, 1560 1561 {"O17O18", NULL, "O17"}, 1562 {"O17O18", NULL, "O18"}, 1563 {"CM1_IO", NULL, "O17"}, 1564 {"CM1_IO", NULL, "O18"}, 1565 {"CM1_IO", NULL, "O19"}, 1566 {"CM1_IO", NULL, "O20"}, 1567 {"CM1_IO", NULL, "O21"}, 1568 {"CM1_IO", NULL, "O22"}, 1569 {"CM1_IO", NULL, "O23"}, 1570 {"CM1_IO", NULL, "O24"}, 1571 {"CM1_IO", NULL, "O25"}, 1572 {"CM1_IO", NULL, "O26"}, 1573 {"CM1_IO", NULL, "O31"}, 1574 {"CM1_IO", NULL, "O32"}, 1575 {"CM1_IO", NULL, "O33"}, 1576 {"CM1_IO", NULL, "O34"}, 1577 {"CM1_IO", NULL, "O35"}, 1578 {"CM1_IO", NULL, "O36"}, 1579 1580 {"O17", "I14 Switch", "I14"}, 1581 {"O18", "I15 Switch", "I15"}, 1582 {"O19", "I16 Switch", "I16"}, 1583 {"O20", "I17 Switch", "I17"}, 1584 {"O21", "I18 Switch", "I18"}, 1585 {"O22", "I19 Switch", "I19"}, 1586 {"O23", "I20 Switch", "I20"}, 1587 {"O24", "I21 Switch", "I21"}, 1588 {"O25", "I23 Switch", "I23"}, 1589 {"O26", "I24 Switch", "I24"}, 1590 {"O25", "I25 Switch", "I25"}, 1591 {"O26", "I26 Switch", "I26"}, 1592 1593 {"O17", "I03 Switch", "I03"}, 1594 {"O18", "I04 Switch", "I04"}, 1595 {"O18", "I23 Switch", "I23"}, 1596 {"O18", "I25 Switch", "I25"}, 1597 {"O19", "I04 Switch", "I04"}, 1598 {"O19", "I23 Switch", "I23"}, 1599 {"O19", "I24 Switch", "I24"}, 1600 {"O19", "I25 Switch", "I25"}, 1601 {"O19", "I26 Switch", "I26"}, 1602 {"O20", "I24 Switch", "I24"}, 1603 {"O20", "I26 Switch", "I26"}, 1604 {"O21", "I23 Switch", "I23"}, 1605 {"O21", "I25 Switch", "I25"}, 1606 {"O22", "I24 Switch", "I24"}, 1607 {"O22", "I26 Switch", "I26"}, 1608 1609 {"O23", "I23 Switch", "I23"}, 1610 {"O23", "I25 Switch", "I25"}, 1611 {"O24", "I24 Switch", "I24"}, 1612 {"O24", "I26 Switch", "I26"}, 1613 {"O24", "I23 Switch", "I23"}, 1614 {"O24", "I25 Switch", "I25"}, 1615 {"O13", "I00 Switch", "I00"}, 1616 {"O14", "I01 Switch", "I01"}, 1617 {"O03", "I10 Switch", "I10"}, 1618 {"O04", "I11 Switch", "I11"}, 1619 }; 1620 1621 static const struct mtk_base_memif_data memif_data[MT8365_AFE_MEMIF_NUM] = { 1622 { 1623 .name = "DL1", 1624 .id = MT8365_AFE_MEMIF_DL1, 1625 .reg_ofs_base = AFE_DL1_BASE, 1626 .reg_ofs_cur = AFE_DL1_CUR, 1627 .fs_reg = AFE_DAC_CON1, 1628 .fs_shift = 0, 1629 .fs_maskbit = 0xf, 1630 .mono_reg = AFE_DAC_CON1, 1631 .mono_shift = 21, 1632 .hd_reg = AFE_MEMIF_PBUF_SIZE, 1633 .hd_shift = 16, 1634 .enable_reg = AFE_DAC_CON0, 1635 .enable_shift = 1, 1636 .msb_reg = -1, 1637 .msb_shift = -1, 1638 .agent_disable_reg = -1, 1639 .agent_disable_shift = -1, 1640 }, { 1641 .name = "DL2", 1642 .id = MT8365_AFE_MEMIF_DL2, 1643 .reg_ofs_base = AFE_DL2_BASE, 1644 .reg_ofs_cur = AFE_DL2_CUR, 1645 .fs_reg = AFE_DAC_CON1, 1646 .fs_shift = 4, 1647 .fs_maskbit = 0xf, 1648 .mono_reg = AFE_DAC_CON1, 1649 .mono_shift = 22, 1650 .hd_reg = AFE_MEMIF_PBUF_SIZE, 1651 .hd_shift = 18, 1652 .enable_reg = AFE_DAC_CON0, 1653 .enable_shift = 2, 1654 .msb_reg = -1, 1655 .msb_shift = -1, 1656 .agent_disable_reg = -1, 1657 .agent_disable_shift = -1, 1658 }, { 1659 .name = "TDM OUT", 1660 .id = MT8365_AFE_MEMIF_TDM_OUT, 1661 .reg_ofs_base = AFE_HDMI_OUT_BASE, 1662 .reg_ofs_cur = AFE_HDMI_OUT_CUR, 1663 .fs_reg = -1, 1664 .fs_shift = -1, 1665 .fs_maskbit = -1, 1666 .mono_reg = -1, 1667 .mono_shift = -1, 1668 .hd_reg = AFE_MEMIF_PBUF_SIZE, 1669 .hd_shift = 28, 1670 .enable_reg = AFE_HDMI_OUT_CON0, 1671 .enable_shift = 0, 1672 .msb_reg = -1, 1673 .msb_shift = -1, 1674 .agent_disable_reg = -1, 1675 .agent_disable_shift = -1, 1676 }, { 1677 .name = "AWB", 1678 .id = MT8365_AFE_MEMIF_AWB, 1679 .reg_ofs_base = AFE_AWB_BASE, 1680 .reg_ofs_cur = AFE_AWB_CUR, 1681 .fs_reg = AFE_DAC_CON1, 1682 .fs_shift = 12, 1683 .fs_maskbit = 0xf, 1684 .mono_reg = AFE_DAC_CON1, 1685 .mono_shift = 24, 1686 .hd_reg = AFE_MEMIF_PBUF_SIZE, 1687 .hd_shift = 20, 1688 .enable_reg = AFE_DAC_CON0, 1689 .enable_shift = 6, 1690 .msb_reg = AFE_MEMIF_MSB, 1691 .msb_shift = 17, 1692 .agent_disable_reg = -1, 1693 .agent_disable_shift = -1, 1694 }, { 1695 .name = "VUL", 1696 .id = MT8365_AFE_MEMIF_VUL, 1697 .reg_ofs_base = AFE_VUL_BASE, 1698 .reg_ofs_cur = AFE_VUL_CUR, 1699 .fs_reg = AFE_DAC_CON1, 1700 .fs_shift = 16, 1701 .fs_maskbit = 0xf, 1702 .mono_reg = AFE_DAC_CON1, 1703 .mono_shift = 27, 1704 .hd_reg = AFE_MEMIF_PBUF_SIZE, 1705 .hd_shift = 22, 1706 .enable_reg = AFE_DAC_CON0, 1707 .enable_shift = 3, 1708 .msb_reg = AFE_MEMIF_MSB, 1709 .msb_shift = 20, 1710 .agent_disable_reg = -1, 1711 .agent_disable_shift = -1, 1712 }, { 1713 .name = "VUL2", 1714 .id = MT8365_AFE_MEMIF_VUL2, 1715 .reg_ofs_base = AFE_VUL_D2_BASE, 1716 .reg_ofs_cur = AFE_VUL_D2_CUR, 1717 .fs_reg = AFE_DAC_CON0, 1718 .fs_shift = 20, 1719 .fs_maskbit = 0xf, 1720 .mono_reg = -1, 1721 .mono_shift = -1, 1722 .hd_reg = AFE_MEMIF_PBUF_SIZE, 1723 .hd_shift = 14, 1724 .enable_reg = AFE_DAC_CON0, 1725 .enable_shift = 9, 1726 .msb_reg = AFE_MEMIF_MSB, 1727 .msb_shift = 21, 1728 .agent_disable_reg = -1, 1729 .agent_disable_shift = -1, 1730 }, { 1731 .name = "VUL3", 1732 .id = MT8365_AFE_MEMIF_VUL3, 1733 .reg_ofs_base = AFE_VUL3_BASE, 1734 .reg_ofs_cur = AFE_VUL3_CUR, 1735 .fs_reg = AFE_DAC_CON1, 1736 .fs_shift = 8, 1737 .fs_maskbit = 0xf, 1738 .mono_reg = AFE_DAC_CON0, 1739 .mono_shift = 13, 1740 .hd_reg = AFE_MEMIF_PBUF2_SIZE, 1741 .hd_shift = 10, 1742 .enable_reg = AFE_DAC_CON0, 1743 .enable_shift = 12, 1744 .msb_reg = AFE_MEMIF_MSB, 1745 .msb_shift = 27, 1746 .agent_disable_reg = -1, 1747 .agent_disable_shift = -1, 1748 }, { 1749 .name = "TDM IN", 1750 .id = MT8365_AFE_MEMIF_TDM_IN, 1751 .reg_ofs_base = AFE_HDMI_IN_2CH_BASE, 1752 .reg_ofs_cur = AFE_HDMI_IN_2CH_CUR, 1753 .fs_reg = -1, 1754 .fs_shift = -1, 1755 .fs_maskbit = -1, 1756 .mono_reg = AFE_HDMI_IN_2CH_CON0, 1757 .mono_shift = 1, 1758 .hd_reg = AFE_MEMIF_PBUF2_SIZE, 1759 .hd_shift = 8, 1760 .hd_align_mshift = 5, 1761 .enable_reg = AFE_HDMI_IN_2CH_CON0, 1762 .enable_shift = 0, 1763 .msb_reg = AFE_MEMIF_MSB, 1764 .msb_shift = 28, 1765 .agent_disable_reg = -1, 1766 .agent_disable_shift = -1, 1767 }, 1768 }; 1769 1770 static const struct mtk_base_irq_data irq_data[MT8365_AFE_IRQ_NUM] = { 1771 { 1772 .id = MT8365_AFE_IRQ1, 1773 .irq_cnt_reg = AFE_IRQ_MCU_CNT1, 1774 .irq_cnt_shift = 0, 1775 .irq_cnt_maskbit = 0x3ffff, 1776 .irq_en_reg = AFE_IRQ_MCU_CON, 1777 .irq_en_shift = 0, 1778 .irq_fs_reg = AFE_IRQ_MCU_CON, 1779 .irq_fs_shift = 4, 1780 .irq_fs_maskbit = 0xf, 1781 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1782 .irq_clr_shift = 0, 1783 }, { 1784 .id = MT8365_AFE_IRQ2, 1785 .irq_cnt_reg = AFE_IRQ_MCU_CNT2, 1786 .irq_cnt_shift = 0, 1787 .irq_cnt_maskbit = 0x3ffff, 1788 .irq_en_reg = AFE_IRQ_MCU_CON, 1789 .irq_en_shift = 1, 1790 .irq_fs_reg = AFE_IRQ_MCU_CON, 1791 .irq_fs_shift = 8, 1792 .irq_fs_maskbit = 0xf, 1793 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1794 .irq_clr_shift = 1, 1795 }, { 1796 .id = MT8365_AFE_IRQ3, 1797 .irq_cnt_reg = AFE_IRQ_MCU_CNT3, 1798 .irq_cnt_shift = 0, 1799 .irq_cnt_maskbit = 0x3ffff, 1800 .irq_en_reg = AFE_IRQ_MCU_CON, 1801 .irq_en_shift = 2, 1802 .irq_fs_reg = AFE_IRQ_MCU_CON, 1803 .irq_fs_shift = 16, 1804 .irq_fs_maskbit = 0xf, 1805 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1806 .irq_clr_shift = 2, 1807 }, { 1808 .id = MT8365_AFE_IRQ4, 1809 .irq_cnt_reg = AFE_IRQ_MCU_CNT4, 1810 .irq_cnt_shift = 0, 1811 .irq_cnt_maskbit = 0x3ffff, 1812 .irq_en_reg = AFE_IRQ_MCU_CON, 1813 .irq_en_shift = 3, 1814 .irq_fs_reg = AFE_IRQ_MCU_CON, 1815 .irq_fs_shift = 20, 1816 .irq_fs_maskbit = 0xf, 1817 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1818 .irq_clr_shift = 3, 1819 }, { 1820 .id = MT8365_AFE_IRQ5, 1821 .irq_cnt_reg = AFE_IRQ_MCU_CNT5, 1822 .irq_cnt_shift = 0, 1823 .irq_cnt_maskbit = 0x3ffff, 1824 .irq_en_reg = AFE_IRQ_MCU_CON2, 1825 .irq_en_shift = 3, 1826 .irq_fs_reg = -1, 1827 .irq_fs_shift = 0, 1828 .irq_fs_maskbit = 0x0, 1829 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1830 .irq_clr_shift = 4, 1831 }, { 1832 .id = MT8365_AFE_IRQ6, 1833 .irq_cnt_reg = -1, 1834 .irq_cnt_shift = 0, 1835 .irq_cnt_maskbit = 0x0, 1836 .irq_en_reg = AFE_IRQ_MCU_CON, 1837 .irq_en_shift = 13, 1838 .irq_fs_reg = -1, 1839 .irq_fs_shift = 0, 1840 .irq_fs_maskbit = 0x0, 1841 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1842 .irq_clr_shift = 5, 1843 }, { 1844 .id = MT8365_AFE_IRQ7, 1845 .irq_cnt_reg = AFE_IRQ_MCU_CNT7, 1846 .irq_cnt_shift = 0, 1847 .irq_cnt_maskbit = 0x3ffff, 1848 .irq_en_reg = AFE_IRQ_MCU_CON, 1849 .irq_en_shift = 14, 1850 .irq_fs_reg = AFE_IRQ_MCU_CON, 1851 .irq_fs_shift = 24, 1852 .irq_fs_maskbit = 0xf, 1853 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1854 .irq_clr_shift = 6, 1855 }, { 1856 .id = MT8365_AFE_IRQ8, 1857 .irq_cnt_reg = AFE_IRQ_MCU_CNT8, 1858 .irq_cnt_shift = 0, 1859 .irq_cnt_maskbit = 0x3ffff, 1860 .irq_en_reg = AFE_IRQ_MCU_CON, 1861 .irq_en_shift = 15, 1862 .irq_fs_reg = AFE_IRQ_MCU_CON, 1863 .irq_fs_shift = 28, 1864 .irq_fs_maskbit = 0xf, 1865 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1866 .irq_clr_shift = 7, 1867 }, { 1868 .id = MT8365_AFE_IRQ9, 1869 .irq_cnt_reg = -1, 1870 .irq_cnt_shift = 0, 1871 .irq_cnt_maskbit = 0x0, 1872 .irq_en_reg = AFE_IRQ_MCU_CON2, 1873 .irq_en_shift = 2, 1874 .irq_fs_reg = -1, 1875 .irq_fs_shift = 0, 1876 .irq_fs_maskbit = 0x0, 1877 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1878 .irq_clr_shift = 8, 1879 }, { 1880 .id = MT8365_AFE_IRQ10, 1881 .irq_cnt_reg = AFE_IRQ_MCU_CNT10, 1882 .irq_cnt_shift = 0, 1883 .irq_cnt_maskbit = 0x3ffff, 1884 .irq_en_reg = AFE_IRQ_MCU_CON2, 1885 .irq_en_shift = 4, 1886 .irq_fs_reg = -1, 1887 .irq_fs_shift = 0, 1888 .irq_fs_maskbit = 0x0, 1889 .irq_clr_reg = AFE_IRQ_MCU_CLR, 1890 .irq_clr_shift = 9, 1891 }, 1892 }; 1893 1894 static int memif_specified_irqs[MT8365_AFE_MEMIF_NUM] = { 1895 [MT8365_AFE_MEMIF_DL1] = MT8365_AFE_IRQ1, 1896 [MT8365_AFE_MEMIF_DL2] = MT8365_AFE_IRQ2, 1897 [MT8365_AFE_MEMIF_TDM_OUT] = MT8365_AFE_IRQ5, 1898 [MT8365_AFE_MEMIF_AWB] = MT8365_AFE_IRQ3, 1899 [MT8365_AFE_MEMIF_VUL] = MT8365_AFE_IRQ4, 1900 [MT8365_AFE_MEMIF_VUL2] = MT8365_AFE_IRQ7, 1901 [MT8365_AFE_MEMIF_VUL3] = MT8365_AFE_IRQ8, 1902 [MT8365_AFE_MEMIF_TDM_IN] = MT8365_AFE_IRQ10, 1903 }; 1904 1905 static const struct regmap_config mt8365_afe_regmap_config = { 1906 .reg_bits = 32, 1907 .reg_stride = 4, 1908 .val_bits = 32, 1909 .max_register = MAX_REGISTER, 1910 .cache_type = REGCACHE_NONE, 1911 }; 1912 1913 static irqreturn_t mt8365_afe_irq_handler(int irq, void *dev_id) 1914 { 1915 struct mtk_base_afe *afe = dev_id; 1916 unsigned int reg_value; 1917 unsigned int mcu_irq_mask; 1918 int i, ret; 1919 1920 ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, ®_value); 1921 if (ret) { 1922 dev_err_ratelimited(afe->dev, "%s irq status err\n", __func__); 1923 reg_value = AFE_IRQ_STATUS_BITS; 1924 goto err_irq; 1925 } 1926 1927 ret = regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_irq_mask); 1928 if (ret) { 1929 dev_err_ratelimited(afe->dev, "%s irq mcu_en err\n", __func__); 1930 reg_value = AFE_IRQ_STATUS_BITS; 1931 goto err_irq; 1932 } 1933 1934 /* only clr cpu irq */ 1935 reg_value &= mcu_irq_mask; 1936 1937 for (i = 0; i < MT8365_AFE_MEMIF_NUM; i++) { 1938 struct mtk_base_afe_memif *memif = &afe->memif[i]; 1939 struct mtk_base_afe_irq *mcu_irq; 1940 1941 if (memif->irq_usage < 0) 1942 continue; 1943 1944 mcu_irq = &afe->irqs[memif->irq_usage]; 1945 1946 if (!(reg_value & (1 << mcu_irq->irq_data->irq_clr_shift))) 1947 continue; 1948 1949 snd_pcm_period_elapsed(memif->substream); 1950 } 1951 1952 err_irq: 1953 /* clear irq */ 1954 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 1955 reg_value & AFE_IRQ_STATUS_BITS); 1956 1957 return IRQ_HANDLED; 1958 } 1959 1960 static int __maybe_unused mt8365_afe_runtime_suspend(struct device *dev) 1961 { 1962 return 0; 1963 } 1964 1965 static int mt8365_afe_runtime_resume(struct device *dev) 1966 { 1967 return 0; 1968 } 1969 1970 static int __maybe_unused mt8365_afe_suspend(struct device *dev) 1971 { 1972 struct mtk_base_afe *afe = dev_get_drvdata(dev); 1973 struct regmap *regmap = afe->regmap; 1974 int i; 1975 1976 mt8365_afe_enable_main_clk(afe); 1977 1978 if (!afe->reg_back_up) 1979 afe->reg_back_up = 1980 devm_kcalloc(dev, afe->reg_back_up_list_num, 1981 sizeof(unsigned int), GFP_KERNEL); 1982 1983 for (i = 0; i < afe->reg_back_up_list_num; i++) 1984 regmap_read(regmap, afe->reg_back_up_list[i], 1985 &afe->reg_back_up[i]); 1986 1987 mt8365_afe_disable_main_clk(afe); 1988 1989 return 0; 1990 } 1991 1992 static int __maybe_unused mt8365_afe_resume(struct device *dev) 1993 { 1994 struct mtk_base_afe *afe = dev_get_drvdata(dev); 1995 struct regmap *regmap = afe->regmap; 1996 int i = 0; 1997 1998 if (!afe->reg_back_up) 1999 return 0; 2000 2001 mt8365_afe_enable_main_clk(afe); 2002 2003 for (i = 0; i < afe->reg_back_up_list_num; i++) 2004 regmap_write(regmap, afe->reg_back_up_list[i], 2005 afe->reg_back_up[i]); 2006 2007 mt8365_afe_disable_main_clk(afe); 2008 2009 return 0; 2010 } 2011 2012 static int __maybe_unused mt8365_afe_dev_runtime_suspend(struct device *dev) 2013 { 2014 struct mtk_base_afe *afe = dev_get_drvdata(dev); 2015 2016 if (pm_runtime_status_suspended(dev) || afe->suspended) 2017 return 0; 2018 2019 mt8365_afe_suspend(dev); 2020 afe->suspended = true; 2021 return 0; 2022 } 2023 2024 static int __maybe_unused mt8365_afe_dev_runtime_resume(struct device *dev) 2025 { 2026 struct mtk_base_afe *afe = dev_get_drvdata(dev); 2027 2028 if (pm_runtime_status_suspended(dev) || !afe->suspended) 2029 return 0; 2030 2031 mt8365_afe_resume(dev); 2032 afe->suspended = false; 2033 return 0; 2034 } 2035 2036 static int mt8365_afe_init_registers(struct mtk_base_afe *afe) 2037 { 2038 size_t i; 2039 2040 static struct { 2041 unsigned int reg; 2042 unsigned int mask; 2043 unsigned int val; 2044 } init_regs[] = { 2045 { AFE_CONN_24BIT, GENMASK(31, 0), GENMASK(31, 0) }, 2046 { AFE_CONN_24BIT_1, GENMASK(21, 0), GENMASK(21, 0) }, 2047 }; 2048 2049 mt8365_afe_enable_main_clk(afe); 2050 2051 for (i = 0; i < ARRAY_SIZE(init_regs); i++) 2052 regmap_update_bits(afe->regmap, init_regs[i].reg, 2053 init_regs[i].mask, init_regs[i].val); 2054 2055 mt8365_afe_disable_main_clk(afe); 2056 2057 return 0; 2058 } 2059 2060 static int mt8365_dai_memif_register(struct mtk_base_afe *afe) 2061 { 2062 struct mtk_base_afe_dai *dai; 2063 2064 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 2065 if (!dai) 2066 return -ENOMEM; 2067 2068 list_add(&dai->list, &afe->sub_dais); 2069 2070 dai->dai_drivers = mt8365_memif_dai_driver; 2071 dai->num_dai_drivers = ARRAY_SIZE(mt8365_memif_dai_driver); 2072 2073 dai->dapm_widgets = mt8365_memif_widgets; 2074 dai->num_dapm_widgets = ARRAY_SIZE(mt8365_memif_widgets); 2075 dai->dapm_routes = mt8365_memif_routes; 2076 dai->num_dapm_routes = ARRAY_SIZE(mt8365_memif_routes); 2077 return 0; 2078 } 2079 2080 typedef int (*dai_register_cb)(struct mtk_base_afe *); 2081 static const dai_register_cb dai_register_cbs[] = { 2082 mt8365_dai_pcm_register, 2083 mt8365_dai_i2s_register, 2084 mt8365_dai_adda_register, 2085 mt8365_dai_dmic_register, 2086 mt8365_dai_memif_register, 2087 }; 2088 2089 static int mt8365_afe_pcm_dev_probe(struct platform_device *pdev) 2090 { 2091 struct mtk_base_afe *afe; 2092 struct mt8365_afe_private *afe_priv; 2093 struct device *dev; 2094 int ret, i, sel_irq; 2095 unsigned int irq_id; 2096 struct resource *res; 2097 2098 afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL); 2099 if (!afe) 2100 return -ENOMEM; 2101 platform_set_drvdata(pdev, afe); 2102 2103 afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv), 2104 GFP_KERNEL); 2105 if (!afe->platform_priv) 2106 return -ENOMEM; 2107 2108 afe_priv = afe->platform_priv; 2109 afe->dev = &pdev->dev; 2110 dev = afe->dev; 2111 2112 spin_lock_init(&afe_priv->afe_ctrl_lock); 2113 mutex_init(&afe_priv->afe_clk_mutex); 2114 2115 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2116 afe->base_addr = devm_ioremap_resource(&pdev->dev, res); 2117 if (IS_ERR(afe->base_addr)) 2118 return PTR_ERR(afe->base_addr); 2119 2120 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 2121 if (res) { 2122 afe_priv->afe_sram_vir_addr = 2123 devm_ioremap_resource(&pdev->dev, res); 2124 if (!IS_ERR(afe_priv->afe_sram_vir_addr)) { 2125 afe_priv->afe_sram_phy_addr = res->start; 2126 afe_priv->afe_sram_size = resource_size(res); 2127 } 2128 } 2129 2130 /* initial audio related clock */ 2131 ret = mt8365_afe_init_audio_clk(afe); 2132 if (ret) 2133 return dev_err_probe(afe->dev, ret, "mt8365_afe_init_audio_clk fail\n"); 2134 2135 afe->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "top_audio_sel", 2136 afe->base_addr, 2137 &mt8365_afe_regmap_config); 2138 if (IS_ERR(afe->regmap)) 2139 return PTR_ERR(afe->regmap); 2140 2141 /* memif % irq initialize*/ 2142 afe->memif_size = MT8365_AFE_MEMIF_NUM; 2143 afe->memif = devm_kcalloc(afe->dev, afe->memif_size, 2144 sizeof(*afe->memif), GFP_KERNEL); 2145 if (!afe->memif) 2146 return -ENOMEM; 2147 2148 afe->irqs_size = MT8365_AFE_IRQ_NUM; 2149 afe->irqs = devm_kcalloc(afe->dev, afe->irqs_size, 2150 sizeof(*afe->irqs), GFP_KERNEL); 2151 if (!afe->irqs) 2152 return -ENOMEM; 2153 2154 for (i = 0; i < afe->irqs_size; i++) 2155 afe->irqs[i].irq_data = &irq_data[i]; 2156 2157 ret = platform_get_irq(pdev, 0); 2158 if (ret < 0) 2159 return ret; 2160 2161 irq_id = ret; 2162 ret = devm_request_irq(afe->dev, irq_id, mt8365_afe_irq_handler, 2163 0, "Afe_ISR_Handle", (void *)afe); 2164 if (ret) 2165 return dev_err_probe(afe->dev, ret, "could not request_irq\n"); 2166 2167 /* init sub_dais */ 2168 INIT_LIST_HEAD(&afe->sub_dais); 2169 2170 for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) { 2171 ret = dai_register_cbs[i](afe); 2172 if (ret) { 2173 dev_warn(afe->dev, "dai register i %d fail, ret %d\n", 2174 i, ret); 2175 return ret; 2176 } 2177 } 2178 2179 /* init dai_driver and component_driver */ 2180 ret = mtk_afe_combine_sub_dai(afe); 2181 if (ret) { 2182 dev_warn(afe->dev, "mtk_afe_combine_sub_dai fail, ret %d\n", 2183 ret); 2184 return ret; 2185 } 2186 2187 for (i = 0; i < afe->memif_size; i++) { 2188 afe->memif[i].data = &memif_data[i]; 2189 sel_irq = memif_specified_irqs[i]; 2190 if (sel_irq >= 0) { 2191 afe->memif[i].irq_usage = sel_irq; 2192 afe->memif[i].const_irq = 1; 2193 afe->irqs[sel_irq].irq_occupyed = true; 2194 } else { 2195 afe->memif[i].irq_usage = -1; 2196 } 2197 } 2198 2199 afe->mtk_afe_hardware = &mt8365_afe_hardware; 2200 afe->memif_fs = mt8365_memif_fs; 2201 afe->irq_fs = mt8365_irq_fs; 2202 2203 ret = devm_pm_runtime_enable(&pdev->dev); 2204 if (ret) 2205 return ret; 2206 2207 pm_runtime_get_sync(&pdev->dev); 2208 afe->reg_back_up_list = mt8365_afe_backup_list; 2209 afe->reg_back_up_list_num = ARRAY_SIZE(mt8365_afe_backup_list); 2210 afe->runtime_resume = mt8365_afe_runtime_resume; 2211 afe->runtime_suspend = mt8365_afe_runtime_suspend; 2212 2213 /* open afe pdn for dapm read/write audio register */ 2214 mt8365_afe_enable_top_cg(afe, MT8365_TOP_CG_AFE); 2215 2216 /* Set 26m parent clk */ 2217 mt8365_afe_set_clk_parent(afe, 2218 afe_priv->clocks[MT8365_CLK_TOP_AUD_SEL], 2219 afe_priv->clocks[MT8365_CLK_CLK26M]); 2220 2221 ret = devm_snd_soc_register_component(&pdev->dev, 2222 &mtk_afe_pcm_platform, 2223 afe->dai_drivers, 2224 afe->num_dai_drivers); 2225 if (ret) { 2226 dev_warn(dev, "err_platform\n"); 2227 return ret; 2228 } 2229 2230 mt8365_afe_init_registers(afe); 2231 2232 return 0; 2233 } 2234 2235 static void mt8365_afe_pcm_dev_remove(struct platform_device *pdev) 2236 { 2237 struct mtk_base_afe *afe = platform_get_drvdata(pdev); 2238 2239 mt8365_afe_disable_top_cg(afe, MT8365_TOP_CG_AFE); 2240 2241 pm_runtime_disable(&pdev->dev); 2242 if (!pm_runtime_status_suspended(&pdev->dev)) 2243 mt8365_afe_runtime_suspend(&pdev->dev); 2244 } 2245 2246 static const struct of_device_id mt8365_afe_pcm_dt_match[] = { 2247 { .compatible = "mediatek,mt8365-afe-pcm", }, 2248 { } 2249 }; 2250 MODULE_DEVICE_TABLE(of, mt8365_afe_pcm_dt_match); 2251 2252 static const struct dev_pm_ops mt8365_afe_pm_ops = { 2253 SET_RUNTIME_PM_OPS(mt8365_afe_dev_runtime_suspend, 2254 mt8365_afe_dev_runtime_resume, NULL) 2255 SET_SYSTEM_SLEEP_PM_OPS(mt8365_afe_suspend, 2256 mt8365_afe_resume) 2257 }; 2258 2259 static struct platform_driver mt8365_afe_pcm_driver = { 2260 .driver = { 2261 .name = "mt8365-afe-pcm", 2262 .of_match_table = mt8365_afe_pcm_dt_match, 2263 .pm = &mt8365_afe_pm_ops, 2264 }, 2265 .probe = mt8365_afe_pcm_dev_probe, 2266 .remove = mt8365_afe_pcm_dev_remove, 2267 }; 2268 2269 module_platform_driver(mt8365_afe_pcm_driver); 2270 2271 MODULE_DESCRIPTION("MediaTek ALSA SoC AFE platform driver"); 2272 MODULE_AUTHOR("Jia Zeng <jia.zeng@mediatek.com>"); 2273 MODULE_AUTHOR("Alexandre Mergnat <amergnat@baylibre.com>"); 2274 MODULE_LICENSE("GPL"); 2275
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.