Path: blob/master/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
54079 views
// SPDX-License-Identifier: GPL-2.01/*2* MediaTek ALSA SoC AFE platform driver for 81883*4* Copyright (c) 2022 MediaTek Inc.5* Author: Bicycle Tsai <[email protected]>6* Trevor Wu <[email protected]>7* Chun-Chia Chiu <[email protected]>8*/910#include <linux/arm-smccc.h>11#include <linux/delay.h>12#include <linux/dma-mapping.h>13#include <linux/module.h>14#include <linux/mfd/syscon.h>15#include <linux/of.h>16#include <linux/of_address.h>17#include <linux/of_platform.h>18#include <linux/of_reserved_mem.h>19#include <linux/pm_runtime.h>20#include <linux/soc/mediatek/infracfg.h>21#include <linux/reset.h>22#include <sound/pcm_params.h>23#include "mt8188-afe-common.h"24#include "mt8188-afe-clk.h"25#include "mt8188-reg.h"26#include "../common/mtk-afe-platform-driver.h"27#include "../common/mtk-afe-fe-dai.h"2829#define MT8188_MEMIF_BUFFER_BYTES_ALIGN (0x40)30#define MT8188_MEMIF_DL7_MAX_PERIOD_SIZE (0x3fff)3132#define MEMIF_AXI_MINLEN 9 /* register default value */3334struct mtk_dai_memif_priv {35unsigned int asys_timing_sel;36unsigned int fs_timing;37};3839static const struct snd_pcm_hardware mt8188_afe_hardware = {40.info = SNDRV_PCM_INFO_MMAP |41SNDRV_PCM_INFO_INTERLEAVED |42SNDRV_PCM_INFO_MMAP_VALID,43.formats = SNDRV_PCM_FMTBIT_S16_LE |44SNDRV_PCM_FMTBIT_S24_LE |45SNDRV_PCM_FMTBIT_S32_LE,46.period_bytes_min = 64,47.period_bytes_max = 256 * 1024,48.periods_min = 2,49.periods_max = 256,50.buffer_bytes_max = 256 * 2 * 1024,51};5253struct mt8188_afe_rate {54unsigned int rate;55unsigned int reg_value;56};5758static const struct mt8188_afe_rate mt8188_afe_rates[] = {59{ .rate = 8000, .reg_value = 0, },60{ .rate = 12000, .reg_value = 1, },61{ .rate = 16000, .reg_value = 2, },62{ .rate = 24000, .reg_value = 3, },63{ .rate = 32000, .reg_value = 4, },64{ .rate = 48000, .reg_value = 5, },65{ .rate = 96000, .reg_value = 6, },66{ .rate = 192000, .reg_value = 7, },67{ .rate = 384000, .reg_value = 8, },68{ .rate = 7350, .reg_value = 16, },69{ .rate = 11025, .reg_value = 17, },70{ .rate = 14700, .reg_value = 18, },71{ .rate = 22050, .reg_value = 19, },72{ .rate = 29400, .reg_value = 20, },73{ .rate = 44100, .reg_value = 21, },74{ .rate = 88200, .reg_value = 22, },75{ .rate = 176400, .reg_value = 23, },76{ .rate = 352800, .reg_value = 24, },77};7879int mt8188_afe_fs_timing(unsigned int rate)80{81int i;8283for (i = 0; i < ARRAY_SIZE(mt8188_afe_rates); i++)84if (mt8188_afe_rates[i].rate == rate)85return mt8188_afe_rates[i].reg_value;8687return -EINVAL;88}8990static int mt8188_memif_fs(struct snd_pcm_substream *substream,91unsigned int rate)92{93struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);94struct snd_soc_component *component = NULL;95struct mtk_base_afe *afe = NULL;96struct mt8188_afe_private *afe_priv = NULL;97struct mtk_base_afe_memif *memif = NULL;98struct mtk_dai_memif_priv *memif_priv = NULL;99int fs = mt8188_afe_fs_timing(rate);100int id = snd_soc_rtd_to_cpu(rtd, 0)->id;101102if (id < 0)103return -EINVAL;104105component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);106if (!component)107return -EINVAL;108109afe = snd_soc_component_get_drvdata(component);110memif = &afe->memif[id];111112switch (memif->data->id) {113case MT8188_AFE_MEMIF_DL10:114fs = MT8188_ETDM_OUT3_1X_EN;115break;116case MT8188_AFE_MEMIF_UL8:117fs = MT8188_ETDM_IN1_NX_EN;118break;119case MT8188_AFE_MEMIF_UL3:120fs = MT8188_ETDM_IN2_NX_EN;121break;122default:123afe_priv = afe->platform_priv;124memif_priv = afe_priv->dai_priv[id];125if (memif_priv->fs_timing)126fs = memif_priv->fs_timing;127break;128}129130return fs;131}132133static int mt8188_irq_fs(struct snd_pcm_substream *substream,134unsigned int rate)135{136int fs = mt8188_memif_fs(substream, rate);137138switch (fs) {139case MT8188_ETDM_IN1_NX_EN:140fs = MT8188_ETDM_IN1_1X_EN;141break;142case MT8188_ETDM_IN2_NX_EN:143fs = MT8188_ETDM_IN2_1X_EN;144break;145default:146break;147}148149return fs;150}151152enum {153MT8188_AFE_CM0,154MT8188_AFE_CM1,155MT8188_AFE_CM2,156MT8188_AFE_CM_NUM,157};158159struct mt8188_afe_channel_merge {160int id;161int reg;162unsigned int sel_shift;163unsigned int sel_maskbit;164unsigned int sel_default;165unsigned int ch_num_shift;166unsigned int ch_num_maskbit;167unsigned int en_shift;168unsigned int en_maskbit;169unsigned int update_cnt_shift;170unsigned int update_cnt_maskbit;171unsigned int update_cnt_default;172};173174static const struct mt8188_afe_channel_merge175mt8188_afe_cm[MT8188_AFE_CM_NUM] = {176[MT8188_AFE_CM0] = {177.id = MT8188_AFE_CM0,178.reg = AFE_CM0_CON,179.sel_shift = 30,180.sel_maskbit = 0x1,181.sel_default = 1,182.ch_num_shift = 2,183.ch_num_maskbit = 0x3f,184.en_shift = 0,185.en_maskbit = 0x1,186.update_cnt_shift = 16,187.update_cnt_maskbit = 0x1fff,188.update_cnt_default = 0x3,189},190[MT8188_AFE_CM1] = {191.id = MT8188_AFE_CM1,192.reg = AFE_CM1_CON,193.sel_shift = 30,194.sel_maskbit = 0x1,195.sel_default = 1,196.ch_num_shift = 2,197.ch_num_maskbit = 0x1f,198.en_shift = 0,199.en_maskbit = 0x1,200.update_cnt_shift = 16,201.update_cnt_maskbit = 0x1fff,202.update_cnt_default = 0x3,203},204[MT8188_AFE_CM2] = {205.id = MT8188_AFE_CM2,206.reg = AFE_CM2_CON,207.sel_shift = 30,208.sel_maskbit = 0x1,209.sel_default = 1,210.ch_num_shift = 2,211.ch_num_maskbit = 0x1f,212.en_shift = 0,213.en_maskbit = 0x1,214.update_cnt_shift = 16,215.update_cnt_maskbit = 0x1fff,216.update_cnt_default = 0x3,217},218};219220static int mt8188_afe_memif_is_ul(int id)221{222if (id >= MT8188_AFE_MEMIF_UL_START && id < MT8188_AFE_MEMIF_END)223return 1;224else225return 0;226}227228static const struct mt8188_afe_channel_merge *229mt8188_afe_found_cm(struct snd_soc_dai *dai)230{231struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);232int id = -EINVAL;233234if (mt8188_afe_memif_is_ul(dai->id) == 0)235return NULL;236237switch (dai->id) {238case MT8188_AFE_MEMIF_UL9:239id = MT8188_AFE_CM0;240break;241case MT8188_AFE_MEMIF_UL2:242id = MT8188_AFE_CM1;243break;244case MT8188_AFE_MEMIF_UL10:245id = MT8188_AFE_CM2;246break;247default:248break;249}250251if (id < 0) {252dev_dbg(afe->dev, "%s, memif %d cannot find CM!\n", __func__, dai->id);253return NULL;254}255256return &mt8188_afe_cm[id];257}258259static int mt8188_afe_config_cm(struct mtk_base_afe *afe,260const struct mt8188_afe_channel_merge *cm,261unsigned int channels)262{263if (!cm)264return -EINVAL;265266regmap_update_bits(afe->regmap,267cm->reg,268cm->sel_maskbit << cm->sel_shift,269cm->sel_default << cm->sel_shift);270271regmap_update_bits(afe->regmap,272cm->reg,273cm->ch_num_maskbit << cm->ch_num_shift,274(channels - 1) << cm->ch_num_shift);275276regmap_update_bits(afe->regmap,277cm->reg,278cm->update_cnt_maskbit << cm->update_cnt_shift,279cm->update_cnt_default << cm->update_cnt_shift);280281return 0;282}283284static int mt8188_afe_enable_cm(struct mtk_base_afe *afe,285const struct mt8188_afe_channel_merge *cm,286bool enable)287{288if (!cm)289return -EINVAL;290291regmap_update_bits(afe->regmap,292cm->reg,293cm->en_maskbit << cm->en_shift,294enable << cm->en_shift);295296return 0;297}298299static int mt8188_afe_fe_startup(struct snd_pcm_substream *substream,300struct snd_soc_dai *dai)301{302struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);303struct snd_pcm_runtime *runtime = substream->runtime;304struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);305int id = snd_soc_rtd_to_cpu(rtd, 0)->id;306int ret;307308ret = mtk_afe_fe_startup(substream, dai);309310snd_pcm_hw_constraint_step(runtime, 0,311SNDRV_PCM_HW_PARAM_BUFFER_BYTES,312MT8188_MEMIF_BUFFER_BYTES_ALIGN);313314if (id != MT8188_AFE_MEMIF_DL7)315goto out;316317ret = snd_pcm_hw_constraint_minmax(runtime,318SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 1,319MT8188_MEMIF_DL7_MAX_PERIOD_SIZE);320if (ret < 0)321dev_dbg(afe->dev, "hw_constraint_minmax failed\n");322out:323return ret;324}325326static void mt8188_afe_fe_shutdown(struct snd_pcm_substream *substream,327struct snd_soc_dai *dai)328{329mtk_afe_fe_shutdown(substream, dai);330}331332static int mt8188_afe_fe_hw_params(struct snd_pcm_substream *substream,333struct snd_pcm_hw_params *params,334struct snd_soc_dai *dai)335{336struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);337struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);338int id = snd_soc_rtd_to_cpu(rtd, 0)->id;339struct mtk_base_afe_memif *memif = &afe->memif[id];340const struct mtk_base_memif_data *data = memif->data;341const struct mt8188_afe_channel_merge *cm = mt8188_afe_found_cm(dai);342unsigned int channels = params_channels(params);343344mt8188_afe_config_cm(afe, cm, channels);345346if (data->ch_num_reg >= 0) {347regmap_update_bits(afe->regmap, data->ch_num_reg,348data->ch_num_maskbit << data->ch_num_shift,349channels << data->ch_num_shift);350}351352return mtk_afe_fe_hw_params(substream, params, dai);353}354355static int mt8188_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,356struct snd_soc_dai *dai)357{358struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);359const struct mt8188_afe_channel_merge *cm = mt8188_afe_found_cm(dai);360struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);361struct snd_pcm_runtime * const runtime = substream->runtime;362int id = snd_soc_rtd_to_cpu(rtd, 0)->id;363struct mtk_base_afe_memif *memif = &afe->memif[id];364struct mtk_base_afe_irq *irqs = &afe->irqs[memif->irq_usage];365const struct mtk_base_irq_data *irq_data = irqs->irq_data;366unsigned int counter = runtime->period_size;367int fs;368int ret;369370switch (cmd) {371case SNDRV_PCM_TRIGGER_START:372case SNDRV_PCM_TRIGGER_RESUME:373mt8188_afe_enable_cm(afe, cm, true);374375ret = mtk_memif_set_enable(afe, id);376if (ret) {377dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",378__func__, id, ret);379return ret;380}381382/* set irq counter */383regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,384irq_data->irq_cnt_maskbit << irq_data->irq_cnt_shift,385counter << irq_data->irq_cnt_shift);386387/* set irq fs */388fs = afe->irq_fs(substream, runtime->rate);389390if (fs < 0)391return -EINVAL;392393if (irq_data->irq_fs_reg >= 0)394regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,395irq_data->irq_fs_maskbit << irq_data->irq_fs_shift,396fs << irq_data->irq_fs_shift);397398/* delay for uplink */399if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {400u32 sample_delay;401402sample_delay = ((MEMIF_AXI_MINLEN + 1) * 64 +403(runtime->channels * runtime->sample_bits - 1)) /404(runtime->channels * runtime->sample_bits) + 1;405406udelay(sample_delay * 1000000 / runtime->rate);407}408409/* enable interrupt */410regmap_set_bits(afe->regmap, irq_data->irq_en_reg,411BIT(irq_data->irq_en_shift));412return 0;413case SNDRV_PCM_TRIGGER_STOP:414case SNDRV_PCM_TRIGGER_SUSPEND:415mt8188_afe_enable_cm(afe, cm, false);416417ret = mtk_memif_set_disable(afe, id);418if (ret)419dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",420__func__, id, ret);421422/* disable interrupt */423424regmap_clear_bits(afe->regmap, irq_data->irq_en_reg,425BIT(irq_data->irq_en_shift));426/* and clear pending IRQ */427regmap_write(afe->regmap, irq_data->irq_clr_reg,428BIT(irq_data->irq_clr_shift));429return ret;430default:431return -EINVAL;432}433}434435static const struct snd_soc_dai_ops mt8188_afe_fe_dai_ops = {436.startup = mt8188_afe_fe_startup,437.shutdown = mt8188_afe_fe_shutdown,438.hw_params = mt8188_afe_fe_hw_params,439.hw_free = mtk_afe_fe_hw_free,440.prepare = mtk_afe_fe_prepare,441.trigger = mt8188_afe_fe_trigger,442};443444#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\445SNDRV_PCM_RATE_88200 |\446SNDRV_PCM_RATE_96000 |\447SNDRV_PCM_RATE_176400 |\448SNDRV_PCM_RATE_192000 |\449SNDRV_PCM_RATE_352800 |\450SNDRV_PCM_RATE_384000)451452#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\453SNDRV_PCM_FMTBIT_S24_LE |\454SNDRV_PCM_FMTBIT_S32_LE)455456static struct snd_soc_dai_driver mt8188_memif_dai_driver[] = {457/* FE DAIs: memory intefaces to CPU */458{459.name = "DL2",460.id = MT8188_AFE_MEMIF_DL2,461.playback = {462.stream_name = "DL2",463.channels_min = 1,464.channels_max = 2,465.rates = MTK_PCM_RATES,466.formats = MTK_PCM_FORMATS,467},468.ops = &mt8188_afe_fe_dai_ops,469},470{471.name = "DL3",472.id = MT8188_AFE_MEMIF_DL3,473.playback = {474.stream_name = "DL3",475.channels_min = 1,476.channels_max = 2,477.rates = MTK_PCM_RATES,478.formats = MTK_PCM_FORMATS,479},480.ops = &mt8188_afe_fe_dai_ops,481},482{483.name = "DL6",484.id = MT8188_AFE_MEMIF_DL6,485.playback = {486.stream_name = "DL6",487.channels_min = 1,488.channels_max = 2,489.rates = MTK_PCM_RATES,490.formats = MTK_PCM_FORMATS,491},492.ops = &mt8188_afe_fe_dai_ops,493},494{495.name = "DL7",496.id = MT8188_AFE_MEMIF_DL7,497.playback = {498.stream_name = "DL7",499.channels_min = 1,500.channels_max = 2,501.rates = MTK_PCM_RATES,502.formats = MTK_PCM_FORMATS,503},504.ops = &mt8188_afe_fe_dai_ops,505},506{507.name = "DL8",508.id = MT8188_AFE_MEMIF_DL8,509.playback = {510.stream_name = "DL8",511.channels_min = 1,512.channels_max = 16,513.rates = MTK_PCM_RATES,514.formats = MTK_PCM_FORMATS,515},516.ops = &mt8188_afe_fe_dai_ops,517},518{519.name = "DL10",520.id = MT8188_AFE_MEMIF_DL10,521.playback = {522.stream_name = "DL10",523.channels_min = 1,524.channels_max = 8,525.rates = MTK_PCM_RATES,526.formats = MTK_PCM_FORMATS,527},528.ops = &mt8188_afe_fe_dai_ops,529},530{531.name = "DL11",532.id = MT8188_AFE_MEMIF_DL11,533.playback = {534.stream_name = "DL11",535.channels_min = 1,536.channels_max = 32,537.rates = MTK_PCM_RATES,538.formats = MTK_PCM_FORMATS,539},540.ops = &mt8188_afe_fe_dai_ops,541},542{543.name = "UL1",544.id = MT8188_AFE_MEMIF_UL1,545.capture = {546.stream_name = "UL1",547.channels_min = 1,548.channels_max = 8,549.rates = MTK_PCM_RATES,550.formats = MTK_PCM_FORMATS,551},552.ops = &mt8188_afe_fe_dai_ops,553},554{555.name = "UL2",556.id = MT8188_AFE_MEMIF_UL2,557.capture = {558.stream_name = "UL2",559.channels_min = 1,560.channels_max = 8,561.rates = MTK_PCM_RATES,562.formats = MTK_PCM_FORMATS,563},564.ops = &mt8188_afe_fe_dai_ops,565},566{567.name = "UL3",568.id = MT8188_AFE_MEMIF_UL3,569.capture = {570.stream_name = "UL3",571.channels_min = 1,572.channels_max = 16,573.rates = MTK_PCM_RATES,574.formats = MTK_PCM_FORMATS,575},576.ops = &mt8188_afe_fe_dai_ops,577},578{579.name = "UL4",580.id = MT8188_AFE_MEMIF_UL4,581.capture = {582.stream_name = "UL4",583.channels_min = 1,584.channels_max = 2,585.rates = MTK_PCM_RATES,586.formats = MTK_PCM_FORMATS,587},588.ops = &mt8188_afe_fe_dai_ops,589},590{591.name = "UL5",592.id = MT8188_AFE_MEMIF_UL5,593.capture = {594.stream_name = "UL5",595.channels_min = 1,596.channels_max = 2,597.rates = MTK_PCM_RATES,598.formats = MTK_PCM_FORMATS,599},600.ops = &mt8188_afe_fe_dai_ops,601},602{603.name = "UL6",604.id = MT8188_AFE_MEMIF_UL6,605.capture = {606.stream_name = "UL6",607.channels_min = 1,608.channels_max = 8,609.rates = MTK_PCM_RATES,610.formats = MTK_PCM_FORMATS,611},612.ops = &mt8188_afe_fe_dai_ops,613},614{615.name = "UL8",616.id = MT8188_AFE_MEMIF_UL8,617.capture = {618.stream_name = "UL8",619.channels_min = 1,620.channels_max = 24,621.rates = MTK_PCM_RATES,622.formats = MTK_PCM_FORMATS,623},624.ops = &mt8188_afe_fe_dai_ops,625},626{627.name = "UL9",628.id = MT8188_AFE_MEMIF_UL9,629.capture = {630.stream_name = "UL9",631.channels_min = 1,632.channels_max = 32,633.rates = MTK_PCM_RATES,634.formats = MTK_PCM_FORMATS,635},636.ops = &mt8188_afe_fe_dai_ops,637},638{639.name = "UL10",640.id = MT8188_AFE_MEMIF_UL10,641.capture = {642.stream_name = "UL10",643.channels_min = 1,644.channels_max = 4,645.rates = MTK_PCM_RATES,646.formats = MTK_PCM_FORMATS,647},648.ops = &mt8188_afe_fe_dai_ops,649},650};651652static const struct snd_kcontrol_new o002_mix[] = {653SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN2, 0, 1, 0),654SOC_DAPM_SINGLE_AUTODISABLE("I004 Switch", AFE_CONN2, 4, 1, 0),655SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN2, 12, 1, 0),656SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN2, 20, 1, 0),657SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN2, 22, 1, 0),658SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN2_2, 6, 1, 0),659SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN2_2, 8, 1, 0),660SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN2_5, 8, 1, 0),661};662663static const struct snd_kcontrol_new o003_mix[] = {664SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN3, 1, 1, 0),665SOC_DAPM_SINGLE_AUTODISABLE("I005 Switch", AFE_CONN3, 5, 1, 0),666SOC_DAPM_SINGLE_AUTODISABLE("I006 Switch", AFE_CONN3, 6, 1, 0),667SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN3, 13, 1, 0),668SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN3, 21, 1, 0),669SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN3, 23, 1, 0),670SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN3_2, 7, 1, 0),671SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN3_2, 9, 1, 0),672SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN3_5, 9, 1, 0),673};674675static const struct snd_kcontrol_new o004_mix[] = {676SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN4, 0, 1, 0),677SOC_DAPM_SINGLE_AUTODISABLE("I006 Switch", AFE_CONN4, 6, 1, 0),678SOC_DAPM_SINGLE_AUTODISABLE("I008 Switch", AFE_CONN4, 8, 1, 0),679SOC_DAPM_SINGLE_AUTODISABLE("I014 Switch", AFE_CONN4, 14, 1, 0),680SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN4, 24, 1, 0),681SOC_DAPM_SINGLE_AUTODISABLE("I074 Switch", AFE_CONN4_2, 10, 1, 0),682};683684static const struct snd_kcontrol_new o005_mix[] = {685SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN5, 1, 1, 0),686SOC_DAPM_SINGLE_AUTODISABLE("I007 Switch", AFE_CONN5, 7, 1, 0),687SOC_DAPM_SINGLE_AUTODISABLE("I010 Switch", AFE_CONN5, 10, 1, 0),688SOC_DAPM_SINGLE_AUTODISABLE("I015 Switch", AFE_CONN5, 15, 1, 0),689SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN5, 25, 1, 0),690SOC_DAPM_SINGLE_AUTODISABLE("I075 Switch", AFE_CONN5_2, 11, 1, 0),691};692693static const struct snd_kcontrol_new o006_mix[] = {694SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN6, 0, 1, 0),695SOC_DAPM_SINGLE_AUTODISABLE("I008 Switch", AFE_CONN6, 8, 1, 0),696SOC_DAPM_SINGLE_AUTODISABLE("I016 Switch", AFE_CONN6, 16, 1, 0),697SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN6, 26, 1, 0),698SOC_DAPM_SINGLE_AUTODISABLE("I076 Switch", AFE_CONN6_2, 12, 1, 0),699};700701static const struct snd_kcontrol_new o007_mix[] = {702SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN7, 1, 1, 0),703SOC_DAPM_SINGLE_AUTODISABLE("I009 Switch", AFE_CONN7, 9, 1, 0),704SOC_DAPM_SINGLE_AUTODISABLE("I017 Switch", AFE_CONN7, 17, 1, 0),705SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN7, 27, 1, 0),706SOC_DAPM_SINGLE_AUTODISABLE("I077 Switch", AFE_CONN7_2, 13, 1, 0),707};708709static const struct snd_kcontrol_new o008_mix[] = {710SOC_DAPM_SINGLE_AUTODISABLE("I010 Switch", AFE_CONN8, 10, 1, 0),711SOC_DAPM_SINGLE_AUTODISABLE("I018 Switch", AFE_CONN8, 18, 1, 0),712SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN8, 28, 1, 0),713SOC_DAPM_SINGLE_AUTODISABLE("I078 Switch", AFE_CONN8_2, 14, 1, 0),714};715716static const struct snd_kcontrol_new o009_mix[] = {717SOC_DAPM_SINGLE_AUTODISABLE("I011 Switch", AFE_CONN9, 11, 1, 0),718SOC_DAPM_SINGLE_AUTODISABLE("I019 Switch", AFE_CONN9, 19, 1, 0),719SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN9, 29, 1, 0),720SOC_DAPM_SINGLE_AUTODISABLE("I079 Switch", AFE_CONN9_2, 15, 1, 0),721};722723static const struct snd_kcontrol_new o010_mix[] = {724SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN10, 22, 1, 0),725SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN10, 30, 1, 0),726SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN10_1, 14, 1, 0),727SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN10_2, 8, 1, 0),728SOC_DAPM_SINGLE_AUTODISABLE("I080 Switch", AFE_CONN10_2, 16, 1, 0),729SOC_DAPM_SINGLE_AUTODISABLE("I188 Switch", AFE_CONN10_5, 28, 1, 0),730};731732static const struct snd_kcontrol_new o011_mix[] = {733SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN11, 23, 1, 0),734SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN11, 31, 1, 0),735SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN11_1, 15, 1, 0),736SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN11_2, 9, 1, 0),737SOC_DAPM_SINGLE_AUTODISABLE("I081 Switch", AFE_CONN11_2, 17, 1, 0),738SOC_DAPM_SINGLE_AUTODISABLE("I189 Switch", AFE_CONN11_5, 29, 1, 0),739};740741static const struct snd_kcontrol_new o012_mix[] = {742SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN12, 24, 1, 0),743SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN12_1, 0, 1, 0),744SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN12_1, 16, 1, 0),745SOC_DAPM_SINGLE_AUTODISABLE("I074 Switch", AFE_CONN12_2, 10, 1, 0),746SOC_DAPM_SINGLE_AUTODISABLE("I082 Switch", AFE_CONN12_2, 18, 1, 0),747SOC_DAPM_SINGLE_AUTODISABLE("I190 Switch", AFE_CONN12_5, 30, 1, 0),748};749750static const struct snd_kcontrol_new o013_mix[] = {751SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN13, 25, 1, 0),752SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN13_1, 1, 1, 0),753SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN13_1, 17, 1, 0),754SOC_DAPM_SINGLE_AUTODISABLE("I075 Switch", AFE_CONN13_2, 11, 1, 0),755SOC_DAPM_SINGLE_AUTODISABLE("I083 Switch", AFE_CONN13_2, 19, 1, 0),756SOC_DAPM_SINGLE_AUTODISABLE("I191 Switch", AFE_CONN13_5, 31, 1, 0),757};758759static const struct snd_kcontrol_new o014_mix[] = {760SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN14, 26, 1, 0),761SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN14_1, 2, 1, 0),762SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN14_1, 18, 1, 0),763SOC_DAPM_SINGLE_AUTODISABLE("I076 Switch", AFE_CONN14_2, 12, 1, 0),764SOC_DAPM_SINGLE_AUTODISABLE("I084 Switch", AFE_CONN14_2, 20, 1, 0),765SOC_DAPM_SINGLE_AUTODISABLE("I192 Switch", AFE_CONN14_6, 0, 1, 0),766};767768static const struct snd_kcontrol_new o015_mix[] = {769SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN15, 27, 1, 0),770SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN15_1, 3, 1, 0),771SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN15_1, 19, 1, 0),772SOC_DAPM_SINGLE_AUTODISABLE("I077 Switch", AFE_CONN15_2, 13, 1, 0),773SOC_DAPM_SINGLE_AUTODISABLE("I085 Switch", AFE_CONN15_2, 21, 1, 0),774SOC_DAPM_SINGLE_AUTODISABLE("I193 Switch", AFE_CONN15_6, 1, 1, 0),775};776777static const struct snd_kcontrol_new o016_mix[] = {778SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN16, 28, 1, 0),779SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN16_1, 4, 1, 0),780SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN16_1, 20, 1, 0),781SOC_DAPM_SINGLE_AUTODISABLE("I078 Switch", AFE_CONN16_2, 14, 1, 0),782SOC_DAPM_SINGLE_AUTODISABLE("I086 Switch", AFE_CONN16_2, 22, 1, 0),783SOC_DAPM_SINGLE_AUTODISABLE("I194 Switch", AFE_CONN16_6, 2, 1, 0),784};785786static const struct snd_kcontrol_new o017_mix[] = {787SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN17, 29, 1, 0),788SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN17_1, 5, 1, 0),789SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN17_1, 21, 1, 0),790SOC_DAPM_SINGLE_AUTODISABLE("I079 Switch", AFE_CONN17_2, 15, 1, 0),791SOC_DAPM_SINGLE_AUTODISABLE("I087 Switch", AFE_CONN17_2, 23, 1, 0),792SOC_DAPM_SINGLE_AUTODISABLE("I195 Switch", AFE_CONN17_6, 3, 1, 0),793};794795static const struct snd_kcontrol_new o018_mix[] = {796SOC_DAPM_SINGLE_AUTODISABLE("I080 Switch", AFE_CONN18_2, 16, 1, 0),797};798799static const struct snd_kcontrol_new o019_mix[] = {800SOC_DAPM_SINGLE_AUTODISABLE("I081 Switch", AFE_CONN19_2, 17, 1, 0),801};802803static const struct snd_kcontrol_new o020_mix[] = {804SOC_DAPM_SINGLE_AUTODISABLE("I082 Switch", AFE_CONN20_2, 18, 1, 0),805};806807static const struct snd_kcontrol_new o021_mix[] = {808SOC_DAPM_SINGLE_AUTODISABLE("I083 Switch", AFE_CONN21_2, 19, 1, 0),809};810811static const struct snd_kcontrol_new o022_mix[] = {812SOC_DAPM_SINGLE_AUTODISABLE("I084 Switch", AFE_CONN22_2, 20, 1, 0),813};814815static const struct snd_kcontrol_new o023_mix[] = {816SOC_DAPM_SINGLE_AUTODISABLE("I085 Switch", AFE_CONN23_2, 21, 1, 0),817};818819static const struct snd_kcontrol_new o024_mix[] = {820SOC_DAPM_SINGLE_AUTODISABLE("I086 Switch", AFE_CONN24_2, 22, 1, 0),821};822823static const struct snd_kcontrol_new o025_mix[] = {824SOC_DAPM_SINGLE_AUTODISABLE("I087 Switch", AFE_CONN25_2, 23, 1, 0),825};826827static const struct snd_kcontrol_new o026_mix[] = {828SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN26_1, 14, 1, 0),829};830831static const struct snd_kcontrol_new o027_mix[] = {832SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN27_1, 15, 1, 0),833};834835static const struct snd_kcontrol_new o028_mix[] = {836SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN28_1, 16, 1, 0),837};838839static const struct snd_kcontrol_new o029_mix[] = {840SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN29_1, 17, 1, 0),841};842843static const struct snd_kcontrol_new o030_mix[] = {844SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN30_1, 18, 1, 0),845};846847static const struct snd_kcontrol_new o031_mix[] = {848SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN31_1, 19, 1, 0),849};850851static const struct snd_kcontrol_new o032_mix[] = {852SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN32_1, 20, 1, 0),853};854855static const struct snd_kcontrol_new o033_mix[] = {856SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN33_1, 21, 1, 0),857};858859static const struct snd_kcontrol_new o034_mix[] = {860SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN34, 0, 1, 0),861SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN34, 2, 1, 0),862SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN34, 12, 1, 0),863SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN34, 20, 1, 0),864SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN34_2, 6, 1, 0),865SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN34_2, 8, 1, 0),866SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN34_5, 8, 1, 0),867};868869static const struct snd_kcontrol_new o035_mix[] = {870SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN35, 1, 1, 0),871SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN35, 3, 1, 0),872SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN35, 13, 1, 0),873SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN35, 21, 1, 0),874SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN35_2, 7, 1, 0),875SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN35_2, 9, 1, 0),876SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN35_5, 8, 1, 0),877SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN35_5, 9, 1, 0),878};879880static const struct snd_kcontrol_new o036_mix[] = {881SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN36, 0, 1, 0),882SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN36, 12, 1, 0),883SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN36, 20, 1, 0),884SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN36_2, 6, 1, 0),885SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN36_5, 8, 1, 0),886};887888static const struct snd_kcontrol_new o037_mix[] = {889SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN37, 1, 1, 0),890SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN37, 13, 1, 0),891SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN37, 21, 1, 0),892SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN37_2, 7, 1, 0),893SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN37_5, 9, 1, 0),894};895896static const struct snd_kcontrol_new o038_mix[] = {897SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN38, 22, 1, 0),898SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN38_5, 8, 1, 0),899};900901static const struct snd_kcontrol_new o039_mix[] = {902SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN39, 23, 1, 0),903SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN39_5, 9, 1, 0),904};905906static const struct snd_kcontrol_new o040_mix[] = {907SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN40, 2, 1, 0),908SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN40, 12, 1, 0),909SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN40, 22, 1, 0),910SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN40_5, 8, 1, 0),911};912913static const struct snd_kcontrol_new o041_mix[] = {914SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN41, 3, 1, 0),915SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN41, 13, 1, 0),916SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN41, 23, 1, 0),917SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN41_5, 9, 1, 0),918};919920static const struct snd_kcontrol_new o042_mix[] = {921SOC_DAPM_SINGLE_AUTODISABLE("I014 Switch", AFE_CONN42, 14, 1, 0),922SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN42, 24, 1, 0),923};924925static const struct snd_kcontrol_new o043_mix[] = {926SOC_DAPM_SINGLE_AUTODISABLE("I015 Switch", AFE_CONN43, 15, 1, 0),927SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN43, 25, 1, 0),928};929930static const struct snd_kcontrol_new o044_mix[] = {931SOC_DAPM_SINGLE_AUTODISABLE("I016 Switch", AFE_CONN44, 16, 1, 0),932SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN44, 26, 1, 0),933};934935static const struct snd_kcontrol_new o045_mix[] = {936SOC_DAPM_SINGLE_AUTODISABLE("I017 Switch", AFE_CONN45, 17, 1, 0),937SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN45, 27, 1, 0),938};939940static const struct snd_kcontrol_new o046_mix[] = {941SOC_DAPM_SINGLE_AUTODISABLE("I018 Switch", AFE_CONN46, 18, 1, 0),942SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN46, 28, 1, 0),943};944945static const struct snd_kcontrol_new o047_mix[] = {946SOC_DAPM_SINGLE_AUTODISABLE("I019 Switch", AFE_CONN47, 19, 1, 0),947SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN47, 29, 1, 0),948};949950static const struct snd_kcontrol_new o182_mix[] = {951SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN182, 20, 1, 0),952SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN182, 22, 1, 0),953SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN182, 24, 1, 0),954};955956static const struct snd_kcontrol_new o183_mix[] = {957SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN183, 21, 1, 0),958SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN183, 23, 1, 0),959SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN183, 25, 1, 0),960};961962static const char * const dl8_dl11_data_sel_mux_text[] = {963"dl8", "dl11",964};965966static SOC_ENUM_SINGLE_DECL(dl8_dl11_data_sel_mux_enum,967AFE_DAC_CON2, 0, dl8_dl11_data_sel_mux_text);968969static const struct snd_kcontrol_new dl8_dl11_data_sel_mux =970SOC_DAPM_ENUM("DL8_DL11 Sink",971dl8_dl11_data_sel_mux_enum);972973static const struct snd_soc_dapm_widget mt8188_memif_widgets[] = {974/* DL6 */975SND_SOC_DAPM_MIXER("I000", SND_SOC_NOPM, 0, 0, NULL, 0),976SND_SOC_DAPM_MIXER("I001", SND_SOC_NOPM, 0, 0, NULL, 0),977978/* DL3 */979SND_SOC_DAPM_MIXER("I020", SND_SOC_NOPM, 0, 0, NULL, 0),980SND_SOC_DAPM_MIXER("I021", SND_SOC_NOPM, 0, 0, NULL, 0),981982/* DL11 */983SND_SOC_DAPM_MIXER("I022", SND_SOC_NOPM, 0, 0, NULL, 0),984SND_SOC_DAPM_MIXER("I023", SND_SOC_NOPM, 0, 0, NULL, 0),985SND_SOC_DAPM_MIXER("I024", SND_SOC_NOPM, 0, 0, NULL, 0),986SND_SOC_DAPM_MIXER("I025", SND_SOC_NOPM, 0, 0, NULL, 0),987SND_SOC_DAPM_MIXER("I026", SND_SOC_NOPM, 0, 0, NULL, 0),988SND_SOC_DAPM_MIXER("I027", SND_SOC_NOPM, 0, 0, NULL, 0),989SND_SOC_DAPM_MIXER("I028", SND_SOC_NOPM, 0, 0, NULL, 0),990SND_SOC_DAPM_MIXER("I029", SND_SOC_NOPM, 0, 0, NULL, 0),991SND_SOC_DAPM_MIXER("I030", SND_SOC_NOPM, 0, 0, NULL, 0),992SND_SOC_DAPM_MIXER("I031", SND_SOC_NOPM, 0, 0, NULL, 0),993SND_SOC_DAPM_MIXER("I032", SND_SOC_NOPM, 0, 0, NULL, 0),994SND_SOC_DAPM_MIXER("I033", SND_SOC_NOPM, 0, 0, NULL, 0),995SND_SOC_DAPM_MIXER("I034", SND_SOC_NOPM, 0, 0, NULL, 0),996SND_SOC_DAPM_MIXER("I035", SND_SOC_NOPM, 0, 0, NULL, 0),997SND_SOC_DAPM_MIXER("I036", SND_SOC_NOPM, 0, 0, NULL, 0),998SND_SOC_DAPM_MIXER("I037", SND_SOC_NOPM, 0, 0, NULL, 0),9991000/* DL11/DL8 */1001SND_SOC_DAPM_MIXER("I046", SND_SOC_NOPM, 0, 0, NULL, 0),1002SND_SOC_DAPM_MIXER("I047", SND_SOC_NOPM, 0, 0, NULL, 0),1003SND_SOC_DAPM_MIXER("I048", SND_SOC_NOPM, 0, 0, NULL, 0),1004SND_SOC_DAPM_MIXER("I049", SND_SOC_NOPM, 0, 0, NULL, 0),1005SND_SOC_DAPM_MIXER("I050", SND_SOC_NOPM, 0, 0, NULL, 0),1006SND_SOC_DAPM_MIXER("I051", SND_SOC_NOPM, 0, 0, NULL, 0),1007SND_SOC_DAPM_MIXER("I052", SND_SOC_NOPM, 0, 0, NULL, 0),1008SND_SOC_DAPM_MIXER("I053", SND_SOC_NOPM, 0, 0, NULL, 0),1009SND_SOC_DAPM_MIXER("I054", SND_SOC_NOPM, 0, 0, NULL, 0),1010SND_SOC_DAPM_MIXER("I055", SND_SOC_NOPM, 0, 0, NULL, 0),1011SND_SOC_DAPM_MIXER("I056", SND_SOC_NOPM, 0, 0, NULL, 0),1012SND_SOC_DAPM_MIXER("I057", SND_SOC_NOPM, 0, 0, NULL, 0),1013SND_SOC_DAPM_MIXER("I058", SND_SOC_NOPM, 0, 0, NULL, 0),1014SND_SOC_DAPM_MIXER("I059", SND_SOC_NOPM, 0, 0, NULL, 0),1015SND_SOC_DAPM_MIXER("I060", SND_SOC_NOPM, 0, 0, NULL, 0),1016SND_SOC_DAPM_MIXER("I061", SND_SOC_NOPM, 0, 0, NULL, 0),10171018/* DL2 */1019SND_SOC_DAPM_MIXER("I070", SND_SOC_NOPM, 0, 0, NULL, 0),1020SND_SOC_DAPM_MIXER("I071", SND_SOC_NOPM, 0, 0, NULL, 0),10211022SND_SOC_DAPM_MUX("DL8_DL11 Mux",1023SND_SOC_NOPM, 0, 0, &dl8_dl11_data_sel_mux),10241025/* UL9 */1026SND_SOC_DAPM_MIXER("O002", SND_SOC_NOPM, 0, 0,1027o002_mix, ARRAY_SIZE(o002_mix)),1028SND_SOC_DAPM_MIXER("O003", SND_SOC_NOPM, 0, 0,1029o003_mix, ARRAY_SIZE(o003_mix)),1030SND_SOC_DAPM_MIXER("O004", SND_SOC_NOPM, 0, 0,1031o004_mix, ARRAY_SIZE(o004_mix)),1032SND_SOC_DAPM_MIXER("O005", SND_SOC_NOPM, 0, 0,1033o005_mix, ARRAY_SIZE(o005_mix)),1034SND_SOC_DAPM_MIXER("O006", SND_SOC_NOPM, 0, 0,1035o006_mix, ARRAY_SIZE(o006_mix)),1036SND_SOC_DAPM_MIXER("O007", SND_SOC_NOPM, 0, 0,1037o007_mix, ARRAY_SIZE(o007_mix)),1038SND_SOC_DAPM_MIXER("O008", SND_SOC_NOPM, 0, 0,1039o008_mix, ARRAY_SIZE(o008_mix)),1040SND_SOC_DAPM_MIXER("O009", SND_SOC_NOPM, 0, 0,1041o009_mix, ARRAY_SIZE(o009_mix)),1042SND_SOC_DAPM_MIXER("O010", SND_SOC_NOPM, 0, 0,1043o010_mix, ARRAY_SIZE(o010_mix)),1044SND_SOC_DAPM_MIXER("O011", SND_SOC_NOPM, 0, 0,1045o011_mix, ARRAY_SIZE(o011_mix)),1046SND_SOC_DAPM_MIXER("O012", SND_SOC_NOPM, 0, 0,1047o012_mix, ARRAY_SIZE(o012_mix)),1048SND_SOC_DAPM_MIXER("O013", SND_SOC_NOPM, 0, 0,1049o013_mix, ARRAY_SIZE(o013_mix)),1050SND_SOC_DAPM_MIXER("O014", SND_SOC_NOPM, 0, 0,1051o014_mix, ARRAY_SIZE(o014_mix)),1052SND_SOC_DAPM_MIXER("O015", SND_SOC_NOPM, 0, 0,1053o015_mix, ARRAY_SIZE(o015_mix)),1054SND_SOC_DAPM_MIXER("O016", SND_SOC_NOPM, 0, 0,1055o016_mix, ARRAY_SIZE(o016_mix)),1056SND_SOC_DAPM_MIXER("O017", SND_SOC_NOPM, 0, 0,1057o017_mix, ARRAY_SIZE(o017_mix)),1058SND_SOC_DAPM_MIXER("O018", SND_SOC_NOPM, 0, 0,1059o018_mix, ARRAY_SIZE(o018_mix)),1060SND_SOC_DAPM_MIXER("O019", SND_SOC_NOPM, 0, 0,1061o019_mix, ARRAY_SIZE(o019_mix)),1062SND_SOC_DAPM_MIXER("O020", SND_SOC_NOPM, 0, 0,1063o020_mix, ARRAY_SIZE(o020_mix)),1064SND_SOC_DAPM_MIXER("O021", SND_SOC_NOPM, 0, 0,1065o021_mix, ARRAY_SIZE(o021_mix)),1066SND_SOC_DAPM_MIXER("O022", SND_SOC_NOPM, 0, 0,1067o022_mix, ARRAY_SIZE(o022_mix)),1068SND_SOC_DAPM_MIXER("O023", SND_SOC_NOPM, 0, 0,1069o023_mix, ARRAY_SIZE(o023_mix)),1070SND_SOC_DAPM_MIXER("O024", SND_SOC_NOPM, 0, 0,1071o024_mix, ARRAY_SIZE(o024_mix)),1072SND_SOC_DAPM_MIXER("O025", SND_SOC_NOPM, 0, 0,1073o025_mix, ARRAY_SIZE(o025_mix)),1074SND_SOC_DAPM_MIXER("O026", SND_SOC_NOPM, 0, 0,1075o026_mix, ARRAY_SIZE(o026_mix)),1076SND_SOC_DAPM_MIXER("O027", SND_SOC_NOPM, 0, 0,1077o027_mix, ARRAY_SIZE(o027_mix)),1078SND_SOC_DAPM_MIXER("O028", SND_SOC_NOPM, 0, 0,1079o028_mix, ARRAY_SIZE(o028_mix)),1080SND_SOC_DAPM_MIXER("O029", SND_SOC_NOPM, 0, 0,1081o029_mix, ARRAY_SIZE(o029_mix)),1082SND_SOC_DAPM_MIXER("O030", SND_SOC_NOPM, 0, 0,1083o030_mix, ARRAY_SIZE(o030_mix)),1084SND_SOC_DAPM_MIXER("O031", SND_SOC_NOPM, 0, 0,1085o031_mix, ARRAY_SIZE(o031_mix)),1086SND_SOC_DAPM_MIXER("O032", SND_SOC_NOPM, 0, 0,1087o032_mix, ARRAY_SIZE(o032_mix)),1088SND_SOC_DAPM_MIXER("O033", SND_SOC_NOPM, 0, 0,1089o033_mix, ARRAY_SIZE(o033_mix)),10901091/* UL4 */1092SND_SOC_DAPM_MIXER("O034", SND_SOC_NOPM, 0, 0,1093o034_mix, ARRAY_SIZE(o034_mix)),1094SND_SOC_DAPM_MIXER("O035", SND_SOC_NOPM, 0, 0,1095o035_mix, ARRAY_SIZE(o035_mix)),10961097/* UL5 */1098SND_SOC_DAPM_MIXER("O036", SND_SOC_NOPM, 0, 0,1099o036_mix, ARRAY_SIZE(o036_mix)),1100SND_SOC_DAPM_MIXER("O037", SND_SOC_NOPM, 0, 0,1101o037_mix, ARRAY_SIZE(o037_mix)),11021103/* UL10 */1104SND_SOC_DAPM_MIXER("O038", SND_SOC_NOPM, 0, 0,1105o038_mix, ARRAY_SIZE(o038_mix)),1106SND_SOC_DAPM_MIXER("O039", SND_SOC_NOPM, 0, 0,1107o039_mix, ARRAY_SIZE(o039_mix)),1108SND_SOC_DAPM_MIXER("O182", SND_SOC_NOPM, 0, 0,1109o182_mix, ARRAY_SIZE(o182_mix)),1110SND_SOC_DAPM_MIXER("O183", SND_SOC_NOPM, 0, 0,1111o183_mix, ARRAY_SIZE(o183_mix)),11121113/* UL2 */1114SND_SOC_DAPM_MIXER("O040", SND_SOC_NOPM, 0, 0,1115o040_mix, ARRAY_SIZE(o040_mix)),1116SND_SOC_DAPM_MIXER("O041", SND_SOC_NOPM, 0, 0,1117o041_mix, ARRAY_SIZE(o041_mix)),1118SND_SOC_DAPM_MIXER("O042", SND_SOC_NOPM, 0, 0,1119o042_mix, ARRAY_SIZE(o042_mix)),1120SND_SOC_DAPM_MIXER("O043", SND_SOC_NOPM, 0, 0,1121o043_mix, ARRAY_SIZE(o043_mix)),1122SND_SOC_DAPM_MIXER("O044", SND_SOC_NOPM, 0, 0,1123o044_mix, ARRAY_SIZE(o044_mix)),1124SND_SOC_DAPM_MIXER("O045", SND_SOC_NOPM, 0, 0,1125o045_mix, ARRAY_SIZE(o045_mix)),1126SND_SOC_DAPM_MIXER("O046", SND_SOC_NOPM, 0, 0,1127o046_mix, ARRAY_SIZE(o046_mix)),1128SND_SOC_DAPM_MIXER("O047", SND_SOC_NOPM, 0, 0,1129o047_mix, ARRAY_SIZE(o047_mix)),1130};11311132static const struct snd_soc_dapm_route mt8188_memif_routes[] = {1133{"I000", NULL, "DL6"},1134{"I001", NULL, "DL6"},11351136{"I020", NULL, "DL3"},1137{"I021", NULL, "DL3"},11381139{"I022", NULL, "DL11"},1140{"I023", NULL, "DL11"},1141{"I024", NULL, "DL11"},1142{"I025", NULL, "DL11"},1143{"I026", NULL, "DL11"},1144{"I027", NULL, "DL11"},1145{"I028", NULL, "DL11"},1146{"I029", NULL, "DL11"},1147{"I030", NULL, "DL11"},1148{"I031", NULL, "DL11"},1149{"I032", NULL, "DL11"},1150{"I033", NULL, "DL11"},1151{"I034", NULL, "DL11"},1152{"I035", NULL, "DL11"},1153{"I036", NULL, "DL11"},1154{"I037", NULL, "DL11"},11551156{"DL8_DL11 Mux", "dl8", "DL8"},1157{"DL8_DL11 Mux", "dl11", "DL11"},11581159{"I046", NULL, "DL8_DL11 Mux"},1160{"I047", NULL, "DL8_DL11 Mux"},1161{"I048", NULL, "DL8_DL11 Mux"},1162{"I049", NULL, "DL8_DL11 Mux"},1163{"I050", NULL, "DL8_DL11 Mux"},1164{"I051", NULL, "DL8_DL11 Mux"},1165{"I052", NULL, "DL8_DL11 Mux"},1166{"I053", NULL, "DL8_DL11 Mux"},1167{"I054", NULL, "DL8_DL11 Mux"},1168{"I055", NULL, "DL8_DL11 Mux"},1169{"I056", NULL, "DL8_DL11 Mux"},1170{"I057", NULL, "DL8_DL11 Mux"},1171{"I058", NULL, "DL8_DL11 Mux"},1172{"I059", NULL, "DL8_DL11 Mux"},1173{"I060", NULL, "DL8_DL11 Mux"},1174{"I061", NULL, "DL8_DL11 Mux"},11751176{"I070", NULL, "DL2"},1177{"I071", NULL, "DL2"},11781179{"UL9", NULL, "O002"},1180{"UL9", NULL, "O003"},1181{"UL9", NULL, "O004"},1182{"UL9", NULL, "O005"},1183{"UL9", NULL, "O006"},1184{"UL9", NULL, "O007"},1185{"UL9", NULL, "O008"},1186{"UL9", NULL, "O009"},1187{"UL9", NULL, "O010"},1188{"UL9", NULL, "O011"},1189{"UL9", NULL, "O012"},1190{"UL9", NULL, "O013"},1191{"UL9", NULL, "O014"},1192{"UL9", NULL, "O015"},1193{"UL9", NULL, "O016"},1194{"UL9", NULL, "O017"},1195{"UL9", NULL, "O018"},1196{"UL9", NULL, "O019"},1197{"UL9", NULL, "O020"},1198{"UL9", NULL, "O021"},1199{"UL9", NULL, "O022"},1200{"UL9", NULL, "O023"},1201{"UL9", NULL, "O024"},1202{"UL9", NULL, "O025"},1203{"UL9", NULL, "O026"},1204{"UL9", NULL, "O027"},1205{"UL9", NULL, "O028"},1206{"UL9", NULL, "O029"},1207{"UL9", NULL, "O030"},1208{"UL9", NULL, "O031"},1209{"UL9", NULL, "O032"},1210{"UL9", NULL, "O033"},12111212{"UL4", NULL, "O034"},1213{"UL4", NULL, "O035"},12141215{"UL5", NULL, "O036"},1216{"UL5", NULL, "O037"},12171218{"UL10", NULL, "O038"},1219{"UL10", NULL, "O039"},1220{"UL10", NULL, "O182"},1221{"UL10", NULL, "O183"},12221223{"UL2", NULL, "O040"},1224{"UL2", NULL, "O041"},1225{"UL2", NULL, "O042"},1226{"UL2", NULL, "O043"},1227{"UL2", NULL, "O044"},1228{"UL2", NULL, "O045"},1229{"UL2", NULL, "O046"},1230{"UL2", NULL, "O047"},12311232{"O004", "I000 Switch", "I000"},1233{"O005", "I001 Switch", "I001"},12341235{"O006", "I000 Switch", "I000"},1236{"O007", "I001 Switch", "I001"},12371238{"O010", "I022 Switch", "I022"},1239{"O011", "I023 Switch", "I023"},1240{"O012", "I024 Switch", "I024"},1241{"O013", "I025 Switch", "I025"},1242{"O014", "I026 Switch", "I026"},1243{"O015", "I027 Switch", "I027"},1244{"O016", "I028 Switch", "I028"},1245{"O017", "I029 Switch", "I029"},12461247{"O010", "I046 Switch", "I046"},1248{"O011", "I047 Switch", "I047"},1249{"O012", "I048 Switch", "I048"},1250{"O013", "I049 Switch", "I049"},1251{"O014", "I050 Switch", "I050"},1252{"O015", "I051 Switch", "I051"},1253{"O016", "I052 Switch", "I052"},1254{"O017", "I053 Switch", "I053"},12551256{"O002", "I022 Switch", "I022"},1257{"O003", "I023 Switch", "I023"},1258{"O004", "I024 Switch", "I024"},1259{"O005", "I025 Switch", "I025"},1260{"O006", "I026 Switch", "I026"},1261{"O007", "I027 Switch", "I027"},1262{"O008", "I028 Switch", "I028"},1263{"O009", "I029 Switch", "I029"},1264{"O010", "I030 Switch", "I030"},1265{"O011", "I031 Switch", "I031"},1266{"O012", "I032 Switch", "I032"},1267{"O013", "I033 Switch", "I033"},1268{"O014", "I034 Switch", "I034"},1269{"O015", "I035 Switch", "I035"},1270{"O016", "I036 Switch", "I036"},1271{"O017", "I037 Switch", "I037"},1272{"O026", "I046 Switch", "I046"},1273{"O027", "I047 Switch", "I047"},1274{"O028", "I048 Switch", "I048"},1275{"O029", "I049 Switch", "I049"},1276{"O030", "I050 Switch", "I050"},1277{"O031", "I051 Switch", "I051"},1278{"O032", "I052 Switch", "I052"},1279{"O033", "I053 Switch", "I053"},12801281{"O002", "I000 Switch", "I000"},1282{"O003", "I001 Switch", "I001"},1283{"O002", "I020 Switch", "I020"},1284{"O003", "I021 Switch", "I021"},1285{"O002", "I070 Switch", "I070"},1286{"O003", "I071 Switch", "I071"},12871288{"O002", "I004 Switch", "I004"},1289{"O003", "I005 Switch", "I005"},1290{"O003", "I006 Switch", "I006"},1291{"O004", "I006 Switch", "I006"},1292{"O004", "I008 Switch", "I008"},1293{"O005", "I007 Switch", "I007"},1294{"O005", "I010 Switch", "I010"},1295{"O006", "I008 Switch", "I008"},1296{"O007", "I009 Switch", "I009"},1297{"O008", "I010 Switch", "I010"},1298{"O009", "I011 Switch", "I011"},12991300{"O034", "I000 Switch", "I000"},1301{"O035", "I001 Switch", "I001"},1302{"O034", "I002 Switch", "I002"},1303{"O035", "I003 Switch", "I003"},1304{"O034", "I012 Switch", "I012"},1305{"O035", "I013 Switch", "I013"},1306{"O034", "I020 Switch", "I020"},1307{"O035", "I021 Switch", "I021"},1308{"O034", "I070 Switch", "I070"},1309{"O035", "I071 Switch", "I071"},1310{"O034", "I072 Switch", "I072"},1311{"O035", "I073 Switch", "I073"},13121313{"O036", "I000 Switch", "I000"},1314{"O037", "I001 Switch", "I001"},1315{"O036", "I012 Switch", "I012"},1316{"O037", "I013 Switch", "I013"},1317{"O036", "I020 Switch", "I020"},1318{"O037", "I021 Switch", "I021"},1319{"O036", "I070 Switch", "I070"},1320{"O037", "I071 Switch", "I071"},1321{"O036", "I168 Switch", "I168"},1322{"O037", "I169 Switch", "I169"},13231324{"O038", "I022 Switch", "I022"},1325{"O039", "I023 Switch", "I023"},1326{"O182", "I024 Switch", "I024"},1327{"O183", "I025 Switch", "I025"},13281329{"O038", "I168 Switch", "I168"},1330{"O039", "I169 Switch", "I169"},13311332{"O182", "I020 Switch", "I020"},1333{"O183", "I021 Switch", "I021"},13341335{"O182", "I022 Switch", "I022"},1336{"O183", "I023 Switch", "I023"},13371338{"O040", "I022 Switch", "I022"},1339{"O041", "I023 Switch", "I023"},1340{"O042", "I024 Switch", "I024"},1341{"O043", "I025 Switch", "I025"},1342{"O044", "I026 Switch", "I026"},1343{"O045", "I027 Switch", "I027"},1344{"O046", "I028 Switch", "I028"},1345{"O047", "I029 Switch", "I029"},13461347{"O040", "I002 Switch", "I002"},1348{"O041", "I003 Switch", "I003"},13491350{"O002", "I012 Switch", "I012"},1351{"O003", "I013 Switch", "I013"},1352{"O004", "I014 Switch", "I014"},1353{"O005", "I015 Switch", "I015"},1354{"O006", "I016 Switch", "I016"},1355{"O007", "I017 Switch", "I017"},1356{"O008", "I018 Switch", "I018"},1357{"O009", "I019 Switch", "I019"},1358{"O010", "I188 Switch", "I188"},1359{"O011", "I189 Switch", "I189"},1360{"O012", "I190 Switch", "I190"},1361{"O013", "I191 Switch", "I191"},1362{"O014", "I192 Switch", "I192"},1363{"O015", "I193 Switch", "I193"},1364{"O016", "I194 Switch", "I194"},1365{"O017", "I195 Switch", "I195"},13661367{"O040", "I012 Switch", "I012"},1368{"O041", "I013 Switch", "I013"},1369{"O042", "I014 Switch", "I014"},1370{"O043", "I015 Switch", "I015"},1371{"O044", "I016 Switch", "I016"},1372{"O045", "I017 Switch", "I017"},1373{"O046", "I018 Switch", "I018"},1374{"O047", "I019 Switch", "I019"},13751376{"O002", "I072 Switch", "I072"},1377{"O003", "I073 Switch", "I073"},1378{"O004", "I074 Switch", "I074"},1379{"O005", "I075 Switch", "I075"},1380{"O006", "I076 Switch", "I076"},1381{"O007", "I077 Switch", "I077"},1382{"O008", "I078 Switch", "I078"},1383{"O009", "I079 Switch", "I079"},1384{"O010", "I080 Switch", "I080"},1385{"O011", "I081 Switch", "I081"},1386{"O012", "I082 Switch", "I082"},1387{"O013", "I083 Switch", "I083"},1388{"O014", "I084 Switch", "I084"},1389{"O015", "I085 Switch", "I085"},1390{"O016", "I086 Switch", "I086"},1391{"O017", "I087 Switch", "I087"},13921393{"O010", "I072 Switch", "I072"},1394{"O011", "I073 Switch", "I073"},1395{"O012", "I074 Switch", "I074"},1396{"O013", "I075 Switch", "I075"},1397{"O014", "I076 Switch", "I076"},1398{"O015", "I077 Switch", "I077"},1399{"O016", "I078 Switch", "I078"},1400{"O017", "I079 Switch", "I079"},1401{"O018", "I080 Switch", "I080"},1402{"O019", "I081 Switch", "I081"},1403{"O020", "I082 Switch", "I082"},1404{"O021", "I083 Switch", "I083"},1405{"O022", "I084 Switch", "I084"},1406{"O023", "I085 Switch", "I085"},1407{"O024", "I086 Switch", "I086"},1408{"O025", "I087 Switch", "I087"},14091410{"O002", "I168 Switch", "I168"},1411{"O003", "I169 Switch", "I169"},14121413{"O034", "I168 Switch", "I168"},1414{"O035", "I168 Switch", "I168"},1415{"O035", "I169 Switch", "I169"},14161417{"O040", "I168 Switch", "I168"},1418{"O041", "I169 Switch", "I169"},1419};14201421static const char * const mt8188_afe_1x_en_sel_text[] = {1422"a1sys_a2sys", "a3sys", "a4sys",1423};14241425static const unsigned int mt8188_afe_1x_en_sel_values[] = {14260, 1, 2,1427};14281429static SOC_VALUE_ENUM_SINGLE_DECL(dl2_1x_en_sel_enum,1430A3_A4_TIMING_SEL1, 18, 0x3,1431mt8188_afe_1x_en_sel_text,1432mt8188_afe_1x_en_sel_values);1433static SOC_VALUE_ENUM_SINGLE_DECL(dl3_1x_en_sel_enum,1434A3_A4_TIMING_SEL1, 20, 0x3,1435mt8188_afe_1x_en_sel_text,1436mt8188_afe_1x_en_sel_values);1437static SOC_VALUE_ENUM_SINGLE_DECL(dl6_1x_en_sel_enum,1438A3_A4_TIMING_SEL1, 22, 0x3,1439mt8188_afe_1x_en_sel_text,1440mt8188_afe_1x_en_sel_values);1441static SOC_VALUE_ENUM_SINGLE_DECL(dl7_1x_en_sel_enum,1442A3_A4_TIMING_SEL1, 24, 0x3,1443mt8188_afe_1x_en_sel_text,1444mt8188_afe_1x_en_sel_values);1445static SOC_VALUE_ENUM_SINGLE_DECL(dl8_1x_en_sel_enum,1446A3_A4_TIMING_SEL1, 26, 0x3,1447mt8188_afe_1x_en_sel_text,1448mt8188_afe_1x_en_sel_values);1449static SOC_VALUE_ENUM_SINGLE_DECL(dl10_1x_en_sel_enum,1450A3_A4_TIMING_SEL1, 28, 0x3,1451mt8188_afe_1x_en_sel_text,1452mt8188_afe_1x_en_sel_values);1453static SOC_VALUE_ENUM_SINGLE_DECL(dl11_1x_en_sel_enum,1454A3_A4_TIMING_SEL1, 30, 0x3,1455mt8188_afe_1x_en_sel_text,1456mt8188_afe_1x_en_sel_values);1457static SOC_VALUE_ENUM_SINGLE_DECL(ul1_1x_en_sel_enum,1458A3_A4_TIMING_SEL1, 0, 0x3,1459mt8188_afe_1x_en_sel_text,1460mt8188_afe_1x_en_sel_values);1461static SOC_VALUE_ENUM_SINGLE_DECL(ul2_1x_en_sel_enum,1462A3_A4_TIMING_SEL1, 2, 0x3,1463mt8188_afe_1x_en_sel_text,1464mt8188_afe_1x_en_sel_values);1465static SOC_VALUE_ENUM_SINGLE_DECL(ul3_1x_en_sel_enum,1466A3_A4_TIMING_SEL1, 4, 0x3,1467mt8188_afe_1x_en_sel_text,1468mt8188_afe_1x_en_sel_values);1469static SOC_VALUE_ENUM_SINGLE_DECL(ul4_1x_en_sel_enum,1470A3_A4_TIMING_SEL1, 6, 0x3,1471mt8188_afe_1x_en_sel_text,1472mt8188_afe_1x_en_sel_values);1473static SOC_VALUE_ENUM_SINGLE_DECL(ul5_1x_en_sel_enum,1474A3_A4_TIMING_SEL1, 8, 0x3,1475mt8188_afe_1x_en_sel_text,1476mt8188_afe_1x_en_sel_values);1477static SOC_VALUE_ENUM_SINGLE_DECL(ul6_1x_en_sel_enum,1478A3_A4_TIMING_SEL1, 10, 0x3,1479mt8188_afe_1x_en_sel_text,1480mt8188_afe_1x_en_sel_values);1481static SOC_VALUE_ENUM_SINGLE_DECL(ul8_1x_en_sel_enum,1482A3_A4_TIMING_SEL1, 12, 0x3,1483mt8188_afe_1x_en_sel_text,1484mt8188_afe_1x_en_sel_values);1485static SOC_VALUE_ENUM_SINGLE_DECL(ul9_1x_en_sel_enum,1486A3_A4_TIMING_SEL1, 14, 0x3,1487mt8188_afe_1x_en_sel_text,1488mt8188_afe_1x_en_sel_values);1489static SOC_VALUE_ENUM_SINGLE_DECL(ul10_1x_en_sel_enum,1490A3_A4_TIMING_SEL1, 16, 0x3,1491mt8188_afe_1x_en_sel_text,1492mt8188_afe_1x_en_sel_values);14931494static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq1_1x_en_sel_enum,1495A3_A4_TIMING_SEL6, 0, 0x3,1496mt8188_afe_1x_en_sel_text,1497mt8188_afe_1x_en_sel_values);1498static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq2_1x_en_sel_enum,1499A3_A4_TIMING_SEL6, 2, 0x3,1500mt8188_afe_1x_en_sel_text,1501mt8188_afe_1x_en_sel_values);1502static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq3_1x_en_sel_enum,1503A3_A4_TIMING_SEL6, 4, 0x3,1504mt8188_afe_1x_en_sel_text,1505mt8188_afe_1x_en_sel_values);1506static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq4_1x_en_sel_enum,1507A3_A4_TIMING_SEL6, 6, 0x3,1508mt8188_afe_1x_en_sel_text,1509mt8188_afe_1x_en_sel_values);1510static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq5_1x_en_sel_enum,1511A3_A4_TIMING_SEL6, 8, 0x3,1512mt8188_afe_1x_en_sel_text,1513mt8188_afe_1x_en_sel_values);1514static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq6_1x_en_sel_enum,1515A3_A4_TIMING_SEL6, 10, 0x3,1516mt8188_afe_1x_en_sel_text,1517mt8188_afe_1x_en_sel_values);1518static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq7_1x_en_sel_enum,1519A3_A4_TIMING_SEL6, 12, 0x3,1520mt8188_afe_1x_en_sel_text,1521mt8188_afe_1x_en_sel_values);1522static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq8_1x_en_sel_enum,1523A3_A4_TIMING_SEL6, 14, 0x3,1524mt8188_afe_1x_en_sel_text,1525mt8188_afe_1x_en_sel_values);1526static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq9_1x_en_sel_enum,1527A3_A4_TIMING_SEL6, 16, 0x3,1528mt8188_afe_1x_en_sel_text,1529mt8188_afe_1x_en_sel_values);1530static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq10_1x_en_sel_enum,1531A3_A4_TIMING_SEL6, 18, 0x3,1532mt8188_afe_1x_en_sel_text,1533mt8188_afe_1x_en_sel_values);1534static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq11_1x_en_sel_enum,1535A3_A4_TIMING_SEL6, 20, 0x3,1536mt8188_afe_1x_en_sel_text,1537mt8188_afe_1x_en_sel_values);1538static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq12_1x_en_sel_enum,1539A3_A4_TIMING_SEL6, 22, 0x3,1540mt8188_afe_1x_en_sel_text,1541mt8188_afe_1x_en_sel_values);1542static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq13_1x_en_sel_enum,1543A3_A4_TIMING_SEL6, 24, 0x3,1544mt8188_afe_1x_en_sel_text,1545mt8188_afe_1x_en_sel_values);1546static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq14_1x_en_sel_enum,1547A3_A4_TIMING_SEL6, 26, 0x3,1548mt8188_afe_1x_en_sel_text,1549mt8188_afe_1x_en_sel_values);1550static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq15_1x_en_sel_enum,1551A3_A4_TIMING_SEL6, 28, 0x3,1552mt8188_afe_1x_en_sel_text,1553mt8188_afe_1x_en_sel_values);1554static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq16_1x_en_sel_enum,1555A3_A4_TIMING_SEL6, 30, 0x3,1556mt8188_afe_1x_en_sel_text,1557mt8188_afe_1x_en_sel_values);15581559static const char * const mt8188_afe_fs_timing_sel_text[] = {1560"asys",1561"etdmout1_1x_en",1562"etdmout2_1x_en",1563"etdmout3_1x_en",1564"etdmin1_1x_en",1565"etdmin2_1x_en",1566"etdmin1_nx_en",1567"etdmin2_nx_en",1568};15691570static const unsigned int mt8188_afe_fs_timing_sel_values[] = {15710,1572MT8188_ETDM_OUT1_1X_EN,1573MT8188_ETDM_OUT2_1X_EN,1574MT8188_ETDM_OUT3_1X_EN,1575MT8188_ETDM_IN1_1X_EN,1576MT8188_ETDM_IN2_1X_EN,1577MT8188_ETDM_IN1_NX_EN,1578MT8188_ETDM_IN2_NX_EN,1579};15801581static SOC_VALUE_ENUM_SINGLE_DECL(dl2_fs_timing_sel_enum,1582SND_SOC_NOPM, 0, 0,1583mt8188_afe_fs_timing_sel_text,1584mt8188_afe_fs_timing_sel_values);1585static SOC_VALUE_ENUM_SINGLE_DECL(dl3_fs_timing_sel_enum,1586SND_SOC_NOPM, 0, 0,1587mt8188_afe_fs_timing_sel_text,1588mt8188_afe_fs_timing_sel_values);1589static SOC_VALUE_ENUM_SINGLE_DECL(dl6_fs_timing_sel_enum,1590SND_SOC_NOPM, 0, 0,1591mt8188_afe_fs_timing_sel_text,1592mt8188_afe_fs_timing_sel_values);1593static SOC_VALUE_ENUM_SINGLE_DECL(dl8_fs_timing_sel_enum,1594SND_SOC_NOPM, 0, 0,1595mt8188_afe_fs_timing_sel_text,1596mt8188_afe_fs_timing_sel_values);1597static SOC_VALUE_ENUM_SINGLE_DECL(dl11_fs_timing_sel_enum,1598SND_SOC_NOPM, 0, 0,1599mt8188_afe_fs_timing_sel_text,1600mt8188_afe_fs_timing_sel_values);1601static SOC_VALUE_ENUM_SINGLE_DECL(ul2_fs_timing_sel_enum,1602SND_SOC_NOPM, 0, 0,1603mt8188_afe_fs_timing_sel_text,1604mt8188_afe_fs_timing_sel_values);1605static SOC_VALUE_ENUM_SINGLE_DECL(ul4_fs_timing_sel_enum,1606SND_SOC_NOPM, 0, 0,1607mt8188_afe_fs_timing_sel_text,1608mt8188_afe_fs_timing_sel_values);1609static SOC_VALUE_ENUM_SINGLE_DECL(ul5_fs_timing_sel_enum,1610SND_SOC_NOPM, 0, 0,1611mt8188_afe_fs_timing_sel_text,1612mt8188_afe_fs_timing_sel_values);1613static SOC_VALUE_ENUM_SINGLE_DECL(ul9_fs_timing_sel_enum,1614SND_SOC_NOPM, 0, 0,1615mt8188_afe_fs_timing_sel_text,1616mt8188_afe_fs_timing_sel_values);1617static SOC_VALUE_ENUM_SINGLE_DECL(ul10_fs_timing_sel_enum,1618SND_SOC_NOPM, 0, 0,1619mt8188_afe_fs_timing_sel_text,1620mt8188_afe_fs_timing_sel_values);16211622static int mt8188_memif_1x_en_sel_put(struct snd_kcontrol *kcontrol,1623struct snd_ctl_elem_value *ucontrol)1624{1625struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);1626struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1627struct mt8188_afe_private *afe_priv = afe->platform_priv;1628struct mtk_dai_memif_priv *memif_priv;1629unsigned int dai_id = kcontrol->id.device;1630long val = ucontrol->value.integer.value[0];1631int ret = 0;16321633memif_priv = afe_priv->dai_priv[dai_id];16341635if (val == memif_priv->asys_timing_sel)1636return 0;16371638ret = snd_soc_put_enum_double(kcontrol, ucontrol);16391640memif_priv->asys_timing_sel = val;16411642return ret;1643}16441645static int mt8188_asys_irq_1x_en_sel_put(struct snd_kcontrol *kcontrol,1646struct snd_ctl_elem_value *ucontrol)1647{1648struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);1649struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1650struct mt8188_afe_private *afe_priv = afe->platform_priv;1651unsigned int id = kcontrol->id.device;1652long val = ucontrol->value.integer.value[0];1653int ret = 0;16541655if (val == afe_priv->irq_priv[id].asys_timing_sel)1656return 0;16571658ret = snd_soc_put_enum_double(kcontrol, ucontrol);16591660afe_priv->irq_priv[id].asys_timing_sel = val;16611662return ret;1663}16641665static int mt8188_memif_fs_timing_sel_get(struct snd_kcontrol *kcontrol,1666struct snd_ctl_elem_value *ucontrol)1667{1668struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);1669struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1670struct mt8188_afe_private *afe_priv = afe->platform_priv;1671struct mtk_dai_memif_priv *memif_priv;1672unsigned int dai_id = kcontrol->id.device;1673struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;16741675memif_priv = afe_priv->dai_priv[dai_id];16761677ucontrol->value.enumerated.item[0] =1678snd_soc_enum_val_to_item(e, memif_priv->fs_timing);16791680return 0;1681}16821683static int mt8188_memif_fs_timing_sel_put(struct snd_kcontrol *kcontrol,1684struct snd_ctl_elem_value *ucontrol)1685{1686struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);1687struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1688struct mt8188_afe_private *afe_priv = afe->platform_priv;1689struct mtk_dai_memif_priv *memif_priv;1690unsigned int dai_id = kcontrol->id.device;1691struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;1692unsigned int *item = ucontrol->value.enumerated.item;1693unsigned int prev_item = 0;16941695if (item[0] >= e->items)1696return -EINVAL;16971698memif_priv = afe_priv->dai_priv[dai_id];16991700prev_item = snd_soc_enum_val_to_item(e, memif_priv->fs_timing);17011702if (item[0] == prev_item)1703return 0;17041705memif_priv->fs_timing = snd_soc_enum_item_to_val(e, item[0]);17061707return 1;1708}17091710static const struct snd_kcontrol_new mt8188_memif_controls[] = {1711MT8188_SOC_ENUM_EXT("dl2_1x_en_sel",1712dl2_1x_en_sel_enum,1713snd_soc_get_enum_double,1714mt8188_memif_1x_en_sel_put,1715MT8188_AFE_MEMIF_DL2),1716MT8188_SOC_ENUM_EXT("dl3_1x_en_sel",1717dl3_1x_en_sel_enum,1718snd_soc_get_enum_double,1719mt8188_memif_1x_en_sel_put,1720MT8188_AFE_MEMIF_DL3),1721MT8188_SOC_ENUM_EXT("dl6_1x_en_sel",1722dl6_1x_en_sel_enum,1723snd_soc_get_enum_double,1724mt8188_memif_1x_en_sel_put,1725MT8188_AFE_MEMIF_DL6),1726MT8188_SOC_ENUM_EXT("dl7_1x_en_sel",1727dl7_1x_en_sel_enum,1728snd_soc_get_enum_double,1729mt8188_memif_1x_en_sel_put,1730MT8188_AFE_MEMIF_DL7),1731MT8188_SOC_ENUM_EXT("dl8_1x_en_sel",1732dl8_1x_en_sel_enum,1733snd_soc_get_enum_double,1734mt8188_memif_1x_en_sel_put,1735MT8188_AFE_MEMIF_DL8),1736MT8188_SOC_ENUM_EXT("dl10_1x_en_sel",1737dl10_1x_en_sel_enum,1738snd_soc_get_enum_double,1739mt8188_memif_1x_en_sel_put,1740MT8188_AFE_MEMIF_DL10),1741MT8188_SOC_ENUM_EXT("dl11_1x_en_sel",1742dl11_1x_en_sel_enum,1743snd_soc_get_enum_double,1744mt8188_memif_1x_en_sel_put,1745MT8188_AFE_MEMIF_DL11),1746MT8188_SOC_ENUM_EXT("ul1_1x_en_sel",1747ul1_1x_en_sel_enum,1748snd_soc_get_enum_double,1749mt8188_memif_1x_en_sel_put,1750MT8188_AFE_MEMIF_UL1),1751MT8188_SOC_ENUM_EXT("ul2_1x_en_sel",1752ul2_1x_en_sel_enum,1753snd_soc_get_enum_double,1754mt8188_memif_1x_en_sel_put,1755MT8188_AFE_MEMIF_UL2),1756MT8188_SOC_ENUM_EXT("ul3_1x_en_sel",1757ul3_1x_en_sel_enum,1758snd_soc_get_enum_double,1759mt8188_memif_1x_en_sel_put,1760MT8188_AFE_MEMIF_UL3),1761MT8188_SOC_ENUM_EXT("ul4_1x_en_sel",1762ul4_1x_en_sel_enum,1763snd_soc_get_enum_double,1764mt8188_memif_1x_en_sel_put,1765MT8188_AFE_MEMIF_UL4),1766MT8188_SOC_ENUM_EXT("ul5_1x_en_sel",1767ul5_1x_en_sel_enum,1768snd_soc_get_enum_double,1769mt8188_memif_1x_en_sel_put,1770MT8188_AFE_MEMIF_UL5),1771MT8188_SOC_ENUM_EXT("ul6_1x_en_sel",1772ul6_1x_en_sel_enum,1773snd_soc_get_enum_double,1774mt8188_memif_1x_en_sel_put,1775MT8188_AFE_MEMIF_UL6),1776MT8188_SOC_ENUM_EXT("ul8_1x_en_sel",1777ul8_1x_en_sel_enum,1778snd_soc_get_enum_double,1779mt8188_memif_1x_en_sel_put,1780MT8188_AFE_MEMIF_UL8),1781MT8188_SOC_ENUM_EXT("ul9_1x_en_sel",1782ul9_1x_en_sel_enum,1783snd_soc_get_enum_double,1784mt8188_memif_1x_en_sel_put,1785MT8188_AFE_MEMIF_UL9),1786MT8188_SOC_ENUM_EXT("ul10_1x_en_sel",1787ul10_1x_en_sel_enum,1788snd_soc_get_enum_double,1789mt8188_memif_1x_en_sel_put,1790MT8188_AFE_MEMIF_UL10),1791MT8188_SOC_ENUM_EXT("asys_irq1_1x_en_sel",1792asys_irq1_1x_en_sel_enum,1793snd_soc_get_enum_double,1794mt8188_asys_irq_1x_en_sel_put,1795MT8188_AFE_IRQ_13),1796MT8188_SOC_ENUM_EXT("asys_irq2_1x_en_sel",1797asys_irq2_1x_en_sel_enum,1798snd_soc_get_enum_double,1799mt8188_asys_irq_1x_en_sel_put,1800MT8188_AFE_IRQ_14),1801MT8188_SOC_ENUM_EXT("asys_irq3_1x_en_sel",1802asys_irq3_1x_en_sel_enum,1803snd_soc_get_enum_double,1804mt8188_asys_irq_1x_en_sel_put,1805MT8188_AFE_IRQ_15),1806MT8188_SOC_ENUM_EXT("asys_irq4_1x_en_sel",1807asys_irq4_1x_en_sel_enum,1808snd_soc_get_enum_double,1809mt8188_asys_irq_1x_en_sel_put,1810MT8188_AFE_IRQ_16),1811MT8188_SOC_ENUM_EXT("asys_irq5_1x_en_sel",1812asys_irq5_1x_en_sel_enum,1813snd_soc_get_enum_double,1814mt8188_asys_irq_1x_en_sel_put,1815MT8188_AFE_IRQ_17),1816MT8188_SOC_ENUM_EXT("asys_irq6_1x_en_sel",1817asys_irq6_1x_en_sel_enum,1818snd_soc_get_enum_double,1819mt8188_asys_irq_1x_en_sel_put,1820MT8188_AFE_IRQ_18),1821MT8188_SOC_ENUM_EXT("asys_irq7_1x_en_sel",1822asys_irq7_1x_en_sel_enum,1823snd_soc_get_enum_double,1824mt8188_asys_irq_1x_en_sel_put,1825MT8188_AFE_IRQ_19),1826MT8188_SOC_ENUM_EXT("asys_irq8_1x_en_sel",1827asys_irq8_1x_en_sel_enum,1828snd_soc_get_enum_double,1829mt8188_asys_irq_1x_en_sel_put,1830MT8188_AFE_IRQ_20),1831MT8188_SOC_ENUM_EXT("asys_irq9_1x_en_sel",1832asys_irq9_1x_en_sel_enum,1833snd_soc_get_enum_double,1834mt8188_asys_irq_1x_en_sel_put,1835MT8188_AFE_IRQ_21),1836MT8188_SOC_ENUM_EXT("asys_irq10_1x_en_sel",1837asys_irq10_1x_en_sel_enum,1838snd_soc_get_enum_double,1839mt8188_asys_irq_1x_en_sel_put,1840MT8188_AFE_IRQ_22),1841MT8188_SOC_ENUM_EXT("asys_irq11_1x_en_sel",1842asys_irq11_1x_en_sel_enum,1843snd_soc_get_enum_double,1844mt8188_asys_irq_1x_en_sel_put,1845MT8188_AFE_IRQ_23),1846MT8188_SOC_ENUM_EXT("asys_irq12_1x_en_sel",1847asys_irq12_1x_en_sel_enum,1848snd_soc_get_enum_double,1849mt8188_asys_irq_1x_en_sel_put,1850MT8188_AFE_IRQ_24),1851MT8188_SOC_ENUM_EXT("asys_irq13_1x_en_sel",1852asys_irq13_1x_en_sel_enum,1853snd_soc_get_enum_double,1854mt8188_asys_irq_1x_en_sel_put,1855MT8188_AFE_IRQ_25),1856MT8188_SOC_ENUM_EXT("asys_irq14_1x_en_sel",1857asys_irq14_1x_en_sel_enum,1858snd_soc_get_enum_double,1859mt8188_asys_irq_1x_en_sel_put,1860MT8188_AFE_IRQ_26),1861MT8188_SOC_ENUM_EXT("asys_irq15_1x_en_sel",1862asys_irq15_1x_en_sel_enum,1863snd_soc_get_enum_double,1864mt8188_asys_irq_1x_en_sel_put,1865MT8188_AFE_IRQ_27),1866MT8188_SOC_ENUM_EXT("asys_irq16_1x_en_sel",1867asys_irq16_1x_en_sel_enum,1868snd_soc_get_enum_double,1869mt8188_asys_irq_1x_en_sel_put,1870MT8188_AFE_IRQ_28),1871MT8188_SOC_ENUM_EXT("dl2_fs_timing_sel",1872dl2_fs_timing_sel_enum,1873mt8188_memif_fs_timing_sel_get,1874mt8188_memif_fs_timing_sel_put,1875MT8188_AFE_MEMIF_DL2),1876MT8188_SOC_ENUM_EXT("dl3_fs_timing_sel",1877dl3_fs_timing_sel_enum,1878mt8188_memif_fs_timing_sel_get,1879mt8188_memif_fs_timing_sel_put,1880MT8188_AFE_MEMIF_DL3),1881MT8188_SOC_ENUM_EXT("dl6_fs_timing_sel",1882dl6_fs_timing_sel_enum,1883mt8188_memif_fs_timing_sel_get,1884mt8188_memif_fs_timing_sel_put,1885MT8188_AFE_MEMIF_DL6),1886MT8188_SOC_ENUM_EXT("dl8_fs_timing_sel",1887dl8_fs_timing_sel_enum,1888mt8188_memif_fs_timing_sel_get,1889mt8188_memif_fs_timing_sel_put,1890MT8188_AFE_MEMIF_DL8),1891MT8188_SOC_ENUM_EXT("dl11_fs_timing_sel",1892dl11_fs_timing_sel_enum,1893mt8188_memif_fs_timing_sel_get,1894mt8188_memif_fs_timing_sel_put,1895MT8188_AFE_MEMIF_DL11),1896MT8188_SOC_ENUM_EXT("ul2_fs_timing_sel",1897ul2_fs_timing_sel_enum,1898mt8188_memif_fs_timing_sel_get,1899mt8188_memif_fs_timing_sel_put,1900MT8188_AFE_MEMIF_UL2),1901MT8188_SOC_ENUM_EXT("ul4_fs_timing_sel",1902ul4_fs_timing_sel_enum,1903mt8188_memif_fs_timing_sel_get,1904mt8188_memif_fs_timing_sel_put,1905MT8188_AFE_MEMIF_UL4),1906MT8188_SOC_ENUM_EXT("ul5_fs_timing_sel",1907ul5_fs_timing_sel_enum,1908mt8188_memif_fs_timing_sel_get,1909mt8188_memif_fs_timing_sel_put,1910MT8188_AFE_MEMIF_UL5),1911MT8188_SOC_ENUM_EXT("ul9_fs_timing_sel",1912ul9_fs_timing_sel_enum,1913mt8188_memif_fs_timing_sel_get,1914mt8188_memif_fs_timing_sel_put,1915MT8188_AFE_MEMIF_UL9),1916MT8188_SOC_ENUM_EXT("ul10_fs_timing_sel",1917ul10_fs_timing_sel_enum,1918mt8188_memif_fs_timing_sel_get,1919mt8188_memif_fs_timing_sel_put,1920MT8188_AFE_MEMIF_UL10),1921};19221923static const struct mtk_base_memif_data memif_data[MT8188_AFE_MEMIF_NUM] = {1924[MT8188_AFE_MEMIF_DL2] = {1925.name = "DL2",1926.id = MT8188_AFE_MEMIF_DL2,1927.reg_ofs_base = AFE_DL2_BASE,1928.reg_ofs_cur = AFE_DL2_CUR,1929.reg_ofs_end = AFE_DL2_END,1930.fs_reg = AFE_MEMIF_AGENT_FS_CON0,1931.fs_shift = 10,1932.fs_maskbit = 0x1f,1933.mono_reg = -1,1934.mono_shift = 0,1935.int_odd_flag_reg = -1,1936.int_odd_flag_shift = 0,1937.enable_reg = AFE_DAC_CON0,1938.enable_shift = 18,1939.hd_reg = AFE_DL2_CON0,1940.hd_shift = 5,1941.agent_disable_reg = AUDIO_TOP_CON5,1942.agent_disable_shift = 18,1943.ch_num_reg = AFE_DL2_CON0,1944.ch_num_shift = 0,1945.ch_num_maskbit = 0x1f,1946.msb_reg = AFE_NORMAL_BASE_ADR_MSB,1947.msb_shift = 18,1948.msb_end_reg = AFE_NORMAL_END_ADR_MSB,1949.msb_end_shift = 18,1950},1951[MT8188_AFE_MEMIF_DL3] = {1952.name = "DL3",1953.id = MT8188_AFE_MEMIF_DL3,1954.reg_ofs_base = AFE_DL3_BASE,1955.reg_ofs_cur = AFE_DL3_CUR,1956.reg_ofs_end = AFE_DL3_END,1957.fs_reg = AFE_MEMIF_AGENT_FS_CON0,1958.fs_shift = 15,1959.fs_maskbit = 0x1f,1960.mono_reg = -1,1961.mono_shift = 0,1962.int_odd_flag_reg = -1,1963.int_odd_flag_shift = 0,1964.enable_reg = AFE_DAC_CON0,1965.enable_shift = 19,1966.hd_reg = AFE_DL3_CON0,1967.hd_shift = 5,1968.agent_disable_reg = AUDIO_TOP_CON5,1969.agent_disable_shift = 19,1970.ch_num_reg = AFE_DL3_CON0,1971.ch_num_shift = 0,1972.ch_num_maskbit = 0x1f,1973.msb_reg = AFE_NORMAL_BASE_ADR_MSB,1974.msb_shift = 19,1975.msb_end_reg = AFE_NORMAL_END_ADR_MSB,1976.msb_end_shift = 19,1977},1978[MT8188_AFE_MEMIF_DL6] = {1979.name = "DL6",1980.id = MT8188_AFE_MEMIF_DL6,1981.reg_ofs_base = AFE_DL6_BASE,1982.reg_ofs_cur = AFE_DL6_CUR,1983.reg_ofs_end = AFE_DL6_END,1984.fs_reg = AFE_MEMIF_AGENT_FS_CON1,1985.fs_shift = 0,1986.fs_maskbit = 0x1f,1987.mono_reg = -1,1988.mono_shift = 0,1989.int_odd_flag_reg = -1,1990.int_odd_flag_shift = 0,1991.enable_reg = AFE_DAC_CON0,1992.enable_shift = 22,1993.hd_reg = AFE_DL6_CON0,1994.hd_shift = 5,1995.agent_disable_reg = AUDIO_TOP_CON5,1996.agent_disable_shift = 22,1997.ch_num_reg = AFE_DL6_CON0,1998.ch_num_shift = 0,1999.ch_num_maskbit = 0x1f,2000.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2001.msb_shift = 22,2002.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2003.msb_end_shift = 22,2004},2005[MT8188_AFE_MEMIF_DL7] = {2006.name = "DL7",2007.id = MT8188_AFE_MEMIF_DL7,2008.reg_ofs_base = AFE_DL7_BASE,2009.reg_ofs_cur = AFE_DL7_CUR,2010.reg_ofs_end = AFE_DL7_END,2011.fs_reg = -1,2012.fs_shift = 0,2013.fs_maskbit = 0,2014.mono_reg = -1,2015.mono_shift = 0,2016.int_odd_flag_reg = -1,2017.int_odd_flag_shift = 0,2018.enable_reg = AFE_DAC_CON0,2019.enable_shift = 23,2020.hd_reg = AFE_DL7_CON0,2021.hd_shift = 5,2022.agent_disable_reg = AUDIO_TOP_CON5,2023.agent_disable_shift = 23,2024.ch_num_reg = AFE_DL7_CON0,2025.ch_num_shift = 0,2026.ch_num_maskbit = 0x1f,2027.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2028.msb_shift = 23,2029.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2030.msb_end_shift = 23,2031},2032[MT8188_AFE_MEMIF_DL8] = {2033.name = "DL8",2034.id = MT8188_AFE_MEMIF_DL8,2035.reg_ofs_base = AFE_DL8_BASE,2036.reg_ofs_cur = AFE_DL8_CUR,2037.reg_ofs_end = AFE_DL8_END,2038.fs_reg = AFE_MEMIF_AGENT_FS_CON1,2039.fs_shift = 10,2040.fs_maskbit = 0x1f,2041.mono_reg = -1,2042.mono_shift = 0,2043.int_odd_flag_reg = -1,2044.int_odd_flag_shift = 0,2045.enable_reg = AFE_DAC_CON0,2046.enable_shift = 24,2047.hd_reg = AFE_DL8_CON0,2048.hd_shift = 6,2049.agent_disable_reg = AUDIO_TOP_CON5,2050.agent_disable_shift = 24,2051.ch_num_reg = AFE_DL8_CON0,2052.ch_num_shift = 0,2053.ch_num_maskbit = 0x3f,2054.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2055.msb_shift = 24,2056.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2057.msb_end_shift = 24,2058},2059[MT8188_AFE_MEMIF_DL10] = {2060.name = "DL10",2061.id = MT8188_AFE_MEMIF_DL10,2062.reg_ofs_base = AFE_DL10_BASE,2063.reg_ofs_cur = AFE_DL10_CUR,2064.reg_ofs_end = AFE_DL10_END,2065.fs_reg = AFE_MEMIF_AGENT_FS_CON1,2066.fs_shift = 20,2067.fs_maskbit = 0x1f,2068.mono_reg = -1,2069.mono_shift = 0,2070.int_odd_flag_reg = -1,2071.int_odd_flag_shift = 0,2072.enable_reg = AFE_DAC_CON0,2073.enable_shift = 26,2074.hd_reg = AFE_DL10_CON0,2075.hd_shift = 5,2076.agent_disable_reg = AUDIO_TOP_CON5,2077.agent_disable_shift = 26,2078.ch_num_reg = AFE_DL10_CON0,2079.ch_num_shift = 0,2080.ch_num_maskbit = 0x1f,2081.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2082.msb_shift = 26,2083.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2084.msb_end_shift = 26,2085},2086[MT8188_AFE_MEMIF_DL11] = {2087.name = "DL11",2088.id = MT8188_AFE_MEMIF_DL11,2089.reg_ofs_base = AFE_DL11_BASE,2090.reg_ofs_cur = AFE_DL11_CUR,2091.reg_ofs_end = AFE_DL11_END,2092.fs_reg = AFE_MEMIF_AGENT_FS_CON1,2093.fs_shift = 25,2094.fs_maskbit = 0x1f,2095.mono_reg = -1,2096.mono_shift = 0,2097.int_odd_flag_reg = -1,2098.int_odd_flag_shift = 0,2099.enable_reg = AFE_DAC_CON0,2100.enable_shift = 27,2101.hd_reg = AFE_DL11_CON0,2102.hd_shift = 7,2103.agent_disable_reg = AUDIO_TOP_CON5,2104.agent_disable_shift = 27,2105.ch_num_reg = AFE_DL11_CON0,2106.ch_num_shift = 0,2107.ch_num_maskbit = 0x7f,2108.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2109.msb_shift = 27,2110.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2111.msb_end_shift = 27,2112},2113[MT8188_AFE_MEMIF_UL1] = {2114.name = "UL1",2115.id = MT8188_AFE_MEMIF_UL1,2116.reg_ofs_base = AFE_UL1_BASE,2117.reg_ofs_cur = AFE_UL1_CUR,2118.reg_ofs_end = AFE_UL1_END,2119.fs_reg = -1,2120.fs_shift = 0,2121.fs_maskbit = 0,2122.mono_reg = AFE_UL1_CON0,2123.mono_shift = 1,2124.int_odd_flag_reg = AFE_UL1_CON0,2125.int_odd_flag_shift = 0,2126.enable_reg = AFE_DAC_CON0,2127.enable_shift = 1,2128.hd_reg = AFE_UL1_CON0,2129.hd_shift = 5,2130.agent_disable_reg = AUDIO_TOP_CON5,2131.agent_disable_shift = 0,2132.ch_num_reg = -1,2133.ch_num_shift = 0,2134.ch_num_maskbit = 0,2135.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2136.msb_shift = 0,2137.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2138.msb_end_shift = 0,2139},2140[MT8188_AFE_MEMIF_UL2] = {2141.name = "UL2",2142.id = MT8188_AFE_MEMIF_UL2,2143.reg_ofs_base = AFE_UL2_BASE,2144.reg_ofs_cur = AFE_UL2_CUR,2145.reg_ofs_end = AFE_UL2_END,2146.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2147.fs_shift = 5,2148.fs_maskbit = 0x1f,2149.mono_reg = AFE_UL2_CON0,2150.mono_shift = 1,2151.int_odd_flag_reg = AFE_UL2_CON0,2152.int_odd_flag_shift = 0,2153.enable_reg = AFE_DAC_CON0,2154.enable_shift = 2,2155.hd_reg = AFE_UL2_CON0,2156.hd_shift = 5,2157.agent_disable_reg = AUDIO_TOP_CON5,2158.agent_disable_shift = 1,2159.ch_num_reg = -1,2160.ch_num_shift = 0,2161.ch_num_maskbit = 0,2162.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2163.msb_shift = 1,2164.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2165.msb_end_shift = 1,2166},2167[MT8188_AFE_MEMIF_UL3] = {2168.name = "UL3",2169.id = MT8188_AFE_MEMIF_UL3,2170.reg_ofs_base = AFE_UL3_BASE,2171.reg_ofs_cur = AFE_UL3_CUR,2172.reg_ofs_end = AFE_UL3_END,2173.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2174.fs_shift = 10,2175.fs_maskbit = 0x1f,2176.mono_reg = AFE_UL3_CON0,2177.mono_shift = 1,2178.int_odd_flag_reg = AFE_UL3_CON0,2179.int_odd_flag_shift = 0,2180.enable_reg = AFE_DAC_CON0,2181.enable_shift = 3,2182.hd_reg = AFE_UL3_CON0,2183.hd_shift = 5,2184.agent_disable_reg = AUDIO_TOP_CON5,2185.agent_disable_shift = 2,2186.ch_num_reg = -1,2187.ch_num_shift = 0,2188.ch_num_maskbit = 0,2189.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2190.msb_shift = 2,2191.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2192.msb_end_shift = 2,2193},2194[MT8188_AFE_MEMIF_UL4] = {2195.name = "UL4",2196.id = MT8188_AFE_MEMIF_UL4,2197.reg_ofs_base = AFE_UL4_BASE,2198.reg_ofs_cur = AFE_UL4_CUR,2199.reg_ofs_end = AFE_UL4_END,2200.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2201.fs_shift = 15,2202.fs_maskbit = 0x1f,2203.mono_reg = AFE_UL4_CON0,2204.mono_shift = 1,2205.int_odd_flag_reg = AFE_UL4_CON0,2206.int_odd_flag_shift = 0,2207.enable_reg = AFE_DAC_CON0,2208.enable_shift = 4,2209.hd_reg = AFE_UL4_CON0,2210.hd_shift = 5,2211.agent_disable_reg = AUDIO_TOP_CON5,2212.agent_disable_shift = 3,2213.ch_num_reg = -1,2214.ch_num_shift = 0,2215.ch_num_maskbit = 0,2216.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2217.msb_shift = 3,2218.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2219.msb_end_shift = 3,2220},2221[MT8188_AFE_MEMIF_UL5] = {2222.name = "UL5",2223.id = MT8188_AFE_MEMIF_UL5,2224.reg_ofs_base = AFE_UL5_BASE,2225.reg_ofs_cur = AFE_UL5_CUR,2226.reg_ofs_end = AFE_UL5_END,2227.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2228.fs_shift = 20,2229.fs_maskbit = 0x1f,2230.mono_reg = AFE_UL5_CON0,2231.mono_shift = 1,2232.int_odd_flag_reg = AFE_UL5_CON0,2233.int_odd_flag_shift = 0,2234.enable_reg = AFE_DAC_CON0,2235.enable_shift = 5,2236.hd_reg = AFE_UL5_CON0,2237.hd_shift = 5,2238.agent_disable_reg = AUDIO_TOP_CON5,2239.agent_disable_shift = 4,2240.ch_num_reg = -1,2241.ch_num_shift = 0,2242.ch_num_maskbit = 0,2243.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2244.msb_shift = 4,2245.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2246.msb_end_shift = 4,2247},2248[MT8188_AFE_MEMIF_UL6] = {2249.name = "UL6",2250.id = MT8188_AFE_MEMIF_UL6,2251.reg_ofs_base = AFE_UL6_BASE,2252.reg_ofs_cur = AFE_UL6_CUR,2253.reg_ofs_end = AFE_UL6_END,2254.fs_reg = -1,2255.fs_shift = 0,2256.fs_maskbit = 0,2257.mono_reg = AFE_UL6_CON0,2258.mono_shift = 1,2259.int_odd_flag_reg = AFE_UL6_CON0,2260.int_odd_flag_shift = 0,2261.enable_reg = AFE_DAC_CON0,2262.enable_shift = 6,2263.hd_reg = AFE_UL6_CON0,2264.hd_shift = 5,2265.agent_disable_reg = AUDIO_TOP_CON5,2266.agent_disable_shift = 5,2267.ch_num_reg = -1,2268.ch_num_shift = 0,2269.ch_num_maskbit = 0,2270.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2271.msb_shift = 5,2272.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2273.msb_end_shift = 5,2274},2275[MT8188_AFE_MEMIF_UL8] = {2276.name = "UL8",2277.id = MT8188_AFE_MEMIF_UL8,2278.reg_ofs_base = AFE_UL8_BASE,2279.reg_ofs_cur = AFE_UL8_CUR,2280.reg_ofs_end = AFE_UL8_END,2281.fs_reg = AFE_MEMIF_AGENT_FS_CON3,2282.fs_shift = 5,2283.fs_maskbit = 0x1f,2284.mono_reg = AFE_UL8_CON0,2285.mono_shift = 1,2286.int_odd_flag_reg = AFE_UL8_CON0,2287.int_odd_flag_shift = 0,2288.enable_reg = AFE_DAC_CON0,2289.enable_shift = 8,2290.hd_reg = AFE_UL8_CON0,2291.hd_shift = 5,2292.agent_disable_reg = AUDIO_TOP_CON5,2293.agent_disable_shift = 7,2294.ch_num_reg = -1,2295.ch_num_shift = 0,2296.ch_num_maskbit = 0,2297.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2298.msb_shift = 7,2299.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2300.msb_end_shift = 7,2301},2302[MT8188_AFE_MEMIF_UL9] = {2303.name = "UL9",2304.id = MT8188_AFE_MEMIF_UL9,2305.reg_ofs_base = AFE_UL9_BASE,2306.reg_ofs_cur = AFE_UL9_CUR,2307.reg_ofs_end = AFE_UL9_END,2308.fs_reg = AFE_MEMIF_AGENT_FS_CON3,2309.fs_shift = 10,2310.fs_maskbit = 0x1f,2311.mono_reg = AFE_UL9_CON0,2312.mono_shift = 1,2313.int_odd_flag_reg = AFE_UL9_CON0,2314.int_odd_flag_shift = 0,2315.enable_reg = AFE_DAC_CON0,2316.enable_shift = 9,2317.hd_reg = AFE_UL9_CON0,2318.hd_shift = 5,2319.agent_disable_reg = AUDIO_TOP_CON5,2320.agent_disable_shift = 8,2321.ch_num_reg = -1,2322.ch_num_shift = 0,2323.ch_num_maskbit = 0,2324.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2325.msb_shift = 8,2326.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2327.msb_end_shift = 8,2328},2329[MT8188_AFE_MEMIF_UL10] = {2330.name = "UL10",2331.id = MT8188_AFE_MEMIF_UL10,2332.reg_ofs_base = AFE_UL10_BASE,2333.reg_ofs_cur = AFE_UL10_CUR,2334.reg_ofs_end = AFE_UL10_END,2335.fs_reg = AFE_MEMIF_AGENT_FS_CON3,2336.fs_shift = 15,2337.fs_maskbit = 0x1f,2338.mono_reg = AFE_UL10_CON0,2339.mono_shift = 1,2340.int_odd_flag_reg = AFE_UL10_CON0,2341.int_odd_flag_shift = 0,2342.enable_reg = AFE_DAC_CON0,2343.enable_shift = 10,2344.hd_reg = AFE_UL10_CON0,2345.hd_shift = 5,2346.agent_disable_reg = AUDIO_TOP_CON5,2347.agent_disable_shift = 9,2348.ch_num_reg = -1,2349.ch_num_shift = 0,2350.ch_num_maskbit = 0,2351.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2352.msb_shift = 9,2353.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2354.msb_end_shift = 9,2355},2356};23572358static const struct mtk_base_irq_data irq_data[MT8188_AFE_IRQ_NUM] = {2359[MT8188_AFE_IRQ_1] = {2360.id = MT8188_AFE_IRQ_1,2361.irq_cnt_reg = -1,2362.irq_cnt_shift = 0,2363.irq_cnt_maskbit = 0,2364.irq_fs_reg = -1,2365.irq_fs_shift = 0,2366.irq_fs_maskbit = 0,2367.irq_en_reg = AFE_IRQ1_CON,2368.irq_en_shift = 31,2369.irq_clr_reg = AFE_IRQ_MCU_CLR,2370.irq_clr_shift = 0,2371.irq_status_shift = 16,2372},2373[MT8188_AFE_IRQ_2] = {2374.id = MT8188_AFE_IRQ_2,2375.irq_cnt_reg = -1,2376.irq_cnt_shift = 0,2377.irq_cnt_maskbit = 0,2378.irq_fs_reg = -1,2379.irq_fs_shift = 0,2380.irq_fs_maskbit = 0,2381.irq_en_reg = AFE_IRQ2_CON,2382.irq_en_shift = 31,2383.irq_clr_reg = AFE_IRQ_MCU_CLR,2384.irq_clr_shift = 1,2385.irq_status_shift = 17,2386},2387[MT8188_AFE_IRQ_3] = {2388.id = MT8188_AFE_IRQ_3,2389.irq_cnt_reg = AFE_IRQ3_CON,2390.irq_cnt_shift = 0,2391.irq_cnt_maskbit = 0xffffff,2392.irq_fs_reg = -1,2393.irq_fs_shift = 0,2394.irq_fs_maskbit = 0,2395.irq_en_reg = AFE_IRQ3_CON,2396.irq_en_shift = 31,2397.irq_clr_reg = AFE_IRQ_MCU_CLR,2398.irq_clr_shift = 2,2399.irq_status_shift = 18,2400},2401[MT8188_AFE_IRQ_8] = {2402.id = MT8188_AFE_IRQ_8,2403.irq_cnt_reg = -1,2404.irq_cnt_shift = 0,2405.irq_cnt_maskbit = 0,2406.irq_fs_reg = -1,2407.irq_fs_shift = 0,2408.irq_fs_maskbit = 0,2409.irq_en_reg = AFE_IRQ8_CON,2410.irq_en_shift = 31,2411.irq_clr_reg = AFE_IRQ_MCU_CLR,2412.irq_clr_shift = 7,2413.irq_status_shift = 23,2414},2415[MT8188_AFE_IRQ_9] = {2416.id = MT8188_AFE_IRQ_9,2417.irq_cnt_reg = AFE_IRQ9_CON,2418.irq_cnt_shift = 0,2419.irq_cnt_maskbit = 0xffffff,2420.irq_fs_reg = -1,2421.irq_fs_shift = 0,2422.irq_fs_maskbit = 0,2423.irq_en_reg = AFE_IRQ9_CON,2424.irq_en_shift = 31,2425.irq_clr_reg = AFE_IRQ_MCU_CLR,2426.irq_clr_shift = 8,2427.irq_status_shift = 24,2428},2429[MT8188_AFE_IRQ_10] = {2430.id = MT8188_AFE_IRQ_10,2431.irq_cnt_reg = -1,2432.irq_cnt_shift = 0,2433.irq_cnt_maskbit = 0,2434.irq_fs_reg = -1,2435.irq_fs_shift = 0,2436.irq_fs_maskbit = 0,2437.irq_en_reg = AFE_IRQ10_CON,2438.irq_en_shift = 31,2439.irq_clr_reg = AFE_IRQ_MCU_CLR,2440.irq_clr_shift = 9,2441.irq_status_shift = 25,2442},2443[MT8188_AFE_IRQ_13] = {2444.id = MT8188_AFE_IRQ_13,2445.irq_cnt_reg = ASYS_IRQ1_CON,2446.irq_cnt_shift = 0,2447.irq_cnt_maskbit = 0xffffff,2448.irq_fs_reg = ASYS_IRQ1_CON,2449.irq_fs_shift = 24,2450.irq_fs_maskbit = 0x1ffff,2451.irq_en_reg = ASYS_IRQ1_CON,2452.irq_en_shift = 31,2453.irq_clr_reg = ASYS_IRQ_CLR,2454.irq_clr_shift = 0,2455.irq_status_shift = 0,2456},2457[MT8188_AFE_IRQ_14] = {2458.id = MT8188_AFE_IRQ_14,2459.irq_cnt_reg = ASYS_IRQ2_CON,2460.irq_cnt_shift = 0,2461.irq_cnt_maskbit = 0xffffff,2462.irq_fs_reg = ASYS_IRQ2_CON,2463.irq_fs_shift = 24,2464.irq_fs_maskbit = 0x1ffff,2465.irq_en_reg = ASYS_IRQ2_CON,2466.irq_en_shift = 31,2467.irq_clr_reg = ASYS_IRQ_CLR,2468.irq_clr_shift = 1,2469.irq_status_shift = 1,2470},2471[MT8188_AFE_IRQ_15] = {2472.id = MT8188_AFE_IRQ_15,2473.irq_cnt_reg = ASYS_IRQ3_CON,2474.irq_cnt_shift = 0,2475.irq_cnt_maskbit = 0xffffff,2476.irq_fs_reg = ASYS_IRQ3_CON,2477.irq_fs_shift = 24,2478.irq_fs_maskbit = 0x1ffff,2479.irq_en_reg = ASYS_IRQ3_CON,2480.irq_en_shift = 31,2481.irq_clr_reg = ASYS_IRQ_CLR,2482.irq_clr_shift = 2,2483.irq_status_shift = 2,2484},2485[MT8188_AFE_IRQ_16] = {2486.id = MT8188_AFE_IRQ_16,2487.irq_cnt_reg = ASYS_IRQ4_CON,2488.irq_cnt_shift = 0,2489.irq_cnt_maskbit = 0xffffff,2490.irq_fs_reg = ASYS_IRQ4_CON,2491.irq_fs_shift = 24,2492.irq_fs_maskbit = 0x1ffff,2493.irq_en_reg = ASYS_IRQ4_CON,2494.irq_en_shift = 31,2495.irq_clr_reg = ASYS_IRQ_CLR,2496.irq_clr_shift = 3,2497.irq_status_shift = 3,2498},2499[MT8188_AFE_IRQ_17] = {2500.id = MT8188_AFE_IRQ_17,2501.irq_cnt_reg = ASYS_IRQ5_CON,2502.irq_cnt_shift = 0,2503.irq_cnt_maskbit = 0xffffff,2504.irq_fs_reg = ASYS_IRQ5_CON,2505.irq_fs_shift = 24,2506.irq_fs_maskbit = 0x1ffff,2507.irq_en_reg = ASYS_IRQ5_CON,2508.irq_en_shift = 31,2509.irq_clr_reg = ASYS_IRQ_CLR,2510.irq_clr_shift = 4,2511.irq_status_shift = 4,2512},2513[MT8188_AFE_IRQ_18] = {2514.id = MT8188_AFE_IRQ_18,2515.irq_cnt_reg = ASYS_IRQ6_CON,2516.irq_cnt_shift = 0,2517.irq_cnt_maskbit = 0xffffff,2518.irq_fs_reg = ASYS_IRQ6_CON,2519.irq_fs_shift = 24,2520.irq_fs_maskbit = 0x1ffff,2521.irq_en_reg = ASYS_IRQ6_CON,2522.irq_en_shift = 31,2523.irq_clr_reg = ASYS_IRQ_CLR,2524.irq_clr_shift = 5,2525.irq_status_shift = 5,2526},2527[MT8188_AFE_IRQ_19] = {2528.id = MT8188_AFE_IRQ_19,2529.irq_cnt_reg = ASYS_IRQ7_CON,2530.irq_cnt_shift = 0,2531.irq_cnt_maskbit = 0xffffff,2532.irq_fs_reg = ASYS_IRQ7_CON,2533.irq_fs_shift = 24,2534.irq_fs_maskbit = 0x1ffff,2535.irq_en_reg = ASYS_IRQ7_CON,2536.irq_en_shift = 31,2537.irq_clr_reg = ASYS_IRQ_CLR,2538.irq_clr_shift = 6,2539.irq_status_shift = 6,2540},2541[MT8188_AFE_IRQ_20] = {2542.id = MT8188_AFE_IRQ_20,2543.irq_cnt_reg = ASYS_IRQ8_CON,2544.irq_cnt_shift = 0,2545.irq_cnt_maskbit = 0xffffff,2546.irq_fs_reg = ASYS_IRQ8_CON,2547.irq_fs_shift = 24,2548.irq_fs_maskbit = 0x1ffff,2549.irq_en_reg = ASYS_IRQ8_CON,2550.irq_en_shift = 31,2551.irq_clr_reg = ASYS_IRQ_CLR,2552.irq_clr_shift = 7,2553.irq_status_shift = 7,2554},2555[MT8188_AFE_IRQ_21] = {2556.id = MT8188_AFE_IRQ_21,2557.irq_cnt_reg = ASYS_IRQ9_CON,2558.irq_cnt_shift = 0,2559.irq_cnt_maskbit = 0xffffff,2560.irq_fs_reg = ASYS_IRQ9_CON,2561.irq_fs_shift = 24,2562.irq_fs_maskbit = 0x1ffff,2563.irq_en_reg = ASYS_IRQ9_CON,2564.irq_en_shift = 31,2565.irq_clr_reg = ASYS_IRQ_CLR,2566.irq_clr_shift = 8,2567.irq_status_shift = 8,2568},2569[MT8188_AFE_IRQ_22] = {2570.id = MT8188_AFE_IRQ_22,2571.irq_cnt_reg = ASYS_IRQ10_CON,2572.irq_cnt_shift = 0,2573.irq_cnt_maskbit = 0xffffff,2574.irq_fs_reg = ASYS_IRQ10_CON,2575.irq_fs_shift = 24,2576.irq_fs_maskbit = 0x1ffff,2577.irq_en_reg = ASYS_IRQ10_CON,2578.irq_en_shift = 31,2579.irq_clr_reg = ASYS_IRQ_CLR,2580.irq_clr_shift = 9,2581.irq_status_shift = 9,2582},2583[MT8188_AFE_IRQ_23] = {2584.id = MT8188_AFE_IRQ_23,2585.irq_cnt_reg = ASYS_IRQ11_CON,2586.irq_cnt_shift = 0,2587.irq_cnt_maskbit = 0xffffff,2588.irq_fs_reg = ASYS_IRQ11_CON,2589.irq_fs_shift = 24,2590.irq_fs_maskbit = 0x1ffff,2591.irq_en_reg = ASYS_IRQ11_CON,2592.irq_en_shift = 31,2593.irq_clr_reg = ASYS_IRQ_CLR,2594.irq_clr_shift = 10,2595.irq_status_shift = 10,2596},2597[MT8188_AFE_IRQ_24] = {2598.id = MT8188_AFE_IRQ_24,2599.irq_cnt_reg = ASYS_IRQ12_CON,2600.irq_cnt_shift = 0,2601.irq_cnt_maskbit = 0xffffff,2602.irq_fs_reg = ASYS_IRQ12_CON,2603.irq_fs_shift = 24,2604.irq_fs_maskbit = 0x1ffff,2605.irq_en_reg = ASYS_IRQ12_CON,2606.irq_en_shift = 31,2607.irq_clr_reg = ASYS_IRQ_CLR,2608.irq_clr_shift = 11,2609.irq_status_shift = 11,2610},2611[MT8188_AFE_IRQ_25] = {2612.id = MT8188_AFE_IRQ_25,2613.irq_cnt_reg = ASYS_IRQ13_CON,2614.irq_cnt_shift = 0,2615.irq_cnt_maskbit = 0xffffff,2616.irq_fs_reg = ASYS_IRQ13_CON,2617.irq_fs_shift = 24,2618.irq_fs_maskbit = 0x1ffff,2619.irq_en_reg = ASYS_IRQ13_CON,2620.irq_en_shift = 31,2621.irq_clr_reg = ASYS_IRQ_CLR,2622.irq_clr_shift = 12,2623.irq_status_shift = 12,2624},2625[MT8188_AFE_IRQ_26] = {2626.id = MT8188_AFE_IRQ_26,2627.irq_cnt_reg = ASYS_IRQ14_CON,2628.irq_cnt_shift = 0,2629.irq_cnt_maskbit = 0xffffff,2630.irq_fs_reg = ASYS_IRQ14_CON,2631.irq_fs_shift = 24,2632.irq_fs_maskbit = 0x1ffff,2633.irq_en_reg = ASYS_IRQ14_CON,2634.irq_en_shift = 31,2635.irq_clr_reg = ASYS_IRQ_CLR,2636.irq_clr_shift = 13,2637.irq_status_shift = 13,2638},2639[MT8188_AFE_IRQ_27] = {2640.id = MT8188_AFE_IRQ_27,2641.irq_cnt_reg = ASYS_IRQ15_CON,2642.irq_cnt_shift = 0,2643.irq_cnt_maskbit = 0xffffff,2644.irq_fs_reg = ASYS_IRQ15_CON,2645.irq_fs_shift = 24,2646.irq_fs_maskbit = 0x1ffff,2647.irq_en_reg = ASYS_IRQ15_CON,2648.irq_en_shift = 31,2649.irq_clr_reg = ASYS_IRQ_CLR,2650.irq_clr_shift = 14,2651.irq_status_shift = 14,2652},2653[MT8188_AFE_IRQ_28] = {2654.id = MT8188_AFE_IRQ_28,2655.irq_cnt_reg = ASYS_IRQ16_CON,2656.irq_cnt_shift = 0,2657.irq_cnt_maskbit = 0xffffff,2658.irq_fs_reg = ASYS_IRQ16_CON,2659.irq_fs_shift = 24,2660.irq_fs_maskbit = 0x1ffff,2661.irq_en_reg = ASYS_IRQ16_CON,2662.irq_en_shift = 31,2663.irq_clr_reg = ASYS_IRQ_CLR,2664.irq_clr_shift = 15,2665.irq_status_shift = 15,2666},2667};26682669static const int mt8188_afe_memif_const_irqs[MT8188_AFE_MEMIF_NUM] = {2670[MT8188_AFE_MEMIF_DL2] = MT8188_AFE_IRQ_13,2671[MT8188_AFE_MEMIF_DL3] = MT8188_AFE_IRQ_14,2672[MT8188_AFE_MEMIF_DL6] = MT8188_AFE_IRQ_15,2673[MT8188_AFE_MEMIF_DL7] = MT8188_AFE_IRQ_1,2674[MT8188_AFE_MEMIF_DL8] = MT8188_AFE_IRQ_16,2675[MT8188_AFE_MEMIF_DL10] = MT8188_AFE_IRQ_17,2676[MT8188_AFE_MEMIF_DL11] = MT8188_AFE_IRQ_18,2677[MT8188_AFE_MEMIF_UL1] = MT8188_AFE_IRQ_3,2678[MT8188_AFE_MEMIF_UL2] = MT8188_AFE_IRQ_19,2679[MT8188_AFE_MEMIF_UL3] = MT8188_AFE_IRQ_20,2680[MT8188_AFE_MEMIF_UL4] = MT8188_AFE_IRQ_21,2681[MT8188_AFE_MEMIF_UL5] = MT8188_AFE_IRQ_22,2682[MT8188_AFE_MEMIF_UL6] = MT8188_AFE_IRQ_9,2683[MT8188_AFE_MEMIF_UL8] = MT8188_AFE_IRQ_23,2684[MT8188_AFE_MEMIF_UL9] = MT8188_AFE_IRQ_24,2685[MT8188_AFE_MEMIF_UL10] = MT8188_AFE_IRQ_25,2686};26872688static bool mt8188_is_volatile_reg(struct device *dev, unsigned int reg)2689{2690/* these auto-gen reg has read-only bit, so put it as volatile */2691/* volatile reg cannot be cached, so cannot be set when power off */2692switch (reg) {2693case AUDIO_TOP_CON0:2694case AUDIO_TOP_CON1:2695case AUDIO_TOP_CON3:2696case AUDIO_TOP_CON4:2697case AUDIO_TOP_CON5:2698case AUDIO_TOP_CON6:2699case ASYS_IRQ_CLR:2700case ASYS_IRQ_STATUS:2701case ASYS_IRQ_MON1:2702case ASYS_IRQ_MON2:2703case AFE_IRQ_MCU_CLR:2704case AFE_IRQ_STATUS:2705case AFE_IRQ3_CON_MON:2706case AFE_IRQ_MCU_MON2:2707case ADSP_IRQ_STATUS:2708case AUDIO_TOP_STA0:2709case AUDIO_TOP_STA1:2710case AFE_GAIN1_CUR:2711case AFE_GAIN2_CUR:2712case AFE_IEC_BURST_INFO:2713case AFE_IEC_CHL_STAT0:2714case AFE_IEC_CHL_STAT1:2715case AFE_IEC_CHR_STAT0:2716case AFE_IEC_CHR_STAT1:2717case AFE_SPDIFIN_CHSTS1:2718case AFE_SPDIFIN_CHSTS2:2719case AFE_SPDIFIN_CHSTS3:2720case AFE_SPDIFIN_CHSTS4:2721case AFE_SPDIFIN_CHSTS5:2722case AFE_SPDIFIN_CHSTS6:2723case AFE_SPDIFIN_DEBUG1:2724case AFE_SPDIFIN_DEBUG2:2725case AFE_SPDIFIN_DEBUG3:2726case AFE_SPDIFIN_DEBUG4:2727case AFE_SPDIFIN_EC:2728case AFE_SPDIFIN_CKLOCK_CFG:2729case AFE_SPDIFIN_BR_DBG1:2730case AFE_SPDIFIN_CKFBDIV:2731case AFE_SPDIFIN_INT_EXT:2732case AFE_SPDIFIN_INT_EXT2:2733case SPDIFIN_FREQ_STATUS:2734case SPDIFIN_USERCODE1:2735case SPDIFIN_USERCODE2:2736case SPDIFIN_USERCODE3:2737case SPDIFIN_USERCODE4:2738case SPDIFIN_USERCODE5:2739case SPDIFIN_USERCODE6:2740case SPDIFIN_USERCODE7:2741case SPDIFIN_USERCODE8:2742case SPDIFIN_USERCODE9:2743case SPDIFIN_USERCODE10:2744case SPDIFIN_USERCODE11:2745case SPDIFIN_USERCODE12:2746case AFE_LINEIN_APLL_TUNER_MON:2747case AFE_EARC_APLL_TUNER_MON:2748case AFE_CM0_MON:2749case AFE_CM1_MON:2750case AFE_CM2_MON:2751case AFE_MPHONE_MULTI_DET_MON0:2752case AFE_MPHONE_MULTI_DET_MON1:2753case AFE_MPHONE_MULTI_DET_MON2:2754case AFE_MPHONE_MULTI2_DET_MON0:2755case AFE_MPHONE_MULTI2_DET_MON1:2756case AFE_MPHONE_MULTI2_DET_MON2:2757case AFE_ADDA_MTKAIF_MON0:2758case AFE_ADDA_MTKAIF_MON1:2759case AFE_AUD_PAD_TOP:2760case AFE_ADDA6_MTKAIF_MON0:2761case AFE_ADDA6_MTKAIF_MON1:2762case AFE_ADDA6_SRC_DEBUG_MON0:2763case AFE_ADDA6_UL_SRC_MON0:2764case AFE_ADDA6_UL_SRC_MON1:2765case AFE_ASRC11_NEW_CON8:2766case AFE_ASRC11_NEW_CON9:2767case AFE_ASRC12_NEW_CON8:2768case AFE_ASRC12_NEW_CON9:2769case AFE_LRCK_CNT:2770case AFE_DAC_MON0:2771case AFE_DAC_CON0:2772case AFE_DL2_CUR:2773case AFE_DL3_CUR:2774case AFE_DL6_CUR:2775case AFE_DL7_CUR:2776case AFE_DL8_CUR:2777case AFE_DL10_CUR:2778case AFE_DL11_CUR:2779case AFE_UL1_CUR:2780case AFE_UL2_CUR:2781case AFE_UL3_CUR:2782case AFE_UL4_CUR:2783case AFE_UL5_CUR:2784case AFE_UL6_CUR:2785case AFE_UL8_CUR:2786case AFE_UL9_CUR:2787case AFE_UL10_CUR:2788case AFE_DL8_CHK_SUM1:2789case AFE_DL8_CHK_SUM2:2790case AFE_DL8_CHK_SUM3:2791case AFE_DL8_CHK_SUM4:2792case AFE_DL8_CHK_SUM5:2793case AFE_DL8_CHK_SUM6:2794case AFE_DL10_CHK_SUM1:2795case AFE_DL10_CHK_SUM2:2796case AFE_DL10_CHK_SUM3:2797case AFE_DL10_CHK_SUM4:2798case AFE_DL10_CHK_SUM5:2799case AFE_DL10_CHK_SUM6:2800case AFE_DL11_CHK_SUM1:2801case AFE_DL11_CHK_SUM2:2802case AFE_DL11_CHK_SUM3:2803case AFE_DL11_CHK_SUM4:2804case AFE_DL11_CHK_SUM5:2805case AFE_DL11_CHK_SUM6:2806case AFE_UL1_CHK_SUM1:2807case AFE_UL1_CHK_SUM2:2808case AFE_UL2_CHK_SUM1:2809case AFE_UL2_CHK_SUM2:2810case AFE_UL3_CHK_SUM1:2811case AFE_UL3_CHK_SUM2:2812case AFE_UL4_CHK_SUM1:2813case AFE_UL4_CHK_SUM2:2814case AFE_UL5_CHK_SUM1:2815case AFE_UL5_CHK_SUM2:2816case AFE_UL6_CHK_SUM1:2817case AFE_UL6_CHK_SUM2:2818case AFE_UL8_CHK_SUM1:2819case AFE_UL8_CHK_SUM2:2820case AFE_DL2_CHK_SUM1:2821case AFE_DL2_CHK_SUM2:2822case AFE_DL3_CHK_SUM1:2823case AFE_DL3_CHK_SUM2:2824case AFE_DL6_CHK_SUM1:2825case AFE_DL6_CHK_SUM2:2826case AFE_DL7_CHK_SUM1:2827case AFE_DL7_CHK_SUM2:2828case AFE_UL9_CHK_SUM1:2829case AFE_UL9_CHK_SUM2:2830case AFE_BUS_MON1:2831case UL1_MOD2AGT_CNT_LAT:2832case UL2_MOD2AGT_CNT_LAT:2833case UL3_MOD2AGT_CNT_LAT:2834case UL4_MOD2AGT_CNT_LAT:2835case UL5_MOD2AGT_CNT_LAT:2836case UL6_MOD2AGT_CNT_LAT:2837case UL8_MOD2AGT_CNT_LAT:2838case UL9_MOD2AGT_CNT_LAT:2839case UL10_MOD2AGT_CNT_LAT:2840case AFE_MEMIF_BUF_FULL_MON:2841case AFE_MEMIF_BUF_MON1:2842case AFE_MEMIF_BUF_MON3:2843case AFE_MEMIF_BUF_MON4:2844case AFE_MEMIF_BUF_MON5:2845case AFE_MEMIF_BUF_MON6:2846case AFE_MEMIF_BUF_MON7:2847case AFE_MEMIF_BUF_MON8:2848case AFE_MEMIF_BUF_MON9:2849case AFE_MEMIF_BUF_MON10:2850case DL2_AGENT2MODULE_CNT:2851case DL3_AGENT2MODULE_CNT:2852case DL6_AGENT2MODULE_CNT:2853case DL7_AGENT2MODULE_CNT:2854case DL8_AGENT2MODULE_CNT:2855case DL10_AGENT2MODULE_CNT:2856case DL11_AGENT2MODULE_CNT:2857case UL1_MODULE2AGENT_CNT:2858case UL2_MODULE2AGENT_CNT:2859case UL3_MODULE2AGENT_CNT:2860case UL4_MODULE2AGENT_CNT:2861case UL5_MODULE2AGENT_CNT:2862case UL6_MODULE2AGENT_CNT:2863case UL8_MODULE2AGENT_CNT:2864case UL9_MODULE2AGENT_CNT:2865case UL10_MODULE2AGENT_CNT:2866case AFE_DMIC0_SRC_DEBUG_MON0:2867case AFE_DMIC0_UL_SRC_MON0:2868case AFE_DMIC0_UL_SRC_MON1:2869case AFE_DMIC1_SRC_DEBUG_MON0:2870case AFE_DMIC1_UL_SRC_MON0:2871case AFE_DMIC1_UL_SRC_MON1:2872case AFE_DMIC2_SRC_DEBUG_MON0:2873case AFE_DMIC2_UL_SRC_MON0:2874case AFE_DMIC2_UL_SRC_MON1:2875case AFE_DMIC3_SRC_DEBUG_MON0:2876case AFE_DMIC3_UL_SRC_MON0:2877case AFE_DMIC3_UL_SRC_MON1:2878case ETDM_IN1_MONITOR:2879case ETDM_IN2_MONITOR:2880case ETDM_OUT1_MONITOR:2881case ETDM_OUT2_MONITOR:2882case ETDM_OUT3_MONITOR:2883case AFE_ADDA_SRC_DEBUG_MON0:2884case AFE_ADDA_SRC_DEBUG_MON1:2885case AFE_ADDA_DL_SDM_FIFO_MON:2886case AFE_ADDA_DL_SRC_LCH_MON:2887case AFE_ADDA_DL_SRC_RCH_MON:2888case AFE_ADDA_DL_SDM_OUT_MON:2889case AFE_GASRC0_NEW_CON8:2890case AFE_GASRC0_NEW_CON9:2891case AFE_GASRC0_NEW_CON12:2892case AFE_GASRC1_NEW_CON8:2893case AFE_GASRC1_NEW_CON9:2894case AFE_GASRC1_NEW_CON12:2895case AFE_GASRC2_NEW_CON8:2896case AFE_GASRC2_NEW_CON9:2897case AFE_GASRC2_NEW_CON12:2898case AFE_GASRC3_NEW_CON8:2899case AFE_GASRC3_NEW_CON9:2900case AFE_GASRC3_NEW_CON12:2901case AFE_GASRC4_NEW_CON8:2902case AFE_GASRC4_NEW_CON9:2903case AFE_GASRC4_NEW_CON12:2904case AFE_GASRC5_NEW_CON8:2905case AFE_GASRC5_NEW_CON9:2906case AFE_GASRC5_NEW_CON12:2907case AFE_GASRC6_NEW_CON8:2908case AFE_GASRC6_NEW_CON9:2909case AFE_GASRC6_NEW_CON12:2910case AFE_GASRC7_NEW_CON8:2911case AFE_GASRC7_NEW_CON9:2912case AFE_GASRC7_NEW_CON12:2913case AFE_GASRC8_NEW_CON8:2914case AFE_GASRC8_NEW_CON9:2915case AFE_GASRC8_NEW_CON12:2916case AFE_GASRC9_NEW_CON8:2917case AFE_GASRC9_NEW_CON9:2918case AFE_GASRC9_NEW_CON12:2919case AFE_GASRC10_NEW_CON8:2920case AFE_GASRC10_NEW_CON9:2921case AFE_GASRC10_NEW_CON12:2922case AFE_GASRC11_NEW_CON8:2923case AFE_GASRC11_NEW_CON9:2924case AFE_GASRC11_NEW_CON12:2925return true;2926default:2927return false;2928};2929}29302931static const struct regmap_config mt8188_afe_regmap_config = {2932.reg_bits = 32,2933.reg_stride = 4,2934.val_bits = 32,2935.volatile_reg = mt8188_is_volatile_reg,2936.max_register = AFE_MAX_REGISTER,2937.num_reg_defaults_raw = ((AFE_MAX_REGISTER / 4) + 1),2938.cache_type = REGCACHE_FLAT,2939};29402941#define AFE_IRQ_CLR_BITS (0x387)2942#define ASYS_IRQ_CLR_BITS (0xffff)29432944static irqreturn_t mt8188_afe_irq_handler(int irq_id, void *dev_id)2945{2946struct mtk_base_afe *afe = dev_id;2947unsigned int val = 0;2948unsigned int asys_irq_clr_bits = 0;2949unsigned int afe_irq_clr_bits = 0;2950unsigned int irq_status_bits = 0;2951unsigned int irq_clr_bits = 0;2952unsigned int mcu_irq_mask = 0;2953int i = 0;2954int ret = 0;29552956ret = regmap_read(afe->regmap, AFE_IRQ_STATUS, &val);2957if (ret) {2958dev_err(afe->dev, "%s irq status err\n", __func__);2959afe_irq_clr_bits = AFE_IRQ_CLR_BITS;2960asys_irq_clr_bits = ASYS_IRQ_CLR_BITS;2961goto err_irq;2962}29632964ret = regmap_read(afe->regmap, AFE_IRQ_MASK, &mcu_irq_mask);2965if (ret) {2966dev_err(afe->dev, "%s read irq mask err\n", __func__);2967afe_irq_clr_bits = AFE_IRQ_CLR_BITS;2968asys_irq_clr_bits = ASYS_IRQ_CLR_BITS;2969goto err_irq;2970}29712972/* only clr cpu irq */2973val &= mcu_irq_mask;29742975for (i = 0; i < MT8188_AFE_MEMIF_NUM; i++) {2976struct mtk_base_afe_memif *memif = &afe->memif[i];2977struct mtk_base_irq_data const *irq_data;29782979if (memif->irq_usage < 0)2980continue;29812982irq_data = afe->irqs[memif->irq_usage].irq_data;29832984irq_status_bits = BIT(irq_data->irq_status_shift);2985irq_clr_bits = BIT(irq_data->irq_clr_shift);29862987if (!(val & irq_status_bits))2988continue;29892990if (irq_data->irq_clr_reg == ASYS_IRQ_CLR)2991asys_irq_clr_bits |= irq_clr_bits;2992else2993afe_irq_clr_bits |= irq_clr_bits;29942995snd_pcm_period_elapsed(memif->substream);2996}29972998err_irq:2999/* clear irq */3000if (asys_irq_clr_bits)3001regmap_write(afe->regmap, ASYS_IRQ_CLR, asys_irq_clr_bits);3002if (afe_irq_clr_bits)3003regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, afe_irq_clr_bits);30043005return IRQ_HANDLED;3006}30073008static int mt8188_afe_runtime_suspend(struct device *dev)3009{3010struct mtk_base_afe *afe = dev_get_drvdata(dev);3011struct mt8188_afe_private *afe_priv = afe->platform_priv;30123013if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)3014goto skip_regmap;30153016mt8188_afe_disable_main_clock(afe);30173018regcache_cache_only(afe->regmap, true);3019regcache_mark_dirty(afe->regmap);30203021skip_regmap:3022mt8188_afe_disable_reg_rw_clk(afe);30233024return 0;3025}30263027static int mt8188_afe_runtime_resume(struct device *dev)3028{3029struct mtk_base_afe *afe = dev_get_drvdata(dev);3030struct mt8188_afe_private *afe_priv = afe->platform_priv;3031struct arm_smccc_res res;30323033arm_smccc_smc(MTK_SIP_AUDIO_CONTROL,3034MTK_AUDIO_SMC_OP_DOMAIN_SIDEBANDS,30350, 0, 0, 0, 0, 0, &res);30363037mt8188_afe_enable_reg_rw_clk(afe);30383039if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)3040goto skip_regmap;30413042regcache_cache_only(afe->regmap, false);3043regcache_sync(afe->regmap);30443045mt8188_afe_enable_main_clock(afe);3046skip_regmap:3047return 0;3048}30493050static int init_memif_priv_data(struct mtk_base_afe *afe)3051{3052struct mt8188_afe_private *afe_priv = afe->platform_priv;3053struct mtk_dai_memif_priv *memif_priv;3054int i;30553056for (i = MT8188_AFE_MEMIF_START; i < MT8188_AFE_MEMIF_END; i++) {3057memif_priv = devm_kzalloc(afe->dev,3058sizeof(struct mtk_dai_memif_priv),3059GFP_KERNEL);3060if (!memif_priv)3061return -ENOMEM;30623063afe_priv->dai_priv[i] = memif_priv;3064}30653066return 0;3067}30683069static int mt8188_dai_memif_register(struct mtk_base_afe *afe)3070{3071struct mtk_base_afe_dai *dai;30723073dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);3074if (!dai)3075return -ENOMEM;30763077list_add(&dai->list, &afe->sub_dais);30783079dai->dai_drivers = mt8188_memif_dai_driver;3080dai->num_dai_drivers = ARRAY_SIZE(mt8188_memif_dai_driver);30813082dai->dapm_widgets = mt8188_memif_widgets;3083dai->num_dapm_widgets = ARRAY_SIZE(mt8188_memif_widgets);3084dai->dapm_routes = mt8188_memif_routes;3085dai->num_dapm_routes = ARRAY_SIZE(mt8188_memif_routes);3086dai->controls = mt8188_memif_controls;3087dai->num_controls = ARRAY_SIZE(mt8188_memif_controls);30883089return init_memif_priv_data(afe);3090}30913092typedef int (*dai_register_cb)(struct mtk_base_afe *);3093static const dai_register_cb dai_register_cbs[] = {3094mt8188_dai_adda_register,3095mt8188_dai_dmic_register,3096mt8188_dai_etdm_register,3097mt8188_dai_pcm_register,3098mt8188_dai_memif_register,3099};31003101static const struct reg_sequence mt8188_afe_reg_defaults[] = {3102{ AFE_IRQ_MASK, 0x387ffff },3103{ AFE_IRQ3_CON, BIT(30) },3104{ AFE_IRQ9_CON, BIT(30) },3105{ ETDM_IN1_CON4, 0x12000100 },3106{ ETDM_IN2_CON4, 0x12000100 },3107};31083109static const struct reg_sequence mt8188_cg_patch[] = {3110{ AUDIO_TOP_CON0, 0xfffffffb },3111{ AUDIO_TOP_CON1, 0xfffffff8 },3112};31133114static int mt8188_afe_init_registers(struct mtk_base_afe *afe)3115{3116return regmap_multi_reg_write(afe->regmap,3117mt8188_afe_reg_defaults,3118ARRAY_SIZE(mt8188_afe_reg_defaults));3119}31203121static int mt8188_afe_parse_of(struct mtk_base_afe *afe,3122struct device_node *np)3123{3124#if IS_ENABLED(CONFIG_SND_SOC_MT6359)3125struct mt8188_afe_private *afe_priv = afe->platform_priv;31263127afe_priv->topckgen = syscon_regmap_lookup_by_phandle(afe->dev->of_node,3128"mediatek,topckgen");3129if (IS_ERR(afe_priv->topckgen))3130return dev_err_probe(afe->dev, PTR_ERR(afe_priv->topckgen),3131"%s() Cannot find topckgen controller\n",3132__func__);3133#endif3134return 0;3135}31363137#define MT8188_DELAY_US 103138#define MT8188_TIMEOUT_US USEC_PER_SEC31393140static int bus_protect_enable(struct regmap *regmap)3141{3142int ret;3143u32 val;3144u32 mask;31453146val = 0;3147mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1;3148regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_SET, mask);31493150ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3151val, (val & mask) == mask,3152MT8188_DELAY_US, MT8188_TIMEOUT_US);3153if (ret)3154return ret;31553156val = 0;3157mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2;3158regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_SET, mask);31593160ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3161val, (val & mask) == mask,3162MT8188_DELAY_US, MT8188_TIMEOUT_US);3163return ret;3164}31653166static int bus_protect_disable(struct regmap *regmap)3167{3168int ret;3169u32 val;3170u32 mask;31713172val = 0;3173mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2;3174regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_CLR, mask);31753176ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3177val, !(val & mask),3178MT8188_DELAY_US, MT8188_TIMEOUT_US);3179if (ret)3180return ret;31813182val = 0;3183mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1;3184regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_CLR, mask);31853186ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3187val, !(val & mask),3188MT8188_DELAY_US, MT8188_TIMEOUT_US);3189return ret;3190}31913192static int mt8188_afe_pcm_dev_probe(struct platform_device *pdev)3193{3194struct mtk_base_afe *afe;3195struct mt8188_afe_private *afe_priv;3196struct device *dev = &pdev->dev;3197struct reset_control *rstc;3198struct regmap *infra_ao;3199int i, irq_id, ret;32003201ret = of_reserved_mem_device_init(dev);3202if (ret)3203dev_dbg(dev, "failed to assign memory region: %d\n", ret);32043205ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(33));3206if (ret)3207return ret;32083209afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);3210if (!afe)3211return -ENOMEM;32123213afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),3214GFP_KERNEL);3215if (!afe->platform_priv)3216return -ENOMEM;32173218afe_priv = afe->platform_priv;3219afe->dev = &pdev->dev;32203221afe->base_addr = devm_platform_ioremap_resource(pdev, 0);3222if (IS_ERR(afe->base_addr))3223return dev_err_probe(dev, PTR_ERR(afe->base_addr),3224"AFE base_addr not found\n");32253226infra_ao = syscon_regmap_lookup_by_phandle(dev->of_node,3227"mediatek,infracfg");3228if (IS_ERR(infra_ao))3229return dev_err_probe(dev, PTR_ERR(infra_ao),3230"%s() Cannot find infra_ao controller\n",3231__func__);32323233/* reset controller to reset audio regs before regmap cache */3234rstc = devm_reset_control_get_exclusive(dev, "audiosys");3235if (IS_ERR(rstc))3236return dev_err_probe(dev, PTR_ERR(rstc),3237"could not get audiosys reset\n");32383239ret = bus_protect_enable(infra_ao);3240if (ret) {3241dev_err(dev, "bus_protect_enable failed\n");3242return ret;3243}32443245ret = reset_control_reset(rstc);3246if (ret) {3247dev_err(dev, "failed to trigger audio reset:%d\n", ret);3248return ret;3249}32503251ret = bus_protect_disable(infra_ao);3252if (ret) {3253dev_err(dev, "bus_protect_disable failed\n");3254return ret;3255}32563257/* initial audio related clock */3258ret = mt8188_afe_init_clock(afe);3259if (ret)3260return dev_err_probe(dev, ret, "init clock error");32613262spin_lock_init(&afe_priv->afe_ctrl_lock);32633264mutex_init(&afe->irq_alloc_lock);32653266/* irq initialize */3267afe->irqs_size = MT8188_AFE_IRQ_NUM;3268afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),3269GFP_KERNEL);3270if (!afe->irqs)3271return -ENOMEM;32723273for (i = 0; i < afe->irqs_size; i++)3274afe->irqs[i].irq_data = &irq_data[i];32753276/* init memif */3277afe->memif_size = MT8188_AFE_MEMIF_NUM;3278afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),3279GFP_KERNEL);3280if (!afe->memif)3281return -ENOMEM;32823283for (i = 0; i < afe->memif_size; i++) {3284afe->memif[i].data = &memif_data[i];3285afe->memif[i].irq_usage = mt8188_afe_memif_const_irqs[i];3286afe->memif[i].const_irq = 1;3287afe->irqs[afe->memif[i].irq_usage].irq_occupyed = true;3288}32893290/* request irq */3291irq_id = platform_get_irq(pdev, 0);3292if (irq_id < 0)3293return dev_err_probe(dev, irq_id, "no irq found");32943295ret = devm_request_irq(dev, irq_id, mt8188_afe_irq_handler,3296IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);3297if (ret)3298return dev_err_probe(dev, ret, "could not request_irq for asys-isr\n");32993300/* init sub_dais */3301INIT_LIST_HEAD(&afe->sub_dais);33023303for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {3304ret = dai_register_cbs[i](afe);3305if (ret)3306return dev_err_probe(dev, ret, "dai register i %d fail\n", i);3307}33083309/* init dai_driver and component_driver */3310ret = mtk_afe_combine_sub_dai(afe);3311if (ret)3312return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");33133314afe->mtk_afe_hardware = &mt8188_afe_hardware;3315afe->memif_fs = mt8188_memif_fs;3316afe->irq_fs = mt8188_irq_fs;33173318afe->runtime_resume = mt8188_afe_runtime_resume;3319afe->runtime_suspend = mt8188_afe_runtime_suspend;33203321platform_set_drvdata(pdev, afe);33223323ret = mt8188_afe_parse_of(afe, pdev->dev.of_node);3324if (ret)3325return ret;33263327ret = devm_pm_runtime_enable(dev);3328if (ret)3329return ret;33303331/* enable clock for regcache get default value from hw */3332afe_priv->pm_runtime_bypass_reg_ctl = true;3333ret = pm_runtime_resume_and_get(dev);3334if (ret)3335return dev_err_probe(dev, ret, "failed to resume device\n");33363337afe->regmap = devm_regmap_init_mmio(&pdev->dev, afe->base_addr,3338&mt8188_afe_regmap_config);3339if (IS_ERR(afe->regmap)) {3340ret = PTR_ERR(afe->regmap);3341goto err_pm_put;3342}33433344ret = regmap_register_patch(afe->regmap, mt8188_cg_patch,3345ARRAY_SIZE(mt8188_cg_patch));3346if (ret < 0) {3347dev_info(dev, "Failed to apply cg patch\n");3348goto err_pm_put;3349}33503351/* register component */3352ret = devm_snd_soc_register_component(dev, &mtk_afe_pcm_platform,3353afe->dai_drivers, afe->num_dai_drivers);3354if (ret) {3355dev_warn(dev, "err_platform\n");3356goto err_pm_put;3357}33583359mt8188_afe_init_registers(afe);33603361pm_runtime_put_sync(&pdev->dev);3362afe_priv->pm_runtime_bypass_reg_ctl = false;33633364regcache_cache_only(afe->regmap, true);3365regcache_mark_dirty(afe->regmap);33663367return 0;3368err_pm_put:3369pm_runtime_put_sync(dev);33703371return ret;3372}33733374static const struct of_device_id mt8188_afe_pcm_dt_match[] = {3375{ .compatible = "mediatek,mt8188-afe", },3376{},3377};3378MODULE_DEVICE_TABLE(of, mt8188_afe_pcm_dt_match);33793380static const struct dev_pm_ops mt8188_afe_pm_ops = {3381RUNTIME_PM_OPS(mt8188_afe_runtime_suspend,3382mt8188_afe_runtime_resume, NULL)3383};33843385static struct platform_driver mt8188_afe_pcm_driver = {3386.driver = {3387.name = "mt8188-audio",3388.of_match_table = mt8188_afe_pcm_dt_match,3389.pm = pm_ptr(&mt8188_afe_pm_ops),3390},3391.probe = mt8188_afe_pcm_dev_probe,3392};33933394module_platform_driver(mt8188_afe_pcm_driver);33953396MODULE_DESCRIPTION("MediaTek SoC AFE platform driver for ALSA 8188");3397MODULE_AUTHOR("Chun-Chia.Chiu <[email protected]>");3398MODULE_LICENSE("GPL");339934003401