Path: blob/master/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// Mediatek ALSA SoC AFE platform driver for 81863//4// Copyright (c) 2022 MediaTek Inc.5// Author: Jiaxin Yu <[email protected]>67#include <linux/delay.h>8#include <linux/dma-mapping.h>9#include <linux/module.h>10#include <linux/of.h>11#include <linux/of_address.h>12#include <linux/of_reserved_mem.h>13#include <linux/pm_runtime.h>14#include <linux/reset.h>15#include <sound/soc.h>1617#include "../common/mtk-afe-platform-driver.h"18#include "../common/mtk-afe-fe-dai.h"1920#include "mt8186-afe-common.h"21#include "mt8186-afe-clk.h"22#include "mt8186-afe-gpio.h"23#include "mt8186-interconnection.h"2425static const struct snd_pcm_hardware mt8186_afe_hardware = {26.info = (SNDRV_PCM_INFO_MMAP |27SNDRV_PCM_INFO_INTERLEAVED |28SNDRV_PCM_INFO_MMAP_VALID),29.formats = (SNDRV_PCM_FMTBIT_S16_LE |30SNDRV_PCM_FMTBIT_S24_LE |31SNDRV_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};3940static int mt8186_fe_startup(struct snd_pcm_substream *substream,41struct snd_soc_dai *dai)42{43struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);44struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);45struct snd_pcm_runtime *runtime = substream->runtime;46int id = snd_soc_rtd_to_cpu(rtd, 0)->id;47struct mtk_base_afe_memif *memif = &afe->memif[id];48const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware;49int ret;5051memif->substream = substream;5253snd_pcm_hw_constraint_step(substream->runtime, 0,54SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16);5556snd_soc_set_runtime_hwparams(substream, mtk_afe_hardware);5758ret = snd_pcm_hw_constraint_integer(runtime,59SNDRV_PCM_HW_PARAM_PERIODS);60if (ret < 0) {61dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n");62return ret;63}6465/* dynamic allocate irq to memif */66if (memif->irq_usage < 0) {67int irq_id = mtk_dynamic_irq_acquire(afe);6869if (irq_id != afe->irqs_size) {70/* link */71memif->irq_usage = irq_id;72} else {73dev_err(afe->dev, "%s() error: no more asys irq\n",74__func__);75return -EBUSY;76}77}7879return 0;80}8182static void mt8186_fe_shutdown(struct snd_pcm_substream *substream,83struct snd_soc_dai *dai)84{85struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);86struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);87struct mt8186_afe_private *afe_priv = afe->platform_priv;88int id = snd_soc_rtd_to_cpu(rtd, 0)->id;89struct mtk_base_afe_memif *memif = &afe->memif[id];90int irq_id = memif->irq_usage;9192memif->substream = NULL;93afe_priv->irq_cnt[id] = 0;94afe_priv->xrun_assert[id] = 0;9596if (!memif->const_irq) {97mtk_dynamic_irq_release(afe, irq_id);98memif->irq_usage = -1;99memif->substream = NULL;100}101}102103static int mt8186_fe_hw_params(struct snd_pcm_substream *substream,104struct snd_pcm_hw_params *params,105struct snd_soc_dai *dai)106{107struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);108struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);109int id = snd_soc_rtd_to_cpu(rtd, 0)->id;110unsigned int channels = params_channels(params);111unsigned int rate = params_rate(params);112int ret;113114ret = mtk_afe_fe_hw_params(substream, params, dai);115if (ret)116return ret;117118/* channel merge configuration, enable control is in UL5_IN_MUX */119if (id == MT8186_MEMIF_VUL3) {120int update_cnt = 8;121unsigned int val = 0;122unsigned int mask = 0;123int fs_mode = mt8186_rate_transform(afe->dev, rate, id);124125/* set rate, channel, update cnt, disable sgen */126val = fs_mode << CM1_FS_SELECT_SFT |127(channels - 1) << CHANNEL_MERGE0_CHNUM_SFT |128update_cnt << CHANNEL_MERGE0_UPDATE_CNT_SFT;129mask = CM1_FS_SELECT_MASK_SFT |130CHANNEL_MERGE0_CHNUM_MASK_SFT |131CHANNEL_MERGE0_UPDATE_CNT_MASK_SFT;132regmap_update_bits(afe->regmap, AFE_CM1_CON, mask, val);133}134135return 0;136}137138static int mt8186_fe_hw_free(struct snd_pcm_substream *substream,139struct snd_soc_dai *dai)140{141struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);142int ret;143144ret = mtk_afe_fe_hw_free(substream, dai);145if (ret) {146dev_err(afe->dev, "%s failed\n", __func__);147return ret;148}149150return 0;151}152153static int mt8186_fe_trigger(struct snd_pcm_substream *substream, int cmd,154struct snd_soc_dai *dai)155{156struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);157struct snd_pcm_runtime * const runtime = substream->runtime;158struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);159struct mt8186_afe_private *afe_priv = afe->platform_priv;160int id = snd_soc_rtd_to_cpu(rtd, 0)->id;161struct mtk_base_afe_memif *memif = &afe->memif[id];162int irq_id = memif->irq_usage;163struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];164const struct mtk_base_irq_data *irq_data = irqs->irq_data;165unsigned int rate = runtime->rate;166unsigned int counter;167int fs;168int ret;169170dev_dbg(afe->dev, "%s(), %s cmd %d, irq_id %d\n",171__func__, memif->data->name, cmd, irq_id);172173switch (cmd) {174case SNDRV_PCM_TRIGGER_START:175case SNDRV_PCM_TRIGGER_RESUME:176ret = mtk_memif_set_enable(afe, id);177if (ret) {178dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",179__func__, id, ret);180return ret;181}182183/*184* for small latency record185* ul memif need read some data before irq enable186*/187if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&188((runtime->period_size * 1000) / rate <= 10))189udelay(300);190191/* set irq counter */192if (afe_priv->irq_cnt[id] > 0)193counter = afe_priv->irq_cnt[id];194else195counter = runtime->period_size;196197regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,198irq_data->irq_cnt_maskbit199<< irq_data->irq_cnt_shift,200counter << irq_data->irq_cnt_shift);201202/* set irq fs */203fs = afe->irq_fs(substream, runtime->rate);204if (fs < 0)205return -EINVAL;206207regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,208irq_data->irq_fs_maskbit209<< irq_data->irq_fs_shift,210fs << irq_data->irq_fs_shift);211212/* enable interrupt */213if (runtime->stop_threshold != ~(0U))214regmap_update_bits(afe->regmap,215irq_data->irq_en_reg,2161 << irq_data->irq_en_shift,2171 << irq_data->irq_en_shift);218return 0;219case SNDRV_PCM_TRIGGER_STOP:220case SNDRV_PCM_TRIGGER_SUSPEND:221if (afe_priv->xrun_assert[id] > 0) {222if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {223int avail = snd_pcm_capture_avail(runtime);224/* alsa can trigger stop/start when occur xrun */225if (avail >= runtime->buffer_size)226dev_dbg(afe->dev, "%s(), id %d, xrun assert\n",227__func__, id);228}229}230231ret = mtk_memif_set_disable(afe, id);232if (ret)233dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",234__func__, id, ret);235236/* disable interrupt */237if (runtime->stop_threshold != ~(0U))238regmap_update_bits(afe->regmap,239irq_data->irq_en_reg,2401 << irq_data->irq_en_shift,2410 << irq_data->irq_en_shift);242243/* clear pending IRQ */244regmap_write(afe->regmap, irq_data->irq_clr_reg,2451 << irq_data->irq_clr_shift);246return ret;247default:248return -EINVAL;249}250}251252static int mt8186_memif_fs(struct snd_pcm_substream *substream,253unsigned int rate)254{255struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);256struct snd_soc_component *component =257snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);258struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);259int id = snd_soc_rtd_to_cpu(rtd, 0)->id;260261return mt8186_rate_transform(afe->dev, rate, id);262}263264static int mt8186_get_dai_fs(struct mtk_base_afe *afe,265int dai_id, unsigned int rate)266{267return mt8186_rate_transform(afe->dev, rate, dai_id);268}269270static int mt8186_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)271{272struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);273struct snd_soc_component *component =274snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);275struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);276277return mt8186_general_rate_transform(afe->dev, rate);278}279280static int mt8186_get_memif_pbuf_size(struct snd_pcm_substream *substream)281{282struct snd_pcm_runtime *runtime = substream->runtime;283284if ((runtime->period_size * 1000) / runtime->rate > 10)285return MT8186_MEMIF_PBUF_SIZE_256_BYTES;286287return MT8186_MEMIF_PBUF_SIZE_32_BYTES;288}289290static int mt8186_fe_prepare(struct snd_pcm_substream *substream,291struct snd_soc_dai *dai)292{293struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);294struct snd_pcm_runtime * const runtime = substream->runtime;295struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);296int id = snd_soc_rtd_to_cpu(rtd, 0)->id;297struct mtk_base_afe_memif *memif = &afe->memif[id];298int irq_id = memif->irq_usage;299struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];300const struct mtk_base_irq_data *irq_data = irqs->irq_data;301unsigned int counter = runtime->period_size;302int fs;303int ret;304305ret = mtk_afe_fe_prepare(substream, dai);306if (ret)307return ret;308309/* set irq counter */310regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,311irq_data->irq_cnt_maskbit312<< irq_data->irq_cnt_shift,313counter << irq_data->irq_cnt_shift);314315/* set irq fs */316fs = afe->irq_fs(substream, runtime->rate);317318if (fs < 0)319return -EINVAL;320321regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,322irq_data->irq_fs_maskbit323<< irq_data->irq_fs_shift,324fs << irq_data->irq_fs_shift);325326return 0;327}328329/* 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};338339#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\340SNDRV_PCM_RATE_88200 |\341SNDRV_PCM_RATE_96000 |\342SNDRV_PCM_RATE_176400 |\343SNDRV_PCM_RATE_192000)344345#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\346SNDRV_PCM_RATE_16000 |\347SNDRV_PCM_RATE_32000 |\348SNDRV_PCM_RATE_48000)349350#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\351SNDRV_PCM_FMTBIT_S24_LE |\352SNDRV_PCM_FMTBIT_S32_LE)353354static 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};561562/* kcontrol */563static int mt8186_irq_cnt1_get(struct snd_kcontrol *kcontrol,564struct snd_ctl_elem_value *ucontrol)565{566struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);567struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);568struct mt8186_afe_private *afe_priv = afe->platform_priv;569570ucontrol->value.integer.value[0] =571afe_priv->irq_cnt[MT8186_PRIMARY_MEMIF];572573return 0;574}575576static int mt8186_irq_cnt1_set(struct snd_kcontrol *kcontrol,577struct snd_ctl_elem_value *ucontrol)578{579struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);580struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);581struct mt8186_afe_private *afe_priv = afe->platform_priv;582int memif_num = MT8186_PRIMARY_MEMIF;583struct mtk_base_afe_memif *memif = &afe->memif[memif_num];584int irq_id = memif->irq_usage;585int irq_cnt = afe_priv->irq_cnt[memif_num];586587dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n",588__func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]);589590if (irq_cnt == ucontrol->value.integer.value[0])591return 0;592593irq_cnt = ucontrol->value.integer.value[0];594afe_priv->irq_cnt[memif_num] = irq_cnt;595596if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) {597struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];598const struct mtk_base_irq_data *irq_data = irqs->irq_data;599600regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,601irq_data->irq_cnt_maskbit602<< irq_data->irq_cnt_shift,603irq_cnt << irq_data->irq_cnt_shift);604} else {605dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n",606__func__, irq_id);607}608609return 1;610}611612static int mt8186_irq_cnt2_get(struct snd_kcontrol *kcontrol,613struct snd_ctl_elem_value *ucontrol)614{615struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);616struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);617struct mt8186_afe_private *afe_priv = afe->platform_priv;618619ucontrol->value.integer.value[0] =620afe_priv->irq_cnt[MT8186_RECORD_MEMIF];621622return 0;623}624625static int mt8186_irq_cnt2_set(struct snd_kcontrol *kcontrol,626struct snd_ctl_elem_value *ucontrol)627{628struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);629struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);630struct mt8186_afe_private *afe_priv = afe->platform_priv;631int memif_num = MT8186_RECORD_MEMIF;632struct mtk_base_afe_memif *memif = &afe->memif[memif_num];633int irq_id = memif->irq_usage;634int irq_cnt = afe_priv->irq_cnt[memif_num];635636dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n",637__func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]);638639if (irq_cnt == ucontrol->value.integer.value[0])640return 0;641642irq_cnt = ucontrol->value.integer.value[0];643afe_priv->irq_cnt[memif_num] = irq_cnt;644645if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) {646struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];647const struct mtk_base_irq_data *irq_data = irqs->irq_data;648649regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,650irq_data->irq_cnt_maskbit651<< irq_data->irq_cnt_shift,652irq_cnt << irq_data->irq_cnt_shift);653} else {654dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n",655__func__, irq_id);656}657658return 1;659}660661static int mt8186_record_xrun_assert_get(struct snd_kcontrol *kcontrol,662struct snd_ctl_elem_value *ucontrol)663{664struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);665struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);666struct mt8186_afe_private *afe_priv = afe->platform_priv;667int xrun_assert = afe_priv->xrun_assert[MT8186_RECORD_MEMIF];668669ucontrol->value.integer.value[0] = xrun_assert;670671return 0;672}673674static int mt8186_record_xrun_assert_set(struct snd_kcontrol *kcontrol,675struct snd_ctl_elem_value *ucontrol)676{677struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);678struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);679struct mt8186_afe_private *afe_priv = afe->platform_priv;680int xrun_assert = ucontrol->value.integer.value[0];681682dev_dbg(afe->dev, "%s(), xrun_assert %d\n", __func__, xrun_assert);683684if (xrun_assert == afe_priv->xrun_assert[MT8186_RECORD_MEMIF])685return 0;686687afe_priv->xrun_assert[MT8186_RECORD_MEMIF] = xrun_assert;688689return 1;690}691692static const struct snd_kcontrol_new mt8186_pcm_kcontrols[] = {693SOC_SINGLE_EXT("Audio IRQ1 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0,694mt8186_irq_cnt1_get, mt8186_irq_cnt1_set),695SOC_SINGLE_EXT("Audio IRQ2 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0,696mt8186_irq_cnt2_get, mt8186_irq_cnt2_set),697SOC_SINGLE_EXT("record_xrun_assert", SND_SOC_NOPM, 0, 0x1, 0,698mt8186_record_xrun_assert_get,699mt8186_record_xrun_assert_set),700};701702/* dma widget & routes*/703static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {704SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN21,705I_ADDA_UL_CH1, 1, 0),706SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN21,707I_ADDA_UL_CH2, 1, 0),708SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN21,709I_ADDA_UL_CH3, 1, 0),710SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN21_1,711I_TDM_IN_CH1, 1, 0),712};713714static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {715SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN22,716I_ADDA_UL_CH1, 1, 0),717SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN22,718I_ADDA_UL_CH2, 1, 0),719SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN22,720I_ADDA_UL_CH3, 1, 0),721SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN22,722I_ADDA_UL_CH4, 1, 0),723SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN22_1,724I_TDM_IN_CH2, 1, 0),725};726727static const struct snd_kcontrol_new memif_ul1_ch3_mix[] = {728SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN9,729I_ADDA_UL_CH1, 1, 0),730SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN9,731I_ADDA_UL_CH2, 1, 0),732SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN9,733I_ADDA_UL_CH3, 1, 0),734SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN9_1,735I_TDM_IN_CH3, 1, 0),736};737738static const struct snd_kcontrol_new memif_ul1_ch4_mix[] = {739SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN10,740I_ADDA_UL_CH1, 1, 0),741SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN10,742I_ADDA_UL_CH2, 1, 0),743SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN10,744I_ADDA_UL_CH3, 1, 0),745SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN10,746I_ADDA_UL_CH4, 1, 0),747SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN10_1,748I_TDM_IN_CH4, 1, 0),749};750751static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {752SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN5,753I_I2S0_CH1, 1, 0),754SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN5,755I_DL1_CH1, 1, 0),756SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN5,757I_DL12_CH1, 1, 0),758SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN5,759I_DL2_CH1, 1, 0),760SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN5,761I_DL3_CH1, 1, 0),762SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN5_1,763I_DL4_CH1, 1, 0),764SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN5_1,765I_DL5_CH1, 1, 0),766SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN5_1,767I_DL6_CH1, 1, 0),768SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN5,769I_PCM_1_CAP_CH1, 1, 0),770SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN5,771I_I2S2_CH1, 1, 0),772SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN5_1,773I_CONNSYS_I2S_CH1, 1, 0),774SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1 Switch", AFE_CONN5_1,775I_SRC_1_OUT_CH1, 1, 0),776};777778static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {779SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN6,780I_I2S0_CH2, 1, 0),781SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN6,782I_DL1_CH2, 1, 0),783SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN6,784I_DL12_CH2, 1, 0),785SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN6,786I_DL2_CH2, 1, 0),787SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN6,788I_DL3_CH2, 1, 0),789SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN6_1,790I_DL4_CH2, 1, 0),791SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN6_1,792I_DL5_CH2, 1, 0),793SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN6_1,794I_DL6_CH2, 1, 0),795SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN6,796I_PCM_1_CAP_CH2, 1, 0),797SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN6,798I_I2S2_CH2, 1, 0),799SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN6_1,800I_CONNSYS_I2S_CH2, 1, 0),801SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2 Switch", AFE_CONN6_1,802I_SRC_1_OUT_CH2, 1, 0),803};804805static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {806SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN32_1,807I_CONNSYS_I2S_CH1, 1, 0),808SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN32,809I_DL1_CH1, 1, 0),810SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN32,811I_DL2_CH1, 1, 0),812};813814static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {815SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN33_1,816I_CONNSYS_I2S_CH2, 1, 0),817};818819static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {820SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN38,821I_ADDA_UL_CH1, 1, 0),822SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN38,823I_I2S0_CH1, 1, 0),824};825826static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = {827SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN39,828I_ADDA_UL_CH2, 1, 0),829SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN39,830I_I2S0_CH2, 1, 0),831};832833static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = {834SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN44,835I_ADDA_UL_CH1, 1, 0),836};837838static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = {839SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN45,840I_ADDA_UL_CH2, 1, 0),841};842843static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = {844SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN46,845I_ADDA_UL_CH1, 1, 0),846SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN46,847I_DL1_CH1, 1, 0),848SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN46,849I_DL12_CH1, 1, 0),850SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN46_1,851I_DL6_CH1, 1, 0),852SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN46,853I_DL2_CH1, 1, 0),854SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN46,855I_DL3_CH1, 1, 0),856SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN46_1,857I_DL4_CH1, 1, 0),858SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN46,859I_PCM_1_CAP_CH1, 1, 0),860SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1 Switch", AFE_CONN46,861I_GAIN1_OUT_CH1, 1, 0),862};863864static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = {865SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN47,866I_ADDA_UL_CH2, 1, 0),867SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN47,868I_DL1_CH2, 1, 0),869SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN47,870I_DL12_CH2, 1, 0),871SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN47_1,872I_DL6_CH2, 1, 0),873SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN47,874I_DL2_CH2, 1, 0),875SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN47,876I_DL3_CH2, 1, 0),877SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN47_1,878I_DL4_CH2, 1, 0),879SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN47,880I_PCM_1_CAP_CH2, 1, 0),881SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2 Switch", AFE_CONN47,882I_GAIN1_OUT_CH2, 1, 0),883};884885static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = {886SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN48,887I_ADDA_UL_CH1, 1, 0),888SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH1 Switch", AFE_CONN48,889I_GAIN2_OUT_CH1, 1, 0),890SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1 Switch", AFE_CONN48_1,891I_SRC_2_OUT_CH1, 1, 0),892};893894static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = {895SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN49,896I_ADDA_UL_CH2, 1, 0),897SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH2 Switch", AFE_CONN49,898I_GAIN2_OUT_CH2, 1, 0),899SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2 Switch", AFE_CONN49_1,900I_SRC_2_OUT_CH2, 1, 0),901};902903static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = {904SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN50,905I_ADDA_UL_CH1, 1, 0),906};907908static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = {909SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN51,910I_ADDA_UL_CH2, 1, 0),911};912913static const struct snd_kcontrol_new hw_cm1_ch1_mix[] = {914SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN58_1,915I_TDM_IN_CH1, 1, 0),916SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN58,917I_I2S0_CH1, 1, 0),918SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN58,919I_I2S2_CH1, 1, 0),920SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN58,921I_ADDA_UL_CH1, 1, 0),922SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN58,923I_DL1_CH1, 1, 0),924SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN58,925I_DL12_CH1, 1, 0),926SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN58,927I_DL12_CH3, 1, 0),928SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN58,929I_DL2_CH1, 1, 0),930SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN58,931I_DL3_CH1, 1, 0),932SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN58_1,933I_DL4_CH1, 1, 0),934SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN58_1,935I_DL5_CH1, 1, 0),936SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN58_1,937I_SRC_1_OUT_CH1, 1, 0),938SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN58_1,939I_SRC_2_OUT_CH1, 1, 0),940};941942static const struct snd_kcontrol_new hw_cm1_ch2_mix[] = {943SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN59_1,944I_TDM_IN_CH2, 1, 0),945SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN59,946I_I2S0_CH2, 1, 0),947SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN59,948I_I2S2_CH2, 1, 0),949SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN59,950I_ADDA_UL_CH2, 1, 0),951SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN59,952I_DL1_CH2, 1, 0),953SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN59,954I_DL12_CH2, 1, 0),955SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN59,956I_DL12_CH4, 1, 0),957SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN59,958I_DL2_CH2, 1, 0),959SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN59,960I_DL3_CH2, 1, 0),961SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN59_1,962I_DL4_CH2, 1, 0),963SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN59_1,964I_DL5_CH2, 1, 0),965SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN59_1,966I_SRC_1_OUT_CH2, 1, 0),967SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN59_1,968I_SRC_2_OUT_CH2, 1, 0),969};970971static const struct snd_kcontrol_new hw_cm1_ch3_mix[] = {972SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN60_1,973I_TDM_IN_CH3, 1, 0),974SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN60,975I_I2S0_CH1, 1, 0),976SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN60,977I_I2S2_CH1, 1, 0),978SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN60,979I_ADDA_UL_CH1, 1, 0),980SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN60,981I_DL1_CH1, 1, 0),982SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN60,983I_DL12_CH1, 1, 0),984SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN60,985I_DL12_CH3, 1, 0),986SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN60,987I_DL2_CH1, 1, 0),988SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN60,989I_DL3_CH1, 1, 0),990SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN60_1,991I_DL4_CH1, 1, 0),992SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN60_1,993I_DL5_CH1, 1, 0),994SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN60_1,995I_SRC_1_OUT_CH1, 1, 0),996SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN60_1,997I_SRC_2_OUT_CH1, 1, 0),998};9991000static const struct snd_kcontrol_new hw_cm1_ch4_mix[] = {1001SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN61_1,1002I_TDM_IN_CH4, 1, 0),1003SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN61,1004I_I2S0_CH2, 1, 0),1005SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN61,1006I_I2S2_CH2, 1, 0),1007SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN61,1008I_ADDA_UL_CH2, 1, 0),1009SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN61,1010I_DL1_CH2, 1, 0),1011SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN61,1012I_DL12_CH2, 1, 0),1013SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN61,1014I_DL12_CH4, 1, 0),1015SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN61,1016I_DL2_CH2, 1, 0),1017SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN61,1018I_DL3_CH2, 1, 0),1019SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN61_1,1020I_DL4_CH2, 1, 0),1021SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN61_1,1022I_DL5_CH2, 1, 0),1023SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN61_1,1024I_SRC_1_OUT_CH2, 1, 0),1025SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN61_1,1026I_SRC_2_OUT_CH2, 1, 0),1027};10281029static const struct snd_kcontrol_new hw_cm1_ch5_mix[] = {1030SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH5 Switch", AFE_CONN62_1,1031I_TDM_IN_CH5, 1, 0),1032SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN62,1033I_I2S0_CH1, 1, 0),1034SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN62,1035I_I2S2_CH1, 1, 0),1036SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN62,1037I_ADDA_UL_CH1, 1, 0),1038SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN62,1039I_DL1_CH1, 1, 0),1040SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN62,1041I_DL12_CH1, 1, 0),1042SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN62,1043I_DL12_CH3, 1, 0),1044SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN62,1045I_DL2_CH1, 1, 0),1046SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN62,1047I_DL3_CH1, 1, 0),1048SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN62_1,1049I_DL4_CH1, 1, 0),1050SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN62_1,1051I_DL5_CH1, 1, 0),1052SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN62_1,1053I_SRC_1_OUT_CH1, 1, 0),1054SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN62_1,1055I_SRC_2_OUT_CH1, 1, 0),1056};10571058static const struct snd_kcontrol_new hw_cm1_ch6_mix[] = {1059SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH6 Switch", AFE_CONN63_1,1060I_TDM_IN_CH6, 1, 0),1061SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN63,1062I_I2S0_CH2, 1, 0),1063SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN63,1064I_I2S2_CH2, 1, 0),1065SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN63,1066I_ADDA_UL_CH2, 1, 0),1067SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN63,1068I_DL1_CH2, 1, 0),1069SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN63,1070I_DL12_CH2, 1, 0),1071SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN63,1072I_DL12_CH4, 1, 0),1073SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN63,1074I_DL2_CH2, 1, 0),1075SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN63,1076I_DL3_CH2, 1, 0),1077SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN63_1,1078I_DL4_CH2, 1, 0),1079SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN63_1,1080I_DL5_CH2, 1, 0),1081SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN63_1,1082I_SRC_1_OUT_CH2, 1, 0),1083SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN63_1,1084I_SRC_2_OUT_CH2, 1, 0),1085};10861087static const struct snd_kcontrol_new hw_cm1_ch7_mix[] = {1088SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH7 Switch", AFE_CONN64_1,1089I_TDM_IN_CH7, 1, 0),1090SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN64,1091I_I2S0_CH1, 1, 0),1092SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN64,1093I_I2S2_CH1, 1, 0),1094SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN64,1095I_ADDA_UL_CH1, 1, 0),1096SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN64,1097I_DL1_CH1, 1, 0),1098SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1v", AFE_CONN64,1099I_DL12_CH1, 1, 0),1100SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN64,1101I_DL12_CH3, 1, 0),1102SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN64,1103I_DL2_CH1, 1, 0),1104SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN64,1105I_DL3_CH1, 1, 0),1106SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN64_1,1107I_DL4_CH1, 1, 0),1108SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN64_1,1109I_DL5_CH1, 1, 0),1110SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN64_1,1111I_SRC_1_OUT_CH1, 1, 0),1112SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN64_1,1113I_SRC_2_OUT_CH1, 1, 0),1114};11151116static const struct snd_kcontrol_new hw_cm1_ch8_mix[] = {1117SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH8 Switch", AFE_CONN65_1,1118I_TDM_IN_CH8, 1, 0),1119SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN65,1120I_I2S0_CH2, 1, 0),1121SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN65,1122I_I2S2_CH2, 1, 0),1123SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN65,1124I_ADDA_UL_CH2, 1, 0),1125SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN65,1126I_DL1_CH2, 1, 0),1127SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN65,1128I_DL12_CH2, 1, 0),1129SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN65,1130I_DL12_CH4, 1, 0),1131SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN65,1132I_DL2_CH2, 1, 0),1133SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN65,1134I_DL3_CH2, 1, 0),1135SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN65_1,1136I_DL4_CH2, 1, 0),1137SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN65_1,1138I_DL5_CH2, 1, 0),1139SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN65_1,1140I_SRC_1_OUT_CH2, 1, 0),1141SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN65_1,1142I_SRC_2_OUT_CH2, 1, 0),1143};11441145static const struct snd_kcontrol_new hw_cm1_ch9_mix[] = {1146SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN66,1147I_I2S0_CH1, 1, 0),1148SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN66,1149I_I2S2_CH1, 1, 0),1150SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN66,1151I_ADDA_UL_CH1, 1, 0),1152SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN66,1153I_DL1_CH1, 1, 0),1154SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN66,1155I_DL12_CH1, 1, 0),1156SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN66,1157I_DL12_CH3, 1, 0),1158SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN66,1159I_DL2_CH1, 1, 0),1160SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN66,1161I_DL3_CH1, 1, 0),1162SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN66_1,1163I_DL4_CH1, 1, 0),1164SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN66_1,1165I_DL5_CH1, 1, 0),1166SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN66_1,1167I_SRC_1_OUT_CH1, 1, 0),1168SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN66_1,1169I_SRC_2_OUT_CH1, 1, 0),1170};11711172static const struct snd_kcontrol_new hw_cm1_ch10_mix[] = {1173SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN67,1174I_I2S0_CH2, 1, 0),1175SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN67,1176I_I2S2_CH2, 1, 0),1177SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN67,1178I_ADDA_UL_CH2, 1, 0),1179SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN67,1180I_DL1_CH2, 1, 0),1181SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN67,1182I_DL12_CH2, 1, 0),1183SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN67,1184I_DL12_CH4, 1, 0),1185SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN67,1186I_DL2_CH2, 1, 0),1187SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN67,1188I_DL3_CH2, 1, 0),1189SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN67_1,1190I_DL4_CH2, 1, 0),1191SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN67_1,1192I_DL5_CH2, 1, 0),1193SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN67_1,1194I_SRC_1_OUT_CH2, 1, 0),1195SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN67_1,1196I_SRC_2_OUT_CH2, 1, 0),1197};11981199static const struct snd_kcontrol_new hw_cm1_ch11_mix[] = {1200SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN68,1201I_I2S0_CH1, 1, 0),1202SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN68,1203I_I2S2_CH1, 1, 0),1204SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN68,1205I_ADDA_UL_CH1, 1, 0),1206SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN68,1207I_DL1_CH1, 1, 0),1208SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN68,1209I_DL12_CH1, 1, 0),1210SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN68,1211I_DL12_CH3, 1, 0),1212SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN68,1213I_DL2_CH1, 1, 0),1214SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN68,1215I_DL3_CH1, 1, 0),1216SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN68_1,1217I_DL4_CH1, 1, 0),1218SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN68_1,1219I_DL5_CH1, 1, 0),1220SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN68_1,1221I_SRC_1_OUT_CH1, 1, 0),1222SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN68_1,1223I_SRC_2_OUT_CH1, 1, 0),1224};12251226static const struct snd_kcontrol_new hw_cm1_ch12_mix[] = {1227SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN69,1228I_I2S0_CH2, 1, 0),1229SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN69,1230I_I2S2_CH2, 1, 0),1231SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN69,1232I_ADDA_UL_CH2, 1, 0),1233SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN69,1234I_DL1_CH2, 1, 0),1235SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN69,1236I_DL12_CH2, 1, 0),1237SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN69,1238I_DL12_CH4, 1, 0),1239SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN69,1240I_DL2_CH2, 1, 0),1241SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN69,1242I_DL3_CH2, 1, 0),1243SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN69_1,1244I_DL4_CH2, 1, 0),1245SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN69_1,1246I_DL5_CH2, 1, 0),1247SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN69_1,1248I_SRC_1_OUT_CH2, 1, 0),1249SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN69_1,1250I_SRC_2_OUT_CH2, 1, 0),1251};12521253/* ADDA UL MUX */1254enum {1255UL5_IN_MUX_CM1 = 0,1256UL5_IN_MUX_NORMAL,1257UL5_IN_MUX_MASK = 0x1,1258};12591260static const char * const ul5_in_mux_map[] = {1261"UL5_IN_FROM_CM1", "UL5_IN_FROM_Normal"1262};12631264static int ul5_in_map_value[] = {1265UL5_IN_MUX_CM1,1266UL5_IN_MUX_NORMAL,1267};12681269static SOC_VALUE_ENUM_SINGLE_DECL(ul5_in_mux_map_enum,1270AFE_CM1_CON,1271VUL3_BYPASS_CM_SFT,1272VUL3_BYPASS_CM_MASK,1273ul5_in_mux_map,1274ul5_in_map_value);12751276static const struct snd_kcontrol_new ul5_in_mux_control =1277SOC_DAPM_ENUM("UL5_IN_MUX Select", ul5_in_mux_map_enum);12781279static const struct snd_soc_dapm_widget mt8186_memif_widgets[] = {1280/* inter-connections */1281SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,1282memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),1283SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,1284memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),1285SND_SOC_DAPM_MIXER("UL1_CH3", SND_SOC_NOPM, 0, 0,1286memif_ul1_ch3_mix, ARRAY_SIZE(memif_ul1_ch3_mix)),1287SND_SOC_DAPM_MIXER("UL1_CH4", SND_SOC_NOPM, 0, 0,1288memif_ul1_ch4_mix, ARRAY_SIZE(memif_ul1_ch4_mix)),12891290SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,1291memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),1292SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,1293memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),12941295SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,1296memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),1297SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,1298memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),12991300SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0,1301memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)),1302SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0,1303memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)),13041305SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0,1306memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)),1307SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0,1308memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)),13091310SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0,1311memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)),1312SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0,1313memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)),13141315SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0,1316memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)),1317SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0,1318memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)),13191320SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0,1321memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)),1322SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0,1323memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)),13241325SND_SOC_DAPM_MIXER("UL5_2CH", SND_SOC_NOPM, 0, 0, NULL, 0),13261327SND_SOC_DAPM_MIXER("HW_CM1", SND_SOC_NOPM, 0, 0, NULL, 0),13281329/* CM1 en*/1330SND_SOC_DAPM_SUPPLY_S("CM1_EN", 0, AFE_CM1_CON,1331CHANNEL_MERGE0_EN_SFT, 0, NULL,1332SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),13331334SND_SOC_DAPM_MIXER("HW_CM1_CH1", SND_SOC_NOPM, 0, 0,1335hw_cm1_ch1_mix, ARRAY_SIZE(hw_cm1_ch1_mix)),1336SND_SOC_DAPM_MIXER("HW_CM1_CH2", SND_SOC_NOPM, 0, 0,1337hw_cm1_ch2_mix, ARRAY_SIZE(hw_cm1_ch2_mix)),1338SND_SOC_DAPM_MIXER("HW_CM1_CH3", SND_SOC_NOPM, 0, 0,1339hw_cm1_ch3_mix, ARRAY_SIZE(hw_cm1_ch3_mix)),1340SND_SOC_DAPM_MIXER("HW_CM1_CH4", SND_SOC_NOPM, 0, 0,1341hw_cm1_ch4_mix, ARRAY_SIZE(hw_cm1_ch4_mix)),1342SND_SOC_DAPM_MIXER("HW_CM1_CH5", SND_SOC_NOPM, 0, 0,1343hw_cm1_ch5_mix, ARRAY_SIZE(hw_cm1_ch5_mix)),1344SND_SOC_DAPM_MIXER("HW_CM1_CH6", SND_SOC_NOPM, 0, 0,1345hw_cm1_ch6_mix, ARRAY_SIZE(hw_cm1_ch6_mix)),1346SND_SOC_DAPM_MIXER("HW_CM1_CH7", SND_SOC_NOPM, 0, 0,1347hw_cm1_ch7_mix, ARRAY_SIZE(hw_cm1_ch7_mix)),1348SND_SOC_DAPM_MIXER("HW_CM1_CH8", SND_SOC_NOPM, 0, 0,1349hw_cm1_ch8_mix, ARRAY_SIZE(hw_cm1_ch8_mix)),1350SND_SOC_DAPM_MIXER("HW_CM1_CH9", SND_SOC_NOPM, 0, 0,1351hw_cm1_ch9_mix, ARRAY_SIZE(hw_cm1_ch9_mix)),1352SND_SOC_DAPM_MIXER("HW_CM1_CH10", SND_SOC_NOPM, 0, 0,1353hw_cm1_ch10_mix, ARRAY_SIZE(hw_cm1_ch10_mix)),1354SND_SOC_DAPM_MIXER("HW_CM1_CH11", SND_SOC_NOPM, 0, 0,1355hw_cm1_ch11_mix, ARRAY_SIZE(hw_cm1_ch11_mix)),1356SND_SOC_DAPM_MIXER("HW_CM1_CH12", SND_SOC_NOPM, 0, 0,1357hw_cm1_ch12_mix, ARRAY_SIZE(hw_cm1_ch12_mix)),13581359SND_SOC_DAPM_MUX("UL5_IN_MUX", SND_SOC_NOPM, 0, 0,1360&ul5_in_mux_control),13611362SND_SOC_DAPM_MIXER("DSP_DL1_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),1363SND_SOC_DAPM_MIXER("DSP_DL2_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),13641365SND_SOC_DAPM_INPUT("UL1_VIRTUAL_INPUT"),1366SND_SOC_DAPM_INPUT("UL2_VIRTUAL_INPUT"),1367SND_SOC_DAPM_INPUT("UL3_VIRTUAL_INPUT"),1368SND_SOC_DAPM_INPUT("UL4_VIRTUAL_INPUT"),1369SND_SOC_DAPM_INPUT("UL5_VIRTUAL_INPUT"),1370SND_SOC_DAPM_INPUT("UL6_VIRTUAL_INPUT"),1371};13721373static 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"},13901391{"UL2", NULL, "UL2_CH1"},1392{"UL2", NULL, "UL2_CH2"},13931394/* 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"},14091410{"Hostless_UL2 UL", NULL, "UL2_VIRTUAL_INPUT"},14111412{"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"},14161417{"UL2_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"},1418{"UL2_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"},14191420{"UL2_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"},1421{"UL2_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"},14221423{"UL2_CH1", "SRC_1_OUT_CH1 Switch", "HW_SRC_1_Out"},1424{"UL2_CH2", "SRC_1_OUT_CH2 Switch", "HW_SRC_1_Out"},14251426{"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"},14301431{"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"},14371438{"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"},14681469{"HW_CM1_CH3", "DL1_CH1 Switch", "Hostless_UL5 UL"},1470{"HW_CM1_CH4", "DL1_CH2 Switch", "Hostless_UL5 UL"},14711472{"HW_CM1_CH3", "DL3_CH1 Switch", "Hostless_UL5 UL"},1473{"HW_CM1_CH4", "DL3_CH2 Switch", "Hostless_UL5 UL"},14741475{"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"},14771478{"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"},14821483{"Hostless_UL5 UL", NULL, "UL5_VIRTUAL_INPUT"},14841485{"UL6", NULL, "UL6_CH1"},1486{"UL6", NULL, "UL6_CH2"},14871488{"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"},15071508{"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"},15161517{"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"},15211522{"HW_GAIN2_IN_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},1523{"HW_GAIN2_IN_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},1524};15251526static 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};20132014static 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};23672368static 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};23882389static 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 */2393switch (reg) {2394case AUDIO_TOP_CON0: /* reg bit controlled by CCF */2395case AUDIO_TOP_CON1: /* reg bit controlled by CCF */2396case AUDIO_TOP_CON2:2397case AUDIO_TOP_CON3:2398case AFE_DAC_CON0:2399case AFE_DL1_CUR_MSB:2400case AFE_DL1_CUR:2401case AFE_DL1_END:2402case AFE_DL2_CUR_MSB:2403case AFE_DL2_CUR:2404case AFE_DL2_END:2405case AFE_DL3_CUR_MSB:2406case AFE_DL3_CUR:2407case AFE_DL3_END:2408case AFE_DL4_CUR_MSB:2409case AFE_DL4_CUR:2410case AFE_DL4_END:2411case AFE_DL12_CUR_MSB:2412case AFE_DL12_CUR:2413case AFE_DL12_END:2414case AFE_ADDA_SRC_DEBUG_MON0:2415case AFE_ADDA_SRC_DEBUG_MON1:2416case AFE_ADDA_UL_SRC_MON0:2417case AFE_ADDA_UL_SRC_MON1:2418case AFE_SECURE_CON0:2419case AFE_SRAM_BOUND:2420case AFE_SECURE_CON1:2421case AFE_VUL_CUR_MSB:2422case AFE_VUL_CUR:2423case AFE_VUL_END:2424case AFE_SIDETONE_MON:2425case AFE_SIDETONE_CON0:2426case AFE_SIDETONE_COEFF:2427case AFE_VUL2_CUR_MSB:2428case AFE_VUL2_CUR:2429case AFE_VUL2_END:2430case AFE_VUL3_CUR_MSB:2431case AFE_VUL3_CUR:2432case AFE_VUL3_END:2433case AFE_I2S_MON:2434case AFE_DAC_MON:2435case AFE_IRQ0_MCU_CNT_MON:2436case AFE_IRQ6_MCU_CNT_MON:2437case AFE_VUL4_CUR_MSB:2438case AFE_VUL4_CUR:2439case AFE_VUL4_END:2440case AFE_VUL12_CUR_MSB:2441case AFE_VUL12_CUR:2442case AFE_VUL12_END:2443case AFE_IRQ3_MCU_CNT_MON:2444case AFE_IRQ4_MCU_CNT_MON:2445case AFE_IRQ_MCU_STATUS:2446case AFE_IRQ_MCU_CLR:2447case AFE_IRQ_MCU_MON2:2448case AFE_IRQ1_MCU_CNT_MON:2449case AFE_IRQ2_MCU_CNT_MON:2450case AFE_IRQ5_MCU_CNT_MON:2451case AFE_IRQ7_MCU_CNT_MON:2452case AFE_IRQ_MCU_MISS_CLR:2453case AFE_GAIN1_CUR:2454case AFE_GAIN2_CUR:2455case AFE_SRAM_DELSEL_CON1:2456case PCM_INTF_CON2:2457case FPGA_CFG0:2458case FPGA_CFG1:2459case FPGA_CFG2:2460case FPGA_CFG3:2461case AUDIO_TOP_DBG_MON0:2462case AUDIO_TOP_DBG_MON1:2463case AFE_IRQ8_MCU_CNT_MON:2464case AFE_IRQ11_MCU_CNT_MON:2465case AFE_IRQ12_MCU_CNT_MON:2466case AFE_IRQ9_MCU_CNT_MON:2467case AFE_IRQ10_MCU_CNT_MON:2468case AFE_IRQ13_MCU_CNT_MON:2469case AFE_IRQ14_MCU_CNT_MON:2470case AFE_IRQ15_MCU_CNT_MON:2471case AFE_IRQ16_MCU_CNT_MON:2472case AFE_IRQ17_MCU_CNT_MON:2473case AFE_IRQ18_MCU_CNT_MON:2474case AFE_IRQ19_MCU_CNT_MON:2475case AFE_IRQ20_MCU_CNT_MON:2476case AFE_IRQ21_MCU_CNT_MON:2477case AFE_IRQ22_MCU_CNT_MON:2478case AFE_IRQ23_MCU_CNT_MON:2479case AFE_IRQ24_MCU_CNT_MON:2480case AFE_IRQ25_MCU_CNT_MON:2481case AFE_IRQ26_MCU_CNT_MON:2482case AFE_IRQ31_MCU_CNT_MON:2483case AFE_CBIP_MON0:2484case AFE_CBIP_SLV_MUX_MON0:2485case AFE_CBIP_SLV_DECODER_MON0:2486case AFE_ADDA6_MTKAIF_MON0:2487case AFE_ADDA6_MTKAIF_MON1:2488case AFE_AWB_CUR_MSB:2489case AFE_AWB_CUR:2490case AFE_AWB_END:2491case AFE_AWB2_CUR_MSB:2492case AFE_AWB2_CUR:2493case AFE_AWB2_END:2494case AFE_DAI_CUR_MSB:2495case AFE_DAI_CUR:2496case AFE_DAI_END:2497case AFE_DAI2_CUR_MSB:2498case AFE_DAI2_CUR:2499case AFE_DAI2_END:2500case AFE_ADDA6_SRC_DEBUG_MON0:2501case AFE_ADD6A_UL_SRC_MON0:2502case AFE_ADDA6_UL_SRC_MON1:2503case AFE_MOD_DAI_CUR_MSB:2504case AFE_MOD_DAI_CUR:2505case AFE_MOD_DAI_END:2506case AFE_AWB_RCH_MON:2507case AFE_AWB_LCH_MON:2508case AFE_VUL_RCH_MON:2509case AFE_VUL_LCH_MON:2510case AFE_VUL12_RCH_MON:2511case AFE_VUL12_LCH_MON:2512case AFE_VUL2_RCH_MON:2513case AFE_VUL2_LCH_MON:2514case AFE_DAI_DATA_MON:2515case AFE_MOD_DAI_DATA_MON:2516case AFE_DAI2_DATA_MON:2517case AFE_AWB2_RCH_MON:2518case AFE_AWB2_LCH_MON:2519case AFE_VUL3_RCH_MON:2520case AFE_VUL3_LCH_MON:2521case AFE_VUL4_RCH_MON:2522case AFE_VUL4_LCH_MON:2523case AFE_VUL5_RCH_MON:2524case AFE_VUL5_LCH_MON:2525case AFE_VUL6_RCH_MON:2526case AFE_VUL6_LCH_MON:2527case AFE_DL1_RCH_MON:2528case AFE_DL1_LCH_MON:2529case AFE_DL2_RCH_MON:2530case AFE_DL2_LCH_MON:2531case AFE_DL12_RCH1_MON:2532case AFE_DL12_LCH1_MON:2533case AFE_DL12_RCH2_MON:2534case AFE_DL12_LCH2_MON:2535case AFE_DL3_RCH_MON:2536case AFE_DL3_LCH_MON:2537case AFE_DL4_RCH_MON:2538case AFE_DL4_LCH_MON:2539case AFE_DL5_RCH_MON:2540case AFE_DL5_LCH_MON:2541case AFE_DL6_RCH_MON:2542case AFE_DL6_LCH_MON:2543case AFE_DL7_RCH_MON:2544case AFE_DL7_LCH_MON:2545case AFE_DL8_RCH_MON:2546case AFE_DL8_LCH_MON:2547case AFE_VUL5_CUR_MSB:2548case AFE_VUL5_CUR:2549case AFE_VUL5_END:2550case AFE_VUL6_CUR_MSB:2551case AFE_VUL6_CUR:2552case AFE_VUL6_END:2553case AFE_ADDA_DL_SDM_FIFO_MON:2554case AFE_ADDA_DL_SRC_LCH_MON:2555case AFE_ADDA_DL_SRC_RCH_MON:2556case AFE_ADDA_DL_SDM_OUT_MON:2557case AFE_CONNSYS_I2S_MON:2558case AFE_ASRC_2CH_CON0:2559case AFE_ASRC_2CH_CON2:2560case AFE_ASRC_2CH_CON3:2561case AFE_ASRC_2CH_CON4:2562case AFE_ASRC_2CH_CON5:2563case AFE_ASRC_2CH_CON7:2564case AFE_ASRC_2CH_CON8:2565case AFE_ASRC_2CH_CON12:2566case AFE_ASRC_2CH_CON13:2567case AFE_ADDA_MTKAIF_MON0:2568case AFE_ADDA_MTKAIF_MON1:2569case AFE_AUD_PAD_TOP:2570case AFE_DL_NLE_R_MON0:2571case AFE_DL_NLE_R_MON1:2572case AFE_DL_NLE_R_MON2:2573case AFE_DL_NLE_L_MON0:2574case AFE_DL_NLE_L_MON1:2575case AFE_DL_NLE_L_MON2:2576case AFE_GENERAL1_ASRC_2CH_CON0:2577case AFE_GENERAL1_ASRC_2CH_CON2:2578case AFE_GENERAL1_ASRC_2CH_CON3:2579case AFE_GENERAL1_ASRC_2CH_CON4:2580case AFE_GENERAL1_ASRC_2CH_CON5:2581case AFE_GENERAL1_ASRC_2CH_CON7:2582case AFE_GENERAL1_ASRC_2CH_CON8:2583case AFE_GENERAL1_ASRC_2CH_CON12:2584case AFE_GENERAL1_ASRC_2CH_CON13:2585case AFE_GENERAL2_ASRC_2CH_CON0:2586case AFE_GENERAL2_ASRC_2CH_CON2:2587case AFE_GENERAL2_ASRC_2CH_CON3:2588case AFE_GENERAL2_ASRC_2CH_CON4:2589case AFE_GENERAL2_ASRC_2CH_CON5:2590case AFE_GENERAL2_ASRC_2CH_CON7:2591case AFE_GENERAL2_ASRC_2CH_CON8:2592case AFE_GENERAL2_ASRC_2CH_CON12:2593case AFE_GENERAL2_ASRC_2CH_CON13:2594case AFE_DL5_CUR_MSB:2595case AFE_DL5_CUR:2596case AFE_DL5_END:2597case AFE_DL6_CUR_MSB:2598case AFE_DL6_CUR:2599case AFE_DL6_END:2600case AFE_DL7_CUR_MSB:2601case AFE_DL7_CUR:2602case AFE_DL7_END:2603case AFE_DL8_CUR_MSB:2604case AFE_DL8_CUR:2605case AFE_DL8_END:2606case AFE_PROT_SIDEBAND_MON:2607case AFE_DOMAIN_SIDEBAND0_MON:2608case AFE_DOMAIN_SIDEBAND1_MON:2609case AFE_DOMAIN_SIDEBAND2_MON:2610case AFE_DOMAIN_SIDEBAND3_MON:2611case AFE_APLL1_TUNER_CFG: /* [20:31] is monitor */2612case AFE_APLL2_TUNER_CFG: /* [20:31] is monitor */2613return true;2614default:2615return false;2616};2617}26182619static const struct regmap_config mt8186_afe_regmap_config = {2620.reg_bits = 32,2621.reg_stride = 4,2622.val_bits = 32,26232624.volatile_reg = mt8186_is_volatile_reg,26252626.max_register = AFE_MAX_REGISTER,2627.num_reg_defaults_raw = AFE_MAX_REGISTER,26282629.cache_type = REGCACHE_FLAT,2630};26312632static irqreturn_t mt8186_afe_irq_handler(int irq_id, void *dev)2633{2634struct mtk_base_afe *afe = dev;2635struct mtk_base_afe_irq *irq;2636unsigned int status;2637unsigned int status_mcu;2638unsigned int mcu_en;2639int ret;2640int i;26412642/* get irq that is sent to MCU */2643ret = regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);2644if (ret) {2645dev_err(afe->dev, "%s, get irq direction fail, ret %d", __func__, ret);2646return ret;2647}26482649ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);2650/* only care IRQ which is sent to MCU */2651status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS;26522653if (ret || status_mcu == 0) {2654dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",2655__func__, ret, status, mcu_en);26562657goto err_irq;2658}26592660for (i = 0; i < MT8186_MEMIF_NUM; i++) {2661struct mtk_base_afe_memif *memif = &afe->memif[i];26622663if (!memif->substream)2664continue;26652666if (memif->irq_usage < 0)2667continue;26682669irq = &afe->irqs[memif->irq_usage];26702671if (status_mcu & (1 << irq->irq_data->irq_en_shift))2672snd_pcm_period_elapsed(memif->substream);2673}26742675err_irq:2676/* clear irq */2677regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, status_mcu);26782679return IRQ_HANDLED;2680}26812682static int mt8186_afe_runtime_suspend(struct device *dev)2683{2684struct mtk_base_afe *afe = dev_get_drvdata(dev);2685struct mt8186_afe_private *afe_priv = afe->platform_priv;2686unsigned int value = 0;2687int ret;26882689if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)2690goto skip_regmap;26912692/* disable AFE */2693regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);26942695ret = regmap_read_poll_timeout(afe->regmap,2696AFE_DAC_MON,2697value,2698(value & AFE_ON_RETM_MASK_SFT) == 0,269920,27001 * 1000 * 1000);2701if (ret) {2702dev_err(afe->dev, "%s(), ret %d\n", __func__, ret);2703return ret;2704}27052706/* make sure all irq status are cleared */2707regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);2708regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);27092710/* reset sgen */2711regmap_write(afe->regmap, AFE_SINEGEN_CON0, 0x0);2712regmap_update_bits(afe->regmap, AFE_SINEGEN_CON2,2713INNER_LOOP_BACK_MODE_MASK_SFT,27140x3f << INNER_LOOP_BACK_MODE_SFT);27152716/* cache only */2717regcache_cache_only(afe->regmap, true);2718regcache_mark_dirty(afe->regmap);27192720skip_regmap:2721mt8186_afe_disable_cgs(afe);2722mt8186_afe_disable_clock(afe);27232724return 0;2725}27262727static int mt8186_afe_runtime_resume(struct device *dev)2728{2729struct mtk_base_afe *afe = dev_get_drvdata(dev);2730struct mt8186_afe_private *afe_priv = afe->platform_priv;2731int ret;27322733ret = mt8186_afe_enable_clock(afe);2734if (ret)2735return ret;27362737ret = mt8186_afe_enable_cgs(afe);2738if (ret)2739return ret;27402741if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)2742goto skip_regmap;27432744regcache_cache_only(afe->regmap, false);2745regcache_sync(afe->regmap);27462747/* enable audio sys DCM for power saving */2748regmap_update_bits(afe_priv->infracfg, PERI_BUS_DCM_CTRL, BIT(29), BIT(29));2749regmap_update_bits(afe->regmap, AUDIO_TOP_CON0, BIT(29), BIT(29));27502751/* force cpu use 8_24 format when writing 32bit data */2752regmap_update_bits(afe->regmap, AFE_MEMIF_CON0, CPU_HD_ALIGN_MASK_SFT, 0);27532754/* set all output port to 24bit */2755regmap_write(afe->regmap, AFE_CONN_24BIT, 0xffffffff);2756regmap_write(afe->regmap, AFE_CONN_24BIT_1, 0xffffffff);27572758/* enable AFE */2759regmap_update_bits(afe->regmap, AFE_DAC_CON0, AUDIO_AFE_ON_MASK_SFT, BIT(0));27602761skip_regmap:2762return 0;2763}27642765static int mt8186_afe_component_probe(struct snd_soc_component *component)2766{2767mtk_afe_add_sub_dai_control(component);2768mt8186_add_misc_control(component);27692770return 0;2771}27722773static 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};27792780static int mt8186_dai_memif_register(struct mtk_base_afe *afe)2781{2782struct mtk_base_afe_dai *dai;27832784dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2785if (!dai)2786return -ENOMEM;27872788list_add(&dai->list, &afe->sub_dais);27892790dai->dai_drivers = mt8186_memif_dai_driver;2791dai->num_dai_drivers = ARRAY_SIZE(mt8186_memif_dai_driver);27922793dai->controls = mt8186_pcm_kcontrols;2794dai->num_controls = ARRAY_SIZE(mt8186_pcm_kcontrols);2795dai->dapm_widgets = mt8186_memif_widgets;2796dai->num_dapm_widgets = ARRAY_SIZE(mt8186_memif_widgets);2797dai->dapm_routes = mt8186_memif_routes;2798dai->num_dapm_routes = ARRAY_SIZE(mt8186_memif_routes);2799return 0;2800}28012802typedef int (*dai_register_cb)(struct mtk_base_afe *);2803static const dai_register_cb dai_register_cbs[] = {2804mt8186_dai_adda_register,2805mt8186_dai_i2s_register,2806mt8186_dai_tdm_register,2807mt8186_dai_hw_gain_register,2808mt8186_dai_src_register,2809mt8186_dai_pcm_register,2810mt8186_dai_hostless_register,2811mt8186_dai_memif_register,2812};28132814static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)2815{2816struct mtk_base_afe *afe;2817struct mt8186_afe_private *afe_priv;2818struct reset_control *rstc;2819struct device *dev = &pdev->dev;2820int i, ret, irq_id;28212822ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));2823if (ret)2824return ret;28252826afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);2827if (!afe)2828return -ENOMEM;2829platform_set_drvdata(pdev, afe);28302831afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv), GFP_KERNEL);2832if (!afe->platform_priv)2833return -ENOMEM;28342835afe_priv = afe->platform_priv;2836afe->dev = &pdev->dev;28372838ret = of_reserved_mem_device_init(dev);2839if (ret) {2840dev_info(dev, "no reserved memory found, pre-allocating buffers instead\n");2841afe->preallocate_buffers = true;2842}28432844afe->base_addr = devm_platform_ioremap_resource(pdev, 0);2845if (IS_ERR(afe->base_addr))2846return PTR_ERR(afe->base_addr);28472848/* init audio related clock */2849ret = mt8186_init_clock(afe);2850if (ret) {2851dev_err(dev, "init clock error, ret %d\n", ret);2852return ret;2853}28542855/* init memif */2856afe->memif_32bit_supported = 0;2857afe->memif_size = MT8186_MEMIF_NUM;2858afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif), GFP_KERNEL);2859if (!afe->memif)2860return -ENOMEM;28612862for (i = 0; i < afe->memif_size; i++) {2863afe->memif[i].data = &memif_data[i];2864afe->memif[i].irq_usage = memif_irq_usage[i];2865afe->memif[i].const_irq = 1;2866}28672868mutex_init(&afe->irq_alloc_lock); /* needed when dynamic irq */28692870/* init irq */2871afe->irqs_size = MT8186_IRQ_NUM;2872afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),2873GFP_KERNEL);28742875if (!afe->irqs)2876return -ENOMEM;28772878for (i = 0; i < afe->irqs_size; i++)2879afe->irqs[i].irq_data = &irq_data[i];28802881/* request irq */2882irq_id = platform_get_irq(pdev, 0);2883if (irq_id <= 0)2884return dev_err_probe(dev, irq_id < 0 ? irq_id : -ENXIO,2885"no irq found");28862887ret = devm_request_irq(dev, irq_id, mt8186_afe_irq_handler,2888IRQF_TRIGGER_NONE,2889"Afe_ISR_Handle", (void *)afe);2890if (ret)2891return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n");28922893ret = enable_irq_wake(irq_id);2894if (ret < 0)2895return dev_err_probe(dev, ret, "enable_irq_wake %d\n", irq_id);28962897/* init sub_dais */2898INIT_LIST_HEAD(&afe->sub_dais);28992900for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {2901ret = dai_register_cbs[i](afe);2902if (ret)2903return dev_err_probe(dev, ret, "dai register i %d fail\n", i);2904}29052906/* init dai_driver and component_driver */2907ret = mtk_afe_combine_sub_dai(afe);2908if (ret)2909return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");29102911/* reset controller to reset audio regs before regmap cache */2912rstc = devm_reset_control_get_exclusive(dev, "audiosys");2913if (IS_ERR(rstc))2914return dev_err_probe(dev, PTR_ERR(rstc), "could not get audiosys reset\n");29152916ret = reset_control_reset(rstc);2917if (ret)2918return dev_err_probe(dev, ret, "failed to trigger audio reset\n");29192920/* enable clock for regcache get default value from hw */2921afe_priv->pm_runtime_bypass_reg_ctl = true;29222923ret = devm_pm_runtime_enable(dev);2924if (ret)2925return ret;29262927ret = pm_runtime_resume_and_get(dev);2928if (ret)2929return dev_err_probe(dev, ret, "failed to resume device\n");29302931afe->regmap = devm_regmap_init_mmio(dev, afe->base_addr,2932&mt8186_afe_regmap_config);2933if (IS_ERR(afe->regmap)) {2934ret = PTR_ERR(afe->regmap);2935goto err_pm_disable;2936}29372938/* others */2939afe->mtk_afe_hardware = &mt8186_afe_hardware;2940afe->memif_fs = mt8186_memif_fs;2941afe->irq_fs = mt8186_irq_fs;2942afe->get_dai_fs = mt8186_get_dai_fs;2943afe->get_memif_pbuf_size = mt8186_get_memif_pbuf_size;29442945afe->runtime_resume = mt8186_afe_runtime_resume;2946afe->runtime_suspend = mt8186_afe_runtime_suspend;29472948/* register platform */2949dev_dbg(dev, "%s(), devm_snd_soc_register_component\n", __func__);29502951ret = devm_snd_soc_register_component(dev,2952&mt8186_afe_component,2953afe->dai_drivers,2954afe->num_dai_drivers);2955if (ret) {2956dev_err(dev, "err_dai_component\n");2957goto err_pm_disable;2958}29592960ret = pm_runtime_put_sync(dev);2961if (ret) {2962pm_runtime_get_noresume(dev);2963dev_err(dev, "failed to suspend device: %d\n", ret);2964goto err_pm_disable;2965}2966afe_priv->pm_runtime_bypass_reg_ctl = false;29672968regcache_cache_only(afe->regmap, true);2969regcache_mark_dirty(afe->regmap);29702971return 0;29722973err_pm_disable:2974pm_runtime_put_noidle(dev);2975pm_runtime_set_suspended(dev);29762977return ret;2978}29792980static const struct of_device_id mt8186_afe_pcm_dt_match[] = {2981{ .compatible = "mediatek,mt8186-sound", },2982{},2983};2984MODULE_DEVICE_TABLE(of, mt8186_afe_pcm_dt_match);29852986static const struct dev_pm_ops mt8186_afe_pm_ops = {2987RUNTIME_PM_OPS(mt8186_afe_runtime_suspend,2988mt8186_afe_runtime_resume, NULL)2989};29902991static struct platform_driver mt8186_afe_pcm_driver = {2992.driver = {2993.name = "mt8186-audio",2994.of_match_table = mt8186_afe_pcm_dt_match,2995.pm = pm_ptr(&mt8186_afe_pm_ops),2996},2997.probe = mt8186_afe_pcm_dev_probe,2998};29993000module_platform_driver(mt8186_afe_pcm_driver);30013002MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8186");3003MODULE_AUTHOR("Jiaxin Yu <[email protected]>");3004MODULE_LICENSE("GPL v2");300530063007