2999 lines · c
1// SPDX-License-Identifier: GPL-2.02//3// Mediatek ALSA SoC AFE platform driver for 81864//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 25static 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 40static int mt8186_fe_startup(struct snd_pcm_substream *substream,41 struct snd_soc_dai *dai)42{43 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);44 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);45 struct snd_pcm_runtime *runtime = substream->runtime;46 int id = snd_soc_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 82static void mt8186_fe_shutdown(struct snd_pcm_substream *substream,83 struct snd_soc_dai *dai)84{85 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);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 = snd_soc_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 103static 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 = snd_soc_substream_to_rtd(substream);108 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);109 int id = snd_soc_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 138static 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 153static 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 = snd_soc_substream_to_rtd(substream);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 = snd_soc_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 record185 * ul memif need read some data before irq enable186 */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 else195 counter = runtime->period_size;196 197 regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,198 irq_data->irq_cnt_maskbit199 << 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_maskbit209 << 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 252static int mt8186_memif_fs(struct snd_pcm_substream *substream,253 unsigned int rate)254{255 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);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 = snd_soc_rtd_to_cpu(rtd, 0)->id;260 261 return mt8186_rate_transform(afe->dev, rate, id);262}263 264static 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 270static int mt8186_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)271{272 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);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 280static 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 290static int mt8186_fe_prepare(struct snd_pcm_substream *substream,291 struct snd_soc_dai *dai)292{293 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);294 struct snd_pcm_runtime * const runtime = substream->runtime;295 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);296 int id = snd_soc_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_maskbit312 << 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_maskbit323 << irq_data->irq_fs_shift,324 fs << irq_data->irq_fs_shift);325 326 return 0;327}328 329/* FE DAIs */330static 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 354static 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 */563static 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 576static 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_maskbit602 << 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 612static 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 625static 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_maskbit651 << 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 661static 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 674static 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 692static 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*/703static 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 714static 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 727static 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 738static 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 751static 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 778static 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 805static 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 814static 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 819static 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 826static 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 833static 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 838static 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 843static 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 864static 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 885static 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 894static 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 903static 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 908static 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 913static 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 942static 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 971static 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 1000static 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 1029static 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 1058static 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 1087static 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 1116static 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 1145static 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 1172static 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 1199static 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 1226static 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 */1254enum {1255 UL5_IN_MUX_CM1 = 0,1256 UL5_IN_MUX_NORMAL,1257 UL5_IN_MUX_MASK = 0x1,1258};1259 1260static const char * const ul5_in_mux_map[] = {1261 "UL5_IN_FROM_CM1", "UL5_IN_FROM_Normal"1262};1263 1264static int ul5_in_map_value[] = {1265 UL5_IN_MUX_CM1,1266 UL5_IN_MUX_NORMAL,1267};1268 1269static 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 1276static const struct snd_kcontrol_new ul5_in_mux_control =1277 SOC_DAPM_ENUM("UL5_IN_MUX Select", ul5_in_mux_map_enum);1278 1279static 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_MIXER("DSP_DL1_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),1363 SND_SOC_DAPM_MIXER("DSP_DL2_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),1364 1365 SND_SOC_DAPM_INPUT("UL1_VIRTUAL_INPUT"),1366 SND_SOC_DAPM_INPUT("UL2_VIRTUAL_INPUT"),1367 SND_SOC_DAPM_INPUT("UL3_VIRTUAL_INPUT"),1368 SND_SOC_DAPM_INPUT("UL4_VIRTUAL_INPUT"),1369 SND_SOC_DAPM_INPUT("UL5_VIRTUAL_INPUT"),1370 SND_SOC_DAPM_INPUT("UL6_VIRTUAL_INPUT"),1371};1372 1373static const struct snd_soc_dapm_route mt8186_memif_routes[] = {1374 {"UL1", NULL, "UL1_CH1"},1375 {"UL1", NULL, "UL1_CH2"},1376 {"UL1", NULL, "UL1_CH3"},1377 {"UL1", NULL, "UL1_CH4"},1378 {"UL1_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1379 {"UL1_CH1", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1380 {"UL1_CH2", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1381 {"UL1_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1382 {"UL1_CH3", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1383 {"UL1_CH3", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1384 {"UL1_CH4", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1385 {"UL1_CH4", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1386 {"UL1_CH1", "TDM_IN_CH1 Switch", "TDM IN"},1387 {"UL1_CH2", "TDM_IN_CH2 Switch", "TDM IN"},1388 {"UL1_CH3", "TDM_IN_CH3 Switch", "TDM IN"},1389 {"UL1_CH4", "TDM_IN_CH4 Switch", "TDM IN"},1390 1391 {"UL2", NULL, "UL2_CH1"},1392 {"UL2", NULL, "UL2_CH2"},1393 1394 /* cannot connect FE to FE directly */1395 {"UL2_CH1", "DL1_CH1 Switch", "Hostless_UL2 UL"},1396 {"UL2_CH2", "DL1_CH2 Switch", "Hostless_UL2 UL"},1397 {"UL2_CH1", "DL12_CH1 Switch", "Hostless_UL2 UL"},1398 {"UL2_CH2", "DL12_CH2 Switch", "Hostless_UL2 UL"},1399 {"UL2_CH1", "DL6_CH1 Switch", "Hostless_UL2 UL"},1400 {"UL2_CH2", "DL6_CH2 Switch", "Hostless_UL2 UL"},1401 {"UL2_CH1", "DL2_CH1 Switch", "Hostless_UL2 UL"},1402 {"UL2_CH2", "DL2_CH2 Switch", "Hostless_UL2 UL"},1403 {"UL2_CH1", "DL3_CH1 Switch", "Hostless_UL2 UL"},1404 {"UL2_CH2", "DL3_CH2 Switch", "Hostless_UL2 UL"},1405 {"UL2_CH1", "DL4_CH1 Switch", "Hostless_UL2 UL"},1406 {"UL2_CH2", "DL4_CH2 Switch", "Hostless_UL2 UL"},1407 {"UL2_CH1", "DL5_CH1 Switch", "Hostless_UL2 UL"},1408 {"UL2_CH2", "DL5_CH2 Switch", "Hostless_UL2 UL"},1409 1410 {"Hostless_UL2 UL", NULL, "UL2_VIRTUAL_INPUT"},1411 1412 {"UL2_CH1", "I2S0_CH1 Switch", "I2S0"},1413 {"UL2_CH2", "I2S0_CH2 Switch", "I2S0"},1414 {"UL2_CH1", "I2S2_CH1 Switch", "I2S2"},1415 {"UL2_CH2", "I2S2_CH2 Switch", "I2S2"},1416 1417 {"UL2_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"},1418 {"UL2_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"},1419 1420 {"UL2_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"},1421 {"UL2_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"},1422 1423 {"UL2_CH1", "SRC_1_OUT_CH1 Switch", "HW_SRC_1_Out"},1424 {"UL2_CH2", "SRC_1_OUT_CH2 Switch", "HW_SRC_1_Out"},1425 1426 {"UL3", NULL, "UL3_CH1"},1427 {"UL3", NULL, "UL3_CH2"},1428 {"UL3_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"},1429 {"UL3_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"},1430 1431 {"UL4", NULL, "UL4_CH1"},1432 {"UL4", NULL, "UL4_CH2"},1433 {"UL4_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1434 {"UL4_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1435 {"UL4_CH1", "I2S0_CH1 Switch", "I2S0"},1436 {"UL4_CH2", "I2S0_CH2 Switch", "I2S0"},1437 1438 {"UL5", NULL, "UL5_IN_MUX"},1439 {"UL5_IN_MUX", "UL5_IN_FROM_Normal", "UL5_2CH"},1440 {"UL5_IN_MUX", "UL5_IN_FROM_CM1", "HW_CM1"},1441 {"UL5_2CH", NULL, "UL5_CH1"},1442 {"UL5_2CH", NULL, "UL5_CH2"},1443 {"UL5_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1444 {"UL5_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1445 {"HW_CM1", NULL, "CM1_EN"},1446 {"HW_CM1", NULL, "HW_CM1_CH1"},1447 {"HW_CM1", NULL, "HW_CM1_CH2"},1448 {"HW_CM1", NULL, "HW_CM1_CH3"},1449 {"HW_CM1", NULL, "HW_CM1_CH4"},1450 {"HW_CM1", NULL, "HW_CM1_CH5"},1451 {"HW_CM1", NULL, "HW_CM1_CH6"},1452 {"HW_CM1", NULL, "HW_CM1_CH7"},1453 {"HW_CM1", NULL, "HW_CM1_CH8"},1454 {"HW_CM1", NULL, "HW_CM1_CH9"},1455 {"HW_CM1", NULL, "HW_CM1_CH10"},1456 {"HW_CM1", NULL, "HW_CM1_CH11"},1457 {"HW_CM1", NULL, "HW_CM1_CH12"},1458 {"HW_CM1_CH1", "TDM_IN_CH1 Switch", "TDM IN"},1459 {"HW_CM1_CH2", "TDM_IN_CH2 Switch", "TDM IN"},1460 {"HW_CM1_CH3", "TDM_IN_CH3 Switch", "TDM IN"},1461 {"HW_CM1_CH4", "TDM_IN_CH4 Switch", "TDM IN"},1462 {"HW_CM1_CH5", "TDM_IN_CH5 Switch", "TDM IN"},1463 {"HW_CM1_CH6", "TDM_IN_CH6 Switch", "TDM IN"},1464 {"HW_CM1_CH7", "TDM_IN_CH7 Switch", "TDM IN"},1465 {"HW_CM1_CH8", "TDM_IN_CH8 Switch", "TDM IN"},1466 {"HW_CM1_CH9", "DL1_CH1 Switch", "Hostless_UL5 UL"},1467 {"HW_CM1_CH10", "DL1_CH2 Switch", "Hostless_UL5 UL"},1468 1469 {"HW_CM1_CH3", "DL1_CH1 Switch", "Hostless_UL5 UL"},1470 {"HW_CM1_CH4", "DL1_CH2 Switch", "Hostless_UL5 UL"},1471 1472 {"HW_CM1_CH3", "DL3_CH1 Switch", "Hostless_UL5 UL"},1473 {"HW_CM1_CH4", "DL3_CH2 Switch", "Hostless_UL5 UL"},1474 1475 {"HW_CM1_CH5", "HW_SRC1_OUT_CH1 Switch", "HW_SRC_1_Out"},1476 {"HW_CM1_CH6", "HW_SRC1_OUT_CH2 Switch", "HW_SRC_1_Out"},1477 1478 {"HW_CM1_CH9", "DL12_CH1 Switch", "Hostless_UL5 UL"},1479 {"HW_CM1_CH10", "DL12_CH2 Switch", "Hostless_UL5 UL"},1480 {"HW_CM1_CH11", "DL12_CH3 Switch", "Hostless_UL5 UL"},1481 {"HW_CM1_CH12", "DL12_CH4 Switch", "Hostless_UL5 UL"},1482 1483 {"Hostless_UL5 UL", NULL, "UL5_VIRTUAL_INPUT"},1484 1485 {"UL6", NULL, "UL6_CH1"},1486 {"UL6", NULL, "UL6_CH2"},1487 1488 {"UL6_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1489 {"UL6_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1490 {"UL6_CH1", "DL1_CH1 Switch", "Hostless_UL6 UL"},1491 {"UL6_CH2", "DL1_CH2 Switch", "Hostless_UL6 UL"},1492 {"UL6_CH1", "DL2_CH1 Switch", "Hostless_UL6 UL"},1493 {"UL6_CH2", "DL2_CH2 Switch", "Hostless_UL6 UL"},1494 {"UL6_CH1", "DL12_CH1 Switch", "Hostless_UL6 UL"},1495 {"UL6_CH2", "DL12_CH2 Switch", "Hostless_UL6 UL"},1496 {"UL6_CH1", "DL6_CH1 Switch", "Hostless_UL6 UL"},1497 {"UL6_CH2", "DL6_CH2 Switch", "Hostless_UL6 UL"},1498 {"UL6_CH1", "DL3_CH1 Switch", "Hostless_UL6 UL"},1499 {"UL6_CH2", "DL3_CH2 Switch", "Hostless_UL6 UL"},1500 {"UL6_CH1", "DL4_CH1 Switch", "Hostless_UL6 UL"},1501 {"UL6_CH2", "DL4_CH2 Switch", "Hostless_UL6 UL"},1502 {"Hostless_UL6 UL", NULL, "UL6_VIRTUAL_INPUT"},1503 {"UL6_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"},1504 {"UL6_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"},1505 {"UL6_CH1", "GAIN1_OUT_CH1 Switch", "HW Gain 1 Out"},1506 {"UL6_CH2", "GAIN1_OUT_CH2 Switch", "HW Gain 1 Out"},1507 1508 {"UL7", NULL, "UL7_CH1"},1509 {"UL7", NULL, "UL7_CH2"},1510 {"UL7_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1511 {"UL7_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1512 {"UL7_CH1", "HW_GAIN2_OUT_CH1 Switch", "HW Gain 2 Out"},1513 {"UL7_CH2", "HW_GAIN2_OUT_CH2 Switch", "HW Gain 2 Out"},1514 {"UL7_CH1", "HW_SRC_2_OUT_CH1 Switch", "HW_SRC_2_Out"},1515 {"UL7_CH2", "HW_SRC_2_OUT_CH2 Switch", "HW_SRC_2_Out"},1516 1517 {"UL8", NULL, "UL8_CH1"},1518 {"UL8", NULL, "UL8_CH2"},1519 {"UL8_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1520 {"UL8_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1521 1522 {"HW_GAIN2_IN_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1523 {"HW_GAIN2_IN_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1524};1525 1526static const struct mtk_base_memif_data memif_data[MT8186_MEMIF_NUM] = {1527 [MT8186_MEMIF_DL1] = {1528 .name = "DL1",1529 .id = MT8186_MEMIF_DL1,1530 .reg_ofs_base = AFE_DL1_BASE,1531 .reg_ofs_cur = AFE_DL1_CUR,1532 .reg_ofs_end = AFE_DL1_END,1533 .reg_ofs_base_msb = AFE_DL1_BASE_MSB,1534 .reg_ofs_cur_msb = AFE_DL1_CUR_MSB,1535 .reg_ofs_end_msb = AFE_DL1_END_MSB,1536 .fs_reg = AFE_DL1_CON0,1537 .fs_shift = DL1_MODE_SFT,1538 .fs_maskbit = DL1_MODE_MASK,1539 .mono_reg = AFE_DL1_CON0,1540 .mono_shift = DL1_MONO_SFT,1541 .enable_reg = AFE_DAC_CON0,1542 .enable_shift = DL1_ON_SFT,1543 .hd_reg = AFE_DL1_CON0,1544 .hd_shift = DL1_HD_MODE_SFT,1545 .hd_align_reg = AFE_DL1_CON0,1546 .hd_align_mshift = DL1_HALIGN_SFT,1547 .agent_disable_reg = -1,1548 .agent_disable_shift = -1,1549 .msb_reg = -1,1550 .msb_shift = -1,1551 .pbuf_reg = AFE_DL1_CON0,1552 .pbuf_mask = DL1_PBUF_SIZE_MASK,1553 .pbuf_shift = DL1_PBUF_SIZE_SFT,1554 .minlen_reg = AFE_DL1_CON0,1555 .minlen_mask = DL1_MINLEN_MASK,1556 .minlen_shift = DL1_MINLEN_SFT,1557 },1558 [MT8186_MEMIF_DL12] = {1559 .name = "DL12",1560 .id = MT8186_MEMIF_DL12,1561 .reg_ofs_base = AFE_DL12_BASE,1562 .reg_ofs_cur = AFE_DL12_CUR,1563 .reg_ofs_end = AFE_DL12_END,1564 .reg_ofs_base_msb = AFE_DL12_BASE_MSB,1565 .reg_ofs_cur_msb = AFE_DL12_CUR_MSB,1566 .reg_ofs_end_msb = AFE_DL12_END_MSB,1567 .fs_reg = AFE_DL12_CON0,1568 .fs_shift = DL12_MODE_SFT,1569 .fs_maskbit = DL12_MODE_MASK,1570 .mono_reg = AFE_DL12_CON0,1571 .mono_shift = DL12_MONO_SFT,1572 .quad_ch_reg = AFE_DL12_CON0,1573 .quad_ch_mask = DL12_4CH_EN_MASK,1574 .quad_ch_shift = DL12_4CH_EN_SFT,1575 .enable_reg = AFE_DAC_CON0,1576 .enable_shift = DL12_ON_SFT,1577 .hd_reg = AFE_DL12_CON0,1578 .hd_shift = DL12_HD_MODE_SFT,1579 .hd_align_reg = AFE_DL12_CON0,1580 .hd_align_mshift = DL12_HALIGN_SFT,1581 .agent_disable_reg = -1,1582 .agent_disable_shift = -1,1583 .msb_reg = -1,1584 .msb_shift = -1,1585 .pbuf_reg = AFE_DL12_CON0,1586 .pbuf_mask = DL12_PBUF_SIZE_MASK,1587 .pbuf_shift = DL12_PBUF_SIZE_SFT,1588 .minlen_reg = AFE_DL12_CON0,1589 .minlen_mask = DL12_MINLEN_MASK,1590 .minlen_shift = DL12_MINLEN_SFT,1591 },1592 [MT8186_MEMIF_DL2] = {1593 .name = "DL2",1594 .id = MT8186_MEMIF_DL2,1595 .reg_ofs_base = AFE_DL2_BASE,1596 .reg_ofs_cur = AFE_DL2_CUR,1597 .reg_ofs_end = AFE_DL2_END,1598 .reg_ofs_base_msb = AFE_DL2_BASE_MSB,1599 .reg_ofs_cur_msb = AFE_DL2_CUR_MSB,1600 .reg_ofs_end_msb = AFE_DL2_END_MSB,1601 .fs_reg = AFE_DL2_CON0,1602 .fs_shift = DL2_MODE_SFT,1603 .fs_maskbit = DL2_MODE_MASK,1604 .mono_reg = AFE_DL2_CON0,1605 .mono_shift = DL2_MONO_SFT,1606 .enable_reg = AFE_DAC_CON0,1607 .enable_shift = DL2_ON_SFT,1608 .hd_reg = AFE_DL2_CON0,1609 .hd_shift = DL2_HD_MODE_SFT,1610 .hd_align_reg = AFE_DL2_CON0,1611 .hd_align_mshift = DL2_HALIGN_SFT,1612 .agent_disable_reg = -1,1613 .agent_disable_shift = -1,1614 .msb_reg = -1,1615 .msb_shift = -1,1616 .pbuf_reg = AFE_DL2_CON0,1617 .pbuf_mask = DL2_PBUF_SIZE_MASK,1618 .pbuf_shift = DL2_PBUF_SIZE_SFT,1619 .minlen_reg = AFE_DL2_CON0,1620 .minlen_mask = DL2_MINLEN_MASK,1621 .minlen_shift = DL2_MINLEN_SFT,1622 },1623 [MT8186_MEMIF_DL3] = {1624 .name = "DL3",1625 .id = MT8186_MEMIF_DL3,1626 .reg_ofs_base = AFE_DL3_BASE,1627 .reg_ofs_cur = AFE_DL3_CUR,1628 .reg_ofs_end = AFE_DL3_END,1629 .reg_ofs_base_msb = AFE_DL3_BASE_MSB,1630 .reg_ofs_cur_msb = AFE_DL3_CUR_MSB,1631 .reg_ofs_end_msb = AFE_DL3_END_MSB,1632 .fs_reg = AFE_DL3_CON0,1633 .fs_shift = DL3_MODE_SFT,1634 .fs_maskbit = DL3_MODE_MASK,1635 .mono_reg = AFE_DL3_CON0,1636 .mono_shift = DL3_MONO_SFT,1637 .enable_reg = AFE_DAC_CON0,1638 .enable_shift = DL3_ON_SFT,1639 .hd_reg = AFE_DL3_CON0,1640 .hd_shift = DL3_HD_MODE_SFT,1641 .hd_align_reg = AFE_DL3_CON0,1642 .hd_align_mshift = DL3_HALIGN_SFT,1643 .agent_disable_reg = -1,1644 .agent_disable_shift = -1,1645 .msb_reg = -1,1646 .msb_shift = -1,1647 .pbuf_reg = AFE_DL3_CON0,1648 .pbuf_mask = DL3_PBUF_SIZE_MASK,1649 .pbuf_shift = DL3_PBUF_SIZE_SFT,1650 .minlen_reg = AFE_DL3_CON0,1651 .minlen_mask = DL3_MINLEN_MASK,1652 .minlen_shift = DL3_MINLEN_SFT,1653 },1654 [MT8186_MEMIF_DL4] = {1655 .name = "DL4",1656 .id = MT8186_MEMIF_DL4,1657 .reg_ofs_base = AFE_DL4_BASE,1658 .reg_ofs_cur = AFE_DL4_CUR,1659 .reg_ofs_end = AFE_DL4_END,1660 .reg_ofs_base_msb = AFE_DL4_BASE_MSB,1661 .reg_ofs_cur_msb = AFE_DL4_CUR_MSB,1662 .reg_ofs_end_msb = AFE_DL4_END_MSB,1663 .fs_reg = AFE_DL4_CON0,1664 .fs_shift = DL4_MODE_SFT,1665 .fs_maskbit = DL4_MODE_MASK,1666 .mono_reg = AFE_DL4_CON0,1667 .mono_shift = DL4_MONO_SFT,1668 .enable_reg = AFE_DAC_CON0,1669 .enable_shift = DL4_ON_SFT,1670 .hd_reg = AFE_DL4_CON0,1671 .hd_shift = DL4_HD_MODE_SFT,1672 .hd_align_reg = AFE_DL4_CON0,1673 .hd_align_mshift = DL4_HALIGN_SFT,1674 .agent_disable_reg = -1,1675 .agent_disable_shift = -1,1676 .msb_reg = -1,1677 .msb_shift = -1,1678 .pbuf_reg = AFE_DL4_CON0,1679 .pbuf_mask = DL4_PBUF_SIZE_MASK,1680 .pbuf_shift = DL4_PBUF_SIZE_SFT,1681 .minlen_reg = AFE_DL4_CON0,1682 .minlen_mask = DL4_MINLEN_MASK,1683 .minlen_shift = DL4_MINLEN_SFT,1684 },1685 [MT8186_MEMIF_DL5] = {1686 .name = "DL5",1687 .id = MT8186_MEMIF_DL5,1688 .reg_ofs_base = AFE_DL5_BASE,1689 .reg_ofs_cur = AFE_DL5_CUR,1690 .reg_ofs_end = AFE_DL5_END,1691 .reg_ofs_base_msb = AFE_DL5_BASE_MSB,1692 .reg_ofs_cur_msb = AFE_DL5_CUR_MSB,1693 .reg_ofs_end_msb = AFE_DL5_END_MSB,1694 .fs_reg = AFE_DL5_CON0,1695 .fs_shift = DL5_MODE_SFT,1696 .fs_maskbit = DL5_MODE_MASK,1697 .mono_reg = AFE_DL5_CON0,1698 .mono_shift = DL5_MONO_SFT,1699 .enable_reg = AFE_DAC_CON0,1700 .enable_shift = DL5_ON_SFT,1701 .hd_reg = AFE_DL5_CON0,1702 .hd_shift = DL5_HD_MODE_SFT,1703 .hd_align_reg = AFE_DL5_CON0,1704 .hd_align_mshift = DL5_HALIGN_SFT,1705 .agent_disable_reg = -1,1706 .agent_disable_shift = -1,1707 .msb_reg = -1,1708 .msb_shift = -1,1709 .pbuf_reg = AFE_DL5_CON0,1710 .pbuf_mask = DL5_PBUF_SIZE_MASK,1711 .pbuf_shift = DL5_PBUF_SIZE_SFT,1712 .minlen_reg = AFE_DL5_CON0,1713 .minlen_mask = DL5_MINLEN_MASK,1714 .minlen_shift = DL5_MINLEN_SFT,1715 },1716 [MT8186_MEMIF_DL6] = {1717 .name = "DL6",1718 .id = MT8186_MEMIF_DL6,1719 .reg_ofs_base = AFE_DL6_BASE,1720 .reg_ofs_cur = AFE_DL6_CUR,1721 .reg_ofs_end = AFE_DL6_END,1722 .reg_ofs_base_msb = AFE_DL6_BASE_MSB,1723 .reg_ofs_cur_msb = AFE_DL6_CUR_MSB,1724 .reg_ofs_end_msb = AFE_DL6_END_MSB,1725 .fs_reg = AFE_DL6_CON0,1726 .fs_shift = DL6_MODE_SFT,1727 .fs_maskbit = DL6_MODE_MASK,1728 .mono_reg = AFE_DL6_CON0,1729 .mono_shift = DL6_MONO_SFT,1730 .enable_reg = AFE_DAC_CON0,1731 .enable_shift = DL6_ON_SFT,1732 .hd_reg = AFE_DL6_CON0,1733 .hd_shift = DL6_HD_MODE_SFT,1734 .hd_align_reg = AFE_DL6_CON0,1735 .hd_align_mshift = DL6_HALIGN_SFT,1736 .agent_disable_reg = -1,1737 .agent_disable_shift = -1,1738 .msb_reg = -1,1739 .msb_shift = -1,1740 .pbuf_reg = AFE_DL6_CON0,1741 .pbuf_mask = DL6_PBUF_SIZE_MASK,1742 .pbuf_shift = DL6_PBUF_SIZE_SFT,1743 .minlen_reg = AFE_DL6_CON0,1744 .minlen_mask = DL6_MINLEN_MASK,1745 .minlen_shift = DL6_MINLEN_SFT,1746 },1747 [MT8186_MEMIF_DL7] = {1748 .name = "DL7",1749 .id = MT8186_MEMIF_DL7,1750 .reg_ofs_base = AFE_DL7_BASE,1751 .reg_ofs_cur = AFE_DL7_CUR,1752 .reg_ofs_end = AFE_DL7_END,1753 .reg_ofs_base_msb = AFE_DL7_BASE_MSB,1754 .reg_ofs_cur_msb = AFE_DL7_CUR_MSB,1755 .reg_ofs_end_msb = AFE_DL7_END_MSB,1756 .fs_reg = AFE_DL7_CON0,1757 .fs_shift = DL7_MODE_SFT,1758 .fs_maskbit = DL7_MODE_MASK,1759 .mono_reg = AFE_DL7_CON0,1760 .mono_shift = DL7_MONO_SFT,1761 .enable_reg = AFE_DAC_CON0,1762 .enable_shift = DL7_ON_SFT,1763 .hd_reg = AFE_DL7_CON0,1764 .hd_shift = DL7_HD_MODE_SFT,1765 .hd_align_reg = AFE_DL7_CON0,1766 .hd_align_mshift = DL7_HALIGN_SFT,1767 .agent_disable_reg = -1,1768 .agent_disable_shift = -1,1769 .msb_reg = -1,1770 .msb_shift = -1,1771 .pbuf_reg = AFE_DL7_CON0,1772 .pbuf_mask = DL7_PBUF_SIZE_MASK,1773 .pbuf_shift = DL7_PBUF_SIZE_SFT,1774 .minlen_reg = AFE_DL7_CON0,1775 .minlen_mask = DL7_MINLEN_MASK,1776 .minlen_shift = DL7_MINLEN_SFT,1777 },1778 [MT8186_MEMIF_DL8] = {1779 .name = "DL8",1780 .id = MT8186_MEMIF_DL8,1781 .reg_ofs_base = AFE_DL8_BASE,1782 .reg_ofs_cur = AFE_DL8_CUR,1783 .reg_ofs_end = AFE_DL8_END,1784 .reg_ofs_base_msb = AFE_DL8_BASE_MSB,1785 .reg_ofs_cur_msb = AFE_DL8_CUR_MSB,1786 .reg_ofs_end_msb = AFE_DL8_END_MSB,1787 .fs_reg = AFE_DL8_CON0,1788 .fs_shift = DL8_MODE_SFT,1789 .fs_maskbit = DL8_MODE_MASK,1790 .mono_reg = AFE_DL8_CON0,1791 .mono_shift = DL8_MONO_SFT,1792 .enable_reg = AFE_DAC_CON0,1793 .enable_shift = DL8_ON_SFT,1794 .hd_reg = AFE_DL8_CON0,1795 .hd_shift = DL8_HD_MODE_SFT,1796 .hd_align_reg = AFE_DL8_CON0,1797 .hd_align_mshift = DL8_HALIGN_SFT,1798 .agent_disable_reg = -1,1799 .agent_disable_shift = -1,1800 .msb_reg = -1,1801 .msb_shift = -1,1802 .pbuf_reg = AFE_DL8_CON0,1803 .pbuf_mask = DL8_PBUF_SIZE_MASK,1804 .pbuf_shift = DL8_PBUF_SIZE_SFT,1805 .minlen_reg = AFE_DL8_CON0,1806 .minlen_mask = DL8_MINLEN_MASK,1807 .minlen_shift = DL8_MINLEN_SFT,1808 },1809 [MT8186_MEMIF_VUL12] = {1810 .name = "VUL12",1811 .id = MT8186_MEMIF_VUL12,1812 .reg_ofs_base = AFE_VUL12_BASE,1813 .reg_ofs_cur = AFE_VUL12_CUR,1814 .reg_ofs_end = AFE_VUL12_END,1815 .reg_ofs_base_msb = AFE_VUL12_BASE_MSB,1816 .reg_ofs_cur_msb = AFE_VUL12_CUR_MSB,1817 .reg_ofs_end_msb = AFE_VUL12_END_MSB,1818 .fs_reg = AFE_VUL12_CON0,1819 .fs_shift = VUL12_MODE_SFT,1820 .fs_maskbit = VUL12_MODE_MASK,1821 .mono_reg = AFE_VUL12_CON0,1822 .mono_shift = VUL12_MONO_SFT,1823 .quad_ch_reg = AFE_VUL12_CON0,1824 .quad_ch_mask = VUL12_4CH_EN_MASK,1825 .quad_ch_shift = VUL12_4CH_EN_SFT,1826 .enable_reg = AFE_DAC_CON0,1827 .enable_shift = VUL12_ON_SFT,1828 .hd_reg = AFE_VUL12_CON0,1829 .hd_shift = VUL12_HD_MODE_SFT,1830 .hd_align_reg = AFE_VUL12_CON0,1831 .hd_align_mshift = VUL12_HALIGN_SFT,1832 .agent_disable_reg = -1,1833 .agent_disable_shift = -1,1834 .msb_reg = -1,1835 .msb_shift = -1,1836 },1837 [MT8186_MEMIF_VUL2] = {1838 .name = "VUL2",1839 .id = MT8186_MEMIF_VUL2,1840 .reg_ofs_base = AFE_VUL2_BASE,1841 .reg_ofs_cur = AFE_VUL2_CUR,1842 .reg_ofs_end = AFE_VUL2_END,1843 .reg_ofs_base_msb = AFE_VUL2_BASE_MSB,1844 .reg_ofs_cur_msb = AFE_VUL2_CUR_MSB,1845 .reg_ofs_end_msb = AFE_VUL2_END_MSB,1846 .fs_reg = AFE_VUL2_CON0,1847 .fs_shift = VUL2_MODE_SFT,1848 .fs_maskbit = VUL2_MODE_MASK,1849 .mono_reg = AFE_VUL2_CON0,1850 .mono_shift = VUL2_MONO_SFT,1851 .enable_reg = AFE_DAC_CON0,1852 .enable_shift = VUL2_ON_SFT,1853 .hd_reg = AFE_VUL2_CON0,1854 .hd_shift = VUL2_HD_MODE_SFT,1855 .hd_align_reg = AFE_VUL2_CON0,1856 .hd_align_mshift = VUL2_HALIGN_SFT,1857 .agent_disable_reg = -1,1858 .agent_disable_shift = -1,1859 .msb_reg = -1,1860 .msb_shift = -1,1861 },1862 [MT8186_MEMIF_AWB] = {1863 .name = "AWB",1864 .id = MT8186_MEMIF_AWB,1865 .reg_ofs_base = AFE_AWB_BASE,1866 .reg_ofs_cur = AFE_AWB_CUR,1867 .reg_ofs_end = AFE_AWB_END,1868 .reg_ofs_base_msb = AFE_AWB_BASE_MSB,1869 .reg_ofs_cur_msb = AFE_AWB_CUR_MSB,1870 .reg_ofs_end_msb = AFE_AWB_END_MSB,1871 .fs_reg = AFE_AWB_CON0,1872 .fs_shift = AWB_MODE_SFT,1873 .fs_maskbit = AWB_MODE_MASK,1874 .mono_reg = AFE_AWB_CON0,1875 .mono_shift = AWB_MONO_SFT,1876 .enable_reg = AFE_DAC_CON0,1877 .enable_shift = AWB_ON_SFT,1878 .hd_reg = AFE_AWB_CON0,1879 .hd_shift = AWB_HD_MODE_SFT,1880 .hd_align_reg = AFE_AWB_CON0,1881 .hd_align_mshift = AWB_HALIGN_SFT,1882 .agent_disable_reg = -1,1883 .agent_disable_shift = -1,1884 .msb_reg = -1,1885 .msb_shift = -1,1886 },1887 [MT8186_MEMIF_AWB2] = {1888 .name = "AWB2",1889 .id = MT8186_MEMIF_AWB2,1890 .reg_ofs_base = AFE_AWB2_BASE,1891 .reg_ofs_cur = AFE_AWB2_CUR,1892 .reg_ofs_end = AFE_AWB2_END,1893 .reg_ofs_base_msb = AFE_AWB2_BASE_MSB,1894 .reg_ofs_cur_msb = AFE_AWB2_CUR_MSB,1895 .reg_ofs_end_msb = AFE_AWB2_END_MSB,1896 .fs_reg = AFE_AWB2_CON0,1897 .fs_shift = AWB2_MODE_SFT,1898 .fs_maskbit = AWB2_MODE_MASK,1899 .mono_reg = AFE_AWB2_CON0,1900 .mono_shift = AWB2_MONO_SFT,1901 .enable_reg = AFE_DAC_CON0,1902 .enable_shift = AWB2_ON_SFT,1903 .hd_reg = AFE_AWB2_CON0,1904 .hd_shift = AWB2_HD_MODE_SFT,1905 .hd_align_reg = AFE_AWB2_CON0,1906 .hd_align_mshift = AWB2_HALIGN_SFT,1907 .agent_disable_reg = -1,1908 .agent_disable_shift = -1,1909 .msb_reg = -1,1910 .msb_shift = -1,1911 },1912 [MT8186_MEMIF_VUL3] = {1913 .name = "VUL3",1914 .id = MT8186_MEMIF_VUL3,1915 .reg_ofs_base = AFE_VUL3_BASE,1916 .reg_ofs_cur = AFE_VUL3_CUR,1917 .reg_ofs_end = AFE_VUL3_END,1918 .reg_ofs_base_msb = AFE_VUL3_BASE_MSB,1919 .reg_ofs_cur_msb = AFE_VUL3_CUR_MSB,1920 .reg_ofs_end_msb = AFE_VUL3_END_MSB,1921 .fs_reg = AFE_VUL3_CON0,1922 .fs_shift = VUL3_MODE_SFT,1923 .fs_maskbit = VUL3_MODE_MASK,1924 .mono_reg = AFE_VUL3_CON0,1925 .mono_shift = VUL3_MONO_SFT,1926 .enable_reg = AFE_DAC_CON0,1927 .enable_shift = VUL3_ON_SFT,1928 .hd_reg = AFE_VUL3_CON0,1929 .hd_shift = VUL3_HD_MODE_SFT,1930 .hd_align_reg = AFE_VUL3_CON0,1931 .hd_align_mshift = VUL3_HALIGN_SFT,1932 .agent_disable_reg = -1,1933 .agent_disable_shift = -1,1934 .msb_reg = -1,1935 .msb_shift = -1,1936 },1937 [MT8186_MEMIF_VUL4] = {1938 .name = "VUL4",1939 .id = MT8186_MEMIF_VUL4,1940 .reg_ofs_base = AFE_VUL4_BASE,1941 .reg_ofs_cur = AFE_VUL4_CUR,1942 .reg_ofs_end = AFE_VUL4_END,1943 .reg_ofs_base_msb = AFE_VUL4_BASE_MSB,1944 .reg_ofs_cur_msb = AFE_VUL4_CUR_MSB,1945 .reg_ofs_end_msb = AFE_VUL4_END_MSB,1946 .fs_reg = AFE_VUL4_CON0,1947 .fs_shift = VUL4_MODE_SFT,1948 .fs_maskbit = VUL4_MODE_MASK,1949 .mono_reg = AFE_VUL4_CON0,1950 .mono_shift = VUL4_MONO_SFT,1951 .enable_reg = AFE_DAC_CON0,1952 .enable_shift = VUL4_ON_SFT,1953 .hd_reg = AFE_VUL4_CON0,1954 .hd_shift = VUL4_HD_MODE_SFT,1955 .hd_align_reg = AFE_VUL4_CON0,1956 .hd_align_mshift = VUL4_HALIGN_SFT,1957 .agent_disable_reg = -1,1958 .agent_disable_shift = -1,1959 .msb_reg = -1,1960 .msb_shift = -1,1961 },1962 [MT8186_MEMIF_VUL5] = {1963 .name = "VUL5",1964 .id = MT8186_MEMIF_VUL5,1965 .reg_ofs_base = AFE_VUL5_BASE,1966 .reg_ofs_cur = AFE_VUL5_CUR,1967 .reg_ofs_end = AFE_VUL5_END,1968 .reg_ofs_base_msb = AFE_VUL5_BASE_MSB,1969 .reg_ofs_cur_msb = AFE_VUL5_CUR_MSB,1970 .reg_ofs_end_msb = AFE_VUL5_END_MSB,1971 .fs_reg = AFE_VUL5_CON0,1972 .fs_shift = VUL5_MODE_SFT,1973 .fs_maskbit = VUL5_MODE_MASK,1974 .mono_reg = AFE_VUL5_CON0,1975 .mono_shift = VUL5_MONO_SFT,1976 .enable_reg = AFE_DAC_CON0,1977 .enable_shift = VUL5_ON_SFT,1978 .hd_reg = AFE_VUL5_CON0,1979 .hd_shift = VUL5_HD_MODE_SFT,1980 .hd_align_reg = AFE_VUL5_CON0,1981 .hd_align_mshift = VUL5_HALIGN_SFT,1982 .agent_disable_reg = -1,1983 .agent_disable_shift = -1,1984 .msb_reg = -1,1985 .msb_shift = -1,1986 },1987 [MT8186_MEMIF_VUL6] = {1988 .name = "VUL6",1989 .id = MT8186_MEMIF_VUL6,1990 .reg_ofs_base = AFE_VUL6_BASE,1991 .reg_ofs_cur = AFE_VUL6_CUR,1992 .reg_ofs_end = AFE_VUL6_END,1993 .reg_ofs_base_msb = AFE_VUL6_BASE_MSB,1994 .reg_ofs_cur_msb = AFE_VUL6_CUR_MSB,1995 .reg_ofs_end_msb = AFE_VUL6_END_MSB,1996 .fs_reg = AFE_VUL6_CON0,1997 .fs_shift = VUL6_MODE_SFT,1998 .fs_maskbit = VUL6_MODE_MASK,1999 .mono_reg = AFE_VUL6_CON0,2000 .mono_shift = VUL6_MONO_SFT,2001 .enable_reg = AFE_DAC_CON0,2002 .enable_shift = VUL6_ON_SFT,2003 .hd_reg = AFE_VUL6_CON0,2004 .hd_shift = VUL6_HD_MODE_SFT,2005 .hd_align_reg = AFE_VUL6_CON0,2006 .hd_align_mshift = VUL6_HALIGN_SFT,2007 .agent_disable_reg = -1,2008 .agent_disable_shift = -1,2009 .msb_reg = -1,2010 .msb_shift = -1,2011 },2012};2013 2014static const struct mtk_base_irq_data irq_data[MT8186_IRQ_NUM] = {2015 [MT8186_IRQ_0] = {2016 .id = MT8186_IRQ_0,2017 .irq_cnt_reg = AFE_IRQ_MCU_CNT0,2018 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2019 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2020 .irq_fs_reg = AFE_IRQ_MCU_CON1,2021 .irq_fs_shift = IRQ0_MCU_MODE_SFT,2022 .irq_fs_maskbit = IRQ0_MCU_MODE_MASK,2023 .irq_en_reg = AFE_IRQ_MCU_CON0,2024 .irq_en_shift = IRQ0_MCU_ON_SFT,2025 .irq_clr_reg = AFE_IRQ_MCU_CLR,2026 .irq_clr_shift = IRQ0_MCU_CLR_SFT,2027 },2028 [MT8186_IRQ_1] = {2029 .id = MT8186_IRQ_1,2030 .irq_cnt_reg = AFE_IRQ_MCU_CNT1,2031 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2032 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2033 .irq_fs_reg = AFE_IRQ_MCU_CON1,2034 .irq_fs_shift = IRQ1_MCU_MODE_SFT,2035 .irq_fs_maskbit = IRQ1_MCU_MODE_MASK,2036 .irq_en_reg = AFE_IRQ_MCU_CON0,2037 .irq_en_shift = IRQ1_MCU_ON_SFT,2038 .irq_clr_reg = AFE_IRQ_MCU_CLR,2039 .irq_clr_shift = IRQ1_MCU_CLR_SFT,2040 },2041 [MT8186_IRQ_2] = {2042 .id = MT8186_IRQ_2,2043 .irq_cnt_reg = AFE_IRQ_MCU_CNT2,2044 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2045 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2046 .irq_fs_reg = AFE_IRQ_MCU_CON1,2047 .irq_fs_shift = IRQ2_MCU_MODE_SFT,2048 .irq_fs_maskbit = IRQ2_MCU_MODE_MASK,2049 .irq_en_reg = AFE_IRQ_MCU_CON0,2050 .irq_en_shift = IRQ2_MCU_ON_SFT,2051 .irq_clr_reg = AFE_IRQ_MCU_CLR,2052 .irq_clr_shift = IRQ2_MCU_CLR_SFT,2053 },2054 [MT8186_IRQ_3] = {2055 .id = MT8186_IRQ_3,2056 .irq_cnt_reg = AFE_IRQ_MCU_CNT3,2057 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2058 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2059 .irq_fs_reg = AFE_IRQ_MCU_CON1,2060 .irq_fs_shift = IRQ3_MCU_MODE_SFT,2061 .irq_fs_maskbit = IRQ3_MCU_MODE_MASK,2062 .irq_en_reg = AFE_IRQ_MCU_CON0,2063 .irq_en_shift = IRQ3_MCU_ON_SFT,2064 .irq_clr_reg = AFE_IRQ_MCU_CLR,2065 .irq_clr_shift = IRQ3_MCU_CLR_SFT,2066 },2067 [MT8186_IRQ_4] = {2068 .id = MT8186_IRQ_4,2069 .irq_cnt_reg = AFE_IRQ_MCU_CNT4,2070 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2071 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2072 .irq_fs_reg = AFE_IRQ_MCU_CON1,2073 .irq_fs_shift = IRQ4_MCU_MODE_SFT,2074 .irq_fs_maskbit = IRQ4_MCU_MODE_MASK,2075 .irq_en_reg = AFE_IRQ_MCU_CON0,2076 .irq_en_shift = IRQ4_MCU_ON_SFT,2077 .irq_clr_reg = AFE_IRQ_MCU_CLR,2078 .irq_clr_shift = IRQ4_MCU_CLR_SFT,2079 },2080 [MT8186_IRQ_5] = {2081 .id = MT8186_IRQ_5,2082 .irq_cnt_reg = AFE_IRQ_MCU_CNT5,2083 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2084 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2085 .irq_fs_reg = AFE_IRQ_MCU_CON1,2086 .irq_fs_shift = IRQ5_MCU_MODE_SFT,2087 .irq_fs_maskbit = IRQ5_MCU_MODE_MASK,2088 .irq_en_reg = AFE_IRQ_MCU_CON0,2089 .irq_en_shift = IRQ5_MCU_ON_SFT,2090 .irq_clr_reg = AFE_IRQ_MCU_CLR,2091 .irq_clr_shift = IRQ5_MCU_CLR_SFT,2092 },2093 [MT8186_IRQ_6] = {2094 .id = MT8186_IRQ_6,2095 .irq_cnt_reg = AFE_IRQ_MCU_CNT6,2096 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2097 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2098 .irq_fs_reg = AFE_IRQ_MCU_CON1,2099 .irq_fs_shift = IRQ6_MCU_MODE_SFT,2100 .irq_fs_maskbit = IRQ6_MCU_MODE_MASK,2101 .irq_en_reg = AFE_IRQ_MCU_CON0,2102 .irq_en_shift = IRQ6_MCU_ON_SFT,2103 .irq_clr_reg = AFE_IRQ_MCU_CLR,2104 .irq_clr_shift = IRQ6_MCU_CLR_SFT,2105 },2106 [MT8186_IRQ_7] = {2107 .id = MT8186_IRQ_7,2108 .irq_cnt_reg = AFE_IRQ_MCU_CNT7,2109 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2110 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2111 .irq_fs_reg = AFE_IRQ_MCU_CON1,2112 .irq_fs_shift = IRQ7_MCU_MODE_SFT,2113 .irq_fs_maskbit = IRQ7_MCU_MODE_MASK,2114 .irq_en_reg = AFE_IRQ_MCU_CON0,2115 .irq_en_shift = IRQ7_MCU_ON_SFT,2116 .irq_clr_reg = AFE_IRQ_MCU_CLR,2117 .irq_clr_shift = IRQ7_MCU_CLR_SFT,2118 },2119 [MT8186_IRQ_8] = {2120 .id = MT8186_IRQ_8,2121 .irq_cnt_reg = AFE_IRQ_MCU_CNT8,2122 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2123 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2124 .irq_fs_reg = AFE_IRQ_MCU_CON2,2125 .irq_fs_shift = IRQ8_MCU_MODE_SFT,2126 .irq_fs_maskbit = IRQ8_MCU_MODE_MASK,2127 .irq_en_reg = AFE_IRQ_MCU_CON0,2128 .irq_en_shift = IRQ8_MCU_ON_SFT,2129 .irq_clr_reg = AFE_IRQ_MCU_CLR,2130 .irq_clr_shift = IRQ8_MCU_CLR_SFT,2131 },2132 [MT8186_IRQ_9] = {2133 .id = MT8186_IRQ_9,2134 .irq_cnt_reg = AFE_IRQ_MCU_CNT9,2135 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2136 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2137 .irq_fs_reg = AFE_IRQ_MCU_CON2,2138 .irq_fs_shift = IRQ9_MCU_MODE_SFT,2139 .irq_fs_maskbit = IRQ9_MCU_MODE_MASK,2140 .irq_en_reg = AFE_IRQ_MCU_CON0,2141 .irq_en_shift = IRQ9_MCU_ON_SFT,2142 .irq_clr_reg = AFE_IRQ_MCU_CLR,2143 .irq_clr_shift = IRQ9_MCU_CLR_SFT,2144 },2145 [MT8186_IRQ_10] = {2146 .id = MT8186_IRQ_10,2147 .irq_cnt_reg = AFE_IRQ_MCU_CNT10,2148 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2149 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2150 .irq_fs_reg = AFE_IRQ_MCU_CON2,2151 .irq_fs_shift = IRQ10_MCU_MODE_SFT,2152 .irq_fs_maskbit = IRQ10_MCU_MODE_MASK,2153 .irq_en_reg = AFE_IRQ_MCU_CON0,2154 .irq_en_shift = IRQ10_MCU_ON_SFT,2155 .irq_clr_reg = AFE_IRQ_MCU_CLR,2156 .irq_clr_shift = IRQ10_MCU_CLR_SFT,2157 },2158 [MT8186_IRQ_11] = {2159 .id = MT8186_IRQ_11,2160 .irq_cnt_reg = AFE_IRQ_MCU_CNT11,2161 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2162 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2163 .irq_fs_reg = AFE_IRQ_MCU_CON2,2164 .irq_fs_shift = IRQ11_MCU_MODE_SFT,2165 .irq_fs_maskbit = IRQ11_MCU_MODE_MASK,2166 .irq_en_reg = AFE_IRQ_MCU_CON0,2167 .irq_en_shift = IRQ11_MCU_ON_SFT,2168 .irq_clr_reg = AFE_IRQ_MCU_CLR,2169 .irq_clr_shift = IRQ11_MCU_CLR_SFT,2170 },2171 [MT8186_IRQ_12] = {2172 .id = MT8186_IRQ_12,2173 .irq_cnt_reg = AFE_IRQ_MCU_CNT12,2174 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2175 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2176 .irq_fs_reg = AFE_IRQ_MCU_CON2,2177 .irq_fs_shift = IRQ12_MCU_MODE_SFT,2178 .irq_fs_maskbit = IRQ12_MCU_MODE_MASK,2179 .irq_en_reg = AFE_IRQ_MCU_CON0,2180 .irq_en_shift = IRQ12_MCU_ON_SFT,2181 .irq_clr_reg = AFE_IRQ_MCU_CLR,2182 .irq_clr_shift = IRQ12_MCU_CLR_SFT,2183 },2184 [MT8186_IRQ_13] = {2185 .id = MT8186_IRQ_13,2186 .irq_cnt_reg = AFE_IRQ_MCU_CNT13,2187 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2188 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2189 .irq_fs_reg = AFE_IRQ_MCU_CON2,2190 .irq_fs_shift = IRQ13_MCU_MODE_SFT,2191 .irq_fs_maskbit = IRQ13_MCU_MODE_MASK,2192 .irq_en_reg = AFE_IRQ_MCU_CON0,2193 .irq_en_shift = IRQ13_MCU_ON_SFT,2194 .irq_clr_reg = AFE_IRQ_MCU_CLR,2195 .irq_clr_shift = IRQ13_MCU_CLR_SFT,2196 },2197 [MT8186_IRQ_14] = {2198 .id = MT8186_IRQ_14,2199 .irq_cnt_reg = AFE_IRQ_MCU_CNT14,2200 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2201 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2202 .irq_fs_reg = AFE_IRQ_MCU_CON2,2203 .irq_fs_shift = IRQ14_MCU_MODE_SFT,2204 .irq_fs_maskbit = IRQ14_MCU_MODE_MASK,2205 .irq_en_reg = AFE_IRQ_MCU_CON0,2206 .irq_en_shift = IRQ14_MCU_ON_SFT,2207 .irq_clr_reg = AFE_IRQ_MCU_CLR,2208 .irq_clr_shift = IRQ14_MCU_CLR_SFT,2209 },2210 [MT8186_IRQ_15] = {2211 .id = MT8186_IRQ_15,2212 .irq_cnt_reg = AFE_IRQ_MCU_CNT15,2213 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2214 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2215 .irq_fs_reg = AFE_IRQ_MCU_CON2,2216 .irq_fs_shift = IRQ15_MCU_MODE_SFT,2217 .irq_fs_maskbit = IRQ15_MCU_MODE_MASK,2218 .irq_en_reg = AFE_IRQ_MCU_CON0,2219 .irq_en_shift = IRQ15_MCU_ON_SFT,2220 .irq_clr_reg = AFE_IRQ_MCU_CLR,2221 .irq_clr_shift = IRQ15_MCU_CLR_SFT,2222 },2223 [MT8186_IRQ_16] = {2224 .id = MT8186_IRQ_16,2225 .irq_cnt_reg = AFE_IRQ_MCU_CNT16,2226 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2227 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2228 .irq_fs_reg = AFE_IRQ_MCU_CON3,2229 .irq_fs_shift = IRQ16_MCU_MODE_SFT,2230 .irq_fs_maskbit = IRQ16_MCU_MODE_MASK,2231 .irq_en_reg = AFE_IRQ_MCU_CON0,2232 .irq_en_shift = IRQ16_MCU_ON_SFT,2233 .irq_clr_reg = AFE_IRQ_MCU_CLR,2234 .irq_clr_shift = IRQ16_MCU_CLR_SFT,2235 },2236 [MT8186_IRQ_17] = {2237 .id = MT8186_IRQ_17,2238 .irq_cnt_reg = AFE_IRQ_MCU_CNT17,2239 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2240 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2241 .irq_fs_reg = AFE_IRQ_MCU_CON3,2242 .irq_fs_shift = IRQ17_MCU_MODE_SFT,2243 .irq_fs_maskbit = IRQ17_MCU_MODE_MASK,2244 .irq_en_reg = AFE_IRQ_MCU_CON0,2245 .irq_en_shift = IRQ17_MCU_ON_SFT,2246 .irq_clr_reg = AFE_IRQ_MCU_CLR,2247 .irq_clr_shift = IRQ17_MCU_CLR_SFT,2248 },2249 [MT8186_IRQ_18] = {2250 .id = MT8186_IRQ_18,2251 .irq_cnt_reg = AFE_IRQ_MCU_CNT18,2252 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2253 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2254 .irq_fs_reg = AFE_IRQ_MCU_CON3,2255 .irq_fs_shift = IRQ18_MCU_MODE_SFT,2256 .irq_fs_maskbit = IRQ18_MCU_MODE_MASK,2257 .irq_en_reg = AFE_IRQ_MCU_CON0,2258 .irq_en_shift = IRQ18_MCU_ON_SFT,2259 .irq_clr_reg = AFE_IRQ_MCU_CLR,2260 .irq_clr_shift = IRQ18_MCU_CLR_SFT,2261 },2262 [MT8186_IRQ_19] = {2263 .id = MT8186_IRQ_19,2264 .irq_cnt_reg = AFE_IRQ_MCU_CNT19,2265 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2266 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2267 .irq_fs_reg = AFE_IRQ_MCU_CON3,2268 .irq_fs_shift = IRQ19_MCU_MODE_SFT,2269 .irq_fs_maskbit = IRQ19_MCU_MODE_MASK,2270 .irq_en_reg = AFE_IRQ_MCU_CON0,2271 .irq_en_shift = IRQ19_MCU_ON_SFT,2272 .irq_clr_reg = AFE_IRQ_MCU_CLR,2273 .irq_clr_shift = IRQ19_MCU_CLR_SFT,2274 },2275 [MT8186_IRQ_20] = {2276 .id = MT8186_IRQ_20,2277 .irq_cnt_reg = AFE_IRQ_MCU_CNT20,2278 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2279 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2280 .irq_fs_reg = AFE_IRQ_MCU_CON3,2281 .irq_fs_shift = IRQ20_MCU_MODE_SFT,2282 .irq_fs_maskbit = IRQ20_MCU_MODE_MASK,2283 .irq_en_reg = AFE_IRQ_MCU_CON0,2284 .irq_en_shift = IRQ20_MCU_ON_SFT,2285 .irq_clr_reg = AFE_IRQ_MCU_CLR,2286 .irq_clr_shift = IRQ20_MCU_CLR_SFT,2287 },2288 [MT8186_IRQ_21] = {2289 .id = MT8186_IRQ_21,2290 .irq_cnt_reg = AFE_IRQ_MCU_CNT21,2291 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2292 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2293 .irq_fs_reg = AFE_IRQ_MCU_CON3,2294 .irq_fs_shift = IRQ21_MCU_MODE_SFT,2295 .irq_fs_maskbit = IRQ21_MCU_MODE_MASK,2296 .irq_en_reg = AFE_IRQ_MCU_CON0,2297 .irq_en_shift = IRQ21_MCU_ON_SFT,2298 .irq_clr_reg = AFE_IRQ_MCU_CLR,2299 .irq_clr_shift = IRQ21_MCU_CLR_SFT,2300 },2301 [MT8186_IRQ_22] = {2302 .id = MT8186_IRQ_22,2303 .irq_cnt_reg = AFE_IRQ_MCU_CNT22,2304 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2305 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2306 .irq_fs_reg = AFE_IRQ_MCU_CON3,2307 .irq_fs_shift = IRQ22_MCU_MODE_SFT,2308 .irq_fs_maskbit = IRQ22_MCU_MODE_MASK,2309 .irq_en_reg = AFE_IRQ_MCU_CON0,2310 .irq_en_shift = IRQ22_MCU_ON_SFT,2311 .irq_clr_reg = AFE_IRQ_MCU_CLR,2312 .irq_clr_shift = IRQ22_MCU_CLR_SFT,2313 },2314 [MT8186_IRQ_23] = {2315 .id = MT8186_IRQ_23,2316 .irq_cnt_reg = AFE_IRQ_MCU_CNT23,2317 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2318 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2319 .irq_fs_reg = AFE_IRQ_MCU_CON3,2320 .irq_fs_shift = IRQ23_MCU_MODE_SFT,2321 .irq_fs_maskbit = IRQ23_MCU_MODE_MASK,2322 .irq_en_reg = AFE_IRQ_MCU_CON0,2323 .irq_en_shift = IRQ23_MCU_ON_SFT,2324 .irq_clr_reg = AFE_IRQ_MCU_CLR,2325 .irq_clr_shift = IRQ23_MCU_CLR_SFT,2326 },2327 [MT8186_IRQ_24] = {2328 .id = MT8186_IRQ_24,2329 .irq_cnt_reg = AFE_IRQ_MCU_CNT24,2330 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2331 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2332 .irq_fs_reg = AFE_IRQ_MCU_CON4,2333 .irq_fs_shift = IRQ24_MCU_MODE_SFT,2334 .irq_fs_maskbit = IRQ24_MCU_MODE_MASK,2335 .irq_en_reg = AFE_IRQ_MCU_CON0,2336 .irq_en_shift = IRQ24_MCU_ON_SFT,2337 .irq_clr_reg = AFE_IRQ_MCU_CLR,2338 .irq_clr_shift = IRQ24_MCU_CLR_SFT,2339 },2340 [MT8186_IRQ_25] = {2341 .id = MT8186_IRQ_25,2342 .irq_cnt_reg = AFE_IRQ_MCU_CNT25,2343 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2344 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2345 .irq_fs_reg = AFE_IRQ_MCU_CON4,2346 .irq_fs_shift = IRQ25_MCU_MODE_SFT,2347 .irq_fs_maskbit = IRQ25_MCU_MODE_MASK,2348 .irq_en_reg = AFE_IRQ_MCU_CON0,2349 .irq_en_shift = IRQ25_MCU_ON_SFT,2350 .irq_clr_reg = AFE_IRQ_MCU_CLR,2351 .irq_clr_shift = IRQ25_MCU_CLR_SFT,2352 },2353 [MT8186_IRQ_26] = {2354 .id = MT8186_IRQ_26,2355 .irq_cnt_reg = AFE_IRQ_MCU_CNT26,2356 .irq_cnt_shift = AFE_IRQ_CNT_SHIFT,2357 .irq_cnt_maskbit = AFE_IRQ_CNT_MASK,2358 .irq_fs_reg = AFE_IRQ_MCU_CON4,2359 .irq_fs_shift = IRQ26_MCU_MODE_SFT,2360 .irq_fs_maskbit = IRQ26_MCU_MODE_MASK,2361 .irq_en_reg = AFE_IRQ_MCU_CON0,2362 .irq_en_shift = IRQ26_MCU_ON_SFT,2363 .irq_clr_reg = AFE_IRQ_MCU_CLR,2364 .irq_clr_shift = IRQ26_MCU_CLR_SFT,2365 },2366};2367 2368static const int memif_irq_usage[MT8186_MEMIF_NUM] = {2369 /* TODO: verify each memif & irq */2370 [MT8186_MEMIF_DL1] = MT8186_IRQ_0,2371 [MT8186_MEMIF_DL2] = MT8186_IRQ_1,2372 [MT8186_MEMIF_DL3] = MT8186_IRQ_2,2373 [MT8186_MEMIF_DL4] = MT8186_IRQ_3,2374 [MT8186_MEMIF_DL5] = MT8186_IRQ_4,2375 [MT8186_MEMIF_DL6] = MT8186_IRQ_5,2376 [MT8186_MEMIF_DL7] = MT8186_IRQ_6,2377 [MT8186_MEMIF_DL8] = MT8186_IRQ_7,2378 [MT8186_MEMIF_DL12] = MT8186_IRQ_9,2379 [MT8186_MEMIF_VUL12] = MT8186_IRQ_10,2380 [MT8186_MEMIF_VUL2] = MT8186_IRQ_11,2381 [MT8186_MEMIF_AWB] = MT8186_IRQ_12,2382 [MT8186_MEMIF_AWB2] = MT8186_IRQ_13,2383 [MT8186_MEMIF_VUL3] = MT8186_IRQ_14,2384 [MT8186_MEMIF_VUL4] = MT8186_IRQ_15,2385 [MT8186_MEMIF_VUL5] = MT8186_IRQ_16,2386 [MT8186_MEMIF_VUL6] = MT8186_IRQ_17,2387};2388 2389static bool mt8186_is_volatile_reg(struct device *dev, unsigned int reg)2390{2391 /* these auto-gen reg has read-only bit, so put it as volatile */2392 /* volatile reg cannot be cached, so cannot be set when power off */2393 switch (reg) {2394 case AUDIO_TOP_CON0: /* reg bit controlled by CCF */2395 case AUDIO_TOP_CON1: /* reg bit controlled by CCF */2396 case AUDIO_TOP_CON2:2397 case AUDIO_TOP_CON3:2398 case AFE_DAC_CON0:2399 case AFE_DL1_CUR_MSB:2400 case AFE_DL1_CUR:2401 case AFE_DL1_END:2402 case AFE_DL2_CUR_MSB:2403 case AFE_DL2_CUR:2404 case AFE_DL2_END:2405 case AFE_DL3_CUR_MSB:2406 case AFE_DL3_CUR:2407 case AFE_DL3_END:2408 case AFE_DL4_CUR_MSB:2409 case AFE_DL4_CUR:2410 case AFE_DL4_END:2411 case AFE_DL12_CUR_MSB:2412 case AFE_DL12_CUR:2413 case AFE_DL12_END:2414 case AFE_ADDA_SRC_DEBUG_MON0:2415 case AFE_ADDA_SRC_DEBUG_MON1:2416 case AFE_ADDA_UL_SRC_MON0:2417 case AFE_ADDA_UL_SRC_MON1:2418 case AFE_SECURE_CON0:2419 case AFE_SRAM_BOUND:2420 case AFE_SECURE_CON1:2421 case AFE_VUL_CUR_MSB:2422 case AFE_VUL_CUR:2423 case AFE_VUL_END:2424 case AFE_SIDETONE_MON:2425 case AFE_SIDETONE_CON0:2426 case AFE_SIDETONE_COEFF:2427 case AFE_VUL2_CUR_MSB:2428 case AFE_VUL2_CUR:2429 case AFE_VUL2_END:2430 case AFE_VUL3_CUR_MSB:2431 case AFE_VUL3_CUR:2432 case AFE_VUL3_END:2433 case AFE_I2S_MON:2434 case AFE_DAC_MON:2435 case AFE_IRQ0_MCU_CNT_MON:2436 case AFE_IRQ6_MCU_CNT_MON:2437 case AFE_VUL4_CUR_MSB:2438 case AFE_VUL4_CUR:2439 case AFE_VUL4_END:2440 case AFE_VUL12_CUR_MSB:2441 case AFE_VUL12_CUR:2442 case AFE_VUL12_END:2443 case AFE_IRQ3_MCU_CNT_MON:2444 case AFE_IRQ4_MCU_CNT_MON:2445 case AFE_IRQ_MCU_STATUS:2446 case AFE_IRQ_MCU_CLR:2447 case AFE_IRQ_MCU_MON2:2448 case AFE_IRQ1_MCU_CNT_MON:2449 case AFE_IRQ2_MCU_CNT_MON:2450 case AFE_IRQ5_MCU_CNT_MON:2451 case AFE_IRQ7_MCU_CNT_MON:2452 case AFE_IRQ_MCU_MISS_CLR:2453 case AFE_GAIN1_CUR:2454 case AFE_GAIN2_CUR:2455 case AFE_SRAM_DELSEL_CON1:2456 case PCM_INTF_CON2:2457 case FPGA_CFG0:2458 case FPGA_CFG1:2459 case FPGA_CFG2:2460 case FPGA_CFG3:2461 case AUDIO_TOP_DBG_MON0:2462 case AUDIO_TOP_DBG_MON1:2463 case AFE_IRQ8_MCU_CNT_MON:2464 case AFE_IRQ11_MCU_CNT_MON:2465 case AFE_IRQ12_MCU_CNT_MON:2466 case AFE_IRQ9_MCU_CNT_MON:2467 case AFE_IRQ10_MCU_CNT_MON:2468 case AFE_IRQ13_MCU_CNT_MON:2469 case AFE_IRQ14_MCU_CNT_MON:2470 case AFE_IRQ15_MCU_CNT_MON:2471 case AFE_IRQ16_MCU_CNT_MON:2472 case AFE_IRQ17_MCU_CNT_MON:2473 case AFE_IRQ18_MCU_CNT_MON:2474 case AFE_IRQ19_MCU_CNT_MON:2475 case AFE_IRQ20_MCU_CNT_MON:2476 case AFE_IRQ21_MCU_CNT_MON:2477 case AFE_IRQ22_MCU_CNT_MON:2478 case AFE_IRQ23_MCU_CNT_MON:2479 case AFE_IRQ24_MCU_CNT_MON:2480 case AFE_IRQ25_MCU_CNT_MON:2481 case AFE_IRQ26_MCU_CNT_MON:2482 case AFE_IRQ31_MCU_CNT_MON:2483 case AFE_CBIP_MON0:2484 case AFE_CBIP_SLV_MUX_MON0:2485 case AFE_CBIP_SLV_DECODER_MON0:2486 case AFE_ADDA6_MTKAIF_MON0:2487 case AFE_ADDA6_MTKAIF_MON1:2488 case AFE_AWB_CUR_MSB:2489 case AFE_AWB_CUR:2490 case AFE_AWB_END:2491 case AFE_AWB2_CUR_MSB:2492 case AFE_AWB2_CUR:2493 case AFE_AWB2_END:2494 case AFE_DAI_CUR_MSB:2495 case AFE_DAI_CUR:2496 case AFE_DAI_END:2497 case AFE_DAI2_CUR_MSB:2498 case AFE_DAI2_CUR:2499 case AFE_DAI2_END:2500 case AFE_ADDA6_SRC_DEBUG_MON0:2501 case AFE_ADD6A_UL_SRC_MON0:2502 case AFE_ADDA6_UL_SRC_MON1:2503 case AFE_MOD_DAI_CUR_MSB:2504 case AFE_MOD_DAI_CUR:2505 case AFE_MOD_DAI_END:2506 case AFE_AWB_RCH_MON:2507 case AFE_AWB_LCH_MON:2508 case AFE_VUL_RCH_MON:2509 case AFE_VUL_LCH_MON:2510 case AFE_VUL12_RCH_MON:2511 case AFE_VUL12_LCH_MON:2512 case AFE_VUL2_RCH_MON:2513 case AFE_VUL2_LCH_MON:2514 case AFE_DAI_DATA_MON:2515 case AFE_MOD_DAI_DATA_MON:2516 case AFE_DAI2_DATA_MON:2517 case AFE_AWB2_RCH_MON:2518 case AFE_AWB2_LCH_MON:2519 case AFE_VUL3_RCH_MON:2520 case AFE_VUL3_LCH_MON:2521 case AFE_VUL4_RCH_MON:2522 case AFE_VUL4_LCH_MON:2523 case AFE_VUL5_RCH_MON:2524 case AFE_VUL5_LCH_MON:2525 case AFE_VUL6_RCH_MON:2526 case AFE_VUL6_LCH_MON:2527 case AFE_DL1_RCH_MON:2528 case AFE_DL1_LCH_MON:2529 case AFE_DL2_RCH_MON:2530 case AFE_DL2_LCH_MON:2531 case AFE_DL12_RCH1_MON:2532 case AFE_DL12_LCH1_MON:2533 case AFE_DL12_RCH2_MON:2534 case AFE_DL12_LCH2_MON:2535 case AFE_DL3_RCH_MON:2536 case AFE_DL3_LCH_MON:2537 case AFE_DL4_RCH_MON:2538 case AFE_DL4_LCH_MON:2539 case AFE_DL5_RCH_MON:2540 case AFE_DL5_LCH_MON:2541 case AFE_DL6_RCH_MON:2542 case AFE_DL6_LCH_MON:2543 case AFE_DL7_RCH_MON:2544 case AFE_DL7_LCH_MON:2545 case AFE_DL8_RCH_MON:2546 case AFE_DL8_LCH_MON:2547 case AFE_VUL5_CUR_MSB:2548 case AFE_VUL5_CUR:2549 case AFE_VUL5_END:2550 case AFE_VUL6_CUR_MSB:2551 case AFE_VUL6_CUR:2552 case AFE_VUL6_END:2553 case AFE_ADDA_DL_SDM_FIFO_MON:2554 case AFE_ADDA_DL_SRC_LCH_MON:2555 case AFE_ADDA_DL_SRC_RCH_MON:2556 case AFE_ADDA_DL_SDM_OUT_MON:2557 case AFE_CONNSYS_I2S_MON:2558 case AFE_ASRC_2CH_CON0:2559 case AFE_ASRC_2CH_CON2:2560 case AFE_ASRC_2CH_CON3:2561 case AFE_ASRC_2CH_CON4:2562 case AFE_ASRC_2CH_CON5:2563 case AFE_ASRC_2CH_CON7:2564 case AFE_ASRC_2CH_CON8:2565 case AFE_ASRC_2CH_CON12:2566 case AFE_ASRC_2CH_CON13:2567 case AFE_ADDA_MTKAIF_MON0:2568 case AFE_ADDA_MTKAIF_MON1:2569 case AFE_AUD_PAD_TOP:2570 case AFE_DL_NLE_R_MON0:2571 case AFE_DL_NLE_R_MON1:2572 case AFE_DL_NLE_R_MON2:2573 case AFE_DL_NLE_L_MON0:2574 case AFE_DL_NLE_L_MON1:2575 case AFE_DL_NLE_L_MON2:2576 case AFE_GENERAL1_ASRC_2CH_CON0:2577 case AFE_GENERAL1_ASRC_2CH_CON2:2578 case AFE_GENERAL1_ASRC_2CH_CON3:2579 case AFE_GENERAL1_ASRC_2CH_CON4:2580 case AFE_GENERAL1_ASRC_2CH_CON5:2581 case AFE_GENERAL1_ASRC_2CH_CON7:2582 case AFE_GENERAL1_ASRC_2CH_CON8:2583 case AFE_GENERAL1_ASRC_2CH_CON12:2584 case AFE_GENERAL1_ASRC_2CH_CON13:2585 case AFE_GENERAL2_ASRC_2CH_CON0:2586 case AFE_GENERAL2_ASRC_2CH_CON2:2587 case AFE_GENERAL2_ASRC_2CH_CON3:2588 case AFE_GENERAL2_ASRC_2CH_CON4:2589 case AFE_GENERAL2_ASRC_2CH_CON5:2590 case AFE_GENERAL2_ASRC_2CH_CON7:2591 case AFE_GENERAL2_ASRC_2CH_CON8:2592 case AFE_GENERAL2_ASRC_2CH_CON12:2593 case AFE_GENERAL2_ASRC_2CH_CON13:2594 case AFE_DL5_CUR_MSB:2595 case AFE_DL5_CUR:2596 case AFE_DL5_END:2597 case AFE_DL6_CUR_MSB:2598 case AFE_DL6_CUR:2599 case AFE_DL6_END:2600 case AFE_DL7_CUR_MSB:2601 case AFE_DL7_CUR:2602 case AFE_DL7_END:2603 case AFE_DL8_CUR_MSB:2604 case AFE_DL8_CUR:2605 case AFE_DL8_END:2606 case AFE_PROT_SIDEBAND_MON:2607 case AFE_DOMAIN_SIDEBAND0_MON:2608 case AFE_DOMAIN_SIDEBAND1_MON:2609 case AFE_DOMAIN_SIDEBAND2_MON:2610 case AFE_DOMAIN_SIDEBAND3_MON:2611 case AFE_APLL1_TUNER_CFG: /* [20:31] is monitor */2612 case AFE_APLL2_TUNER_CFG: /* [20:31] is monitor */2613 return true;2614 default:2615 return false;2616 };2617}2618 2619static const struct regmap_config mt8186_afe_regmap_config = {2620 .reg_bits = 32,2621 .reg_stride = 4,2622 .val_bits = 32,2623 2624 .volatile_reg = mt8186_is_volatile_reg,2625 2626 .max_register = AFE_MAX_REGISTER,2627 .num_reg_defaults_raw = AFE_MAX_REGISTER,2628 2629 .cache_type = REGCACHE_FLAT,2630};2631 2632static irqreturn_t mt8186_afe_irq_handler(int irq_id, void *dev)2633{2634 struct mtk_base_afe *afe = dev;2635 struct mtk_base_afe_irq *irq;2636 unsigned int status;2637 unsigned int status_mcu;2638 unsigned int mcu_en;2639 int ret;2640 int i;2641 2642 /* get irq that is sent to MCU */2643 ret = regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);2644 if (ret) {2645 dev_err(afe->dev, "%s, get irq direction fail, ret %d", __func__, ret);2646 return ret;2647 }2648 2649 ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);2650 /* only care IRQ which is sent to MCU */2651 status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS;2652 2653 if (ret || status_mcu == 0) {2654 dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",2655 __func__, ret, status, mcu_en);2656 2657 goto err_irq;2658 }2659 2660 for (i = 0; i < MT8186_MEMIF_NUM; i++) {2661 struct mtk_base_afe_memif *memif = &afe->memif[i];2662 2663 if (!memif->substream)2664 continue;2665 2666 if (memif->irq_usage < 0)2667 continue;2668 2669 irq = &afe->irqs[memif->irq_usage];2670 2671 if (status_mcu & (1 << irq->irq_data->irq_en_shift))2672 snd_pcm_period_elapsed(memif->substream);2673 }2674 2675err_irq:2676 /* clear irq */2677 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, status_mcu);2678 2679 return IRQ_HANDLED;2680}2681 2682static int mt8186_afe_runtime_suspend(struct device *dev)2683{2684 struct mtk_base_afe *afe = dev_get_drvdata(dev);2685 struct mt8186_afe_private *afe_priv = afe->platform_priv;2686 unsigned int value = 0;2687 int ret;2688 2689 if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)2690 goto skip_regmap;2691 2692 /* disable AFE */2693 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);2694 2695 ret = regmap_read_poll_timeout(afe->regmap,2696 AFE_DAC_MON,2697 value,2698 (value & AFE_ON_RETM_MASK_SFT) == 0,2699 20,2700 1 * 1000 * 1000);2701 if (ret) {2702 dev_err(afe->dev, "%s(), ret %d\n", __func__, ret);2703 return ret;2704 }2705 2706 /* make sure all irq status are cleared */2707 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);2708 regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);2709 2710 /* reset sgen */2711 regmap_write(afe->regmap, AFE_SINEGEN_CON0, 0x0);2712 regmap_update_bits(afe->regmap, AFE_SINEGEN_CON2,2713 INNER_LOOP_BACK_MODE_MASK_SFT,2714 0x3f << INNER_LOOP_BACK_MODE_SFT);2715 2716 /* cache only */2717 regcache_cache_only(afe->regmap, true);2718 regcache_mark_dirty(afe->regmap);2719 2720skip_regmap:2721 mt8186_afe_disable_cgs(afe);2722 mt8186_afe_disable_clock(afe);2723 2724 return 0;2725}2726 2727static int mt8186_afe_runtime_resume(struct device *dev)2728{2729 struct mtk_base_afe *afe = dev_get_drvdata(dev);2730 struct mt8186_afe_private *afe_priv = afe->platform_priv;2731 int ret;2732 2733 ret = mt8186_afe_enable_clock(afe);2734 if (ret)2735 return ret;2736 2737 ret = mt8186_afe_enable_cgs(afe);2738 if (ret)2739 return ret;2740 2741 if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)2742 goto skip_regmap;2743 2744 regcache_cache_only(afe->regmap, false);2745 regcache_sync(afe->regmap);2746 2747 /* enable audio sys DCM for power saving */2748 regmap_update_bits(afe_priv->infracfg, PERI_BUS_DCM_CTRL, BIT(29), BIT(29));2749 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0, BIT(29), BIT(29));2750 2751 /* force cpu use 8_24 format when writing 32bit data */2752 regmap_update_bits(afe->regmap, AFE_MEMIF_CON0, CPU_HD_ALIGN_MASK_SFT, 0);2753 2754 /* set all output port to 24bit */2755 regmap_write(afe->regmap, AFE_CONN_24BIT, 0xffffffff);2756 regmap_write(afe->regmap, AFE_CONN_24BIT_1, 0xffffffff);2757 2758 /* enable AFE */2759 regmap_update_bits(afe->regmap, AFE_DAC_CON0, AUDIO_AFE_ON_MASK_SFT, BIT(0));2760 2761skip_regmap:2762 return 0;2763}2764 2765static int mt8186_afe_component_probe(struct snd_soc_component *component)2766{2767 mtk_afe_add_sub_dai_control(component);2768 mt8186_add_misc_control(component);2769 2770 return 0;2771}2772 2773static const struct snd_soc_component_driver mt8186_afe_component = {2774 .name = AFE_PCM_NAME,2775 .pcm_construct = mtk_afe_pcm_new,2776 .pointer = mtk_afe_pcm_pointer,2777 .probe = mt8186_afe_component_probe,2778};2779 2780static int mt8186_dai_memif_register(struct mtk_base_afe *afe)2781{2782 struct mtk_base_afe_dai *dai;2783 2784 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2785 if (!dai)2786 return -ENOMEM;2787 2788 list_add(&dai->list, &afe->sub_dais);2789 2790 dai->dai_drivers = mt8186_memif_dai_driver;2791 dai->num_dai_drivers = ARRAY_SIZE(mt8186_memif_dai_driver);2792 2793 dai->controls = mt8186_pcm_kcontrols;2794 dai->num_controls = ARRAY_SIZE(mt8186_pcm_kcontrols);2795 dai->dapm_widgets = mt8186_memif_widgets;2796 dai->num_dapm_widgets = ARRAY_SIZE(mt8186_memif_widgets);2797 dai->dapm_routes = mt8186_memif_routes;2798 dai->num_dapm_routes = ARRAY_SIZE(mt8186_memif_routes);2799 return 0;2800}2801 2802typedef int (*dai_register_cb)(struct mtk_base_afe *);2803static const dai_register_cb dai_register_cbs[] = {2804 mt8186_dai_adda_register,2805 mt8186_dai_i2s_register,2806 mt8186_dai_tdm_register,2807 mt8186_dai_hw_gain_register,2808 mt8186_dai_src_register,2809 mt8186_dai_pcm_register,2810 mt8186_dai_hostless_register,2811 mt8186_dai_memif_register,2812};2813 2814static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)2815{2816 struct mtk_base_afe *afe;2817 struct mt8186_afe_private *afe_priv;2818 struct reset_control *rstc;2819 struct device *dev = &pdev->dev;2820 int i, ret, irq_id;2821 2822 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));2823 if (ret)2824 return ret;2825 2826 afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);2827 if (!afe)2828 return -ENOMEM;2829 platform_set_drvdata(pdev, afe);2830 2831 afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv), GFP_KERNEL);2832 if (!afe->platform_priv)2833 return -ENOMEM;2834 2835 afe_priv = afe->platform_priv;2836 afe->dev = &pdev->dev;2837 2838 afe->base_addr = devm_platform_ioremap_resource(pdev, 0);2839 if (IS_ERR(afe->base_addr))2840 return PTR_ERR(afe->base_addr);2841 2842 /* init audio related clock */2843 ret = mt8186_init_clock(afe);2844 if (ret) {2845 dev_err(dev, "init clock error, ret %d\n", ret);2846 return ret;2847 }2848 2849 /* init memif */2850 afe->memif_32bit_supported = 0;2851 afe->memif_size = MT8186_MEMIF_NUM;2852 afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif), GFP_KERNEL);2853 if (!afe->memif)2854 return -ENOMEM;2855 2856 for (i = 0; i < afe->memif_size; i++) {2857 afe->memif[i].data = &memif_data[i];2858 afe->memif[i].irq_usage = memif_irq_usage[i];2859 afe->memif[i].const_irq = 1;2860 }2861 2862 mutex_init(&afe->irq_alloc_lock); /* needed when dynamic irq */2863 2864 /* init irq */2865 afe->irqs_size = MT8186_IRQ_NUM;2866 afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),2867 GFP_KERNEL);2868 2869 if (!afe->irqs)2870 return -ENOMEM;2871 2872 for (i = 0; i < afe->irqs_size; i++)2873 afe->irqs[i].irq_data = &irq_data[i];2874 2875 /* request irq */2876 irq_id = platform_get_irq(pdev, 0);2877 if (irq_id <= 0)2878 return dev_err_probe(dev, irq_id < 0 ? irq_id : -ENXIO,2879 "no irq found");2880 2881 ret = devm_request_irq(dev, irq_id, mt8186_afe_irq_handler,2882 IRQF_TRIGGER_NONE,2883 "Afe_ISR_Handle", (void *)afe);2884 if (ret)2885 return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n");2886 2887 ret = enable_irq_wake(irq_id);2888 if (ret < 0)2889 return dev_err_probe(dev, ret, "enable_irq_wake %d\n", irq_id);2890 2891 /* init sub_dais */2892 INIT_LIST_HEAD(&afe->sub_dais);2893 2894 for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {2895 ret = dai_register_cbs[i](afe);2896 if (ret)2897 return dev_err_probe(dev, ret, "dai register i %d fail\n", i);2898 }2899 2900 /* init dai_driver and component_driver */2901 ret = mtk_afe_combine_sub_dai(afe);2902 if (ret)2903 return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");2904 2905 /* reset controller to reset audio regs before regmap cache */2906 rstc = devm_reset_control_get_exclusive(dev, "audiosys");2907 if (IS_ERR(rstc))2908 return dev_err_probe(dev, PTR_ERR(rstc), "could not get audiosys reset\n");2909 2910 ret = reset_control_reset(rstc);2911 if (ret)2912 return dev_err_probe(dev, ret, "failed to trigger audio reset\n");2913 2914 /* enable clock for regcache get default value from hw */2915 afe_priv->pm_runtime_bypass_reg_ctl = true;2916 2917 ret = devm_pm_runtime_enable(dev);2918 if (ret)2919 return ret;2920 2921 ret = pm_runtime_resume_and_get(dev);2922 if (ret)2923 return dev_err_probe(dev, ret, "failed to resume device\n");2924 2925 afe->regmap = devm_regmap_init_mmio(dev, afe->base_addr,2926 &mt8186_afe_regmap_config);2927 if (IS_ERR(afe->regmap)) {2928 ret = PTR_ERR(afe->regmap);2929 goto err_pm_disable;2930 }2931 2932 /* others */2933 afe->mtk_afe_hardware = &mt8186_afe_hardware;2934 afe->memif_fs = mt8186_memif_fs;2935 afe->irq_fs = mt8186_irq_fs;2936 afe->get_dai_fs = mt8186_get_dai_fs;2937 afe->get_memif_pbuf_size = mt8186_get_memif_pbuf_size;2938 2939 afe->runtime_resume = mt8186_afe_runtime_resume;2940 afe->runtime_suspend = mt8186_afe_runtime_suspend;2941 2942 /* register platform */2943 dev_dbg(dev, "%s(), devm_snd_soc_register_component\n", __func__);2944 2945 ret = devm_snd_soc_register_component(dev,2946 &mt8186_afe_component,2947 afe->dai_drivers,2948 afe->num_dai_drivers);2949 if (ret) {2950 dev_err(dev, "err_dai_component\n");2951 goto err_pm_disable;2952 }2953 2954 ret = pm_runtime_put_sync(dev);2955 if (ret) {2956 pm_runtime_get_noresume(dev);2957 dev_err(dev, "failed to suspend device: %d\n", ret);2958 goto err_pm_disable;2959 }2960 afe_priv->pm_runtime_bypass_reg_ctl = false;2961 2962 regcache_cache_only(afe->regmap, true);2963 regcache_mark_dirty(afe->regmap);2964 2965 return 0;2966 2967err_pm_disable:2968 pm_runtime_put_noidle(dev);2969 pm_runtime_set_suspended(dev);2970 2971 return ret;2972}2973 2974static const struct of_device_id mt8186_afe_pcm_dt_match[] = {2975 { .compatible = "mediatek,mt8186-sound", },2976 {},2977};2978MODULE_DEVICE_TABLE(of, mt8186_afe_pcm_dt_match);2979 2980static const struct dev_pm_ops mt8186_afe_pm_ops = {2981 SET_RUNTIME_PM_OPS(mt8186_afe_runtime_suspend,2982 mt8186_afe_runtime_resume, NULL)2983};2984 2985static struct platform_driver mt8186_afe_pcm_driver = {2986 .driver = {2987 .name = "mt8186-audio",2988 .of_match_table = mt8186_afe_pcm_dt_match,2989 .pm = &mt8186_afe_pm_ops,2990 },2991 .probe = mt8186_afe_pcm_dev_probe,2992};2993 2994module_platform_driver(mt8186_afe_pcm_driver);2995 2996MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8186");2997MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");2998MODULE_LICENSE("GPL v2");2999