1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // Mediatek ALSA SoC AFE platform driver for 8186 4 // 5 // Copyright (c) 2022 MediaTek Inc. 6 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 7 8 #include <linux/delay.h> 9 #include <linux/dma-mapping.h> 10 #include <linux/module.h> 11 #include <linux/of.h> 12 #include <linux/of_address.h> 13 #include <linux/pm_runtime.h> 14 #include <linux/reset.h> 15 #include <sound/soc.h> 16 17 #include "../common/mtk-afe-platform-driver.h" 18 #include "../common/mtk-afe-fe-dai.h" 19 20 #include "mt8186-afe-common.h" 21 #include "mt8186-afe-clk.h" 22 #include "mt8186-afe-gpio.h" 23 #include "mt8186-interconnection.h" 24 25 static const struct snd_pcm_hardware mt8186_afe_hardware = { 26 .info = (SNDRV_PCM_INFO_MMAP | 27 SNDRV_PCM_INFO_INTERLEAVED | 28 SNDRV_PCM_INFO_MMAP_VALID), 29 .formats = (SNDRV_PCM_FMTBIT_S16_LE | 30 SNDRV_PCM_FMTBIT_S24_LE | 31 SNDRV_PCM_FMTBIT_S32_LE), 32 .period_bytes_min = 96, 33 .period_bytes_max = 4 * 48 * 1024, 34 .periods_min = 2, 35 .periods_max = 256, 36 .buffer_bytes_max = 4 * 48 * 1024, 37 .fifo_size = 0, 38 }; 39 40 static int mt8186_fe_startup(struct snd_pcm_substream *substream, 41 struct snd_soc_dai *dai) 42 { 43 struct snd_soc_pcm_runtime *rtd = substream->private_data; 44 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 45 struct snd_pcm_runtime *runtime = substream->runtime; 46 int id = asoc_rtd_to_cpu(rtd, 0)->id; 47 struct mtk_base_afe_memif *memif = &afe->memif[id]; 48 const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware; 49 int ret; 50 51 memif->substream = substream; 52 53 snd_pcm_hw_constraint_step(substream->runtime, 0, 54 SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16); 55 56 snd_soc_set_runtime_hwparams(substream, mtk_afe_hardware); 57 58 ret = snd_pcm_hw_constraint_integer(runtime, 59 SNDRV_PCM_HW_PARAM_PERIODS); 60 if (ret < 0) { 61 dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n"); 62 return ret; 63 } 64 65 /* dynamic allocate irq to memif */ 66 if (memif->irq_usage < 0) { 67 int irq_id = mtk_dynamic_irq_acquire(afe); 68 69 if (irq_id != afe->irqs_size) { 70 /* link */ 71 memif->irq_usage = irq_id; 72 } else { 73 dev_err(afe->dev, "%s() error: no more asys irq\n", 74 __func__); 75 return -EBUSY; 76 } 77 } 78 79 return 0; 80 } 81 82 static void mt8186_fe_shutdown(struct snd_pcm_substream *substream, 83 struct snd_soc_dai *dai) 84 { 85 struct snd_soc_pcm_runtime *rtd = substream->private_data; 86 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 87 struct mt8186_afe_private *afe_priv = afe->platform_priv; 88 int id = asoc_rtd_to_cpu(rtd, 0)->id; 89 struct mtk_base_afe_memif *memif = &afe->memif[id]; 90 int irq_id = memif->irq_usage; 91 92 memif->substream = NULL; 93 afe_priv->irq_cnt[id] = 0; 94 afe_priv->xrun_assert[id] = 0; 95 96 if (!memif->const_irq) { 97 mtk_dynamic_irq_release(afe, irq_id); 98 memif->irq_usage = -1; 99 memif->substream = NULL; 100 } 101 } 102 103 static int mt8186_fe_hw_params(struct snd_pcm_substream *substream, 104 struct snd_pcm_hw_params *params, 105 struct snd_soc_dai *dai) 106 { 107 struct snd_soc_pcm_runtime *rtd = substream->private_data; 108 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 109 int id = asoc_rtd_to_cpu(rtd, 0)->id; 110 unsigned int channels = params_channels(params); 111 unsigned int rate = params_rate(params); 112 int ret; 113 114 ret = mtk_afe_fe_hw_params(substream, params, dai); 115 if (ret) 116 return ret; 117 118 /* channel merge configuration, enable control is in UL5_IN_MUX */ 119 if (id == MT8186_MEMIF_VUL3) { 120 int update_cnt = 8; 121 unsigned int val = 0; 122 unsigned int mask = 0; 123 int fs_mode = mt8186_rate_transform(afe->dev, rate, id); 124 125 /* set rate, channel, update cnt, disable sgen */ 126 val = fs_mode << CM1_FS_SELECT_SFT | 127 (channels - 1) << CHANNEL_MERGE0_CHNUM_SFT | 128 update_cnt << CHANNEL_MERGE0_UPDATE_CNT_SFT; 129 mask = CM1_FS_SELECT_MASK_SFT | 130 CHANNEL_MERGE0_CHNUM_MASK_SFT | 131 CHANNEL_MERGE0_UPDATE_CNT_MASK_SFT; 132 regmap_update_bits(afe->regmap, AFE_CM1_CON, mask, val); 133 } 134 135 return 0; 136 } 137 138 static int mt8186_fe_hw_free(struct snd_pcm_substream *substream, 139 struct snd_soc_dai *dai) 140 { 141 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 142 int ret; 143 144 ret = mtk_afe_fe_hw_free(substream, dai); 145 if (ret) { 146 dev_err(afe->dev, "%s failed\n", __func__); 147 return ret; 148 } 149 150 return 0; 151 } 152 153 static int mt8186_fe_trigger(struct snd_pcm_substream *substream, int cmd, 154 struct snd_soc_dai *dai) 155 { 156 struct snd_soc_pcm_runtime *rtd = substream->private_data; 157 struct snd_pcm_runtime * const runtime = substream->runtime; 158 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 159 struct mt8186_afe_private *afe_priv = afe->platform_priv; 160 int id = asoc_rtd_to_cpu(rtd, 0)->id; 161 struct mtk_base_afe_memif *memif = &afe->memif[id]; 162 int irq_id = memif->irq_usage; 163 struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id]; 164 const struct mtk_base_irq_data *irq_data = irqs->irq_data; 165 unsigned int rate = runtime->rate; 166 unsigned int counter; 167 int fs; 168 int ret; 169 170 dev_dbg(afe->dev, "%s(), %s cmd %d, irq_id %d\n", 171 __func__, memif->data->name, cmd, irq_id); 172 173 switch (cmd) { 174 case SNDRV_PCM_TRIGGER_START: 175 case SNDRV_PCM_TRIGGER_RESUME: 176 ret = mtk_memif_set_enable(afe, id); 177 if (ret) { 178 dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n", 179 __func__, id, ret); 180 return ret; 181 } 182 183 /* 184 * for small latency record 185 * ul memif need read some data before irq enable 186 */ 187 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE && 188 ((runtime->period_size * 1000) / rate <= 10)) 189 udelay(300); 190 191 /* set irq counter */ 192 if (afe_priv->irq_cnt[id] > 0) 193 counter = afe_priv->irq_cnt[id]; 194 else 195 counter = runtime->period_size; 196 197 regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg, 198 irq_data->irq_cnt_maskbit 199 << irq_data->irq_cnt_shift, 200 counter << irq_data->irq_cnt_shift); 201 202 /* set irq fs */ 203 fs = afe->irq_fs(substream, runtime->rate); 204 if (fs < 0) 205 return -EINVAL; 206 207 regmap_update_bits(afe->regmap, irq_data->irq_fs_reg, 208 irq_data->irq_fs_maskbit 209 << irq_data->irq_fs_shift, 210 fs << irq_data->irq_fs_shift); 211 212 /* enable interrupt */ 213 if (runtime->stop_threshold != ~(0U)) 214 regmap_update_bits(afe->regmap, 215 irq_data->irq_en_reg, 216 1 << irq_data->irq_en_shift, 217 1 << irq_data->irq_en_shift); 218 return 0; 219 case SNDRV_PCM_TRIGGER_STOP: 220 case SNDRV_PCM_TRIGGER_SUSPEND: 221 if (afe_priv->xrun_assert[id] > 0) { 222 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { 223 int avail = snd_pcm_capture_avail(runtime); 224 /* alsa can trigger stop/start when occur xrun */ 225 if (avail >= runtime->buffer_size) 226 dev_dbg(afe->dev, "%s(), id %d, xrun assert\n", 227 __func__, id); 228 } 229 } 230 231 ret = mtk_memif_set_disable(afe, id); 232 if (ret) 233 dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n", 234 __func__, id, ret); 235 236 /* disable interrupt */ 237 if (runtime->stop_threshold != ~(0U)) 238 regmap_update_bits(afe->regmap, 239 irq_data->irq_en_reg, 240 1 << irq_data->irq_en_shift, 241 0 << irq_data->irq_en_shift); 242 243 /* clear pending IRQ */ 244 regmap_write(afe->regmap, irq_data->irq_clr_reg, 245 1 << irq_data->irq_clr_shift); 246 return ret; 247 default: 248 return -EINVAL; 249 } 250 } 251 252 static int mt8186_memif_fs(struct snd_pcm_substream *substream, 253 unsigned int rate) 254 { 255 struct snd_soc_pcm_runtime *rtd = substream->private_data; 256 struct snd_soc_component *component = 257 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 258 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 259 int id = asoc_rtd_to_cpu(rtd, 0)->id; 260 261 return mt8186_rate_transform(afe->dev, rate, id); 262 } 263 264 static int mt8186_get_dai_fs(struct mtk_base_afe *afe, 265 int dai_id, unsigned int rate) 266 { 267 return mt8186_rate_transform(afe->dev, rate, dai_id); 268 } 269 270 static int mt8186_irq_fs(struct snd_pcm_substream *substream, unsigned int rate) 271 { 272 struct snd_soc_pcm_runtime *rtd = substream->private_data; 273 struct snd_soc_component *component = 274 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 275 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 276 277 return mt8186_general_rate_transform(afe->dev, rate); 278 } 279 280 static int mt8186_get_memif_pbuf_size(struct snd_pcm_substream *substream) 281 { 282 struct snd_pcm_runtime *runtime = substream->runtime; 283 284 if ((runtime->period_size * 1000) / runtime->rate > 10) 285 return MT8186_MEMIF_PBUF_SIZE_256_BYTES; 286 287 return MT8186_MEMIF_PBUF_SIZE_32_BYTES; 288 } 289 290 static int mt8186_fe_prepare(struct snd_pcm_substream *substream, 291 struct snd_soc_dai *dai) 292 { 293 struct snd_soc_pcm_runtime *rtd = substream->private_data; 294 struct snd_pcm_runtime * const runtime = substream->runtime; 295 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 296 int id = asoc_rtd_to_cpu(rtd, 0)->id; 297 struct mtk_base_afe_memif *memif = &afe->memif[id]; 298 int irq_id = memif->irq_usage; 299 struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id]; 300 const struct mtk_base_irq_data *irq_data = irqs->irq_data; 301 unsigned int counter = runtime->period_size; 302 int fs; 303 int ret; 304 305 ret = mtk_afe_fe_prepare(substream, dai); 306 if (ret) 307 return ret; 308 309 /* set irq counter */ 310 regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg, 311 irq_data->irq_cnt_maskbit 312 << irq_data->irq_cnt_shift, 313 counter << irq_data->irq_cnt_shift); 314 315 /* set irq fs */ 316 fs = afe->irq_fs(substream, runtime->rate); 317 318 if (fs < 0) 319 return -EINVAL; 320 321 regmap_update_bits(afe->regmap, irq_data->irq_fs_reg, 322 irq_data->irq_fs_maskbit 323 << irq_data->irq_fs_shift, 324 fs << irq_data->irq_fs_shift); 325 326 return 0; 327 } 328 329 /* FE DAIs */ 330 static const struct snd_soc_dai_ops mt8186_memif_dai_ops = { 331 .startup = mt8186_fe_startup, 332 .shutdown = mt8186_fe_shutdown, 333 .hw_params = mt8186_fe_hw_params, 334 .hw_free = mt8186_fe_hw_free, 335 .prepare = mt8186_fe_prepare, 336 .trigger = mt8186_fe_trigger, 337 }; 338 339 #define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\ 340 SNDRV_PCM_RATE_88200 |\ 341 SNDRV_PCM_RATE_96000 |\ 342 SNDRV_PCM_RATE_176400 |\ 343 SNDRV_PCM_RATE_192000) 344 345 #define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\ 346 SNDRV_PCM_RATE_16000 |\ 347 SNDRV_PCM_RATE_32000 |\ 348 SNDRV_PCM_RATE_48000) 349 350 #define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 351 SNDRV_PCM_FMTBIT_S24_LE |\ 352 SNDRV_PCM_FMTBIT_S32_LE) 353 354 static struct snd_soc_dai_driver mt8186_memif_dai_driver[] = { 355 /* FE DAIs: memory intefaces to CPU */ 356 { 357 .name = "DL1", 358 .id = MT8186_MEMIF_DL1, 359 .playback = { 360 .stream_name = "DL1", 361 .channels_min = 1, 362 .channels_max = 2, 363 .rates = MTK_PCM_RATES, 364 .formats = MTK_PCM_FORMATS, 365 }, 366 .ops = &mt8186_memif_dai_ops, 367 }, 368 { 369 .name = "DL12", 370 .id = MT8186_MEMIF_DL12, 371 .playback = { 372 .stream_name = "DL12", 373 .channels_min = 1, 374 .channels_max = 4, 375 .rates = MTK_PCM_RATES, 376 .formats = MTK_PCM_FORMATS, 377 }, 378 .ops = &mt8186_memif_dai_ops, 379 }, 380 { 381 .name = "DL2", 382 .id = MT8186_MEMIF_DL2, 383 .playback = { 384 .stream_name = "DL2", 385 .channels_min = 1, 386 .channels_max = 2, 387 .rates = MTK_PCM_RATES, 388 .formats = MTK_PCM_FORMATS, 389 }, 390 .ops = &mt8186_memif_dai_ops, 391 }, 392 { 393 .name = "DL3", 394 .id = MT8186_MEMIF_DL3, 395 .playback = { 396 .stream_name = "DL3", 397 .channels_min = 1, 398 .channels_max = 2, 399 .rates = MTK_PCM_RATES, 400 .formats = MTK_PCM_FORMATS, 401 }, 402 .ops = &mt8186_memif_dai_ops, 403 }, 404 { 405 .name = "DL4", 406 .id = MT8186_MEMIF_DL4, 407 .playback = { 408 .stream_name = "DL4", 409 .channels_min = 1, 410 .channels_max = 2, 411 .rates = MTK_PCM_RATES, 412 .formats = MTK_PCM_FORMATS, 413 }, 414 .ops = &mt8186_memif_dai_ops, 415 }, 416 { 417 .name = "DL5", 418 .id = MT8186_MEMIF_DL5, 419 .playback = { 420 .stream_name = "DL5", 421 .channels_min = 1, 422 .channels_max = 2, 423 .rates = MTK_PCM_RATES, 424 .formats = MTK_PCM_FORMATS, 425 }, 426 .ops = &mt8186_memif_dai_ops, 427 }, 428 { 429 .name = "DL6", 430 .id = MT8186_MEMIF_DL6, 431 .playback = { 432 .stream_name = "DL6", 433 .channels_min = 1, 434 .channels_max = 2, 435 .rates = MTK_PCM_RATES, 436 .formats = MTK_PCM_FORMATS, 437 }, 438 .ops = &mt8186_memif_dai_ops, 439 }, 440 { 441 .name = "DL7", 442 .id = MT8186_MEMIF_DL7, 443 .playback = { 444 .stream_name = "DL7", 445 .channels_min = 1, 446 .channels_max = 2, 447 .rates = MTK_PCM_RATES, 448 .formats = MTK_PCM_FORMATS, 449 }, 450 .ops = &mt8186_memif_dai_ops, 451 }, 452 { 453 .name = "DL8", 454 .id = MT8186_MEMIF_DL8, 455 .playback = { 456 .stream_name = "DL8", 457 .channels_min = 1, 458 .channels_max = 2, 459 .rates = MTK_PCM_RATES, 460 .formats = MTK_PCM_FORMATS, 461 }, 462 .ops = &mt8186_memif_dai_ops, 463 }, 464 { 465 .name = "UL1", 466 .id = MT8186_MEMIF_VUL12, 467 .capture = { 468 .stream_name = "UL1", 469 .channels_min = 1, 470 .channels_max = 4, 471 .rates = MTK_PCM_RATES, 472 .formats = MTK_PCM_FORMATS, 473 }, 474 .ops = &mt8186_memif_dai_ops, 475 }, 476 { 477 .name = "UL2", 478 .id = MT8186_MEMIF_AWB, 479 .capture = { 480 .stream_name = "UL2", 481 .channels_min = 1, 482 .channels_max = 2, 483 .rates = MTK_PCM_RATES, 484 .formats = MTK_PCM_FORMATS, 485 }, 486 .ops = &mt8186_memif_dai_ops, 487 }, 488 { 489 .name = "UL3", 490 .id = MT8186_MEMIF_VUL2, 491 .capture = { 492 .stream_name = "UL3", 493 .channels_min = 1, 494 .channels_max = 2, 495 .rates = MTK_PCM_RATES, 496 .formats = MTK_PCM_FORMATS, 497 }, 498 .ops = &mt8186_memif_dai_ops, 499 }, 500 { 501 .name = "UL4", 502 .id = MT8186_MEMIF_AWB2, 503 .capture = { 504 .stream_name = "UL4", 505 .channels_min = 1, 506 .channels_max = 2, 507 .rates = MTK_PCM_RATES, 508 .formats = MTK_PCM_FORMATS, 509 }, 510 .ops = &mt8186_memif_dai_ops, 511 }, 512 { 513 .name = "UL5", 514 .id = MT8186_MEMIF_VUL3, 515 .capture = { 516 .stream_name = "UL5", 517 .channels_min = 1, 518 .channels_max = 12, 519 .rates = MTK_PCM_RATES, 520 .formats = MTK_PCM_FORMATS, 521 }, 522 .ops = &mt8186_memif_dai_ops, 523 }, 524 { 525 .name = "UL6", 526 .id = MT8186_MEMIF_VUL4, 527 .capture = { 528 .stream_name = "UL6", 529 .channels_min = 1, 530 .channels_max = 2, 531 .rates = MTK_PCM_RATES, 532 .formats = MTK_PCM_FORMATS, 533 }, 534 .ops = &mt8186_memif_dai_ops, 535 }, 536 { 537 .name = "UL7", 538 .id = MT8186_MEMIF_VUL5, 539 .capture = { 540 .stream_name = "UL7", 541 .channels_min = 1, 542 .channels_max = 2, 543 .rates = MTK_PCM_RATES, 544 .formats = MTK_PCM_FORMATS, 545 }, 546 .ops = &mt8186_memif_dai_ops, 547 }, 548 { 549 .name = "UL8", 550 .id = MT8186_MEMIF_VUL6, 551 .capture = { 552 .stream_name = "UL8", 553 .channels_min = 1, 554 .channels_max = 2, 555 .rates = MTK_PCM_RATES, 556 .formats = MTK_PCM_FORMATS, 557 }, 558 .ops = &mt8186_memif_dai_ops, 559 } 560 }; 561 562 /* kcontrol */ 563 static int mt8186_irq_cnt1_get(struct snd_kcontrol *kcontrol, 564 struct snd_ctl_elem_value *ucontrol) 565 { 566 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 567 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 568 struct mt8186_afe_private *afe_priv = afe->platform_priv; 569 570 ucontrol->value.integer.value[0] = 571 afe_priv->irq_cnt[MT8186_PRIMARY_MEMIF]; 572 573 return 0; 574 } 575 576 static int mt8186_irq_cnt1_set(struct snd_kcontrol *kcontrol, 577 struct snd_ctl_elem_value *ucontrol) 578 { 579 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 580 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 581 struct mt8186_afe_private *afe_priv = afe->platform_priv; 582 int memif_num = MT8186_PRIMARY_MEMIF; 583 struct mtk_base_afe_memif *memif = &afe->memif[memif_num]; 584 int irq_id = memif->irq_usage; 585 int irq_cnt = afe_priv->irq_cnt[memif_num]; 586 587 dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n", 588 __func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]); 589 590 if (irq_cnt == ucontrol->value.integer.value[0]) 591 return 0; 592 593 irq_cnt = ucontrol->value.integer.value[0]; 594 afe_priv->irq_cnt[memif_num] = irq_cnt; 595 596 if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) { 597 struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id]; 598 const struct mtk_base_irq_data *irq_data = irqs->irq_data; 599 600 regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg, 601 irq_data->irq_cnt_maskbit 602 << irq_data->irq_cnt_shift, 603 irq_cnt << irq_data->irq_cnt_shift); 604 } else { 605 dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n", 606 __func__, irq_id); 607 } 608 609 return 1; 610 } 611 612 static int mt8186_irq_cnt2_get(struct snd_kcontrol *kcontrol, 613 struct snd_ctl_elem_value *ucontrol) 614 { 615 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 616 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 617 struct mt8186_afe_private *afe_priv = afe->platform_priv; 618 619 ucontrol->value.integer.value[0] = 620 afe_priv->irq_cnt[MT8186_RECORD_MEMIF]; 621 622 return 0; 623 } 624 625 static int mt8186_irq_cnt2_set(struct snd_kcontrol *kcontrol, 626 struct snd_ctl_elem_value *ucontrol) 627 { 628 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 629 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 630 struct mt8186_afe_private *afe_priv = afe->platform_priv; 631 int memif_num = MT8186_RECORD_MEMIF; 632 struct mtk_base_afe_memif *memif = &afe->memif[memif_num]; 633 int irq_id = memif->irq_usage; 634 int irq_cnt = afe_priv->irq_cnt[memif_num]; 635 636 dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n", 637 __func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]); 638 639 if (irq_cnt == ucontrol->value.integer.value[0]) 640 return 0; 641 642 irq_cnt = ucontrol->value.integer.value[0]; 643 afe_priv->irq_cnt[memif_num] = irq_cnt; 644 645 if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) { 646 struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id]; 647 const struct mtk_base_irq_data *irq_data = irqs->irq_data; 648 649 regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg, 650 irq_data->irq_cnt_maskbit 651 << irq_data->irq_cnt_shift, 652 irq_cnt << irq_data->irq_cnt_shift); 653 } else { 654 dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n", 655 __func__, irq_id); 656 } 657 658 return 1; 659 } 660 661 static int mt8186_record_xrun_assert_get(struct snd_kcontrol *kcontrol, 662 struct snd_ctl_elem_value *ucontrol) 663 { 664 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 665 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 666 struct mt8186_afe_private *afe_priv = afe->platform_priv; 667 int xrun_assert = afe_priv->xrun_assert[MT8186_RECORD_MEMIF]; 668 669 ucontrol->value.integer.value[0] = xrun_assert; 670 671 return 0; 672 } 673 674 static int mt8186_record_xrun_assert_set(struct snd_kcontrol *kcontrol, 675 struct snd_ctl_elem_value *ucontrol) 676 { 677 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 678 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 679 struct mt8186_afe_private *afe_priv = afe->platform_priv; 680 int xrun_assert = ucontrol->value.integer.value[0]; 681 682 dev_dbg(afe->dev, "%s(), xrun_assert %d\n", __func__, xrun_assert); 683 684 if (xrun_assert == afe_priv->xrun_assert[MT8186_RECORD_MEMIF]) 685 return 0; 686 687 afe_priv->xrun_assert[MT8186_RECORD_MEMIF] = xrun_assert; 688 689 return 1; 690 } 691 692 static const struct snd_kcontrol_new mt8186_pcm_kcontrols[] = { 693 SOC_SINGLE_EXT("Audio IRQ1 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0, 694 mt8186_irq_cnt1_get, mt8186_irq_cnt1_set), 695 SOC_SINGLE_EXT("Audio IRQ2 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0, 696 mt8186_irq_cnt2_get, mt8186_irq_cnt2_set), 697 SOC_SINGLE_EXT("record_xrun_assert", SND_SOC_NOPM, 0, 0x1, 0, 698 mt8186_record_xrun_assert_get, 699 mt8186_record_xrun_assert_set), 700 }; 701 702 /* dma widget & routes*/ 703 static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = { 704 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN21, 705 I_ADDA_UL_CH1, 1, 0), 706 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN21, 707 I_ADDA_UL_CH2, 1, 0), 708 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN21, 709 I_ADDA_UL_CH3, 1, 0), 710 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN21_1, 711 I_TDM_IN_CH1, 1, 0), 712 }; 713 714 static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = { 715 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN22, 716 I_ADDA_UL_CH1, 1, 0), 717 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN22, 718 I_ADDA_UL_CH2, 1, 0), 719 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN22, 720 I_ADDA_UL_CH3, 1, 0), 721 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN22, 722 I_ADDA_UL_CH4, 1, 0), 723 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN22_1, 724 I_TDM_IN_CH2, 1, 0), 725 }; 726 727 static const struct snd_kcontrol_new memif_ul1_ch3_mix[] = { 728 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN9, 729 I_ADDA_UL_CH1, 1, 0), 730 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN9, 731 I_ADDA_UL_CH2, 1, 0), 732 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN9, 733 I_ADDA_UL_CH3, 1, 0), 734 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN9_1, 735 I_TDM_IN_CH3, 1, 0), 736 }; 737 738 static const struct snd_kcontrol_new memif_ul1_ch4_mix[] = { 739 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN10, 740 I_ADDA_UL_CH1, 1, 0), 741 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN10, 742 I_ADDA_UL_CH2, 1, 0), 743 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN10, 744 I_ADDA_UL_CH3, 1, 0), 745 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN10, 746 I_ADDA_UL_CH4, 1, 0), 747 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN10_1, 748 I_TDM_IN_CH4, 1, 0), 749 }; 750 751 static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = { 752 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN5, 753 I_I2S0_CH1, 1, 0), 754 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN5, 755 I_DL1_CH1, 1, 0), 756 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN5, 757 I_DL12_CH1, 1, 0), 758 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN5, 759 I_DL2_CH1, 1, 0), 760 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN5, 761 I_DL3_CH1, 1, 0), 762 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN5_1, 763 I_DL4_CH1, 1, 0), 764 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN5_1, 765 I_DL5_CH1, 1, 0), 766 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN5_1, 767 I_DL6_CH1, 1, 0), 768 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN5, 769 I_PCM_1_CAP_CH1, 1, 0), 770 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN5, 771 I_I2S2_CH1, 1, 0), 772 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN5_1, 773 I_CONNSYS_I2S_CH1, 1, 0), 774 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1 Switch", AFE_CONN5_1, 775 I_SRC_1_OUT_CH1, 1, 0), 776 }; 777 778 static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = { 779 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN6, 780 I_I2S0_CH2, 1, 0), 781 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN6, 782 I_DL1_CH2, 1, 0), 783 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN6, 784 I_DL12_CH2, 1, 0), 785 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN6, 786 I_DL2_CH2, 1, 0), 787 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN6, 788 I_DL3_CH2, 1, 0), 789 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN6_1, 790 I_DL4_CH2, 1, 0), 791 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN6_1, 792 I_DL5_CH2, 1, 0), 793 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN6_1, 794 I_DL6_CH2, 1, 0), 795 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN6, 796 I_PCM_1_CAP_CH2, 1, 0), 797 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN6, 798 I_I2S2_CH2, 1, 0), 799 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN6_1, 800 I_CONNSYS_I2S_CH2, 1, 0), 801 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2 Switch", AFE_CONN6_1, 802 I_SRC_1_OUT_CH2, 1, 0), 803 }; 804 805 static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = { 806 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN32_1, 807 I_CONNSYS_I2S_CH1, 1, 0), 808 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN32, 809 I_DL1_CH1, 1, 0), 810 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN32, 811 I_DL2_CH1, 1, 0), 812 }; 813 814 static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = { 815 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN33_1, 816 I_CONNSYS_I2S_CH2, 1, 0), 817 }; 818 819 static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = { 820 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN38, 821 I_ADDA_UL_CH1, 1, 0), 822 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN38, 823 I_I2S0_CH1, 1, 0), 824 }; 825 826 static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = { 827 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN39, 828 I_ADDA_UL_CH2, 1, 0), 829 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN39, 830 I_I2S0_CH2, 1, 0), 831 }; 832 833 static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = { 834 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN44, 835 I_ADDA_UL_CH1, 1, 0), 836 }; 837 838 static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = { 839 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN45, 840 I_ADDA_UL_CH2, 1, 0), 841 }; 842 843 static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = { 844 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN46, 845 I_ADDA_UL_CH1, 1, 0), 846 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN46, 847 I_DL1_CH1, 1, 0), 848 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN46, 849 I_DL12_CH1, 1, 0), 850 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN46_1, 851 I_DL6_CH1, 1, 0), 852 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN46, 853 I_DL2_CH1, 1, 0), 854 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN46, 855 I_DL3_CH1, 1, 0), 856 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN46_1, 857 I_DL4_CH1, 1, 0), 858 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN46, 859 I_PCM_1_CAP_CH1, 1, 0), 860 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1 Switch", AFE_CONN46, 861 I_GAIN1_OUT_CH1, 1, 0), 862 }; 863 864 static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = { 865 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN47, 866 I_ADDA_UL_CH2, 1, 0), 867 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN47, 868 I_DL1_CH2, 1, 0), 869 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN47, 870 I_DL12_CH2, 1, 0), 871 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN47_1, 872 I_DL6_CH2, 1, 0), 873 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN47, 874 I_DL2_CH2, 1, 0), 875 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN47, 876 I_DL3_CH2, 1, 0), 877 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN47_1, 878 I_DL4_CH2, 1, 0), 879 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN47, 880 I_PCM_1_CAP_CH2, 1, 0), 881 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2 Switch", AFE_CONN47, 882 I_GAIN1_OUT_CH2, 1, 0), 883 }; 884 885 static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = { 886 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN48, 887 I_ADDA_UL_CH1, 1, 0), 888 SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH1 Switch", AFE_CONN48, 889 I_GAIN2_OUT_CH1, 1, 0), 890 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1 Switch", AFE_CONN48_1, 891 I_SRC_2_OUT_CH1, 1, 0), 892 }; 893 894 static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = { 895 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN49, 896 I_ADDA_UL_CH2, 1, 0), 897 SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH2 Switch", AFE_CONN49, 898 I_GAIN2_OUT_CH2, 1, 0), 899 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2 Switch", AFE_CONN49_1, 900 I_SRC_2_OUT_CH2, 1, 0), 901 }; 902 903 static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = { 904 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN50, 905 I_ADDA_UL_CH1, 1, 0), 906 }; 907 908 static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = { 909 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN51, 910 I_ADDA_UL_CH2, 1, 0), 911 }; 912 913 static const struct snd_kcontrol_new hw_cm1_ch1_mix[] = { 914 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN58_1, 915 I_TDM_IN_CH1, 1, 0), 916 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN58, 917 I_I2S0_CH1, 1, 0), 918 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN58, 919 I_I2S2_CH1, 1, 0), 920 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN58, 921 I_ADDA_UL_CH1, 1, 0), 922 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN58, 923 I_DL1_CH1, 1, 0), 924 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN58, 925 I_DL12_CH1, 1, 0), 926 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN58, 927 I_DL12_CH3, 1, 0), 928 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN58, 929 I_DL2_CH1, 1, 0), 930 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN58, 931 I_DL3_CH1, 1, 0), 932 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN58_1, 933 I_DL4_CH1, 1, 0), 934 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN58_1, 935 I_DL5_CH1, 1, 0), 936 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN58_1, 937 I_SRC_1_OUT_CH1, 1, 0), 938 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN58_1, 939 I_SRC_2_OUT_CH1, 1, 0), 940 }; 941 942 static const struct snd_kcontrol_new hw_cm1_ch2_mix[] = { 943 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN59_1, 944 I_TDM_IN_CH2, 1, 0), 945 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN59, 946 I_I2S0_CH2, 1, 0), 947 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN59, 948 I_I2S2_CH2, 1, 0), 949 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN59, 950 I_ADDA_UL_CH2, 1, 0), 951 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN59, 952 I_DL1_CH2, 1, 0), 953 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN59, 954 I_DL12_CH2, 1, 0), 955 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN59, 956 I_DL12_CH4, 1, 0), 957 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN59, 958 I_DL2_CH2, 1, 0), 959 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN59, 960 I_DL3_CH2, 1, 0), 961 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN59_1, 962 I_DL4_CH2, 1, 0), 963 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN59_1, 964 I_DL5_CH2, 1, 0), 965 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN59_1, 966 I_SRC_1_OUT_CH2, 1, 0), 967 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN59_1, 968 I_SRC_2_OUT_CH2, 1, 0), 969 }; 970 971 static const struct snd_kcontrol_new hw_cm1_ch3_mix[] = { 972 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN60_1, 973 I_TDM_IN_CH3, 1, 0), 974 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN60, 975 I_I2S0_CH1, 1, 0), 976 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN60, 977 I_I2S2_CH1, 1, 0), 978 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN60, 979 I_ADDA_UL_CH1, 1, 0), 980 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN60, 981 I_DL1_CH1, 1, 0), 982 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN60, 983 I_DL12_CH1, 1, 0), 984 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN60, 985 I_DL12_CH3, 1, 0), 986 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN60, 987 I_DL2_CH1, 1, 0), 988 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN60, 989 I_DL3_CH1, 1, 0), 990 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN60_1, 991 I_DL4_CH1, 1, 0), 992 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN60_1, 993 I_DL5_CH1, 1, 0), 994 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN60_1, 995 I_SRC_1_OUT_CH1, 1, 0), 996 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN60_1, 997 I_SRC_2_OUT_CH1, 1, 0), 998 }; 999 1000 static const struct snd_kcontrol_new hw_cm1_ch4_mix[] = { 1001 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN61_1, 1002 I_TDM_IN_CH4, 1, 0), 1003 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN61, 1004 I_I2S0_CH2, 1, 0), 1005 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN61, 1006 I_I2S2_CH2, 1, 0), 1007 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN61, 1008 I_ADDA_UL_CH2, 1, 0), 1009 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN61, 1010 I_DL1_CH2, 1, 0), 1011 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN61, 1012 I_DL12_CH2, 1, 0), 1013 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN61, 1014 I_DL12_CH4, 1, 0), 1015 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN61, 1016 I_DL2_CH2, 1, 0), 1017 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN61, 1018 I_DL3_CH2, 1, 0), 1019 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN61_1, 1020 I_DL4_CH2, 1, 0), 1021 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN61_1, 1022 I_DL5_CH2, 1, 0), 1023 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN61_1, 1024 I_SRC_1_OUT_CH2, 1, 0), 1025 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN61_1, 1026 I_SRC_2_OUT_CH2, 1, 0), 1027 }; 1028 1029 static const struct snd_kcontrol_new hw_cm1_ch5_mix[] = { 1030 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH5 Switch", AFE_CONN62_1, 1031 I_TDM_IN_CH5, 1, 0), 1032 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN62, 1033 I_I2S0_CH1, 1, 0), 1034 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN62, 1035 I_I2S2_CH1, 1, 0), 1036 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN62, 1037 I_ADDA_UL_CH1, 1, 0), 1038 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN62, 1039 I_DL1_CH1, 1, 0), 1040 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN62, 1041 I_DL12_CH1, 1, 0), 1042 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN62, 1043 I_DL12_CH3, 1, 0), 1044 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN62, 1045 I_DL2_CH1, 1, 0), 1046 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN62, 1047 I_DL3_CH1, 1, 0), 1048 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN62_1, 1049 I_DL4_CH1, 1, 0), 1050 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN62_1, 1051 I_DL5_CH1, 1, 0), 1052 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN62_1, 1053 I_SRC_1_OUT_CH1, 1, 0), 1054 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN62_1, 1055 I_SRC_2_OUT_CH1, 1, 0), 1056 }; 1057 1058 static const struct snd_kcontrol_new hw_cm1_ch6_mix[] = { 1059 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH6 Switch", AFE_CONN63_1, 1060 I_TDM_IN_CH6, 1, 0), 1061 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN63, 1062 I_I2S0_CH2, 1, 0), 1063 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN63, 1064 I_I2S2_CH2, 1, 0), 1065 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN63, 1066 I_ADDA_UL_CH2, 1, 0), 1067 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN63, 1068 I_DL1_CH2, 1, 0), 1069 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN63, 1070 I_DL12_CH2, 1, 0), 1071 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN63, 1072 I_DL12_CH4, 1, 0), 1073 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN63, 1074 I_DL2_CH2, 1, 0), 1075 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN63, 1076 I_DL3_CH2, 1, 0), 1077 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN63_1, 1078 I_DL4_CH2, 1, 0), 1079 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN63_1, 1080 I_DL5_CH2, 1, 0), 1081 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN63_1, 1082 I_SRC_1_OUT_CH2, 1, 0), 1083 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN63_1, 1084 I_SRC_2_OUT_CH2, 1, 0), 1085 }; 1086 1087 static const struct snd_kcontrol_new hw_cm1_ch7_mix[] = { 1088 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH7 Switch", AFE_CONN64_1, 1089 I_TDM_IN_CH7, 1, 0), 1090 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN64, 1091 I_I2S0_CH1, 1, 0), 1092 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN64, 1093 I_I2S2_CH1, 1, 0), 1094 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN64, 1095 I_ADDA_UL_CH1, 1, 0), 1096 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN64, 1097 I_DL1_CH1, 1, 0), 1098 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1v", AFE_CONN64, 1099 I_DL12_CH1, 1, 0), 1100 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN64, 1101 I_DL12_CH3, 1, 0), 1102 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN64, 1103 I_DL2_CH1, 1, 0), 1104 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN64, 1105 I_DL3_CH1, 1, 0), 1106 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN64_1, 1107 I_DL4_CH1, 1, 0), 1108 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN64_1, 1109 I_DL5_CH1, 1, 0), 1110 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN64_1, 1111 I_SRC_1_OUT_CH1, 1, 0), 1112 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN64_1, 1113 I_SRC_2_OUT_CH1, 1, 0), 1114 }; 1115 1116 static const struct snd_kcontrol_new hw_cm1_ch8_mix[] = { 1117 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH8 Switch", AFE_CONN65_1, 1118 I_TDM_IN_CH8, 1, 0), 1119 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN65, 1120 I_I2S0_CH2, 1, 0), 1121 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN65, 1122 I_I2S2_CH2, 1, 0), 1123 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN65, 1124 I_ADDA_UL_CH2, 1, 0), 1125 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN65, 1126 I_DL1_CH2, 1, 0), 1127 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN65, 1128 I_DL12_CH2, 1, 0), 1129 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN65, 1130 I_DL12_CH4, 1, 0), 1131 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN65, 1132 I_DL2_CH2, 1, 0), 1133 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN65, 1134 I_DL3_CH2, 1, 0), 1135 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN65_1, 1136 I_DL4_CH2, 1, 0), 1137 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN65_1, 1138 I_DL5_CH2, 1, 0), 1139 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN65_1, 1140 I_SRC_1_OUT_CH2, 1, 0), 1141 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN65_1, 1142 I_SRC_2_OUT_CH2, 1, 0), 1143 }; 1144 1145 static const struct snd_kcontrol_new hw_cm1_ch9_mix[] = { 1146 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN66, 1147 I_I2S0_CH1, 1, 0), 1148 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN66, 1149 I_I2S2_CH1, 1, 0), 1150 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN66, 1151 I_ADDA_UL_CH1, 1, 0), 1152 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN66, 1153 I_DL1_CH1, 1, 0), 1154 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN66, 1155 I_DL12_CH1, 1, 0), 1156 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN66, 1157 I_DL12_CH3, 1, 0), 1158 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN66, 1159 I_DL2_CH1, 1, 0), 1160 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN66, 1161 I_DL3_CH1, 1, 0), 1162 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN66_1, 1163 I_DL4_CH1, 1, 0), 1164 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN66_1, 1165 I_DL5_CH1, 1, 0), 1166 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN66_1, 1167 I_SRC_1_OUT_CH1, 1, 0), 1168 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN66_1, 1169 I_SRC_2_OUT_CH1, 1, 0), 1170 }; 1171 1172 static const struct snd_kcontrol_new hw_cm1_ch10_mix[] = { 1173 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN67, 1174 I_I2S0_CH2, 1, 0), 1175 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN67, 1176 I_I2S2_CH2, 1, 0), 1177 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN67, 1178 I_ADDA_UL_CH2, 1, 0), 1179 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN67, 1180 I_DL1_CH2, 1, 0), 1181 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN67, 1182 I_DL12_CH2, 1, 0), 1183 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN67, 1184 I_DL12_CH4, 1, 0), 1185 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN67, 1186 I_DL2_CH2, 1, 0), 1187 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN67, 1188 I_DL3_CH2, 1, 0), 1189 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN67_1, 1190 I_DL4_CH2, 1, 0), 1191 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN67_1, 1192 I_DL5_CH2, 1, 0), 1193 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN67_1, 1194 I_SRC_1_OUT_CH2, 1, 0), 1195 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN67_1, 1196 I_SRC_2_OUT_CH2, 1, 0), 1197 }; 1198 1199 static const struct snd_kcontrol_new hw_cm1_ch11_mix[] = { 1200 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN68, 1201 I_I2S0_CH1, 1, 0), 1202 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN68, 1203 I_I2S2_CH1, 1, 0), 1204 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN68, 1205 I_ADDA_UL_CH1, 1, 0), 1206 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN68, 1207 I_DL1_CH1, 1, 0), 1208 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN68, 1209 I_DL12_CH1, 1, 0), 1210 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN68, 1211 I_DL12_CH3, 1, 0), 1212 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN68, 1213 I_DL2_CH1, 1, 0), 1214 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN68, 1215 I_DL3_CH1, 1, 0), 1216 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN68_1, 1217 I_DL4_CH1, 1, 0), 1218 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN68_1, 1219 I_DL5_CH1, 1, 0), 1220 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN68_1, 1221 I_SRC_1_OUT_CH1, 1, 0), 1222 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN68_1, 1223 I_SRC_2_OUT_CH1, 1, 0), 1224 }; 1225 1226 static const struct snd_kcontrol_new hw_cm1_ch12_mix[] = { 1227 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN69, 1228 I_I2S0_CH2, 1, 0), 1229 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN69, 1230 I_I2S2_CH2, 1, 0), 1231 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN69, 1232 I_ADDA_UL_CH2, 1, 0), 1233 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN69, 1234 I_DL1_CH2, 1, 0), 1235 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN69, 1236 I_DL12_CH2, 1, 0), 1237 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN69, 1238 I_DL12_CH4, 1, 0), 1239 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN69, 1240 I_DL2_CH2, 1, 0), 1241 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN69, 1242 I_DL3_CH2, 1, 0), 1243 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN69_1, 1244 I_DL4_CH2, 1, 0), 1245 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN69_1, 1246 I_DL5_CH2, 1, 0), 1247 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN69_1, 1248 I_SRC_1_OUT_CH2, 1, 0), 1249 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN69_1, 1250 I_SRC_2_OUT_CH2, 1, 0), 1251 }; 1252 1253 /* ADDA UL MUX */ 1254 enum { 1255 UL5_IN_MUX_CM1 = 0, 1256 UL5_IN_MUX_NORMAL, 1257 UL5_IN_MUX_MASK = 0x1, 1258 }; 1259 1260 static const char * const ul5_in_mux_map[] = { 1261 "UL5_IN_FROM_CM1", "UL5_IN_FROM_Normal" 1262 }; 1263 1264 static int ul5_in_map_value[] = { 1265 UL5_IN_MUX_CM1, 1266 UL5_IN_MUX_NORMAL, 1267 }; 1268 1269 static SOC_VALUE_ENUM_SINGLE_DECL(ul5_in_mux_map_enum, 1270 AFE_CM1_CON, 1271 VUL3_BYPASS_CM_SFT, 1272 VUL3_BYPASS_CM_MASK, 1273 ul5_in_mux_map, 1274 ul5_in_map_value); 1275 1276 static const struct snd_kcontrol_new ul5_in_mux_control = 1277 SOC_DAPM_ENUM("UL5_IN_MUX Select", ul5_in_mux_map_enum); 1278 1279 static const struct snd_soc_dapm_widget mt8186_memif_widgets[] = { 1280 /* inter-connections */ 1281 SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0, 1282 memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)), 1283 SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0, 1284 memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)), 1285 SND_SOC_DAPM_MIXER("UL1_CH3", SND_SOC_NOPM, 0, 0, 1286 memif_ul1_ch3_mix, ARRAY_SIZE(memif_ul1_ch3_mix)), 1287 SND_SOC_DAPM_MIXER("UL1_CH4", SND_SOC_NOPM, 0, 0, 1288 memif_ul1_ch4_mix, ARRAY_SIZE(memif_ul1_ch4_mix)), 1289 1290 SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0, 1291 memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)), 1292 SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0, 1293 memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)), 1294 1295 SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0, 1296 memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)), 1297 SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0, 1298 memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)), 1299 1300 SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0, 1301 memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)), 1302 SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0, 1303 memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)), 1304 1305 SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0, 1306 memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)), 1307 SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0, 1308 memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)), 1309 1310 SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0, 1311 memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)), 1312 SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0, 1313 memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)), 1314 1315 SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0, 1316 memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)), 1317 SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0, 1318 memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)), 1319 1320 SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0, 1321 memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)), 1322 SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0, 1323 memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)), 1324 1325 SND_SOC_DAPM_MIXER("UL5_2CH", SND_SOC_NOPM, 0, 0, NULL, 0), 1326 1327 SND_SOC_DAPM_MIXER("HW_CM1", SND_SOC_NOPM, 0, 0, NULL, 0), 1328 1329 /* CM1 en*/ 1330 SND_SOC_DAPM_SUPPLY_S("CM1_EN", 0, AFE_CM1_CON, 1331 CHANNEL_MERGE0_EN_SFT, 0, NULL, 1332 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 1333 1334 SND_SOC_DAPM_MIXER("HW_CM1_CH1", SND_SOC_NOPM, 0, 0, 1335 hw_cm1_ch1_mix, ARRAY_SIZE(hw_cm1_ch1_mix)), 1336 SND_SOC_DAPM_MIXER("HW_CM1_CH2", SND_SOC_NOPM, 0, 0, 1337 hw_cm1_ch2_mix, ARRAY_SIZE(hw_cm1_ch2_mix)), 1338 SND_SOC_DAPM_MIXER("HW_CM1_CH3", SND_SOC_NOPM, 0, 0, 1339 hw_cm1_ch3_mix, ARRAY_SIZE(hw_cm1_ch3_mix)), 1340 SND_SOC_DAPM_MIXER("HW_CM1_CH4", SND_SOC_NOPM, 0, 0, 1341 hw_cm1_ch4_mix, ARRAY_SIZE(hw_cm1_ch4_mix)), 1342 SND_SOC_DAPM_MIXER("HW_CM1_CH5", SND_SOC_NOPM, 0, 0, 1343 hw_cm1_ch5_mix, ARRAY_SIZE(hw_cm1_ch5_mix)), 1344 SND_SOC_DAPM_MIXER("HW_CM1_CH6", SND_SOC_NOPM, 0, 0, 1345 hw_cm1_ch6_mix, ARRAY_SIZE(hw_cm1_ch6_mix)), 1346 SND_SOC_DAPM_MIXER("HW_CM1_CH7", SND_SOC_NOPM, 0, 0, 1347 hw_cm1_ch7_mix, ARRAY_SIZE(hw_cm1_ch7_mix)), 1348 SND_SOC_DAPM_MIXER("HW_CM1_CH8", SND_SOC_NOPM, 0, 0, 1349 hw_cm1_ch8_mix, ARRAY_SIZE(hw_cm1_ch8_mix)), 1350 SND_SOC_DAPM_MIXER("HW_CM1_CH9", SND_SOC_NOPM, 0, 0, 1351 hw_cm1_ch9_mix, ARRAY_SIZE(hw_cm1_ch9_mix)), 1352 SND_SOC_DAPM_MIXER("HW_CM1_CH10", SND_SOC_NOPM, 0, 0, 1353 hw_cm1_ch10_mix, ARRAY_SIZE(hw_cm1_ch10_mix)), 1354 SND_SOC_DAPM_MIXER("HW_CM1_CH11", SND_SOC_NOPM, 0, 0, 1355 hw_cm1_ch11_mix, ARRAY_SIZE(hw_cm1_ch11_mix)), 1356 SND_SOC_DAPM_MIXER("HW_CM1_CH12", SND_SOC_NOPM, 0, 0, 1357 hw_cm1_ch12_mix, ARRAY_SIZE(hw_cm1_ch12_mix)), 1358 1359 SND_SOC_DAPM_MUX("UL5_IN_MUX", SND_SOC_NOPM, 0, 0, 1360 &ul5_in_mux_control), 1361 1362 SND_SOC_DAPM_INPUT("UL1_VIRTUAL_INPUT"), 1363 SND_SOC_DAPM_INPUT("UL2_VIRTUAL_INPUT"), 1364 SND_SOC_DAPM_INPUT("UL3_VIRTUAL_INPUT"), 1365 SND_SOC_DAPM_INPUT("UL4_VIRTUAL_INPUT"), 1366 SND_SOC_DAPM_INPUT("UL5_VIRTUAL_INPUT"), 1367 SND_SOC_DAPM_INPUT("UL6_VIRTUAL_INPUT"), 1368 }; 1369 1370 static const struct snd_soc_dapm_route mt8186_memif_routes[] = { 1371 {"UL1", NULL, "UL1_CH1"}, 1372 {"UL1", NULL, "UL1_CH2"}, 1373 {"UL1", NULL, "UL1_CH3"}, 1374 {"UL1", NULL, "UL1_CH4"}, 1375 {"UL1_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1376 {"UL1_CH1", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1377 {"UL1_CH2", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1378 {"UL1_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1379 {"UL1_CH3", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1380 {"UL1_CH3", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1381 {"UL1_CH4", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1382 {"UL1_CH4", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1383 {"UL1_CH1", "TDM_IN_CH1 Switch", "TDM IN"}, 1384 {"UL1_CH2", "TDM_IN_CH2 Switch", "TDM IN"}, 1385 {"UL1_CH3", "TDM_IN_CH3 Switch", "TDM IN"}, 1386 {"UL1_CH4", "TDM_IN_CH4 Switch", "TDM IN"}, 1387 1388 {"UL2", NULL, "UL2_CH1"}, 1389 {"UL2", NULL, "UL2_CH2"}, 1390 1391 /* cannot connect FE to FE directly */ 1392 {"UL2_CH1", "DL1_CH1 Switch", "Hostless_UL2 UL"}, 1393 {"UL2_CH2", "DL1_CH2 Switch", "Hostless_UL2 UL"}, 1394 {"UL2_CH1", "DL12_CH1 Switch", "Hostless_UL2 UL"}, 1395 {"UL2_CH2", "DL12_CH2 Switch", "Hostless_UL2 UL"}, 1396 {"UL2_CH1", "DL6_CH1 Switch", "Hostless_UL2 UL"}, 1397 {"UL2_CH2", "DL6_CH2 Switch", "Hostless_UL2 UL"}, 1398 {"UL2_CH1", "DL2_CH1 Switch", "Hostless_UL2 UL"}, 1399 {"UL2_CH2", "DL2_CH2 Switch", "Hostless_UL2 UL"}, 1400 {"UL2_CH1", "DL3_CH1 Switch", "Hostless_UL2 UL"}, 1401 {"UL2_CH2", "DL3_CH2 Switch", "Hostless_UL2 UL"}, 1402 {"UL2_CH1", "DL4_CH1 Switch", "Hostless_UL2 UL"}, 1403 {"UL2_CH2", "DL4_CH2 Switch", "Hostless_UL2 UL"}, 1404 {"UL2_CH1", "DL5_CH1 Switch", "Hostless_UL2 UL"}, 1405 {"UL2_CH2", "DL5_CH2 Switch", "Hostless_UL2 UL"}, 1406 1407 {"Hostless_UL2 UL", NULL, "UL2_VIRTUAL_INPUT"}, 1408 1409 {"UL2_CH1", "I2S0_CH1 Switch", "I2S0"}, 1410 {"UL2_CH2", "I2S0_CH2 Switch", "I2S0"}, 1411 {"UL2_CH1", "I2S2_CH1 Switch", "I2S2"}, 1412 {"UL2_CH2", "I2S2_CH2 Switch", "I2S2"}, 1413 1414 {"UL2_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"}, 1415 {"UL2_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"}, 1416 1417 {"UL2_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"}, 1418 {"UL2_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"}, 1419 1420 {"UL2_CH1", "SRC_1_OUT_CH1 Switch", "HW_SRC_1_Out"}, 1421 {"UL2_CH2", "SRC_1_OUT_CH2 Switch", "HW_SRC_1_Out"}, 1422 1423 {"UL3", NULL, "UL3_CH1"}, 1424 {"UL3", NULL, "UL3_CH2"}, 1425 {"UL3_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"}, 1426 {"UL3_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"}, 1427 1428 {"UL4", NULL, "UL4_CH1"}, 1429 {"UL4", NULL, "UL4_CH2"}, 1430 {"UL4_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1431 {"UL4_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1432 {"UL4_CH1", "I2S0_CH1 Switch", "I2S0"}, 1433 {"UL4_CH2", "I2S0_CH2 Switch", "I2S0"}, 1434 1435 {"UL5", NULL, "UL5_IN_MUX"}, 1436 {"UL5_IN_MUX", "UL5_IN_FROM_Normal", "UL5_2CH"}, 1437 {"UL5_IN_MUX", "UL5_IN_FROM_CM1", "HW_CM1"}, 1438 {"UL5_2CH", NULL, "UL5_CH1"}, 1439 {"UL5_2CH", NULL, "UL5_CH2"}, 1440 {"UL5_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1441 {"UL5_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1442 {"HW_CM1", NULL, "CM1_EN"}, 1443 {"HW_CM1", NULL, "HW_CM1_CH1"}, 1444 {"HW_CM1", NULL, "HW_CM1_CH2"}, 1445 {"HW_CM1", NULL, "HW_CM1_CH3"}, 1446 {"HW_CM1", NULL, "HW_CM1_CH4"}, 1447 {"HW_CM1", NULL, "HW_CM1_CH5"}, 1448 {"HW_CM1", NULL, "HW_CM1_CH6"}, 1449 {"HW_CM1", NULL, "HW_CM1_CH7"}, 1450 {"HW_CM1", NULL, "HW_CM1_CH8"}, 1451 {"HW_CM1", NULL, "HW_CM1_CH9"}, 1452 {"HW_CM1", NULL, "HW_CM1_CH10"}, 1453 {"HW_CM1", NULL, "HW_CM1_CH11"}, 1454 {"HW_CM1", NULL, "HW_CM1_CH12"}, 1455 {"HW_CM1_CH1", "TDM_IN_CH1 Switch", "TDM IN"}, 1456 {"HW_CM1_CH2", "TDM_IN_CH2 Switch", "TDM IN"}, 1457 {"HW_CM1_CH3", "TDM_IN_CH3 Switch", "TDM IN"}, 1458 {"HW_CM1_CH4", "TDM_IN_CH4 Switch", "TDM IN"}, 1459 {"HW_CM1_CH5", "TDM_IN_CH5 Switch", "TDM IN"}, 1460 {"HW_CM1_CH6", "TDM_IN_CH6 Switch", "TDM IN"}, 1461 {"HW_CM1_CH7", "TDM_IN_CH7 Switch", "TDM IN"}, 1462 {"HW_CM1_CH8", "TDM_IN_CH8 Switch", "TDM IN"}, 1463 {"HW_CM1_CH9", "DL1_CH1 Switch", "Hostless_UL5 UL"}, 1464 {"HW_CM1_CH10", "DL1_CH2 Switch", "Hostless_UL5 UL"}, 1465 1466 {"HW_CM1_CH3", "DL1_CH1 Switch", "Hostless_UL5 UL"}, 1467 {"HW_CM1_CH4", "DL1_CH2 Switch", "Hostless_UL5 UL"}, 1468 1469 {"HW_CM1_CH3", "DL3_CH1 Switch", "Hostless_UL5 UL"}, 1470 {"HW_CM1_CH4", "DL3_CH2 Switch", "Hostless_UL5 UL"}, 1471 1472 {"HW_CM1_CH5", "HW_SRC1_OUT_CH1 Switch", "HW_SRC_1_Out"}, 1473 {"HW_CM1_CH6", "HW_SRC1_OUT_CH2 Switch", "HW_SRC_1_Out"}, 1474 1475 {"HW_CM1_CH9", "DL12_CH1 Switch", "Hostless_UL5 UL"}, 1476 {"HW_CM1_CH10", "DL12_CH2 Switch", "Hostless_UL5 UL"}, 1477 {"HW_CM1_CH11", "DL12_CH3 Switch", "Hostless_UL5 UL"}, 1478 {"HW_CM1_CH12", "DL12_CH4 Switch", "Hostless_UL5 UL"}, 1479 1480 {"Hostless_UL5 UL", NULL, "UL5_VIRTUAL_INPUT"}, 1481 1482 {"UL6", NULL, "UL6_CH1"}, 1483 {"UL6", NULL, "UL6_CH2"}, 1484 1485 {"UL6_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1486 {"UL6_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1487 {"UL6_CH1", "DL1_CH1 Switch", "Hostless_UL6 UL"}, 1488 {"UL6_CH2", "DL1_CH2 Switch", "Hostless_UL6 UL"}, 1489 {"UL6_CH1", "DL2_CH1 Switch", "Hostless_UL6 UL"}, 1490 {"UL6_CH2", "DL2_CH2 Switch", "Hostless_UL6 UL"}, 1491 {"UL6_CH1", "DL12_CH1 Switch", "Hostless_UL6 UL"}, 1492 {"UL6_CH2", "DL12_CH2 Switch", "Hostless_UL6 UL"}, 1493 {"UL6_CH1", "DL6_CH1 Switch", "Hostless_UL6 UL"}, 1494 {"UL6_CH2", "DL6_CH2 Switch", "Hostless_UL6 UL"}, 1495 {"UL6_CH1", "DL3_CH1 Switch", "Hostless_UL6 UL"}, 1496 {"UL6_CH2", "DL3_CH2 Switch", "Hostless_UL6 UL"}, 1497 {"UL6_CH1", "DL4_CH1 Switch", "Hostless_UL6 UL"}, 1498 {"UL6_CH2", "DL4_CH2 Switch", "Hostless_UL6 UL"}, 1499 {"Hostless_UL6 UL", NULL, "UL6_VIRTUAL_INPUT"}, 1500 {"UL6_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"}, 1501 {"UL6_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"}, 1502 {"UL6_CH1", "GAIN1_OUT_CH1 Switch", "HW Gain 1 Out"}, 1503 {"UL6_CH2", "GAIN1_OUT_CH2 Switch", "HW Gain 1 Out"}, 1504 1505 {"UL7", NULL, "UL7_CH1"}, 1506 {"UL7", NULL, "UL7_CH2"}, 1507 {"UL7_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1508 {"UL7_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1509 {"UL7_CH1", "HW_GAIN2_OUT_CH1 Switch", "HW Gain 2 Out"}, 1510 {"UL7_CH2", "HW_GAIN2_OUT_CH2 Switch", "HW Gain 2 Out"}, 1511 {"UL7_CH1", "HW_SRC_2_OUT_CH1 Switch", "HW_SRC_2_Out"}, 1512 {"UL7_CH2", "HW_SRC_2_OUT_CH2 Switch", "HW_SRC_2_Out"}, 1513 1514 {"UL8", NULL, "UL8_CH1"}, 1515 {"UL8", NULL, "UL8_CH2"}, 1516 {"UL8_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1517 {"UL8_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1518 1519 {"HW_GAIN2_IN_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"}, 1520 {"HW_GAIN2_IN_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"}, 1521 }; 1522 1523 static const struct mtk_base_memif_data memif_data[MT8186_MEMIF_NUM] = { 1524 [MT8186_MEMIF_DL1] = { 1525 .name = "DL1", 1526 .id = MT8186_MEMIF_DL1, 1527 .reg_ofs_base = AFE_DL1_BASE, 1528 .reg_ofs_cur = AFE_DL1_CUR, 1529 .reg_ofs_end = AFE_DL1_END, 1530 .reg_ofs_base_msb = AFE_DL1_BASE_MSB, 1531 .reg_ofs_cur_msb = AFE_DL1_CUR_MSB, 1532 .reg_ofs_end_msb = AFE_DL1_END_MSB, 1533 .fs_reg = AFE_DL1_CON0, 1534 .fs_shift = DL1_MODE_SFT, 1535 .fs_maskbit = DL1_MODE_MASK, 1536 .mono_reg = AFE_DL1_CON0, 1537 .mono_shift = DL1_MONO_SFT, 1538 .enable_reg = AFE_DAC_CON0, 1539 .enable_shift = DL1_ON_SFT, 1540 .hd_reg = AFE_DL1_CON0, 1541 .hd_shift = DL1_HD_MODE_SFT, 1542 .hd_align_reg = AFE_DL1_CON0, 1543 .hd_align_mshift = DL1_HALIGN_SFT, 1544 .agent_disable_reg = -1, 1545 .agent_disable_shift = -1, 1546 .msb_reg = -1, 1547 .msb_shift = -1, 1548 .pbuf_reg = AFE_DL1_CON0, 1549 .pbuf_mask = DL1_PBUF_SIZE_MASK, 1550 .pbuf_shift = DL1_PBUF_SIZE_SFT, 1551 .minlen_reg = AFE_DL1_CON0, 1552 .minlen_mask = DL1_MINLEN_MASK, 1553 .minlen_shift = DL1_MINLEN_SFT, 1554 }, 1555 [MT8186_MEMIF_DL12] = { 1556 .name = "DL12", 1557 .id = MT8186_MEMIF_DL12, 1558 .reg_ofs_base = AFE_DL12_BASE, 1559 .reg_ofs_cur = AFE_DL12_CUR, 1560 .reg_ofs_end = AFE_DL12_END, 1561 .reg_ofs_base_msb = AFE_DL12_BASE_MSB, 1562 .reg_ofs_cur_msb = AFE_DL12_CUR_MSB, 1563 .reg_ofs_end_msb = AFE_DL12_END_MSB, 1564 .fs_reg = AFE_DL12_CON0, 1565 .fs_shift = DL12_MODE_SFT, 1566 .fs_maskbit = DL12_MODE_MASK, 1567 .mono_reg = AFE_DL12_CON0, 1568 .mono_shift = DL12_MONO_SFT, 1569 .quad_ch_reg = AFE_DL12_CON0, 1570 .quad_ch_mask = DL12_4CH_EN_MASK, 1571 .quad_ch_shift = DL12_4CH_EN_SFT, 1572 .enable_reg = AFE_DAC_CON0, 1573 .enable_shift = DL12_ON_SFT, 1574 .hd_reg = AFE_DL12_CON0, 1575 .hd_shift = DL12_HD_MODE_SFT, 1576 .hd_align_reg = AFE_DL12_CON0, 1577 .hd_align_mshift = DL12_HALIGN_SFT, 1578 .agent_disable_reg = -1, 1579 .agent_disable_shift = -1, 1580 .msb_reg = -1, 1581 .msb_shift = -1, 1582 .pbuf_reg = AFE_DL12_CON0, 1583 .pbuf_mask = DL12_PBUF_SIZE_MASK, 1584 .pbuf_shift = DL12_PBUF_SIZE_SFT, 1585 .minlen_reg = AFE_DL12_CON0, 1586 .minlen_mask = DL12_MINLEN_MASK, 1587 .minlen_shift = DL12_MINLEN_SFT, 1588 }, 1589 [MT8186_MEMIF_DL2] = { 1590 .name = "DL2", 1591 .id = MT8186_MEMIF_DL2, 1592 .reg_ofs_base = AFE_DL2_BASE, 1593 .reg_ofs_cur = AFE_DL2_CUR, 1594 .reg_ofs_end = AFE_DL2_END, 1595 .reg_ofs_base_msb = AFE_DL2_BASE_MSB, 1596 .reg_ofs_cur_msb = AFE_DL2_CUR_MSB, 1597 .reg_ofs_end_msb = AFE_DL2_END_MSB, 1598 .fs_reg = AFE_DL2_CON0, 1599 .fs_shift = DL2_MODE_SFT, 1600 .fs_maskbit = DL2_MODE_MASK, 1601 .mono_reg = AFE_DL2_CON0, 1602 .mono_shift = DL2_MONO_SFT, 1603 .enable_reg = AFE_DAC_CON0, 1604 .enable_shift = DL2_ON_SFT, 1605 .hd_reg = AFE_DL2_CON0, 1606 .hd_shift = DL2_HD_MODE_SFT, 1607 .hd_align_reg = AFE_DL2_CON0, 1608 .hd_align_mshift = DL2_HALIGN_SFT, 1609 .agent_disable_reg = -1, 1610 .agent_disable_shift = -1, 1611 .msb_reg = -1, 1612 .msb_shift = -1, 1613 .pbuf_reg = AFE_DL2_CON0, 1614 .pbuf_mask = DL2_PBUF_SIZE_MASK, 1615 .pbuf_shift = DL2_PBUF_SIZE_SFT, 1616 .minlen_reg = AFE_DL2_CON0, 1617 .minlen_mask = DL2_MINLEN_MASK, 1618 .minlen_shift = DL2_MINLEN_SFT, 1619 }, 1620 [MT8186_MEMIF_DL3] = { 1621 .name = "DL3", 1622 .id = MT8186_MEMIF_DL3, 1623 .reg_ofs_base = AFE_DL3_BASE, 1624 .reg_ofs_cur = AFE_DL3_CUR, 1625 .reg_ofs_end = AFE_DL3_END, 1626 .reg_ofs_base_msb = AFE_DL3_BASE_MSB, 1627 .reg_ofs_cur_msb = AFE_DL3_CUR_MSB, 1628 .reg_ofs_end_msb = AFE_DL3_END_MSB, 1629 .fs_reg = AFE_DL3_CON0, 1630 .fs_shift = DL3_MODE_SFT, 1631 .fs_maskbit = DL3_MODE_MASK, 1632 .mono_reg = AFE_DL3_CON0, 1633 .mono_shift = DL3_MONO_SFT, 1634 .enable_reg = AFE_DAC_CON0, 1635 .enable_shift = DL3_ON_SFT, 1636 .hd_reg = AFE_DL3_CON0, 1637 .hd_shift = DL3_HD_MODE_SFT, 1638 .hd_align_reg = AFE_DL3_CON0, 1639 .hd_align_mshift = DL3_HALIGN_SFT, 1640 .agent_disable_reg = -1, 1641 .agent_disable_shift = -1, 1642 .msb_reg = -1, 1643 .msb_shift = -1, 1644 .pbuf_reg = AFE_DL3_CON0, 1645 .pbuf_mask = DL3_PBUF_SIZE_MASK, 1646 .pbuf_shift = DL3_PBUF_SIZE_SFT, 1647 .minlen_reg = AFE_DL3_CON0, 1648 .minlen_mask = DL3_MINLEN_MASK, 1649 .minlen_shift = DL3_MINLEN_SFT, 1650 }, 1651 [MT8186_MEMIF_DL4] = { 1652 .name = "DL4", 1653 .id = MT8186_MEMIF_DL4, 1654 .reg_ofs_base = AFE_DL4_BASE, 1655 .reg_ofs_cur = AFE_DL4_CUR, 1656 .reg_ofs_end = AFE_DL4_END, 1657 .reg_ofs_base_msb = AFE_DL4_BASE_MSB, 1658 .reg_ofs_cur_msb = AFE_DL4_CUR_MSB, 1659 .reg_ofs_end_msb = AFE_DL4_END_MSB, 1660 .fs_reg = AFE_DL4_CON0, 1661 .fs_shift = DL4_MODE_SFT, 1662 .fs_maskbit = DL4_MODE_MASK, 1663 .mono_reg = AFE_DL4_CON0, 1664 .mono_shift = DL4_MONO_SFT, 1665 .enable_reg = AFE_DAC_CON0, 1666 .enable_shift = DL4_ON_SFT, 1667 .hd_reg = AFE_DL4_CON0, 1668 .hd_shift = DL4_HD_MODE_SFT, 1669 .hd_align_reg = AFE_DL4_CON0, 1670 .hd_align_mshift = DL4_HALIGN_SFT, 1671 .agent_disable_reg = -1, 1672 .agent_disable_shift = -1, 1673 .msb_reg = -1, 1674 .msb_shift = -1, 1675 .pbuf_reg = AFE_DL4_CON0, 1676 .pbuf_mask = DL4_PBUF_SIZE_MASK, 1677 .pbuf_shift = DL4_PBUF_SIZE_SFT, 1678 .minlen_reg = AFE_DL4_CON0, 1679 .minlen_mask = DL4_MINLEN_MASK, 1680 .minlen_shift = DL4_MINLEN_SFT, 1681 }, 1682 [MT8186_MEMIF_DL5] = { 1683 .name = "DL5", 1684 .id = MT8186_MEMIF_DL5, 1685 .reg_ofs_base = AFE_DL5_BASE, 1686 .reg_ofs_cur = AFE_DL5_CUR, 1687 .reg_ofs_end = AFE_DL5_END, 1688 .reg_ofs_base_msb = AFE_DL5_BASE_MSB, 1689 .reg_ofs_cur_msb = AFE_DL5_CUR_MSB, 1690 .reg_ofs_end_msb = AFE_DL5_END_MSB, 1691 .fs_reg = AFE_DL5_CON0, 1692 .fs_shift = DL5_MODE_SFT, 1693 .fs_maskbit = DL5_MODE_MASK, 1694 .mono_reg = AFE_DL5_CON0, 1695 .mono_shift = DL5_MONO_SFT, 1696 .enable_reg = AFE_DAC_CON0, 1697 .enable_shift = DL5_ON_SFT, 1698 .hd_reg = AFE_DL5_CON0, 1699 .hd_shift = DL5_HD_MODE_SFT, 1700 .hd_align_reg = AFE_DL5_CON0, 1701 .hd_align_mshift = DL5_HALIGN_SFT, 1702 .agent_disable_reg = -1, 1703 .agent_disable_shift = -1, 1704 .msb_reg = -1, 1705 .msb_shift = -1, 1706 .pbuf_reg = AFE_DL5_CON0, 1707 .pbuf_mask = DL5_PBUF_SIZE_MASK, 1708 .pbuf_shift = DL5_PBUF_SIZE_SFT, 1709 .minlen_reg = AFE_DL5_CON0, 1710 .minlen_mask = DL5_MINLEN_MASK, 1711 .minlen_shift = DL5_MINLEN_SFT, 1712 }, 1713 [MT8186_MEMIF_DL6] = { 1714 .name = "DL6", 1715 .id = MT8186_MEMIF_DL6, 1716 .reg_ofs_base = AFE_DL6_BASE, 1717 .reg_ofs_cur = AFE_DL6_CUR, 1718 .reg_ofs_end = AFE_DL6_END, 1719 .reg_ofs_base_msb = AFE_DL6_BASE_MSB, 1720 .reg_ofs_cur_msb = AFE_DL6_CUR_MSB, 1721 .reg_ofs_end_msb = AFE_DL6_END_MSB, 1722 .fs_reg = AFE_DL6_CON0, 1723 .fs_shift = DL6_MODE_SFT, 1724 .fs_maskbit = DL6_MODE_MASK, 1725 .mono_reg = AFE_DL6_CON0, 1726 .mono_shift = DL6_MONO_SFT, 1727 .enable_reg = AFE_DAC_CON0, 1728 .enable_shift = DL6_ON_SFT, 1729 .hd_reg = AFE_DL6_CON0, 1730 .hd_shift = DL6_HD_MODE_SFT, 1731 .hd_align_reg = AFE_DL6_CON0, 1732 .hd_align_mshift = DL6_HALIGN_SFT, 1733 .agent_disable_reg = -1, 1734 .agent_disable_shift = -1, 1735 .msb_reg = -1, 1736 .msb_shift = -1, 1737 .pbuf_reg = AFE_DL6_CON0, 1738 .pbuf_mask = DL6_PBUF_SIZE_MASK, 1739 .pbuf_shift = DL6_PBUF_SIZE_SFT, 1740 .minlen_reg = AFE_DL6_CON0, 1741 .minlen_mask = DL6_MINLEN_MASK, 1742 .minlen_shift = DL6_MINLEN_SFT, 1743 }, 1744 [MT8186_MEMIF_DL7] = { 1745 .name = "DL7", 1746 .id = MT8186_MEMIF_DL7, 1747 .reg_ofs_base = AFE_DL7_BASE, 1748 .reg_ofs_cur = AFE_DL7_CUR, 1749 .reg_ofs_end = AFE_DL7_END, 1750 .reg_ofs_base_msb = AFE_DL7_BASE_MSB, 1751 .reg_ofs_cur_msb = AFE_DL7_CUR_MSB, 1752 .reg_ofs_end_msb = AFE_DL7_END_MSB, 1753 .fs_reg = AFE_DL7_CON0, 1754 .fs_shift = DL7_MODE_SFT, 1755 .fs_maskbit = DL7_MODE_MASK, 1756 .mono_reg = AFE_DL7_CON0, 1757 .mono_shift = DL7_MONO_SFT, 1758 .enable_reg = AFE_DAC_CON0, 1759 .enable_shift = DL7_ON_SFT, 1760 .hd_reg = AFE_DL7_CON0, 1761 .hd_shift = DL7_HD_MODE_SFT, 1762 .hd_align_reg = AFE_DL7_CON0, 1763 .hd_align_mshift = DL7_HALIGN_SFT, 1764 .agent_disable_reg = -1, 1765 .agent_disable_shift = -1, 1766 .msb_reg = -1, 1767 .msb_shift = -1, 1768 .pbuf_reg = AFE_DL7_CON0, 1769 .pbuf_mask = DL7_PBUF_SIZE_MASK, 1770 .pbuf_shift = DL7_PBUF_SIZE_SFT, 1771 .minlen_reg = AFE_DL7_CON0, 1772 .minlen_mask = DL7_MINLEN_MASK, 1773 .minlen_shift = DL7_MINLEN_SFT, 1774 }, 1775 [MT8186_MEMIF_DL8] = { 1776 .name = "DL8", 1777 .id = MT8186_MEMIF_DL8, 1778 .reg_ofs_base = AFE_DL8_BASE, 1779 .reg_ofs_cur = AFE_DL8_CUR, 1780 .reg_ofs_end = AFE_DL8_END, 1781 .reg_ofs_base_msb = AFE_DL8_BASE_MSB, 1782 .reg_ofs_cur_msb = AFE_DL8_CUR_MSB, 1783 .reg_ofs_end_msb = AFE_DL8_END_MSB, 1784 .fs_reg = AFE_DL8_CON0, 1785 .fs_shift = DL8_MODE_SFT, 1786 .fs_maskbit = DL8_MODE_MASK, 1787 .mono_reg = AFE_DL8_CON0, 1788 .mono_shift = DL8_MONO_SFT, 1789 .enable_reg = AFE_DAC_CON0, 1790 .enable_shift = DL8_ON_SFT, 1791 .hd_reg = AFE_DL8_CON0, 1792 .hd_shift = DL8_HD_MODE_SFT, 1793 .hd_align_reg = AFE_DL8_CON0, 1794 .hd_align_mshift = DL8_HALIGN_SFT, 1795 .agent_disable_reg = -1, 1796 .agent_disable_shift = -1, 1797 .msb_reg = -1, 1798 .msb_shift = -1, 1799 .pbuf_reg = AFE_DL8_CON0, 1800 .pbuf_mask = DL8_PBUF_SIZE_MASK, 1801 .pbuf_shift = DL8_PBUF_SIZE_SFT, 1802 .minlen_reg = AFE_DL8_CON0, 1803 .minlen_mask = DL8_MINLEN_MASK, 1804 .minlen_shift = DL8_MINLEN_SFT, 1805 }, 1806 [MT8186_MEMIF_VUL12] = { 1807 .name = "VUL12", 1808 .id = MT8186_MEMIF_VUL12, 1809 .reg_ofs_base = AFE_VUL12_BASE, 1810 .reg_ofs_cur = AFE_VUL12_CUR, 1811 .reg_ofs_end = AFE_VUL12_END, 1812 .reg_ofs_base_msb = AFE_VUL12_BASE_MSB, 1813 .reg_ofs_cur_msb = AFE_VUL12_CUR_MSB, 1814 .reg_ofs_end_msb = AFE_VUL12_END_MSB, 1815 .fs_reg = AFE_VUL12_CON0, 1816 .fs_shift = VUL12_MODE_SFT, 1817 .fs_maskbit = VUL12_MODE_MASK, 1818 .mono_reg = AFE_VUL12_CON0, 1819 .mono_shift = VUL12_MONO_SFT, 1820 .quad_ch_reg = AFE_VUL12_CON0, 1821 .quad_ch_mask = VUL12_4CH_EN_MASK, 1822 .quad_ch_shift = VUL12_4CH_EN_SFT, 1823 .enable_reg = AFE_DAC_CON0, 1824 .enable_shift = VUL12_ON_SFT, 1825 .hd_reg = AFE_VUL12_CON0, 1826 .hd_shift = VUL12_HD_MODE_SFT, 1827 .hd_align_reg = AFE_VUL12_CON0, 1828 .hd_align_mshift = VUL12_HALIGN_SFT, 1829 .agent_disable_reg = -1, 1830 .agent_disable_shift = -1, 1831 .msb_reg = -1, 1832 .msb_shift = -1, 1833 }, 1834 [MT8186_MEMIF_VUL2] = { 1835 .name = "VUL2", 1836 .id = MT8186_MEMIF_VUL2, 1837 .reg_ofs_base = AFE_VUL2_BASE, 1838 .reg_ofs_cur = AFE_VUL2_CUR, 1839 .reg_ofs_end = AFE_VUL2_END, 1840 .reg_ofs_base_msb = AFE_VUL2_BASE_MSB, 1841 .reg_ofs_cur_msb = AFE_VUL2_CUR_MSB, 1842 .reg_ofs_end_msb = AFE_VUL2_END_MSB, 1843 .fs_reg = AFE_VUL2_CON0, 1844 .fs_shift = VUL2_MODE_SFT, 1845 .fs_maskbit = VUL2_MODE_MASK, 1846 .mono_reg = AFE_VUL2_CON0, 1847 .mono_shift = VUL2_MONO_SFT, 1848 .enable_reg = AFE_DAC_CON0, 1849 .enable_shift = VUL2_ON_SFT, 1850 .hd_reg = AFE_VUL2_CON0, 1851 .hd_shift = VUL2_HD_MODE_SFT, 1852 .hd_align_reg = AFE_VUL2_CON0, 1853 .hd_align_mshift = VUL2_HALIGN_SFT, 1854 .agent_disable_reg = -1, 1855 .agent_disable_shift = -1, 1856 .msb_reg = -1, 1857 .msb_shift = -1, 1858 }, 1859 [MT8186_MEMIF_AWB] = { 1860 .name = "AWB", 1861 .id = MT8186_MEMIF_AWB, 1862 .reg_ofs_base = AFE_AWB_BASE, 1863 .reg_ofs_cur = AFE_AWB_CUR, 1864 .reg_ofs_end = AFE_AWB_END, 1865 .reg_ofs_base_msb = AFE_AWB_BASE_MSB, 1866 .reg_ofs_cur_msb = AFE_AWB_CUR_MSB, 1867 .reg_ofs_end_msb = AFE_AWB_END_MSB, 1868 .fs_reg = AFE_AWB_CON0, 1869 .fs_shift = AWB_MODE_SFT, 1870 .fs_maskbit = AWB_MODE_MASK, 1871 .mono_reg = AFE_AWB_CON0, 1872 .mono_shift = AWB_MONO_SFT, 1873 .enable_reg = AFE_DAC_CON0, 1874 .enable_shift = AWB_ON_SFT, 1875 .hd_reg = AFE_AWB_CON0, 1876 .hd_shift = AWB_HD_MODE_SFT, 1877 .hd_align_reg = AFE_AWB_CON0, 1878 .hd_align_mshift = AWB_HALIGN_SFT, 1879 .agent_disable_reg = -1, 1880 .agent_disable_shift = -1, 1881 .msb_reg = -1, 1882 .msb_shift = -1, 1883 }, 1884 [MT8186_MEMIF_AWB2] = { 1885 .name = "AWB2", 1886 .id = MT8186_MEMIF_AWB2, 1887 .reg_ofs_base = AFE_AWB2_BASE, 1888 .reg_ofs_cur = AFE_AWB2_CUR, 1889 .reg_ofs_end = AFE_AWB2_END, 1890 .reg_ofs_base_msb = AFE_AWB2_BASE_MSB, 1891 .reg_ofs_cur_msb = AFE_AWB2_CUR_MSB, 1892 .reg_ofs_end_msb = AFE_AWB2_END_MSB, 1893 .fs_reg = AFE_AWB2_CON0, 1894 .fs_shift = AWB2_MODE_SFT, 1895 .fs_maskbit = AWB2_MODE_MASK, 1896 .mono_reg = AFE_AWB2_CON0, 1897 .mono_shift = AWB2_MONO_SFT, 1898 .enable_reg = AFE_DAC_CON0, 1899 .enable_shift = AWB2_ON_SFT, 1900 .hd_reg = AFE_AWB2_CON0, 1901 .hd_shift = AWB2_HD_MODE_SFT, 1902 .hd_align_reg = AFE_AWB2_CON0, 1903 .hd_align_mshift = AWB2_HALIGN_SFT, 1904 .agent_disable_reg = -1, 1905 .agent_disable_shift = -1, 1906 .msb_reg = -1, 1907 .msb_shift = -1, 1908 }, 1909 [MT8186_MEMIF_VUL3] = { 1910 .name = "VUL3", 1911 .id = MT8186_MEMIF_VUL3, 1912 .reg_ofs_base = AFE_VUL3_BASE, 1913 .reg_ofs_cur = AFE_VUL3_CUR, 1914 .reg_ofs_end = AFE_VUL3_END, 1915 .reg_ofs_base_msb = AFE_VUL3_BASE_MSB, 1916 .reg_ofs_cur_msb = AFE_VUL3_CUR_MSB, 1917 .reg_ofs_end_msb = AFE_VUL3_END_MSB, 1918 .fs_reg = AFE_VUL3_CON0, 1919 .fs_shift = VUL3_MODE_SFT, 1920 .fs_maskbit = VUL3_MODE_MASK, 1921 .mono_reg = AFE_VUL3_CON0, 1922 .mono_shift = VUL3_MONO_SFT, 1923 .enable_reg = AFE_DAC_CON0, 1924 .enable_shift = VUL3_ON_SFT, 1925 .hd_reg = AFE_VUL3_CON0, 1926 .hd_shift = VUL3_HD_MODE_SFT, 1927 .hd_align_reg = AFE_VUL3_CON0, 1928 .hd_align_mshift = VUL3_HALIGN_SFT, 1929 .agent_disable_reg = -1, 1930 .agent_disable_shift = -1, 1931 .msb_reg = -1, 1932 .msb_shift = -1, 1933 }, 1934 [MT8186_MEMIF_VUL4] = { 1935 .name = "VUL4", 1936 .id = MT8186_MEMIF_VUL4, 1937 .reg_ofs_base = AFE_VUL4_BASE, 1938 .reg_ofs_cur = AFE_VUL4_CUR, 1939 .reg_ofs_end = AFE_VUL4_END, 1940 .reg_ofs_base_msb = AFE_VUL4_BASE_MSB, 1941 .reg_ofs_cur_msb = AFE_VUL4_CUR_MSB, 1942 .reg_ofs_end_msb = AFE_VUL4_END_MSB, 1943 .fs_reg = AFE_VUL4_CON0, 1944 .fs_shift = VUL4_MODE_SFT, 1945 .fs_maskbit = VUL4_MODE_MASK, 1946 .mono_reg = AFE_VUL4_CON0, 1947 .mono_shift = VUL4_MONO_SFT, 1948 .enable_reg = AFE_DAC_CON0, 1949 .enable_shift = VUL4_ON_SFT, 1950 .hd_reg = AFE_VUL4_CON0, 1951 .hd_shift = VUL4_HD_MODE_SFT, 1952 .hd_align_reg = AFE_VUL4_CON0, 1953 .hd_align_mshift = VUL4_HALIGN_SFT, 1954 .agent_disable_reg = -1, 1955 .agent_disable_shift = -1, 1956 .msb_reg = -1, 1957 .msb_shift = -1, 1958 }, 1959 [MT8186_MEMIF_VUL5] = { 1960 .name = "VUL5", 1961 .id = MT8186_MEMIF_VUL5, 1962 .reg_ofs_base = AFE_VUL5_BASE, 1963 .reg_ofs_cur = AFE_VUL5_CUR, 1964 .reg_ofs_end = AFE_VUL5_END, 1965 .reg_ofs_base_msb = AFE_VUL5_BASE_MSB, 1966 .reg_ofs_cur_msb = AFE_VUL5_CUR_MSB, 1967 .reg_ofs_end_msb = AFE_VUL5_END_MSB, 1968 .fs_reg = AFE_VUL5_CON0, 1969 .fs_shift = VUL5_MODE_SFT, 1970 .fs_maskbit = VUL5_MODE_MASK, 1971 .mono_reg = AFE_VUL5_CON0, 1972 .mono_shift = VUL5_MONO_SFT, 1973 .enable_reg = AFE_DAC_CON0, 1974 .enable_shift = VUL5_ON_SFT, 1975 .hd_reg = AFE_VUL5_CON0, 1976 .hd_shift = VUL5_HD_MODE_SFT, 1977 .hd_align_reg = AFE_VUL5_CON0, 1978 .hd_align_mshift = VUL5_HALIGN_SFT, 1979 .agent_disable_reg = -1, 1980 .agent_disable_shift = -1, 1981 .msb_reg = -1, 1982 .msb_shift = -1, 1983 }, 1984 [MT8186_MEMIF_VUL6] = { 1985 .name = "VUL6", 1986 .id = MT8186_MEMIF_VUL6, 1987 .reg_ofs_base = AFE_VUL6_BASE, 1988 .reg_ofs_cur = AFE_VUL6_CUR, 1989 .reg_ofs_end = AFE_VUL6_END, 1990 .reg_ofs_base_msb = AFE_VUL6_BASE_MSB, 1991 .reg_ofs_cur_msb = AFE_VUL6_CUR_MSB, 1992 .reg_ofs_end_msb = AFE_VUL6_END_MSB, 1993 .fs_reg = AFE_VUL6_CON0, 1994 .fs_shift = VUL6_MODE_SFT, 1995 .fs_maskbit = VUL6_MODE_MASK, 1996 .mono_reg = AFE_VUL6_CON0, 1997 .mono_shift = VUL6_MONO_SFT, 1998 .enable_reg = AFE_DAC_CON0, 1999 .enable_shift = VUL6_ON_SFT, 2000 .hd_reg = AFE_VUL6_CON0, 2001 .hd_shift = VUL6_HD_MODE_SFT, 2002 .hd_align_reg = AFE_VUL6_CON0, 2003 .hd_align_mshift = VUL6_HALIGN_SFT, 2004 .agent_disable_reg = -1, 2005 .agent_disable_shift = -1, 2006 .msb_reg = -1, 2007 .msb_shift = -1, 2008 }, 2009 }; 2010 2011 static const struct mtk_base_irq_data irq_data[MT8186_IRQ_NUM] = { 2012 [MT8186_IRQ_0] = { 2013 .id = MT8186_IRQ_0, 2014 .irq_cnt_reg = AFE_IRQ_MCU_CNT0, 2015 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2016 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2017 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2018 .irq_fs_shift = IRQ0_MCU_MODE_SFT, 2019 .irq_fs_maskbit = IRQ0_MCU_MODE_MASK, 2020 .irq_en_reg = AFE_IRQ_MCU_CON0, 2021 .irq_en_shift = IRQ0_MCU_ON_SFT, 2022 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2023 .irq_clr_shift = IRQ0_MCU_CLR_SFT, 2024 }, 2025 [MT8186_IRQ_1] = { 2026 .id = MT8186_IRQ_1, 2027 .irq_cnt_reg = AFE_IRQ_MCU_CNT1, 2028 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2029 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2030 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2031 .irq_fs_shift = IRQ1_MCU_MODE_SFT, 2032 .irq_fs_maskbit = IRQ1_MCU_MODE_MASK, 2033 .irq_en_reg = AFE_IRQ_MCU_CON0, 2034 .irq_en_shift = IRQ1_MCU_ON_SFT, 2035 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2036 .irq_clr_shift = IRQ1_MCU_CLR_SFT, 2037 }, 2038 [MT8186_IRQ_2] = { 2039 .id = MT8186_IRQ_2, 2040 .irq_cnt_reg = AFE_IRQ_MCU_CNT2, 2041 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2042 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2043 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2044 .irq_fs_shift = IRQ2_MCU_MODE_SFT, 2045 .irq_fs_maskbit = IRQ2_MCU_MODE_MASK, 2046 .irq_en_reg = AFE_IRQ_MCU_CON0, 2047 .irq_en_shift = IRQ2_MCU_ON_SFT, 2048 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2049 .irq_clr_shift = IRQ2_MCU_CLR_SFT, 2050 }, 2051 [MT8186_IRQ_3] = { 2052 .id = MT8186_IRQ_3, 2053 .irq_cnt_reg = AFE_IRQ_MCU_CNT3, 2054 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2055 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2056 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2057 .irq_fs_shift = IRQ3_MCU_MODE_SFT, 2058 .irq_fs_maskbit = IRQ3_MCU_MODE_MASK, 2059 .irq_en_reg = AFE_IRQ_MCU_CON0, 2060 .irq_en_shift = IRQ3_MCU_ON_SFT, 2061 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2062 .irq_clr_shift = IRQ3_MCU_CLR_SFT, 2063 }, 2064 [MT8186_IRQ_4] = { 2065 .id = MT8186_IRQ_4, 2066 .irq_cnt_reg = AFE_IRQ_MCU_CNT4, 2067 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2068 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2069 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2070 .irq_fs_shift = IRQ4_MCU_MODE_SFT, 2071 .irq_fs_maskbit = IRQ4_MCU_MODE_MASK, 2072 .irq_en_reg = AFE_IRQ_MCU_CON0, 2073 .irq_en_shift = IRQ4_MCU_ON_SFT, 2074 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2075 .irq_clr_shift = IRQ4_MCU_CLR_SFT, 2076 }, 2077 [MT8186_IRQ_5] = { 2078 .id = MT8186_IRQ_5, 2079 .irq_cnt_reg = AFE_IRQ_MCU_CNT5, 2080 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2081 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2082 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2083 .irq_fs_shift = IRQ5_MCU_MODE_SFT, 2084 .irq_fs_maskbit = IRQ5_MCU_MODE_MASK, 2085 .irq_en_reg = AFE_IRQ_MCU_CON0, 2086 .irq_en_shift = IRQ5_MCU_ON_SFT, 2087 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2088 .irq_clr_shift = IRQ5_MCU_CLR_SFT, 2089 }, 2090 [MT8186_IRQ_6] = { 2091 .id = MT8186_IRQ_6, 2092 .irq_cnt_reg = AFE_IRQ_MCU_CNT6, 2093 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2094 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2095 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2096 .irq_fs_shift = IRQ6_MCU_MODE_SFT, 2097 .irq_fs_maskbit = IRQ6_MCU_MODE_MASK, 2098 .irq_en_reg = AFE_IRQ_MCU_CON0, 2099 .irq_en_shift = IRQ6_MCU_ON_SFT, 2100 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2101 .irq_clr_shift = IRQ6_MCU_CLR_SFT, 2102 }, 2103 [MT8186_IRQ_7] = { 2104 .id = MT8186_IRQ_7, 2105 .irq_cnt_reg = AFE_IRQ_MCU_CNT7, 2106 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2107 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2108 .irq_fs_reg = AFE_IRQ_MCU_CON1, 2109 .irq_fs_shift = IRQ7_MCU_MODE_SFT, 2110 .irq_fs_maskbit = IRQ7_MCU_MODE_MASK, 2111 .irq_en_reg = AFE_IRQ_MCU_CON0, 2112 .irq_en_shift = IRQ7_MCU_ON_SFT, 2113 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2114 .irq_clr_shift = IRQ7_MCU_CLR_SFT, 2115 }, 2116 [MT8186_IRQ_8] = { 2117 .id = MT8186_IRQ_8, 2118 .irq_cnt_reg = AFE_IRQ_MCU_CNT8, 2119 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2120 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2121 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2122 .irq_fs_shift = IRQ8_MCU_MODE_SFT, 2123 .irq_fs_maskbit = IRQ8_MCU_MODE_MASK, 2124 .irq_en_reg = AFE_IRQ_MCU_CON0, 2125 .irq_en_shift = IRQ8_MCU_ON_SFT, 2126 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2127 .irq_clr_shift = IRQ8_MCU_CLR_SFT, 2128 }, 2129 [MT8186_IRQ_9] = { 2130 .id = MT8186_IRQ_9, 2131 .irq_cnt_reg = AFE_IRQ_MCU_CNT9, 2132 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2133 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2134 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2135 .irq_fs_shift = IRQ9_MCU_MODE_SFT, 2136 .irq_fs_maskbit = IRQ9_MCU_MODE_MASK, 2137 .irq_en_reg = AFE_IRQ_MCU_CON0, 2138 .irq_en_shift = IRQ9_MCU_ON_SFT, 2139 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2140 .irq_clr_shift = IRQ9_MCU_CLR_SFT, 2141 }, 2142 [MT8186_IRQ_10] = { 2143 .id = MT8186_IRQ_10, 2144 .irq_cnt_reg = AFE_IRQ_MCU_CNT10, 2145 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2146 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2147 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2148 .irq_fs_shift = IRQ10_MCU_MODE_SFT, 2149 .irq_fs_maskbit = IRQ10_MCU_MODE_MASK, 2150 .irq_en_reg = AFE_IRQ_MCU_CON0, 2151 .irq_en_shift = IRQ10_MCU_ON_SFT, 2152 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2153 .irq_clr_shift = IRQ10_MCU_CLR_SFT, 2154 }, 2155 [MT8186_IRQ_11] = { 2156 .id = MT8186_IRQ_11, 2157 .irq_cnt_reg = AFE_IRQ_MCU_CNT11, 2158 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2159 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2160 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2161 .irq_fs_shift = IRQ11_MCU_MODE_SFT, 2162 .irq_fs_maskbit = IRQ11_MCU_MODE_MASK, 2163 .irq_en_reg = AFE_IRQ_MCU_CON0, 2164 .irq_en_shift = IRQ11_MCU_ON_SFT, 2165 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2166 .irq_clr_shift = IRQ11_MCU_CLR_SFT, 2167 }, 2168 [MT8186_IRQ_12] = { 2169 .id = MT8186_IRQ_12, 2170 .irq_cnt_reg = AFE_IRQ_MCU_CNT12, 2171 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2172 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2173 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2174 .irq_fs_shift = IRQ12_MCU_MODE_SFT, 2175 .irq_fs_maskbit = IRQ12_MCU_MODE_MASK, 2176 .irq_en_reg = AFE_IRQ_MCU_CON0, 2177 .irq_en_shift = IRQ12_MCU_ON_SFT, 2178 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2179 .irq_clr_shift = IRQ12_MCU_CLR_SFT, 2180 }, 2181 [MT8186_IRQ_13] = { 2182 .id = MT8186_IRQ_13, 2183 .irq_cnt_reg = AFE_IRQ_MCU_CNT13, 2184 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2185 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2186 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2187 .irq_fs_shift = IRQ13_MCU_MODE_SFT, 2188 .irq_fs_maskbit = IRQ13_MCU_MODE_MASK, 2189 .irq_en_reg = AFE_IRQ_MCU_CON0, 2190 .irq_en_shift = IRQ13_MCU_ON_SFT, 2191 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2192 .irq_clr_shift = IRQ13_MCU_CLR_SFT, 2193 }, 2194 [MT8186_IRQ_14] = { 2195 .id = MT8186_IRQ_14, 2196 .irq_cnt_reg = AFE_IRQ_MCU_CNT14, 2197 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2198 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2199 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2200 .irq_fs_shift = IRQ14_MCU_MODE_SFT, 2201 .irq_fs_maskbit = IRQ14_MCU_MODE_MASK, 2202 .irq_en_reg = AFE_IRQ_MCU_CON0, 2203 .irq_en_shift = IRQ14_MCU_ON_SFT, 2204 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2205 .irq_clr_shift = IRQ14_MCU_CLR_SFT, 2206 }, 2207 [MT8186_IRQ_15] = { 2208 .id = MT8186_IRQ_15, 2209 .irq_cnt_reg = AFE_IRQ_MCU_CNT15, 2210 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2211 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2212 .irq_fs_reg = AFE_IRQ_MCU_CON2, 2213 .irq_fs_shift = IRQ15_MCU_MODE_SFT, 2214 .irq_fs_maskbit = IRQ15_MCU_MODE_MASK, 2215 .irq_en_reg = AFE_IRQ_MCU_CON0, 2216 .irq_en_shift = IRQ15_MCU_ON_SFT, 2217 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2218 .irq_clr_shift = IRQ15_MCU_CLR_SFT, 2219 }, 2220 [MT8186_IRQ_16] = { 2221 .id = MT8186_IRQ_16, 2222 .irq_cnt_reg = AFE_IRQ_MCU_CNT16, 2223 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2224 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2225 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2226 .irq_fs_shift = IRQ16_MCU_MODE_SFT, 2227 .irq_fs_maskbit = IRQ16_MCU_MODE_MASK, 2228 .irq_en_reg = AFE_IRQ_MCU_CON0, 2229 .irq_en_shift = IRQ16_MCU_ON_SFT, 2230 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2231 .irq_clr_shift = IRQ16_MCU_CLR_SFT, 2232 }, 2233 [MT8186_IRQ_17] = { 2234 .id = MT8186_IRQ_17, 2235 .irq_cnt_reg = AFE_IRQ_MCU_CNT17, 2236 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2237 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2238 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2239 .irq_fs_shift = IRQ17_MCU_MODE_SFT, 2240 .irq_fs_maskbit = IRQ17_MCU_MODE_MASK, 2241 .irq_en_reg = AFE_IRQ_MCU_CON0, 2242 .irq_en_shift = IRQ17_MCU_ON_SFT, 2243 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2244 .irq_clr_shift = IRQ17_MCU_CLR_SFT, 2245 }, 2246 [MT8186_IRQ_18] = { 2247 .id = MT8186_IRQ_18, 2248 .irq_cnt_reg = AFE_IRQ_MCU_CNT18, 2249 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2250 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2251 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2252 .irq_fs_shift = IRQ18_MCU_MODE_SFT, 2253 .irq_fs_maskbit = IRQ18_MCU_MODE_MASK, 2254 .irq_en_reg = AFE_IRQ_MCU_CON0, 2255 .irq_en_shift = IRQ18_MCU_ON_SFT, 2256 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2257 .irq_clr_shift = IRQ18_MCU_CLR_SFT, 2258 }, 2259 [MT8186_IRQ_19] = { 2260 .id = MT8186_IRQ_19, 2261 .irq_cnt_reg = AFE_IRQ_MCU_CNT19, 2262 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2263 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2264 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2265 .irq_fs_shift = IRQ19_MCU_MODE_SFT, 2266 .irq_fs_maskbit = IRQ19_MCU_MODE_MASK, 2267 .irq_en_reg = AFE_IRQ_MCU_CON0, 2268 .irq_en_shift = IRQ19_MCU_ON_SFT, 2269 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2270 .irq_clr_shift = IRQ19_MCU_CLR_SFT, 2271 }, 2272 [MT8186_IRQ_20] = { 2273 .id = MT8186_IRQ_20, 2274 .irq_cnt_reg = AFE_IRQ_MCU_CNT20, 2275 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2276 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2277 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2278 .irq_fs_shift = IRQ20_MCU_MODE_SFT, 2279 .irq_fs_maskbit = IRQ20_MCU_MODE_MASK, 2280 .irq_en_reg = AFE_IRQ_MCU_CON0, 2281 .irq_en_shift = IRQ20_MCU_ON_SFT, 2282 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2283 .irq_clr_shift = IRQ20_MCU_CLR_SFT, 2284 }, 2285 [MT8186_IRQ_21] = { 2286 .id = MT8186_IRQ_21, 2287 .irq_cnt_reg = AFE_IRQ_MCU_CNT21, 2288 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2289 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2290 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2291 .irq_fs_shift = IRQ21_MCU_MODE_SFT, 2292 .irq_fs_maskbit = IRQ21_MCU_MODE_MASK, 2293 .irq_en_reg = AFE_IRQ_MCU_CON0, 2294 .irq_en_shift = IRQ21_MCU_ON_SFT, 2295 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2296 .irq_clr_shift = IRQ21_MCU_CLR_SFT, 2297 }, 2298 [MT8186_IRQ_22] = { 2299 .id = MT8186_IRQ_22, 2300 .irq_cnt_reg = AFE_IRQ_MCU_CNT22, 2301 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2302 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2303 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2304 .irq_fs_shift = IRQ22_MCU_MODE_SFT, 2305 .irq_fs_maskbit = IRQ22_MCU_MODE_MASK, 2306 .irq_en_reg = AFE_IRQ_MCU_CON0, 2307 .irq_en_shift = IRQ22_MCU_ON_SFT, 2308 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2309 .irq_clr_shift = IRQ22_MCU_CLR_SFT, 2310 }, 2311 [MT8186_IRQ_23] = { 2312 .id = MT8186_IRQ_23, 2313 .irq_cnt_reg = AFE_IRQ_MCU_CNT23, 2314 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2315 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2316 .irq_fs_reg = AFE_IRQ_MCU_CON3, 2317 .irq_fs_shift = IRQ23_MCU_MODE_SFT, 2318 .irq_fs_maskbit = IRQ23_MCU_MODE_MASK, 2319 .irq_en_reg = AFE_IRQ_MCU_CON0, 2320 .irq_en_shift = IRQ23_MCU_ON_SFT, 2321 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2322 .irq_clr_shift = IRQ23_MCU_CLR_SFT, 2323 }, 2324 [MT8186_IRQ_24] = { 2325 .id = MT8186_IRQ_24, 2326 .irq_cnt_reg = AFE_IRQ_MCU_CNT24, 2327 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2328 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2329 .irq_fs_reg = AFE_IRQ_MCU_CON4, 2330 .irq_fs_shift = IRQ24_MCU_MODE_SFT, 2331 .irq_fs_maskbit = IRQ24_MCU_MODE_MASK, 2332 .irq_en_reg = AFE_IRQ_MCU_CON0, 2333 .irq_en_shift = IRQ24_MCU_ON_SFT, 2334 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2335 .irq_clr_shift = IRQ24_MCU_CLR_SFT, 2336 }, 2337 [MT8186_IRQ_25] = { 2338 .id = MT8186_IRQ_25, 2339 .irq_cnt_reg = AFE_IRQ_MCU_CNT25, 2340 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2341 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2342 .irq_fs_reg = AFE_IRQ_MCU_CON4, 2343 .irq_fs_shift = IRQ25_MCU_MODE_SFT, 2344 .irq_fs_maskbit = IRQ25_MCU_MODE_MASK, 2345 .irq_en_reg = AFE_IRQ_MCU_CON0, 2346 .irq_en_shift = IRQ25_MCU_ON_SFT, 2347 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2348 .irq_clr_shift = IRQ25_MCU_CLR_SFT, 2349 }, 2350 [MT8186_IRQ_26] = { 2351 .id = MT8186_IRQ_26, 2352 .irq_cnt_reg = AFE_IRQ_MCU_CNT26, 2353 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT, 2354 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK, 2355 .irq_fs_reg = AFE_IRQ_MCU_CON4, 2356 .irq_fs_shift = IRQ26_MCU_MODE_SFT, 2357 .irq_fs_maskbit = IRQ26_MCU_MODE_MASK, 2358 .irq_en_reg = AFE_IRQ_MCU_CON0, 2359 .irq_en_shift = IRQ26_MCU_ON_SFT, 2360 .irq_clr_reg = AFE_IRQ_MCU_CLR, 2361 .irq_clr_shift = IRQ26_MCU_CLR_SFT, 2362 }, 2363 }; 2364 2365 static const int memif_irq_usage[MT8186_MEMIF_NUM] = { 2366 /* TODO: verify each memif & irq */ 2367 [MT8186_MEMIF_DL1] = MT8186_IRQ_0, 2368 [MT8186_MEMIF_DL2] = MT8186_IRQ_1, 2369 [MT8186_MEMIF_DL3] = MT8186_IRQ_2, 2370 [MT8186_MEMIF_DL4] = MT8186_IRQ_3, 2371 [MT8186_MEMIF_DL5] = MT8186_IRQ_4, 2372 [MT8186_MEMIF_DL6] = MT8186_IRQ_5, 2373 [MT8186_MEMIF_DL7] = MT8186_IRQ_6, 2374 [MT8186_MEMIF_DL8] = MT8186_IRQ_7, 2375 [MT8186_MEMIF_DL12] = MT8186_IRQ_9, 2376 [MT8186_MEMIF_VUL12] = MT8186_IRQ_10, 2377 [MT8186_MEMIF_VUL2] = MT8186_IRQ_11, 2378 [MT8186_MEMIF_AWB] = MT8186_IRQ_12, 2379 [MT8186_MEMIF_AWB2] = MT8186_IRQ_13, 2380 [MT8186_MEMIF_VUL3] = MT8186_IRQ_14, 2381 [MT8186_MEMIF_VUL4] = MT8186_IRQ_15, 2382 [MT8186_MEMIF_VUL5] = MT8186_IRQ_16, 2383 [MT8186_MEMIF_VUL6] = MT8186_IRQ_17, 2384 }; 2385 2386 static bool mt8186_is_volatile_reg(struct device *dev, unsigned int reg) 2387 { 2388 /* these auto-gen reg has read-only bit, so put it as volatile */ 2389 /* volatile reg cannot be cached, so cannot be set when power off */ 2390 switch (reg) { 2391 case AUDIO_TOP_CON0: /* reg bit controlled by CCF */ 2392 case AUDIO_TOP_CON1: /* reg bit controlled by CCF */ 2393 case AUDIO_TOP_CON2: 2394 case AUDIO_TOP_CON3: 2395 case AFE_DL1_CUR_MSB: 2396 case AFE_DL1_CUR: 2397 case AFE_DL1_END: 2398 case AFE_DL2_CUR_MSB: 2399 case AFE_DL2_CUR: 2400 case AFE_DL2_END: 2401 case AFE_DL3_CUR_MSB: 2402 case AFE_DL3_CUR: 2403 case AFE_DL3_END: 2404 case AFE_DL4_CUR_MSB: 2405 case AFE_DL4_CUR: 2406 case AFE_DL4_END: 2407 case AFE_DL12_CUR_MSB: 2408 case AFE_DL12_CUR: 2409 case AFE_DL12_END: 2410 case AFE_ADDA_SRC_DEBUG_MON0: 2411 case AFE_ADDA_SRC_DEBUG_MON1: 2412 case AFE_ADDA_UL_SRC_MON0: 2413 case AFE_ADDA_UL_SRC_MON1: 2414 case AFE_SECURE_CON0: 2415 case AFE_SRAM_BOUND: 2416 case AFE_SECURE_CON1: 2417 case AFE_VUL_CUR_MSB: 2418 case AFE_VUL_CUR: 2419 case AFE_VUL_END: 2420 case AFE_SIDETONE_MON: 2421 case AFE_SIDETONE_CON0: 2422 case AFE_SIDETONE_COEFF: 2423 case AFE_VUL2_CUR_MSB: 2424 case AFE_VUL2_CUR: 2425 case AFE_VUL2_END: 2426 case AFE_VUL3_CUR_MSB: 2427 case AFE_VUL3_CUR: 2428 case AFE_VUL3_END: 2429 case AFE_I2S_MON: 2430 case AFE_DAC_MON: 2431 case AFE_IRQ0_MCU_CNT_MON: 2432 case AFE_IRQ6_MCU_CNT_MON: 2433 case AFE_VUL4_CUR_MSB: 2434 case AFE_VUL4_CUR: 2435 case AFE_VUL4_END: 2436 case AFE_VUL12_CUR_MSB: 2437 case AFE_VUL12_CUR: 2438 case AFE_VUL12_END: 2439 case AFE_IRQ3_MCU_CNT_MON: 2440 case AFE_IRQ4_MCU_CNT_MON: 2441 case AFE_IRQ_MCU_STATUS: 2442 case AFE_IRQ_MCU_CLR: 2443 case AFE_IRQ_MCU_MON2: 2444 case AFE_IRQ1_MCU_CNT_MON: 2445 case AFE_IRQ2_MCU_CNT_MON: 2446 case AFE_IRQ5_MCU_CNT_MON: 2447 case AFE_IRQ7_MCU_CNT_MON: 2448 case AFE_IRQ_MCU_MISS_CLR: 2449 case AFE_GAIN1_CUR: 2450 case AFE_GAIN2_CUR: 2451 case AFE_SRAM_DELSEL_CON1: 2452 case PCM_INTF_CON2: 2453 case FPGA_CFG0: 2454 case FPGA_CFG1: 2455 case FPGA_CFG2: 2456 case FPGA_CFG3: 2457 case AUDIO_TOP_DBG_MON0: 2458 case AUDIO_TOP_DBG_MON1: 2459 case AFE_IRQ8_MCU_CNT_MON: 2460 case AFE_IRQ11_MCU_CNT_MON: 2461 case AFE_IRQ12_MCU_CNT_MON: 2462 case AFE_IRQ9_MCU_CNT_MON: 2463 case AFE_IRQ10_MCU_CNT_MON: 2464 case AFE_IRQ13_MCU_CNT_MON: 2465 case AFE_IRQ14_MCU_CNT_MON: 2466 case AFE_IRQ15_MCU_CNT_MON: 2467 case AFE_IRQ16_MCU_CNT_MON: 2468 case AFE_IRQ17_MCU_CNT_MON: 2469 case AFE_IRQ18_MCU_CNT_MON: 2470 case AFE_IRQ19_MCU_CNT_MON: 2471 case AFE_IRQ20_MCU_CNT_MON: 2472 case AFE_IRQ21_MCU_CNT_MON: 2473 case AFE_IRQ22_MCU_CNT_MON: 2474 case AFE_IRQ23_MCU_CNT_MON: 2475 case AFE_IRQ24_MCU_CNT_MON: 2476 case AFE_IRQ25_MCU_CNT_MON: 2477 case AFE_IRQ26_MCU_CNT_MON: 2478 case AFE_IRQ31_MCU_CNT_MON: 2479 case AFE_CBIP_MON0: 2480 case AFE_CBIP_SLV_MUX_MON0: 2481 case AFE_CBIP_SLV_DECODER_MON0: 2482 case AFE_ADDA6_MTKAIF_MON0: 2483 case AFE_ADDA6_MTKAIF_MON1: 2484 case AFE_AWB_CUR_MSB: 2485 case AFE_AWB_CUR: 2486 case AFE_AWB_END: 2487 case AFE_AWB2_CUR_MSB: 2488 case AFE_AWB2_CUR: 2489 case AFE_AWB2_END: 2490 case AFE_DAI_CUR_MSB: 2491 case AFE_DAI_CUR: 2492 case AFE_DAI_END: 2493 case AFE_DAI2_CUR_MSB: 2494 case AFE_DAI2_CUR: 2495 case AFE_DAI2_END: 2496 case AFE_ADDA6_SRC_DEBUG_MON0: 2497 case AFE_ADD6A_UL_SRC_MON0: 2498 case AFE_ADDA6_UL_SRC_MON1: 2499 case AFE_MOD_DAI_CUR_MSB: 2500 case AFE_MOD_DAI_CUR: 2501 case AFE_MOD_DAI_END: 2502 case AFE_AWB_RCH_MON: 2503 case AFE_AWB_LCH_MON: 2504 case AFE_VUL_RCH_MON: 2505 case AFE_VUL_LCH_MON: 2506 case AFE_VUL12_RCH_MON: 2507 case AFE_VUL12_LCH_MON: 2508 case AFE_VUL2_RCH_MON: 2509 case AFE_VUL2_LCH_MON: 2510 case AFE_DAI_DATA_MON: 2511 case AFE_MOD_DAI_DATA_MON: 2512 case AFE_DAI2_DATA_MON: 2513 case AFE_AWB2_RCH_MON: 2514 case AFE_AWB2_LCH_MON: 2515 case AFE_VUL3_RCH_MON: 2516 case AFE_VUL3_LCH_MON: 2517 case AFE_VUL4_RCH_MON: 2518 case AFE_VUL4_LCH_MON: 2519 case AFE_VUL5_RCH_MON: 2520 case AFE_VUL5_LCH_MON: 2521 case AFE_VUL6_RCH_MON: 2522 case AFE_VUL6_LCH_MON: 2523 case AFE_DL1_RCH_MON: 2524 case AFE_DL1_LCH_MON: 2525 case AFE_DL2_RCH_MON: 2526 case AFE_DL2_LCH_MON: 2527 case AFE_DL12_RCH1_MON: 2528 case AFE_DL12_LCH1_MON: 2529 case AFE_DL12_RCH2_MON: 2530 case AFE_DL12_LCH2_MON: 2531 case AFE_DL3_RCH_MON: 2532 case AFE_DL3_LCH_MON: 2533 case AFE_DL4_RCH_MON: 2534 case AFE_DL4_LCH_MON: 2535 case AFE_DL5_RCH_MON: 2536 case AFE_DL5_LCH_MON: 2537 case AFE_DL6_RCH_MON: 2538 case AFE_DL6_LCH_MON: 2539 case AFE_DL7_RCH_MON: 2540 case AFE_DL7_LCH_MON: 2541 case AFE_DL8_RCH_MON: 2542 case AFE_DL8_LCH_MON: 2543 case AFE_VUL5_CUR_MSB: 2544 case AFE_VUL5_CUR: 2545 case AFE_VUL5_END: 2546 case AFE_VUL6_CUR_MSB: 2547 case AFE_VUL6_CUR: 2548 case AFE_VUL6_END: 2549 case AFE_ADDA_DL_SDM_FIFO_MON: 2550 case AFE_ADDA_DL_SRC_LCH_MON: 2551 case AFE_ADDA_DL_SRC_RCH_MON: 2552 case AFE_ADDA_DL_SDM_OUT_MON: 2553 case AFE_CONNSYS_I2S_MON: 2554 case AFE_ASRC_2CH_CON0: 2555 case AFE_ASRC_2CH_CON2: 2556 case AFE_ASRC_2CH_CON3: 2557 case AFE_ASRC_2CH_CON4: 2558 case AFE_ASRC_2CH_CON5: 2559 case AFE_ASRC_2CH_CON7: 2560 case AFE_ASRC_2CH_CON8: 2561 case AFE_ASRC_2CH_CON12: 2562 case AFE_ASRC_2CH_CON13: 2563 case AFE_ADDA_MTKAIF_MON0: 2564 case AFE_ADDA_MTKAIF_MON1: 2565 case AFE_AUD_PAD_TOP: 2566 case AFE_DL_NLE_R_MON0: 2567 case AFE_DL_NLE_R_MON1: 2568 case AFE_DL_NLE_R_MON2: 2569 case AFE_DL_NLE_L_MON0: 2570 case AFE_DL_NLE_L_MON1: 2571 case AFE_DL_NLE_L_MON2: 2572 case AFE_GENERAL1_ASRC_2CH_CON0: 2573 case AFE_GENERAL1_ASRC_2CH_CON2: 2574 case AFE_GENERAL1_ASRC_2CH_CON3: 2575 case AFE_GENERAL1_ASRC_2CH_CON4: 2576 case AFE_GENERAL1_ASRC_2CH_CON5: 2577 case AFE_GENERAL1_ASRC_2CH_CON7: 2578 case AFE_GENERAL1_ASRC_2CH_CON8: 2579 case AFE_GENERAL1_ASRC_2CH_CON12: 2580 case AFE_GENERAL1_ASRC_2CH_CON13: 2581 case AFE_GENERAL2_ASRC_2CH_CON0: 2582 case AFE_GENERAL2_ASRC_2CH_CON2: 2583 case AFE_GENERAL2_ASRC_2CH_CON3: 2584 case AFE_GENERAL2_ASRC_2CH_CON4: 2585 case AFE_GENERAL2_ASRC_2CH_CON5: 2586 case AFE_GENERAL2_ASRC_2CH_CON7: 2587 case AFE_GENERAL2_ASRC_2CH_CON8: 2588 case AFE_GENERAL2_ASRC_2CH_CON12: 2589 case AFE_GENERAL2_ASRC_2CH_CON13: 2590 case AFE_DL5_CUR_MSB: 2591 case AFE_DL5_CUR: 2592 case AFE_DL5_END: 2593 case AFE_DL6_CUR_MSB: 2594 case AFE_DL6_CUR: 2595 case AFE_DL6_END: 2596 case AFE_DL7_CUR_MSB: 2597 case AFE_DL7_CUR: 2598 case AFE_DL7_END: 2599 case AFE_DL8_CUR_MSB: 2600 case AFE_DL8_CUR: 2601 case AFE_DL8_END: 2602 case AFE_PROT_SIDEBAND_MON: 2603 case AFE_DOMAIN_SIDEBAND0_MON: 2604 case AFE_DOMAIN_SIDEBAND1_MON: 2605 case AFE_DOMAIN_SIDEBAND2_MON: 2606 case AFE_DOMAIN_SIDEBAND3_MON: 2607 case AFE_APLL1_TUNER_CFG: /* [20:31] is monitor */ 2608 case AFE_APLL2_TUNER_CFG: /* [20:31] is monitor */ 2609 return true; 2610 default: 2611 return false; 2612 }; 2613 } 2614 2615 static const struct regmap_config mt8186_afe_regmap_config = { 2616 .reg_bits = 32, 2617 .reg_stride = 4, 2618 .val_bits = 32, 2619 2620 .volatile_reg = mt8186_is_volatile_reg, 2621 2622 .max_register = AFE_MAX_REGISTER, 2623 .num_reg_defaults_raw = AFE_MAX_REGISTER, 2624 2625 .cache_type = REGCACHE_FLAT, 2626 }; 2627 2628 static irqreturn_t mt8186_afe_irq_handler(int irq_id, void *dev) 2629 { 2630 struct mtk_base_afe *afe = dev; 2631 struct mtk_base_afe_irq *irq; 2632 unsigned int status; 2633 unsigned int status_mcu; 2634 unsigned int mcu_en; 2635 int ret; 2636 int i; 2637 2638 /* get irq that is sent to MCU */ 2639 ret = regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en); 2640 if (ret) { 2641 dev_err(afe->dev, "%s, get irq direction fail, ret %d", __func__, ret); 2642 return ret; 2643 } 2644 2645 ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status); 2646 /* only care IRQ which is sent to MCU */ 2647 status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS; 2648 2649 if (ret || status_mcu == 0) { 2650 dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n", 2651 __func__, ret, status, mcu_en); 2652 2653 goto err_irq; 2654 } 2655 2656 for (i = 0; i < MT8186_MEMIF_NUM; i++) { 2657 struct mtk_base_afe_memif *memif = &afe->memif[i]; 2658 2659 if (!memif->substream) 2660 continue; 2661 2662 if (memif->irq_usage < 0) 2663 continue; 2664 2665 irq = &afe->irqs[memif->irq_usage]; 2666 2667 if (status_mcu & (1 << irq->irq_data->irq_en_shift)) 2668 snd_pcm_period_elapsed(memif->substream); 2669 } 2670 2671 err_irq: 2672 /* clear irq */ 2673 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, status_mcu); 2674 2675 return IRQ_HANDLED; 2676 } 2677 2678 static int mt8186_afe_runtime_suspend(struct device *dev) 2679 { 2680 struct mtk_base_afe *afe = dev_get_drvdata(dev); 2681 struct mt8186_afe_private *afe_priv = afe->platform_priv; 2682 unsigned int value = 0; 2683 int ret; 2684 2685 if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl) 2686 goto skip_regmap; 2687 2688 /* disable AFE */ 2689 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0); 2690 2691 ret = regmap_read_poll_timeout(afe->regmap, 2692 AFE_DAC_MON, 2693 value, 2694 (value & AFE_ON_RETM_MASK_SFT) == 0, 2695 20, 2696 1 * 1000 * 1000); 2697 if (ret) { 2698 dev_err(afe->dev, "%s(), ret %d\n", __func__, ret); 2699 return ret; 2700 } 2701 2702 /* make sure all irq status are cleared */ 2703 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff); 2704 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff); 2705 2706 /* reset sgen */ 2707 regmap_write(afe->regmap, AFE_SINEGEN_CON0, 0x0); 2708 regmap_update_bits(afe->regmap, AFE_SINEGEN_CON2, 2709 INNER_LOOP_BACK_MODE_MASK_SFT, 2710 0x3f << INNER_LOOP_BACK_MODE_SFT); 2711 2712 /* cache only */ 2713 regcache_cache_only(afe->regmap, true); 2714 regcache_mark_dirty(afe->regmap); 2715 2716 skip_regmap: 2717 mt8186_afe_disable_cgs(afe); 2718 mt8186_afe_disable_clock(afe); 2719 2720 return 0; 2721 } 2722 2723 static int mt8186_afe_runtime_resume(struct device *dev) 2724 { 2725 struct mtk_base_afe *afe = dev_get_drvdata(dev); 2726 struct mt8186_afe_private *afe_priv = afe->platform_priv; 2727 int ret; 2728 2729 ret = mt8186_afe_enable_clock(afe); 2730 if (ret) 2731 return ret; 2732 2733 ret = mt8186_afe_enable_cgs(afe); 2734 if (ret) 2735 return ret; 2736 2737 if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl) 2738 goto skip_regmap; 2739 2740 regcache_cache_only(afe->regmap, false); 2741 regcache_sync(afe->regmap); 2742 2743 /* enable audio sys DCM for power saving */ 2744 regmap_update_bits(afe_priv->infracfg, PERI_BUS_DCM_CTRL, BIT(29), BIT(29)); 2745 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0, BIT(29), BIT(29)); 2746 2747 /* force cpu use 8_24 format when writing 32bit data */ 2748 regmap_update_bits(afe->regmap, AFE_MEMIF_CON0, CPU_HD_ALIGN_MASK_SFT, 0); 2749 2750 /* set all output port to 24bit */ 2751 regmap_write(afe->regmap, AFE_CONN_24BIT, 0xffffffff); 2752 regmap_write(afe->regmap, AFE_CONN_24BIT_1, 0xffffffff); 2753 2754 /* enable AFE */ 2755 regmap_update_bits(afe->regmap, AFE_DAC_CON0, AUDIO_AFE_ON_MASK_SFT, BIT(0)); 2756 2757 skip_regmap: 2758 return 0; 2759 } 2760 2761 static int mt8186_afe_component_probe(struct snd_soc_component *component) 2762 { 2763 mtk_afe_add_sub_dai_control(component); 2764 mt8186_add_misc_control(component); 2765 2766 return 0; 2767 } 2768 2769 static const struct snd_soc_component_driver mt8186_afe_component = { 2770 .name = AFE_PCM_NAME, 2771 .pcm_construct = mtk_afe_pcm_new, 2772 .pointer = mtk_afe_pcm_pointer, 2773 .probe = mt8186_afe_component_probe, 2774 }; 2775 2776 static int mt8186_dai_memif_register(struct mtk_base_afe *afe) 2777 { 2778 struct mtk_base_afe_dai *dai; 2779 2780 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 2781 if (!dai) 2782 return -ENOMEM; 2783 2784 list_add(&dai->list, &afe->sub_dais); 2785 2786 dai->dai_drivers = mt8186_memif_dai_driver; 2787 dai->num_dai_drivers = ARRAY_SIZE(mt8186_memif_dai_driver); 2788 2789 dai->controls = mt8186_pcm_kcontrols; 2790 dai->num_controls = ARRAY_SIZE(mt8186_pcm_kcontrols); 2791 dai->dapm_widgets = mt8186_memif_widgets; 2792 dai->num_dapm_widgets = ARRAY_SIZE(mt8186_memif_widgets); 2793 dai->dapm_routes = mt8186_memif_routes; 2794 dai->num_dapm_routes = ARRAY_SIZE(mt8186_memif_routes); 2795 return 0; 2796 } 2797 2798 typedef int (*dai_register_cb)(struct mtk_base_afe *); 2799 static const dai_register_cb dai_register_cbs[] = { 2800 mt8186_dai_adda_register, 2801 mt8186_dai_i2s_register, 2802 mt8186_dai_tdm_register, 2803 mt8186_dai_hw_gain_register, 2804 mt8186_dai_src_register, 2805 mt8186_dai_pcm_register, 2806 mt8186_dai_hostless_register, 2807 mt8186_dai_memif_register, 2808 }; 2809 2810 static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev) 2811 { 2812 struct mtk_base_afe *afe; 2813 struct mt8186_afe_private *afe_priv; 2814 struct resource *res; 2815 struct reset_control *rstc; 2816 struct device *dev = &pdev->dev; 2817 int i, ret, irq_id; 2818 2819 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34)); 2820 if (ret) 2821 return ret; 2822 2823 afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL); 2824 if (!afe) 2825 return -ENOMEM; 2826 platform_set_drvdata(pdev, afe); 2827 2828 afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv), GFP_KERNEL); 2829 if (!afe->platform_priv) 2830 return -ENOMEM; 2831 2832 afe_priv = afe->platform_priv; 2833 afe->dev = &pdev->dev; 2834 2835 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2836 afe->base_addr = devm_ioremap_resource(dev, res); 2837 if (IS_ERR(afe->base_addr)) 2838 return PTR_ERR(afe->base_addr); 2839 2840 /* init audio related clock */ 2841 ret = mt8186_init_clock(afe); 2842 if (ret) { 2843 dev_err(dev, "init clock error, ret %d\n", ret); 2844 return ret; 2845 } 2846 2847 ret = devm_add_action_or_reset(dev, mt8186_deinit_clock, (void *)afe); 2848 if (ret) 2849 return ret; 2850 2851 /* init memif */ 2852 afe->memif_32bit_supported = 0; 2853 afe->memif_size = MT8186_MEMIF_NUM; 2854 afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif), GFP_KERNEL); 2855 if (!afe->memif) 2856 return -ENOMEM; 2857 2858 for (i = 0; i < afe->memif_size; i++) { 2859 afe->memif[i].data = &memif_data[i]; 2860 afe->memif[i].irq_usage = memif_irq_usage[i]; 2861 afe->memif[i].const_irq = 1; 2862 } 2863 2864 mutex_init(&afe->irq_alloc_lock); /* needed when dynamic irq */ 2865 2866 /* init irq */ 2867 afe->irqs_size = MT8186_IRQ_NUM; 2868 afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs), 2869 GFP_KERNEL); 2870 2871 if (!afe->irqs) 2872 return -ENOMEM; 2873 2874 for (i = 0; i < afe->irqs_size; i++) 2875 afe->irqs[i].irq_data = &irq_data[i]; 2876 2877 /* request irq */ 2878 irq_id = platform_get_irq(pdev, 0); 2879 if (irq_id <= 0) 2880 return dev_err_probe(dev, irq_id < 0 ? irq_id : -ENXIO, 2881 "no irq found"); 2882 2883 ret = devm_request_irq(dev, irq_id, mt8186_afe_irq_handler, 2884 IRQF_TRIGGER_NONE, 2885 "Afe_ISR_Handle", (void *)afe); 2886 if (ret) 2887 return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n"); 2888 2889 ret = enable_irq_wake(irq_id); 2890 if (ret < 0) 2891 return dev_err_probe(dev, ret, "enable_irq_wake %d\n", irq_id); 2892 2893 /* init sub_dais */ 2894 INIT_LIST_HEAD(&afe->sub_dais); 2895 2896 for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) { 2897 ret = dai_register_cbs[i](afe); 2898 if (ret) 2899 return dev_err_probe(dev, ret, "dai register i %d fail\n", i); 2900 } 2901 2902 /* init dai_driver and component_driver */ 2903 ret = mtk_afe_combine_sub_dai(afe); 2904 if (ret) 2905 return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n"); 2906 2907 /* reset controller to reset audio regs before regmap cache */ 2908 rstc = devm_reset_control_get_exclusive(dev, "audiosys"); 2909 if (IS_ERR(rstc)) 2910 return dev_err_probe(dev, PTR_ERR(rstc), "could not get audiosys reset\n"); 2911 2912 ret = reset_control_reset(rstc); 2913 if (ret) 2914 return dev_err_probe(dev, ret, "failed to trigger audio reset\n"); 2915 2916 /* enable clock for regcache get default value from hw */ 2917 afe_priv->pm_runtime_bypass_reg_ctl = true; 2918 2919 ret = devm_pm_runtime_enable(dev); 2920 if (ret) 2921 return ret; 2922 2923 ret = pm_runtime_resume_and_get(dev); 2924 if (ret) 2925 return dev_err_probe(dev, ret, "failed to resume device\n"); 2926 2927 afe->regmap = devm_regmap_init_mmio(dev, afe->base_addr, 2928 &mt8186_afe_regmap_config); 2929 if (IS_ERR(afe->regmap)) { 2930 ret = PTR_ERR(afe->regmap); 2931 goto err_pm_disable; 2932 } 2933 2934 /* others */ 2935 afe->mtk_afe_hardware = &mt8186_afe_hardware; 2936 afe->memif_fs = mt8186_memif_fs; 2937 afe->irq_fs = mt8186_irq_fs; 2938 afe->get_dai_fs = mt8186_get_dai_fs; 2939 afe->get_memif_pbuf_size = mt8186_get_memif_pbuf_size; 2940 2941 afe->runtime_resume = mt8186_afe_runtime_resume; 2942 afe->runtime_suspend = mt8186_afe_runtime_suspend; 2943 2944 /* register platform */ 2945 dev_dbg(dev, "%s(), devm_snd_soc_register_component\n", __func__); 2946 2947 ret = devm_snd_soc_register_component(dev, 2948 &mt8186_afe_component, 2949 afe->dai_drivers, 2950 afe->num_dai_drivers); 2951 if (ret) { 2952 dev_err(dev, "err_dai_component\n"); 2953 goto err_pm_disable; 2954 } 2955 2956 ret = pm_runtime_put_sync(dev); 2957 if (ret) { 2958 pm_runtime_get_noresume(dev); 2959 dev_err(dev, "failed to suspend device: %d\n", ret); 2960 goto err_pm_disable; 2961 } 2962 afe_priv->pm_runtime_bypass_reg_ctl = false; 2963 2964 regcache_cache_only(afe->regmap, true); 2965 regcache_mark_dirty(afe->regmap); 2966 2967 return 0; 2968 2969 err_pm_disable: 2970 pm_runtime_put_noidle(dev); 2971 pm_runtime_set_suspended(dev); 2972 2973 return ret; 2974 } 2975 2976 static const struct of_device_id mt8186_afe_pcm_dt_match[] = { 2977 { .compatible = "mediatek,mt8186-sound", }, 2978 {}, 2979 }; 2980 MODULE_DEVICE_TABLE(of, mt8186_afe_pcm_dt_match); 2981 2982 static const struct dev_pm_ops mt8186_afe_pm_ops = { 2983 SET_RUNTIME_PM_OPS(mt8186_afe_runtime_suspend, 2984 mt8186_afe_runtime_resume, NULL) 2985 }; 2986 2987 static struct platform_driver mt8186_afe_pcm_driver = { 2988 .driver = { 2989 .name = "mt8186-audio", 2990 .of_match_table = mt8186_afe_pcm_dt_match, 2991 .pm = &mt8186_afe_pm_ops, 2992 }, 2993 .probe = mt8186_afe_pcm_dev_probe, 2994 }; 2995 2996 module_platform_driver(mt8186_afe_pcm_driver); 2997 2998 MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8186"); 2999 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>"); 3000 MODULE_LICENSE("GPL v2"); 3001