Path: blob/master/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
26488 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 =1626snd_soc_kcontrol_component(kcontrol);1627struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1628struct mt8188_afe_private *afe_priv = afe->platform_priv;1629struct mtk_dai_memif_priv *memif_priv;1630unsigned int dai_id = kcontrol->id.device;1631long val = ucontrol->value.integer.value[0];1632int ret = 0;16331634memif_priv = afe_priv->dai_priv[dai_id];16351636if (val == memif_priv->asys_timing_sel)1637return 0;16381639ret = snd_soc_put_enum_double(kcontrol, ucontrol);16401641memif_priv->asys_timing_sel = val;16421643return ret;1644}16451646static int mt8188_asys_irq_1x_en_sel_put(struct snd_kcontrol *kcontrol,1647struct snd_ctl_elem_value *ucontrol)1648{1649struct snd_soc_component *component =1650snd_soc_kcontrol_component(kcontrol);1651struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1652struct mt8188_afe_private *afe_priv = afe->platform_priv;1653unsigned int id = kcontrol->id.device;1654long val = ucontrol->value.integer.value[0];1655int ret = 0;16561657if (val == afe_priv->irq_priv[id].asys_timing_sel)1658return 0;16591660ret = snd_soc_put_enum_double(kcontrol, ucontrol);16611662afe_priv->irq_priv[id].asys_timing_sel = val;16631664return ret;1665}16661667static int mt8188_memif_fs_timing_sel_get(struct snd_kcontrol *kcontrol,1668struct snd_ctl_elem_value *ucontrol)1669{1670struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);1671struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1672struct mt8188_afe_private *afe_priv = afe->platform_priv;1673struct mtk_dai_memif_priv *memif_priv;1674unsigned int dai_id = kcontrol->id.device;1675struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;16761677memif_priv = afe_priv->dai_priv[dai_id];16781679ucontrol->value.enumerated.item[0] =1680snd_soc_enum_val_to_item(e, memif_priv->fs_timing);16811682return 0;1683}16841685static int mt8188_memif_fs_timing_sel_put(struct snd_kcontrol *kcontrol,1686struct snd_ctl_elem_value *ucontrol)1687{1688struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);1689struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1690struct mt8188_afe_private *afe_priv = afe->platform_priv;1691struct mtk_dai_memif_priv *memif_priv;1692unsigned int dai_id = kcontrol->id.device;1693struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;1694unsigned int *item = ucontrol->value.enumerated.item;1695unsigned int prev_item = 0;16961697if (item[0] >= e->items)1698return -EINVAL;16991700memif_priv = afe_priv->dai_priv[dai_id];17011702prev_item = snd_soc_enum_val_to_item(e, memif_priv->fs_timing);17031704if (item[0] == prev_item)1705return 0;17061707memif_priv->fs_timing = snd_soc_enum_item_to_val(e, item[0]);17081709return 1;1710}17111712static const struct snd_kcontrol_new mt8188_memif_controls[] = {1713MT8188_SOC_ENUM_EXT("dl2_1x_en_sel",1714dl2_1x_en_sel_enum,1715snd_soc_get_enum_double,1716mt8188_memif_1x_en_sel_put,1717MT8188_AFE_MEMIF_DL2),1718MT8188_SOC_ENUM_EXT("dl3_1x_en_sel",1719dl3_1x_en_sel_enum,1720snd_soc_get_enum_double,1721mt8188_memif_1x_en_sel_put,1722MT8188_AFE_MEMIF_DL3),1723MT8188_SOC_ENUM_EXT("dl6_1x_en_sel",1724dl6_1x_en_sel_enum,1725snd_soc_get_enum_double,1726mt8188_memif_1x_en_sel_put,1727MT8188_AFE_MEMIF_DL6),1728MT8188_SOC_ENUM_EXT("dl7_1x_en_sel",1729dl7_1x_en_sel_enum,1730snd_soc_get_enum_double,1731mt8188_memif_1x_en_sel_put,1732MT8188_AFE_MEMIF_DL7),1733MT8188_SOC_ENUM_EXT("dl8_1x_en_sel",1734dl8_1x_en_sel_enum,1735snd_soc_get_enum_double,1736mt8188_memif_1x_en_sel_put,1737MT8188_AFE_MEMIF_DL8),1738MT8188_SOC_ENUM_EXT("dl10_1x_en_sel",1739dl10_1x_en_sel_enum,1740snd_soc_get_enum_double,1741mt8188_memif_1x_en_sel_put,1742MT8188_AFE_MEMIF_DL10),1743MT8188_SOC_ENUM_EXT("dl11_1x_en_sel",1744dl11_1x_en_sel_enum,1745snd_soc_get_enum_double,1746mt8188_memif_1x_en_sel_put,1747MT8188_AFE_MEMIF_DL11),1748MT8188_SOC_ENUM_EXT("ul1_1x_en_sel",1749ul1_1x_en_sel_enum,1750snd_soc_get_enum_double,1751mt8188_memif_1x_en_sel_put,1752MT8188_AFE_MEMIF_UL1),1753MT8188_SOC_ENUM_EXT("ul2_1x_en_sel",1754ul2_1x_en_sel_enum,1755snd_soc_get_enum_double,1756mt8188_memif_1x_en_sel_put,1757MT8188_AFE_MEMIF_UL2),1758MT8188_SOC_ENUM_EXT("ul3_1x_en_sel",1759ul3_1x_en_sel_enum,1760snd_soc_get_enum_double,1761mt8188_memif_1x_en_sel_put,1762MT8188_AFE_MEMIF_UL3),1763MT8188_SOC_ENUM_EXT("ul4_1x_en_sel",1764ul4_1x_en_sel_enum,1765snd_soc_get_enum_double,1766mt8188_memif_1x_en_sel_put,1767MT8188_AFE_MEMIF_UL4),1768MT8188_SOC_ENUM_EXT("ul5_1x_en_sel",1769ul5_1x_en_sel_enum,1770snd_soc_get_enum_double,1771mt8188_memif_1x_en_sel_put,1772MT8188_AFE_MEMIF_UL5),1773MT8188_SOC_ENUM_EXT("ul6_1x_en_sel",1774ul6_1x_en_sel_enum,1775snd_soc_get_enum_double,1776mt8188_memif_1x_en_sel_put,1777MT8188_AFE_MEMIF_UL6),1778MT8188_SOC_ENUM_EXT("ul8_1x_en_sel",1779ul8_1x_en_sel_enum,1780snd_soc_get_enum_double,1781mt8188_memif_1x_en_sel_put,1782MT8188_AFE_MEMIF_UL8),1783MT8188_SOC_ENUM_EXT("ul9_1x_en_sel",1784ul9_1x_en_sel_enum,1785snd_soc_get_enum_double,1786mt8188_memif_1x_en_sel_put,1787MT8188_AFE_MEMIF_UL9),1788MT8188_SOC_ENUM_EXT("ul10_1x_en_sel",1789ul10_1x_en_sel_enum,1790snd_soc_get_enum_double,1791mt8188_memif_1x_en_sel_put,1792MT8188_AFE_MEMIF_UL10),1793MT8188_SOC_ENUM_EXT("asys_irq1_1x_en_sel",1794asys_irq1_1x_en_sel_enum,1795snd_soc_get_enum_double,1796mt8188_asys_irq_1x_en_sel_put,1797MT8188_AFE_IRQ_13),1798MT8188_SOC_ENUM_EXT("asys_irq2_1x_en_sel",1799asys_irq2_1x_en_sel_enum,1800snd_soc_get_enum_double,1801mt8188_asys_irq_1x_en_sel_put,1802MT8188_AFE_IRQ_14),1803MT8188_SOC_ENUM_EXT("asys_irq3_1x_en_sel",1804asys_irq3_1x_en_sel_enum,1805snd_soc_get_enum_double,1806mt8188_asys_irq_1x_en_sel_put,1807MT8188_AFE_IRQ_15),1808MT8188_SOC_ENUM_EXT("asys_irq4_1x_en_sel",1809asys_irq4_1x_en_sel_enum,1810snd_soc_get_enum_double,1811mt8188_asys_irq_1x_en_sel_put,1812MT8188_AFE_IRQ_16),1813MT8188_SOC_ENUM_EXT("asys_irq5_1x_en_sel",1814asys_irq5_1x_en_sel_enum,1815snd_soc_get_enum_double,1816mt8188_asys_irq_1x_en_sel_put,1817MT8188_AFE_IRQ_17),1818MT8188_SOC_ENUM_EXT("asys_irq6_1x_en_sel",1819asys_irq6_1x_en_sel_enum,1820snd_soc_get_enum_double,1821mt8188_asys_irq_1x_en_sel_put,1822MT8188_AFE_IRQ_18),1823MT8188_SOC_ENUM_EXT("asys_irq7_1x_en_sel",1824asys_irq7_1x_en_sel_enum,1825snd_soc_get_enum_double,1826mt8188_asys_irq_1x_en_sel_put,1827MT8188_AFE_IRQ_19),1828MT8188_SOC_ENUM_EXT("asys_irq8_1x_en_sel",1829asys_irq8_1x_en_sel_enum,1830snd_soc_get_enum_double,1831mt8188_asys_irq_1x_en_sel_put,1832MT8188_AFE_IRQ_20),1833MT8188_SOC_ENUM_EXT("asys_irq9_1x_en_sel",1834asys_irq9_1x_en_sel_enum,1835snd_soc_get_enum_double,1836mt8188_asys_irq_1x_en_sel_put,1837MT8188_AFE_IRQ_21),1838MT8188_SOC_ENUM_EXT("asys_irq10_1x_en_sel",1839asys_irq10_1x_en_sel_enum,1840snd_soc_get_enum_double,1841mt8188_asys_irq_1x_en_sel_put,1842MT8188_AFE_IRQ_22),1843MT8188_SOC_ENUM_EXT("asys_irq11_1x_en_sel",1844asys_irq11_1x_en_sel_enum,1845snd_soc_get_enum_double,1846mt8188_asys_irq_1x_en_sel_put,1847MT8188_AFE_IRQ_23),1848MT8188_SOC_ENUM_EXT("asys_irq12_1x_en_sel",1849asys_irq12_1x_en_sel_enum,1850snd_soc_get_enum_double,1851mt8188_asys_irq_1x_en_sel_put,1852MT8188_AFE_IRQ_24),1853MT8188_SOC_ENUM_EXT("asys_irq13_1x_en_sel",1854asys_irq13_1x_en_sel_enum,1855snd_soc_get_enum_double,1856mt8188_asys_irq_1x_en_sel_put,1857MT8188_AFE_IRQ_25),1858MT8188_SOC_ENUM_EXT("asys_irq14_1x_en_sel",1859asys_irq14_1x_en_sel_enum,1860snd_soc_get_enum_double,1861mt8188_asys_irq_1x_en_sel_put,1862MT8188_AFE_IRQ_26),1863MT8188_SOC_ENUM_EXT("asys_irq15_1x_en_sel",1864asys_irq15_1x_en_sel_enum,1865snd_soc_get_enum_double,1866mt8188_asys_irq_1x_en_sel_put,1867MT8188_AFE_IRQ_27),1868MT8188_SOC_ENUM_EXT("asys_irq16_1x_en_sel",1869asys_irq16_1x_en_sel_enum,1870snd_soc_get_enum_double,1871mt8188_asys_irq_1x_en_sel_put,1872MT8188_AFE_IRQ_28),1873MT8188_SOC_ENUM_EXT("dl2_fs_timing_sel",1874dl2_fs_timing_sel_enum,1875mt8188_memif_fs_timing_sel_get,1876mt8188_memif_fs_timing_sel_put,1877MT8188_AFE_MEMIF_DL2),1878MT8188_SOC_ENUM_EXT("dl3_fs_timing_sel",1879dl3_fs_timing_sel_enum,1880mt8188_memif_fs_timing_sel_get,1881mt8188_memif_fs_timing_sel_put,1882MT8188_AFE_MEMIF_DL3),1883MT8188_SOC_ENUM_EXT("dl6_fs_timing_sel",1884dl6_fs_timing_sel_enum,1885mt8188_memif_fs_timing_sel_get,1886mt8188_memif_fs_timing_sel_put,1887MT8188_AFE_MEMIF_DL6),1888MT8188_SOC_ENUM_EXT("dl8_fs_timing_sel",1889dl8_fs_timing_sel_enum,1890mt8188_memif_fs_timing_sel_get,1891mt8188_memif_fs_timing_sel_put,1892MT8188_AFE_MEMIF_DL8),1893MT8188_SOC_ENUM_EXT("dl11_fs_timing_sel",1894dl11_fs_timing_sel_enum,1895mt8188_memif_fs_timing_sel_get,1896mt8188_memif_fs_timing_sel_put,1897MT8188_AFE_MEMIF_DL11),1898MT8188_SOC_ENUM_EXT("ul2_fs_timing_sel",1899ul2_fs_timing_sel_enum,1900mt8188_memif_fs_timing_sel_get,1901mt8188_memif_fs_timing_sel_put,1902MT8188_AFE_MEMIF_UL2),1903MT8188_SOC_ENUM_EXT("ul4_fs_timing_sel",1904ul4_fs_timing_sel_enum,1905mt8188_memif_fs_timing_sel_get,1906mt8188_memif_fs_timing_sel_put,1907MT8188_AFE_MEMIF_UL4),1908MT8188_SOC_ENUM_EXT("ul5_fs_timing_sel",1909ul5_fs_timing_sel_enum,1910mt8188_memif_fs_timing_sel_get,1911mt8188_memif_fs_timing_sel_put,1912MT8188_AFE_MEMIF_UL5),1913MT8188_SOC_ENUM_EXT("ul9_fs_timing_sel",1914ul9_fs_timing_sel_enum,1915mt8188_memif_fs_timing_sel_get,1916mt8188_memif_fs_timing_sel_put,1917MT8188_AFE_MEMIF_UL9),1918MT8188_SOC_ENUM_EXT("ul10_fs_timing_sel",1919ul10_fs_timing_sel_enum,1920mt8188_memif_fs_timing_sel_get,1921mt8188_memif_fs_timing_sel_put,1922MT8188_AFE_MEMIF_UL10),1923};19241925static const struct mtk_base_memif_data memif_data[MT8188_AFE_MEMIF_NUM] = {1926[MT8188_AFE_MEMIF_DL2] = {1927.name = "DL2",1928.id = MT8188_AFE_MEMIF_DL2,1929.reg_ofs_base = AFE_DL2_BASE,1930.reg_ofs_cur = AFE_DL2_CUR,1931.reg_ofs_end = AFE_DL2_END,1932.fs_reg = AFE_MEMIF_AGENT_FS_CON0,1933.fs_shift = 10,1934.fs_maskbit = 0x1f,1935.mono_reg = -1,1936.mono_shift = 0,1937.int_odd_flag_reg = -1,1938.int_odd_flag_shift = 0,1939.enable_reg = AFE_DAC_CON0,1940.enable_shift = 18,1941.hd_reg = AFE_DL2_CON0,1942.hd_shift = 5,1943.agent_disable_reg = AUDIO_TOP_CON5,1944.agent_disable_shift = 18,1945.ch_num_reg = AFE_DL2_CON0,1946.ch_num_shift = 0,1947.ch_num_maskbit = 0x1f,1948.msb_reg = AFE_NORMAL_BASE_ADR_MSB,1949.msb_shift = 18,1950.msb_end_reg = AFE_NORMAL_END_ADR_MSB,1951.msb_end_shift = 18,1952},1953[MT8188_AFE_MEMIF_DL3] = {1954.name = "DL3",1955.id = MT8188_AFE_MEMIF_DL3,1956.reg_ofs_base = AFE_DL3_BASE,1957.reg_ofs_cur = AFE_DL3_CUR,1958.reg_ofs_end = AFE_DL3_END,1959.fs_reg = AFE_MEMIF_AGENT_FS_CON0,1960.fs_shift = 15,1961.fs_maskbit = 0x1f,1962.mono_reg = -1,1963.mono_shift = 0,1964.int_odd_flag_reg = -1,1965.int_odd_flag_shift = 0,1966.enable_reg = AFE_DAC_CON0,1967.enable_shift = 19,1968.hd_reg = AFE_DL3_CON0,1969.hd_shift = 5,1970.agent_disable_reg = AUDIO_TOP_CON5,1971.agent_disable_shift = 19,1972.ch_num_reg = AFE_DL3_CON0,1973.ch_num_shift = 0,1974.ch_num_maskbit = 0x1f,1975.msb_reg = AFE_NORMAL_BASE_ADR_MSB,1976.msb_shift = 19,1977.msb_end_reg = AFE_NORMAL_END_ADR_MSB,1978.msb_end_shift = 19,1979},1980[MT8188_AFE_MEMIF_DL6] = {1981.name = "DL6",1982.id = MT8188_AFE_MEMIF_DL6,1983.reg_ofs_base = AFE_DL6_BASE,1984.reg_ofs_cur = AFE_DL6_CUR,1985.reg_ofs_end = AFE_DL6_END,1986.fs_reg = AFE_MEMIF_AGENT_FS_CON1,1987.fs_shift = 0,1988.fs_maskbit = 0x1f,1989.mono_reg = -1,1990.mono_shift = 0,1991.int_odd_flag_reg = -1,1992.int_odd_flag_shift = 0,1993.enable_reg = AFE_DAC_CON0,1994.enable_shift = 22,1995.hd_reg = AFE_DL6_CON0,1996.hd_shift = 5,1997.agent_disable_reg = AUDIO_TOP_CON5,1998.agent_disable_shift = 22,1999.ch_num_reg = AFE_DL6_CON0,2000.ch_num_shift = 0,2001.ch_num_maskbit = 0x1f,2002.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2003.msb_shift = 22,2004.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2005.msb_end_shift = 22,2006},2007[MT8188_AFE_MEMIF_DL7] = {2008.name = "DL7",2009.id = MT8188_AFE_MEMIF_DL7,2010.reg_ofs_base = AFE_DL7_BASE,2011.reg_ofs_cur = AFE_DL7_CUR,2012.reg_ofs_end = AFE_DL7_END,2013.fs_reg = -1,2014.fs_shift = 0,2015.fs_maskbit = 0,2016.mono_reg = -1,2017.mono_shift = 0,2018.int_odd_flag_reg = -1,2019.int_odd_flag_shift = 0,2020.enable_reg = AFE_DAC_CON0,2021.enable_shift = 23,2022.hd_reg = AFE_DL7_CON0,2023.hd_shift = 5,2024.agent_disable_reg = AUDIO_TOP_CON5,2025.agent_disable_shift = 23,2026.ch_num_reg = AFE_DL7_CON0,2027.ch_num_shift = 0,2028.ch_num_maskbit = 0x1f,2029.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2030.msb_shift = 23,2031.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2032.msb_end_shift = 23,2033},2034[MT8188_AFE_MEMIF_DL8] = {2035.name = "DL8",2036.id = MT8188_AFE_MEMIF_DL8,2037.reg_ofs_base = AFE_DL8_BASE,2038.reg_ofs_cur = AFE_DL8_CUR,2039.reg_ofs_end = AFE_DL8_END,2040.fs_reg = AFE_MEMIF_AGENT_FS_CON1,2041.fs_shift = 10,2042.fs_maskbit = 0x1f,2043.mono_reg = -1,2044.mono_shift = 0,2045.int_odd_flag_reg = -1,2046.int_odd_flag_shift = 0,2047.enable_reg = AFE_DAC_CON0,2048.enable_shift = 24,2049.hd_reg = AFE_DL8_CON0,2050.hd_shift = 6,2051.agent_disable_reg = AUDIO_TOP_CON5,2052.agent_disable_shift = 24,2053.ch_num_reg = AFE_DL8_CON0,2054.ch_num_shift = 0,2055.ch_num_maskbit = 0x3f,2056.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2057.msb_shift = 24,2058.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2059.msb_end_shift = 24,2060},2061[MT8188_AFE_MEMIF_DL10] = {2062.name = "DL10",2063.id = MT8188_AFE_MEMIF_DL10,2064.reg_ofs_base = AFE_DL10_BASE,2065.reg_ofs_cur = AFE_DL10_CUR,2066.reg_ofs_end = AFE_DL10_END,2067.fs_reg = AFE_MEMIF_AGENT_FS_CON1,2068.fs_shift = 20,2069.fs_maskbit = 0x1f,2070.mono_reg = -1,2071.mono_shift = 0,2072.int_odd_flag_reg = -1,2073.int_odd_flag_shift = 0,2074.enable_reg = AFE_DAC_CON0,2075.enable_shift = 26,2076.hd_reg = AFE_DL10_CON0,2077.hd_shift = 5,2078.agent_disable_reg = AUDIO_TOP_CON5,2079.agent_disable_shift = 26,2080.ch_num_reg = AFE_DL10_CON0,2081.ch_num_shift = 0,2082.ch_num_maskbit = 0x1f,2083.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2084.msb_shift = 26,2085.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2086.msb_end_shift = 26,2087},2088[MT8188_AFE_MEMIF_DL11] = {2089.name = "DL11",2090.id = MT8188_AFE_MEMIF_DL11,2091.reg_ofs_base = AFE_DL11_BASE,2092.reg_ofs_cur = AFE_DL11_CUR,2093.reg_ofs_end = AFE_DL11_END,2094.fs_reg = AFE_MEMIF_AGENT_FS_CON1,2095.fs_shift = 25,2096.fs_maskbit = 0x1f,2097.mono_reg = -1,2098.mono_shift = 0,2099.int_odd_flag_reg = -1,2100.int_odd_flag_shift = 0,2101.enable_reg = AFE_DAC_CON0,2102.enable_shift = 27,2103.hd_reg = AFE_DL11_CON0,2104.hd_shift = 7,2105.agent_disable_reg = AUDIO_TOP_CON5,2106.agent_disable_shift = 27,2107.ch_num_reg = AFE_DL11_CON0,2108.ch_num_shift = 0,2109.ch_num_maskbit = 0x7f,2110.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2111.msb_shift = 27,2112.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2113.msb_end_shift = 27,2114},2115[MT8188_AFE_MEMIF_UL1] = {2116.name = "UL1",2117.id = MT8188_AFE_MEMIF_UL1,2118.reg_ofs_base = AFE_UL1_BASE,2119.reg_ofs_cur = AFE_UL1_CUR,2120.reg_ofs_end = AFE_UL1_END,2121.fs_reg = -1,2122.fs_shift = 0,2123.fs_maskbit = 0,2124.mono_reg = AFE_UL1_CON0,2125.mono_shift = 1,2126.int_odd_flag_reg = AFE_UL1_CON0,2127.int_odd_flag_shift = 0,2128.enable_reg = AFE_DAC_CON0,2129.enable_shift = 1,2130.hd_reg = AFE_UL1_CON0,2131.hd_shift = 5,2132.agent_disable_reg = AUDIO_TOP_CON5,2133.agent_disable_shift = 0,2134.ch_num_reg = -1,2135.ch_num_shift = 0,2136.ch_num_maskbit = 0,2137.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2138.msb_shift = 0,2139.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2140.msb_end_shift = 0,2141},2142[MT8188_AFE_MEMIF_UL2] = {2143.name = "UL2",2144.id = MT8188_AFE_MEMIF_UL2,2145.reg_ofs_base = AFE_UL2_BASE,2146.reg_ofs_cur = AFE_UL2_CUR,2147.reg_ofs_end = AFE_UL2_END,2148.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2149.fs_shift = 5,2150.fs_maskbit = 0x1f,2151.mono_reg = AFE_UL2_CON0,2152.mono_shift = 1,2153.int_odd_flag_reg = AFE_UL2_CON0,2154.int_odd_flag_shift = 0,2155.enable_reg = AFE_DAC_CON0,2156.enable_shift = 2,2157.hd_reg = AFE_UL2_CON0,2158.hd_shift = 5,2159.agent_disable_reg = AUDIO_TOP_CON5,2160.agent_disable_shift = 1,2161.ch_num_reg = -1,2162.ch_num_shift = 0,2163.ch_num_maskbit = 0,2164.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2165.msb_shift = 1,2166.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2167.msb_end_shift = 1,2168},2169[MT8188_AFE_MEMIF_UL3] = {2170.name = "UL3",2171.id = MT8188_AFE_MEMIF_UL3,2172.reg_ofs_base = AFE_UL3_BASE,2173.reg_ofs_cur = AFE_UL3_CUR,2174.reg_ofs_end = AFE_UL3_END,2175.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2176.fs_shift = 10,2177.fs_maskbit = 0x1f,2178.mono_reg = AFE_UL3_CON0,2179.mono_shift = 1,2180.int_odd_flag_reg = AFE_UL3_CON0,2181.int_odd_flag_shift = 0,2182.enable_reg = AFE_DAC_CON0,2183.enable_shift = 3,2184.hd_reg = AFE_UL3_CON0,2185.hd_shift = 5,2186.agent_disable_reg = AUDIO_TOP_CON5,2187.agent_disable_shift = 2,2188.ch_num_reg = -1,2189.ch_num_shift = 0,2190.ch_num_maskbit = 0,2191.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2192.msb_shift = 2,2193.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2194.msb_end_shift = 2,2195},2196[MT8188_AFE_MEMIF_UL4] = {2197.name = "UL4",2198.id = MT8188_AFE_MEMIF_UL4,2199.reg_ofs_base = AFE_UL4_BASE,2200.reg_ofs_cur = AFE_UL4_CUR,2201.reg_ofs_end = AFE_UL4_END,2202.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2203.fs_shift = 15,2204.fs_maskbit = 0x1f,2205.mono_reg = AFE_UL4_CON0,2206.mono_shift = 1,2207.int_odd_flag_reg = AFE_UL4_CON0,2208.int_odd_flag_shift = 0,2209.enable_reg = AFE_DAC_CON0,2210.enable_shift = 4,2211.hd_reg = AFE_UL4_CON0,2212.hd_shift = 5,2213.agent_disable_reg = AUDIO_TOP_CON5,2214.agent_disable_shift = 3,2215.ch_num_reg = -1,2216.ch_num_shift = 0,2217.ch_num_maskbit = 0,2218.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2219.msb_shift = 3,2220.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2221.msb_end_shift = 3,2222},2223[MT8188_AFE_MEMIF_UL5] = {2224.name = "UL5",2225.id = MT8188_AFE_MEMIF_UL5,2226.reg_ofs_base = AFE_UL5_BASE,2227.reg_ofs_cur = AFE_UL5_CUR,2228.reg_ofs_end = AFE_UL5_END,2229.fs_reg = AFE_MEMIF_AGENT_FS_CON2,2230.fs_shift = 20,2231.fs_maskbit = 0x1f,2232.mono_reg = AFE_UL5_CON0,2233.mono_shift = 1,2234.int_odd_flag_reg = AFE_UL5_CON0,2235.int_odd_flag_shift = 0,2236.enable_reg = AFE_DAC_CON0,2237.enable_shift = 5,2238.hd_reg = AFE_UL5_CON0,2239.hd_shift = 5,2240.agent_disable_reg = AUDIO_TOP_CON5,2241.agent_disable_shift = 4,2242.ch_num_reg = -1,2243.ch_num_shift = 0,2244.ch_num_maskbit = 0,2245.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2246.msb_shift = 4,2247.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2248.msb_end_shift = 4,2249},2250[MT8188_AFE_MEMIF_UL6] = {2251.name = "UL6",2252.id = MT8188_AFE_MEMIF_UL6,2253.reg_ofs_base = AFE_UL6_BASE,2254.reg_ofs_cur = AFE_UL6_CUR,2255.reg_ofs_end = AFE_UL6_END,2256.fs_reg = -1,2257.fs_shift = 0,2258.fs_maskbit = 0,2259.mono_reg = AFE_UL6_CON0,2260.mono_shift = 1,2261.int_odd_flag_reg = AFE_UL6_CON0,2262.int_odd_flag_shift = 0,2263.enable_reg = AFE_DAC_CON0,2264.enable_shift = 6,2265.hd_reg = AFE_UL6_CON0,2266.hd_shift = 5,2267.agent_disable_reg = AUDIO_TOP_CON5,2268.agent_disable_shift = 5,2269.ch_num_reg = -1,2270.ch_num_shift = 0,2271.ch_num_maskbit = 0,2272.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2273.msb_shift = 5,2274.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2275.msb_end_shift = 5,2276},2277[MT8188_AFE_MEMIF_UL8] = {2278.name = "UL8",2279.id = MT8188_AFE_MEMIF_UL8,2280.reg_ofs_base = AFE_UL8_BASE,2281.reg_ofs_cur = AFE_UL8_CUR,2282.reg_ofs_end = AFE_UL8_END,2283.fs_reg = AFE_MEMIF_AGENT_FS_CON3,2284.fs_shift = 5,2285.fs_maskbit = 0x1f,2286.mono_reg = AFE_UL8_CON0,2287.mono_shift = 1,2288.int_odd_flag_reg = AFE_UL8_CON0,2289.int_odd_flag_shift = 0,2290.enable_reg = AFE_DAC_CON0,2291.enable_shift = 8,2292.hd_reg = AFE_UL8_CON0,2293.hd_shift = 5,2294.agent_disable_reg = AUDIO_TOP_CON5,2295.agent_disable_shift = 7,2296.ch_num_reg = -1,2297.ch_num_shift = 0,2298.ch_num_maskbit = 0,2299.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2300.msb_shift = 7,2301.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2302.msb_end_shift = 7,2303},2304[MT8188_AFE_MEMIF_UL9] = {2305.name = "UL9",2306.id = MT8188_AFE_MEMIF_UL9,2307.reg_ofs_base = AFE_UL9_BASE,2308.reg_ofs_cur = AFE_UL9_CUR,2309.reg_ofs_end = AFE_UL9_END,2310.fs_reg = AFE_MEMIF_AGENT_FS_CON3,2311.fs_shift = 10,2312.fs_maskbit = 0x1f,2313.mono_reg = AFE_UL9_CON0,2314.mono_shift = 1,2315.int_odd_flag_reg = AFE_UL9_CON0,2316.int_odd_flag_shift = 0,2317.enable_reg = AFE_DAC_CON0,2318.enable_shift = 9,2319.hd_reg = AFE_UL9_CON0,2320.hd_shift = 5,2321.agent_disable_reg = AUDIO_TOP_CON5,2322.agent_disable_shift = 8,2323.ch_num_reg = -1,2324.ch_num_shift = 0,2325.ch_num_maskbit = 0,2326.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2327.msb_shift = 8,2328.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2329.msb_end_shift = 8,2330},2331[MT8188_AFE_MEMIF_UL10] = {2332.name = "UL10",2333.id = MT8188_AFE_MEMIF_UL10,2334.reg_ofs_base = AFE_UL10_BASE,2335.reg_ofs_cur = AFE_UL10_CUR,2336.reg_ofs_end = AFE_UL10_END,2337.fs_reg = AFE_MEMIF_AGENT_FS_CON3,2338.fs_shift = 15,2339.fs_maskbit = 0x1f,2340.mono_reg = AFE_UL10_CON0,2341.mono_shift = 1,2342.int_odd_flag_reg = AFE_UL10_CON0,2343.int_odd_flag_shift = 0,2344.enable_reg = AFE_DAC_CON0,2345.enable_shift = 10,2346.hd_reg = AFE_UL10_CON0,2347.hd_shift = 5,2348.agent_disable_reg = AUDIO_TOP_CON5,2349.agent_disable_shift = 9,2350.ch_num_reg = -1,2351.ch_num_shift = 0,2352.ch_num_maskbit = 0,2353.msb_reg = AFE_NORMAL_BASE_ADR_MSB,2354.msb_shift = 9,2355.msb_end_reg = AFE_NORMAL_END_ADR_MSB,2356.msb_end_shift = 9,2357},2358};23592360static const struct mtk_base_irq_data irq_data[MT8188_AFE_IRQ_NUM] = {2361[MT8188_AFE_IRQ_1] = {2362.id = MT8188_AFE_IRQ_1,2363.irq_cnt_reg = -1,2364.irq_cnt_shift = 0,2365.irq_cnt_maskbit = 0,2366.irq_fs_reg = -1,2367.irq_fs_shift = 0,2368.irq_fs_maskbit = 0,2369.irq_en_reg = AFE_IRQ1_CON,2370.irq_en_shift = 31,2371.irq_clr_reg = AFE_IRQ_MCU_CLR,2372.irq_clr_shift = 0,2373.irq_status_shift = 16,2374},2375[MT8188_AFE_IRQ_2] = {2376.id = MT8188_AFE_IRQ_2,2377.irq_cnt_reg = -1,2378.irq_cnt_shift = 0,2379.irq_cnt_maskbit = 0,2380.irq_fs_reg = -1,2381.irq_fs_shift = 0,2382.irq_fs_maskbit = 0,2383.irq_en_reg = AFE_IRQ2_CON,2384.irq_en_shift = 31,2385.irq_clr_reg = AFE_IRQ_MCU_CLR,2386.irq_clr_shift = 1,2387.irq_status_shift = 17,2388},2389[MT8188_AFE_IRQ_3] = {2390.id = MT8188_AFE_IRQ_3,2391.irq_cnt_reg = AFE_IRQ3_CON,2392.irq_cnt_shift = 0,2393.irq_cnt_maskbit = 0xffffff,2394.irq_fs_reg = -1,2395.irq_fs_shift = 0,2396.irq_fs_maskbit = 0,2397.irq_en_reg = AFE_IRQ3_CON,2398.irq_en_shift = 31,2399.irq_clr_reg = AFE_IRQ_MCU_CLR,2400.irq_clr_shift = 2,2401.irq_status_shift = 18,2402},2403[MT8188_AFE_IRQ_8] = {2404.id = MT8188_AFE_IRQ_8,2405.irq_cnt_reg = -1,2406.irq_cnt_shift = 0,2407.irq_cnt_maskbit = 0,2408.irq_fs_reg = -1,2409.irq_fs_shift = 0,2410.irq_fs_maskbit = 0,2411.irq_en_reg = AFE_IRQ8_CON,2412.irq_en_shift = 31,2413.irq_clr_reg = AFE_IRQ_MCU_CLR,2414.irq_clr_shift = 7,2415.irq_status_shift = 23,2416},2417[MT8188_AFE_IRQ_9] = {2418.id = MT8188_AFE_IRQ_9,2419.irq_cnt_reg = AFE_IRQ9_CON,2420.irq_cnt_shift = 0,2421.irq_cnt_maskbit = 0xffffff,2422.irq_fs_reg = -1,2423.irq_fs_shift = 0,2424.irq_fs_maskbit = 0,2425.irq_en_reg = AFE_IRQ9_CON,2426.irq_en_shift = 31,2427.irq_clr_reg = AFE_IRQ_MCU_CLR,2428.irq_clr_shift = 8,2429.irq_status_shift = 24,2430},2431[MT8188_AFE_IRQ_10] = {2432.id = MT8188_AFE_IRQ_10,2433.irq_cnt_reg = -1,2434.irq_cnt_shift = 0,2435.irq_cnt_maskbit = 0,2436.irq_fs_reg = -1,2437.irq_fs_shift = 0,2438.irq_fs_maskbit = 0,2439.irq_en_reg = AFE_IRQ10_CON,2440.irq_en_shift = 31,2441.irq_clr_reg = AFE_IRQ_MCU_CLR,2442.irq_clr_shift = 9,2443.irq_status_shift = 25,2444},2445[MT8188_AFE_IRQ_13] = {2446.id = MT8188_AFE_IRQ_13,2447.irq_cnt_reg = ASYS_IRQ1_CON,2448.irq_cnt_shift = 0,2449.irq_cnt_maskbit = 0xffffff,2450.irq_fs_reg = ASYS_IRQ1_CON,2451.irq_fs_shift = 24,2452.irq_fs_maskbit = 0x1ffff,2453.irq_en_reg = ASYS_IRQ1_CON,2454.irq_en_shift = 31,2455.irq_clr_reg = ASYS_IRQ_CLR,2456.irq_clr_shift = 0,2457.irq_status_shift = 0,2458},2459[MT8188_AFE_IRQ_14] = {2460.id = MT8188_AFE_IRQ_14,2461.irq_cnt_reg = ASYS_IRQ2_CON,2462.irq_cnt_shift = 0,2463.irq_cnt_maskbit = 0xffffff,2464.irq_fs_reg = ASYS_IRQ2_CON,2465.irq_fs_shift = 24,2466.irq_fs_maskbit = 0x1ffff,2467.irq_en_reg = ASYS_IRQ2_CON,2468.irq_en_shift = 31,2469.irq_clr_reg = ASYS_IRQ_CLR,2470.irq_clr_shift = 1,2471.irq_status_shift = 1,2472},2473[MT8188_AFE_IRQ_15] = {2474.id = MT8188_AFE_IRQ_15,2475.irq_cnt_reg = ASYS_IRQ3_CON,2476.irq_cnt_shift = 0,2477.irq_cnt_maskbit = 0xffffff,2478.irq_fs_reg = ASYS_IRQ3_CON,2479.irq_fs_shift = 24,2480.irq_fs_maskbit = 0x1ffff,2481.irq_en_reg = ASYS_IRQ3_CON,2482.irq_en_shift = 31,2483.irq_clr_reg = ASYS_IRQ_CLR,2484.irq_clr_shift = 2,2485.irq_status_shift = 2,2486},2487[MT8188_AFE_IRQ_16] = {2488.id = MT8188_AFE_IRQ_16,2489.irq_cnt_reg = ASYS_IRQ4_CON,2490.irq_cnt_shift = 0,2491.irq_cnt_maskbit = 0xffffff,2492.irq_fs_reg = ASYS_IRQ4_CON,2493.irq_fs_shift = 24,2494.irq_fs_maskbit = 0x1ffff,2495.irq_en_reg = ASYS_IRQ4_CON,2496.irq_en_shift = 31,2497.irq_clr_reg = ASYS_IRQ_CLR,2498.irq_clr_shift = 3,2499.irq_status_shift = 3,2500},2501[MT8188_AFE_IRQ_17] = {2502.id = MT8188_AFE_IRQ_17,2503.irq_cnt_reg = ASYS_IRQ5_CON,2504.irq_cnt_shift = 0,2505.irq_cnt_maskbit = 0xffffff,2506.irq_fs_reg = ASYS_IRQ5_CON,2507.irq_fs_shift = 24,2508.irq_fs_maskbit = 0x1ffff,2509.irq_en_reg = ASYS_IRQ5_CON,2510.irq_en_shift = 31,2511.irq_clr_reg = ASYS_IRQ_CLR,2512.irq_clr_shift = 4,2513.irq_status_shift = 4,2514},2515[MT8188_AFE_IRQ_18] = {2516.id = MT8188_AFE_IRQ_18,2517.irq_cnt_reg = ASYS_IRQ6_CON,2518.irq_cnt_shift = 0,2519.irq_cnt_maskbit = 0xffffff,2520.irq_fs_reg = ASYS_IRQ6_CON,2521.irq_fs_shift = 24,2522.irq_fs_maskbit = 0x1ffff,2523.irq_en_reg = ASYS_IRQ6_CON,2524.irq_en_shift = 31,2525.irq_clr_reg = ASYS_IRQ_CLR,2526.irq_clr_shift = 5,2527.irq_status_shift = 5,2528},2529[MT8188_AFE_IRQ_19] = {2530.id = MT8188_AFE_IRQ_19,2531.irq_cnt_reg = ASYS_IRQ7_CON,2532.irq_cnt_shift = 0,2533.irq_cnt_maskbit = 0xffffff,2534.irq_fs_reg = ASYS_IRQ7_CON,2535.irq_fs_shift = 24,2536.irq_fs_maskbit = 0x1ffff,2537.irq_en_reg = ASYS_IRQ7_CON,2538.irq_en_shift = 31,2539.irq_clr_reg = ASYS_IRQ_CLR,2540.irq_clr_shift = 6,2541.irq_status_shift = 6,2542},2543[MT8188_AFE_IRQ_20] = {2544.id = MT8188_AFE_IRQ_20,2545.irq_cnt_reg = ASYS_IRQ8_CON,2546.irq_cnt_shift = 0,2547.irq_cnt_maskbit = 0xffffff,2548.irq_fs_reg = ASYS_IRQ8_CON,2549.irq_fs_shift = 24,2550.irq_fs_maskbit = 0x1ffff,2551.irq_en_reg = ASYS_IRQ8_CON,2552.irq_en_shift = 31,2553.irq_clr_reg = ASYS_IRQ_CLR,2554.irq_clr_shift = 7,2555.irq_status_shift = 7,2556},2557[MT8188_AFE_IRQ_21] = {2558.id = MT8188_AFE_IRQ_21,2559.irq_cnt_reg = ASYS_IRQ9_CON,2560.irq_cnt_shift = 0,2561.irq_cnt_maskbit = 0xffffff,2562.irq_fs_reg = ASYS_IRQ9_CON,2563.irq_fs_shift = 24,2564.irq_fs_maskbit = 0x1ffff,2565.irq_en_reg = ASYS_IRQ9_CON,2566.irq_en_shift = 31,2567.irq_clr_reg = ASYS_IRQ_CLR,2568.irq_clr_shift = 8,2569.irq_status_shift = 8,2570},2571[MT8188_AFE_IRQ_22] = {2572.id = MT8188_AFE_IRQ_22,2573.irq_cnt_reg = ASYS_IRQ10_CON,2574.irq_cnt_shift = 0,2575.irq_cnt_maskbit = 0xffffff,2576.irq_fs_reg = ASYS_IRQ10_CON,2577.irq_fs_shift = 24,2578.irq_fs_maskbit = 0x1ffff,2579.irq_en_reg = ASYS_IRQ10_CON,2580.irq_en_shift = 31,2581.irq_clr_reg = ASYS_IRQ_CLR,2582.irq_clr_shift = 9,2583.irq_status_shift = 9,2584},2585[MT8188_AFE_IRQ_23] = {2586.id = MT8188_AFE_IRQ_23,2587.irq_cnt_reg = ASYS_IRQ11_CON,2588.irq_cnt_shift = 0,2589.irq_cnt_maskbit = 0xffffff,2590.irq_fs_reg = ASYS_IRQ11_CON,2591.irq_fs_shift = 24,2592.irq_fs_maskbit = 0x1ffff,2593.irq_en_reg = ASYS_IRQ11_CON,2594.irq_en_shift = 31,2595.irq_clr_reg = ASYS_IRQ_CLR,2596.irq_clr_shift = 10,2597.irq_status_shift = 10,2598},2599[MT8188_AFE_IRQ_24] = {2600.id = MT8188_AFE_IRQ_24,2601.irq_cnt_reg = ASYS_IRQ12_CON,2602.irq_cnt_shift = 0,2603.irq_cnt_maskbit = 0xffffff,2604.irq_fs_reg = ASYS_IRQ12_CON,2605.irq_fs_shift = 24,2606.irq_fs_maskbit = 0x1ffff,2607.irq_en_reg = ASYS_IRQ12_CON,2608.irq_en_shift = 31,2609.irq_clr_reg = ASYS_IRQ_CLR,2610.irq_clr_shift = 11,2611.irq_status_shift = 11,2612},2613[MT8188_AFE_IRQ_25] = {2614.id = MT8188_AFE_IRQ_25,2615.irq_cnt_reg = ASYS_IRQ13_CON,2616.irq_cnt_shift = 0,2617.irq_cnt_maskbit = 0xffffff,2618.irq_fs_reg = ASYS_IRQ13_CON,2619.irq_fs_shift = 24,2620.irq_fs_maskbit = 0x1ffff,2621.irq_en_reg = ASYS_IRQ13_CON,2622.irq_en_shift = 31,2623.irq_clr_reg = ASYS_IRQ_CLR,2624.irq_clr_shift = 12,2625.irq_status_shift = 12,2626},2627[MT8188_AFE_IRQ_26] = {2628.id = MT8188_AFE_IRQ_26,2629.irq_cnt_reg = ASYS_IRQ14_CON,2630.irq_cnt_shift = 0,2631.irq_cnt_maskbit = 0xffffff,2632.irq_fs_reg = ASYS_IRQ14_CON,2633.irq_fs_shift = 24,2634.irq_fs_maskbit = 0x1ffff,2635.irq_en_reg = ASYS_IRQ14_CON,2636.irq_en_shift = 31,2637.irq_clr_reg = ASYS_IRQ_CLR,2638.irq_clr_shift = 13,2639.irq_status_shift = 13,2640},2641[MT8188_AFE_IRQ_27] = {2642.id = MT8188_AFE_IRQ_27,2643.irq_cnt_reg = ASYS_IRQ15_CON,2644.irq_cnt_shift = 0,2645.irq_cnt_maskbit = 0xffffff,2646.irq_fs_reg = ASYS_IRQ15_CON,2647.irq_fs_shift = 24,2648.irq_fs_maskbit = 0x1ffff,2649.irq_en_reg = ASYS_IRQ15_CON,2650.irq_en_shift = 31,2651.irq_clr_reg = ASYS_IRQ_CLR,2652.irq_clr_shift = 14,2653.irq_status_shift = 14,2654},2655[MT8188_AFE_IRQ_28] = {2656.id = MT8188_AFE_IRQ_28,2657.irq_cnt_reg = ASYS_IRQ16_CON,2658.irq_cnt_shift = 0,2659.irq_cnt_maskbit = 0xffffff,2660.irq_fs_reg = ASYS_IRQ16_CON,2661.irq_fs_shift = 24,2662.irq_fs_maskbit = 0x1ffff,2663.irq_en_reg = ASYS_IRQ16_CON,2664.irq_en_shift = 31,2665.irq_clr_reg = ASYS_IRQ_CLR,2666.irq_clr_shift = 15,2667.irq_status_shift = 15,2668},2669};26702671static const int mt8188_afe_memif_const_irqs[MT8188_AFE_MEMIF_NUM] = {2672[MT8188_AFE_MEMIF_DL2] = MT8188_AFE_IRQ_13,2673[MT8188_AFE_MEMIF_DL3] = MT8188_AFE_IRQ_14,2674[MT8188_AFE_MEMIF_DL6] = MT8188_AFE_IRQ_15,2675[MT8188_AFE_MEMIF_DL7] = MT8188_AFE_IRQ_1,2676[MT8188_AFE_MEMIF_DL8] = MT8188_AFE_IRQ_16,2677[MT8188_AFE_MEMIF_DL10] = MT8188_AFE_IRQ_17,2678[MT8188_AFE_MEMIF_DL11] = MT8188_AFE_IRQ_18,2679[MT8188_AFE_MEMIF_UL1] = MT8188_AFE_IRQ_3,2680[MT8188_AFE_MEMIF_UL2] = MT8188_AFE_IRQ_19,2681[MT8188_AFE_MEMIF_UL3] = MT8188_AFE_IRQ_20,2682[MT8188_AFE_MEMIF_UL4] = MT8188_AFE_IRQ_21,2683[MT8188_AFE_MEMIF_UL5] = MT8188_AFE_IRQ_22,2684[MT8188_AFE_MEMIF_UL6] = MT8188_AFE_IRQ_9,2685[MT8188_AFE_MEMIF_UL8] = MT8188_AFE_IRQ_23,2686[MT8188_AFE_MEMIF_UL9] = MT8188_AFE_IRQ_24,2687[MT8188_AFE_MEMIF_UL10] = MT8188_AFE_IRQ_25,2688};26892690static bool mt8188_is_volatile_reg(struct device *dev, unsigned int reg)2691{2692/* these auto-gen reg has read-only bit, so put it as volatile */2693/* volatile reg cannot be cached, so cannot be set when power off */2694switch (reg) {2695case AUDIO_TOP_CON0:2696case AUDIO_TOP_CON1:2697case AUDIO_TOP_CON3:2698case AUDIO_TOP_CON4:2699case AUDIO_TOP_CON5:2700case AUDIO_TOP_CON6:2701case ASYS_IRQ_CLR:2702case ASYS_IRQ_STATUS:2703case ASYS_IRQ_MON1:2704case ASYS_IRQ_MON2:2705case AFE_IRQ_MCU_CLR:2706case AFE_IRQ_STATUS:2707case AFE_IRQ3_CON_MON:2708case AFE_IRQ_MCU_MON2:2709case ADSP_IRQ_STATUS:2710case AUDIO_TOP_STA0:2711case AUDIO_TOP_STA1:2712case AFE_GAIN1_CUR:2713case AFE_GAIN2_CUR:2714case AFE_IEC_BURST_INFO:2715case AFE_IEC_CHL_STAT0:2716case AFE_IEC_CHL_STAT1:2717case AFE_IEC_CHR_STAT0:2718case AFE_IEC_CHR_STAT1:2719case AFE_SPDIFIN_CHSTS1:2720case AFE_SPDIFIN_CHSTS2:2721case AFE_SPDIFIN_CHSTS3:2722case AFE_SPDIFIN_CHSTS4:2723case AFE_SPDIFIN_CHSTS5:2724case AFE_SPDIFIN_CHSTS6:2725case AFE_SPDIFIN_DEBUG1:2726case AFE_SPDIFIN_DEBUG2:2727case AFE_SPDIFIN_DEBUG3:2728case AFE_SPDIFIN_DEBUG4:2729case AFE_SPDIFIN_EC:2730case AFE_SPDIFIN_CKLOCK_CFG:2731case AFE_SPDIFIN_BR_DBG1:2732case AFE_SPDIFIN_CKFBDIV:2733case AFE_SPDIFIN_INT_EXT:2734case AFE_SPDIFIN_INT_EXT2:2735case SPDIFIN_FREQ_STATUS:2736case SPDIFIN_USERCODE1:2737case SPDIFIN_USERCODE2:2738case SPDIFIN_USERCODE3:2739case SPDIFIN_USERCODE4:2740case SPDIFIN_USERCODE5:2741case SPDIFIN_USERCODE6:2742case SPDIFIN_USERCODE7:2743case SPDIFIN_USERCODE8:2744case SPDIFIN_USERCODE9:2745case SPDIFIN_USERCODE10:2746case SPDIFIN_USERCODE11:2747case SPDIFIN_USERCODE12:2748case AFE_LINEIN_APLL_TUNER_MON:2749case AFE_EARC_APLL_TUNER_MON:2750case AFE_CM0_MON:2751case AFE_CM1_MON:2752case AFE_CM2_MON:2753case AFE_MPHONE_MULTI_DET_MON0:2754case AFE_MPHONE_MULTI_DET_MON1:2755case AFE_MPHONE_MULTI_DET_MON2:2756case AFE_MPHONE_MULTI2_DET_MON0:2757case AFE_MPHONE_MULTI2_DET_MON1:2758case AFE_MPHONE_MULTI2_DET_MON2:2759case AFE_ADDA_MTKAIF_MON0:2760case AFE_ADDA_MTKAIF_MON1:2761case AFE_AUD_PAD_TOP:2762case AFE_ADDA6_MTKAIF_MON0:2763case AFE_ADDA6_MTKAIF_MON1:2764case AFE_ADDA6_SRC_DEBUG_MON0:2765case AFE_ADDA6_UL_SRC_MON0:2766case AFE_ADDA6_UL_SRC_MON1:2767case AFE_ASRC11_NEW_CON8:2768case AFE_ASRC11_NEW_CON9:2769case AFE_ASRC12_NEW_CON8:2770case AFE_ASRC12_NEW_CON9:2771case AFE_LRCK_CNT:2772case AFE_DAC_MON0:2773case AFE_DAC_CON0:2774case AFE_DL2_CUR:2775case AFE_DL3_CUR:2776case AFE_DL6_CUR:2777case AFE_DL7_CUR:2778case AFE_DL8_CUR:2779case AFE_DL10_CUR:2780case AFE_DL11_CUR:2781case AFE_UL1_CUR:2782case AFE_UL2_CUR:2783case AFE_UL3_CUR:2784case AFE_UL4_CUR:2785case AFE_UL5_CUR:2786case AFE_UL6_CUR:2787case AFE_UL8_CUR:2788case AFE_UL9_CUR:2789case AFE_UL10_CUR:2790case AFE_DL8_CHK_SUM1:2791case AFE_DL8_CHK_SUM2:2792case AFE_DL8_CHK_SUM3:2793case AFE_DL8_CHK_SUM4:2794case AFE_DL8_CHK_SUM5:2795case AFE_DL8_CHK_SUM6:2796case AFE_DL10_CHK_SUM1:2797case AFE_DL10_CHK_SUM2:2798case AFE_DL10_CHK_SUM3:2799case AFE_DL10_CHK_SUM4:2800case AFE_DL10_CHK_SUM5:2801case AFE_DL10_CHK_SUM6:2802case AFE_DL11_CHK_SUM1:2803case AFE_DL11_CHK_SUM2:2804case AFE_DL11_CHK_SUM3:2805case AFE_DL11_CHK_SUM4:2806case AFE_DL11_CHK_SUM5:2807case AFE_DL11_CHK_SUM6:2808case AFE_UL1_CHK_SUM1:2809case AFE_UL1_CHK_SUM2:2810case AFE_UL2_CHK_SUM1:2811case AFE_UL2_CHK_SUM2:2812case AFE_UL3_CHK_SUM1:2813case AFE_UL3_CHK_SUM2:2814case AFE_UL4_CHK_SUM1:2815case AFE_UL4_CHK_SUM2:2816case AFE_UL5_CHK_SUM1:2817case AFE_UL5_CHK_SUM2:2818case AFE_UL6_CHK_SUM1:2819case AFE_UL6_CHK_SUM2:2820case AFE_UL8_CHK_SUM1:2821case AFE_UL8_CHK_SUM2:2822case AFE_DL2_CHK_SUM1:2823case AFE_DL2_CHK_SUM2:2824case AFE_DL3_CHK_SUM1:2825case AFE_DL3_CHK_SUM2:2826case AFE_DL6_CHK_SUM1:2827case AFE_DL6_CHK_SUM2:2828case AFE_DL7_CHK_SUM1:2829case AFE_DL7_CHK_SUM2:2830case AFE_UL9_CHK_SUM1:2831case AFE_UL9_CHK_SUM2:2832case AFE_BUS_MON1:2833case UL1_MOD2AGT_CNT_LAT:2834case UL2_MOD2AGT_CNT_LAT:2835case UL3_MOD2AGT_CNT_LAT:2836case UL4_MOD2AGT_CNT_LAT:2837case UL5_MOD2AGT_CNT_LAT:2838case UL6_MOD2AGT_CNT_LAT:2839case UL8_MOD2AGT_CNT_LAT:2840case UL9_MOD2AGT_CNT_LAT:2841case UL10_MOD2AGT_CNT_LAT:2842case AFE_MEMIF_BUF_FULL_MON:2843case AFE_MEMIF_BUF_MON1:2844case AFE_MEMIF_BUF_MON3:2845case AFE_MEMIF_BUF_MON4:2846case AFE_MEMIF_BUF_MON5:2847case AFE_MEMIF_BUF_MON6:2848case AFE_MEMIF_BUF_MON7:2849case AFE_MEMIF_BUF_MON8:2850case AFE_MEMIF_BUF_MON9:2851case AFE_MEMIF_BUF_MON10:2852case DL2_AGENT2MODULE_CNT:2853case DL3_AGENT2MODULE_CNT:2854case DL6_AGENT2MODULE_CNT:2855case DL7_AGENT2MODULE_CNT:2856case DL8_AGENT2MODULE_CNT:2857case DL10_AGENT2MODULE_CNT:2858case DL11_AGENT2MODULE_CNT:2859case UL1_MODULE2AGENT_CNT:2860case UL2_MODULE2AGENT_CNT:2861case UL3_MODULE2AGENT_CNT:2862case UL4_MODULE2AGENT_CNT:2863case UL5_MODULE2AGENT_CNT:2864case UL6_MODULE2AGENT_CNT:2865case UL8_MODULE2AGENT_CNT:2866case UL9_MODULE2AGENT_CNT:2867case UL10_MODULE2AGENT_CNT:2868case AFE_DMIC0_SRC_DEBUG_MON0:2869case AFE_DMIC0_UL_SRC_MON0:2870case AFE_DMIC0_UL_SRC_MON1:2871case AFE_DMIC1_SRC_DEBUG_MON0:2872case AFE_DMIC1_UL_SRC_MON0:2873case AFE_DMIC1_UL_SRC_MON1:2874case AFE_DMIC2_SRC_DEBUG_MON0:2875case AFE_DMIC2_UL_SRC_MON0:2876case AFE_DMIC2_UL_SRC_MON1:2877case AFE_DMIC3_SRC_DEBUG_MON0:2878case AFE_DMIC3_UL_SRC_MON0:2879case AFE_DMIC3_UL_SRC_MON1:2880case ETDM_IN1_MONITOR:2881case ETDM_IN2_MONITOR:2882case ETDM_OUT1_MONITOR:2883case ETDM_OUT2_MONITOR:2884case ETDM_OUT3_MONITOR:2885case AFE_ADDA_SRC_DEBUG_MON0:2886case AFE_ADDA_SRC_DEBUG_MON1:2887case AFE_ADDA_DL_SDM_FIFO_MON:2888case AFE_ADDA_DL_SRC_LCH_MON:2889case AFE_ADDA_DL_SRC_RCH_MON:2890case AFE_ADDA_DL_SDM_OUT_MON:2891case AFE_GASRC0_NEW_CON8:2892case AFE_GASRC0_NEW_CON9:2893case AFE_GASRC0_NEW_CON12:2894case AFE_GASRC1_NEW_CON8:2895case AFE_GASRC1_NEW_CON9:2896case AFE_GASRC1_NEW_CON12:2897case AFE_GASRC2_NEW_CON8:2898case AFE_GASRC2_NEW_CON9:2899case AFE_GASRC2_NEW_CON12:2900case AFE_GASRC3_NEW_CON8:2901case AFE_GASRC3_NEW_CON9:2902case AFE_GASRC3_NEW_CON12:2903case AFE_GASRC4_NEW_CON8:2904case AFE_GASRC4_NEW_CON9:2905case AFE_GASRC4_NEW_CON12:2906case AFE_GASRC5_NEW_CON8:2907case AFE_GASRC5_NEW_CON9:2908case AFE_GASRC5_NEW_CON12:2909case AFE_GASRC6_NEW_CON8:2910case AFE_GASRC6_NEW_CON9:2911case AFE_GASRC6_NEW_CON12:2912case AFE_GASRC7_NEW_CON8:2913case AFE_GASRC7_NEW_CON9:2914case AFE_GASRC7_NEW_CON12:2915case AFE_GASRC8_NEW_CON8:2916case AFE_GASRC8_NEW_CON9:2917case AFE_GASRC8_NEW_CON12:2918case AFE_GASRC9_NEW_CON8:2919case AFE_GASRC9_NEW_CON9:2920case AFE_GASRC9_NEW_CON12:2921case AFE_GASRC10_NEW_CON8:2922case AFE_GASRC10_NEW_CON9:2923case AFE_GASRC10_NEW_CON12:2924case AFE_GASRC11_NEW_CON8:2925case AFE_GASRC11_NEW_CON9:2926case AFE_GASRC11_NEW_CON12:2927return true;2928default:2929return false;2930};2931}29322933static const struct regmap_config mt8188_afe_regmap_config = {2934.reg_bits = 32,2935.reg_stride = 4,2936.val_bits = 32,2937.volatile_reg = mt8188_is_volatile_reg,2938.max_register = AFE_MAX_REGISTER,2939.num_reg_defaults_raw = ((AFE_MAX_REGISTER / 4) + 1),2940.cache_type = REGCACHE_FLAT,2941};29422943#define AFE_IRQ_CLR_BITS (0x387)2944#define ASYS_IRQ_CLR_BITS (0xffff)29452946static irqreturn_t mt8188_afe_irq_handler(int irq_id, void *dev_id)2947{2948struct mtk_base_afe *afe = dev_id;2949unsigned int val = 0;2950unsigned int asys_irq_clr_bits = 0;2951unsigned int afe_irq_clr_bits = 0;2952unsigned int irq_status_bits = 0;2953unsigned int irq_clr_bits = 0;2954unsigned int mcu_irq_mask = 0;2955int i = 0;2956int ret = 0;29572958ret = regmap_read(afe->regmap, AFE_IRQ_STATUS, &val);2959if (ret) {2960dev_err(afe->dev, "%s irq status err\n", __func__);2961afe_irq_clr_bits = AFE_IRQ_CLR_BITS;2962asys_irq_clr_bits = ASYS_IRQ_CLR_BITS;2963goto err_irq;2964}29652966ret = regmap_read(afe->regmap, AFE_IRQ_MASK, &mcu_irq_mask);2967if (ret) {2968dev_err(afe->dev, "%s read irq mask err\n", __func__);2969afe_irq_clr_bits = AFE_IRQ_CLR_BITS;2970asys_irq_clr_bits = ASYS_IRQ_CLR_BITS;2971goto err_irq;2972}29732974/* only clr cpu irq */2975val &= mcu_irq_mask;29762977for (i = 0; i < MT8188_AFE_MEMIF_NUM; i++) {2978struct mtk_base_afe_memif *memif = &afe->memif[i];2979struct mtk_base_irq_data const *irq_data;29802981if (memif->irq_usage < 0)2982continue;29832984irq_data = afe->irqs[memif->irq_usage].irq_data;29852986irq_status_bits = BIT(irq_data->irq_status_shift);2987irq_clr_bits = BIT(irq_data->irq_clr_shift);29882989if (!(val & irq_status_bits))2990continue;29912992if (irq_data->irq_clr_reg == ASYS_IRQ_CLR)2993asys_irq_clr_bits |= irq_clr_bits;2994else2995afe_irq_clr_bits |= irq_clr_bits;29962997snd_pcm_period_elapsed(memif->substream);2998}29993000err_irq:3001/* clear irq */3002if (asys_irq_clr_bits)3003regmap_write(afe->regmap, ASYS_IRQ_CLR, asys_irq_clr_bits);3004if (afe_irq_clr_bits)3005regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, afe_irq_clr_bits);30063007return IRQ_HANDLED;3008}30093010static int mt8188_afe_runtime_suspend(struct device *dev)3011{3012struct mtk_base_afe *afe = dev_get_drvdata(dev);3013struct mt8188_afe_private *afe_priv = afe->platform_priv;30143015if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)3016goto skip_regmap;30173018mt8188_afe_disable_main_clock(afe);30193020regcache_cache_only(afe->regmap, true);3021regcache_mark_dirty(afe->regmap);30223023skip_regmap:3024mt8188_afe_disable_reg_rw_clk(afe);30253026return 0;3027}30283029static int mt8188_afe_runtime_resume(struct device *dev)3030{3031struct mtk_base_afe *afe = dev_get_drvdata(dev);3032struct mt8188_afe_private *afe_priv = afe->platform_priv;3033struct arm_smccc_res res;30343035arm_smccc_smc(MTK_SIP_AUDIO_CONTROL,3036MTK_AUDIO_SMC_OP_DOMAIN_SIDEBANDS,30370, 0, 0, 0, 0, 0, &res);30383039mt8188_afe_enable_reg_rw_clk(afe);30403041if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)3042goto skip_regmap;30433044regcache_cache_only(afe->regmap, false);3045regcache_sync(afe->regmap);30463047mt8188_afe_enable_main_clock(afe);3048skip_regmap:3049return 0;3050}30513052static int init_memif_priv_data(struct mtk_base_afe *afe)3053{3054struct mt8188_afe_private *afe_priv = afe->platform_priv;3055struct mtk_dai_memif_priv *memif_priv;3056int i;30573058for (i = MT8188_AFE_MEMIF_START; i < MT8188_AFE_MEMIF_END; i++) {3059memif_priv = devm_kzalloc(afe->dev,3060sizeof(struct mtk_dai_memif_priv),3061GFP_KERNEL);3062if (!memif_priv)3063return -ENOMEM;30643065afe_priv->dai_priv[i] = memif_priv;3066}30673068return 0;3069}30703071static int mt8188_dai_memif_register(struct mtk_base_afe *afe)3072{3073struct mtk_base_afe_dai *dai;30743075dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);3076if (!dai)3077return -ENOMEM;30783079list_add(&dai->list, &afe->sub_dais);30803081dai->dai_drivers = mt8188_memif_dai_driver;3082dai->num_dai_drivers = ARRAY_SIZE(mt8188_memif_dai_driver);30833084dai->dapm_widgets = mt8188_memif_widgets;3085dai->num_dapm_widgets = ARRAY_SIZE(mt8188_memif_widgets);3086dai->dapm_routes = mt8188_memif_routes;3087dai->num_dapm_routes = ARRAY_SIZE(mt8188_memif_routes);3088dai->controls = mt8188_memif_controls;3089dai->num_controls = ARRAY_SIZE(mt8188_memif_controls);30903091return init_memif_priv_data(afe);3092}30933094typedef int (*dai_register_cb)(struct mtk_base_afe *);3095static const dai_register_cb dai_register_cbs[] = {3096mt8188_dai_adda_register,3097mt8188_dai_dmic_register,3098mt8188_dai_etdm_register,3099mt8188_dai_pcm_register,3100mt8188_dai_memif_register,3101};31023103static const struct reg_sequence mt8188_afe_reg_defaults[] = {3104{ AFE_IRQ_MASK, 0x387ffff },3105{ AFE_IRQ3_CON, BIT(30) },3106{ AFE_IRQ9_CON, BIT(30) },3107{ ETDM_IN1_CON4, 0x12000100 },3108{ ETDM_IN2_CON4, 0x12000100 },3109};31103111static const struct reg_sequence mt8188_cg_patch[] = {3112{ AUDIO_TOP_CON0, 0xfffffffb },3113{ AUDIO_TOP_CON1, 0xfffffff8 },3114};31153116static int mt8188_afe_init_registers(struct mtk_base_afe *afe)3117{3118return regmap_multi_reg_write(afe->regmap,3119mt8188_afe_reg_defaults,3120ARRAY_SIZE(mt8188_afe_reg_defaults));3121}31223123static int mt8188_afe_parse_of(struct mtk_base_afe *afe,3124struct device_node *np)3125{3126#if IS_ENABLED(CONFIG_SND_SOC_MT6359)3127struct mt8188_afe_private *afe_priv = afe->platform_priv;31283129afe_priv->topckgen = syscon_regmap_lookup_by_phandle(afe->dev->of_node,3130"mediatek,topckgen");3131if (IS_ERR(afe_priv->topckgen))3132return dev_err_probe(afe->dev, PTR_ERR(afe_priv->topckgen),3133"%s() Cannot find topckgen controller\n",3134__func__);3135#endif3136return 0;3137}31383139#define MT8188_DELAY_US 103140#define MT8188_TIMEOUT_US USEC_PER_SEC31413142static int bus_protect_enable(struct regmap *regmap)3143{3144int ret;3145u32 val;3146u32 mask;31473148val = 0;3149mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1;3150regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_SET, mask);31513152ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3153val, (val & mask) == mask,3154MT8188_DELAY_US, MT8188_TIMEOUT_US);3155if (ret)3156return ret;31573158val = 0;3159mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2;3160regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_SET, mask);31613162ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3163val, (val & mask) == mask,3164MT8188_DELAY_US, MT8188_TIMEOUT_US);3165return ret;3166}31673168static int bus_protect_disable(struct regmap *regmap)3169{3170int ret;3171u32 val;3172u32 mask;31733174val = 0;3175mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2;3176regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_CLR, mask);31773178ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3179val, !(val & mask),3180MT8188_DELAY_US, MT8188_TIMEOUT_US);3181if (ret)3182return ret;31833184val = 0;3185mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1;3186regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_CLR, mask);31873188ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,3189val, !(val & mask),3190MT8188_DELAY_US, MT8188_TIMEOUT_US);3191return ret;3192}31933194static int mt8188_afe_pcm_dev_probe(struct platform_device *pdev)3195{3196struct mtk_base_afe *afe;3197struct mt8188_afe_private *afe_priv;3198struct device *dev = &pdev->dev;3199struct reset_control *rstc;3200struct regmap *infra_ao;3201int i, irq_id, ret;32023203ret = of_reserved_mem_device_init(dev);3204if (ret)3205dev_dbg(dev, "failed to assign memory region: %d\n", ret);32063207ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(33));3208if (ret)3209return ret;32103211afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);3212if (!afe)3213return -ENOMEM;32143215afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),3216GFP_KERNEL);3217if (!afe->platform_priv)3218return -ENOMEM;32193220afe_priv = afe->platform_priv;3221afe->dev = &pdev->dev;32223223afe->base_addr = devm_platform_ioremap_resource(pdev, 0);3224if (IS_ERR(afe->base_addr))3225return dev_err_probe(dev, PTR_ERR(afe->base_addr),3226"AFE base_addr not found\n");32273228infra_ao = syscon_regmap_lookup_by_phandle(dev->of_node,3229"mediatek,infracfg");3230if (IS_ERR(infra_ao))3231return dev_err_probe(dev, PTR_ERR(infra_ao),3232"%s() Cannot find infra_ao controller\n",3233__func__);32343235/* reset controller to reset audio regs before regmap cache */3236rstc = devm_reset_control_get_exclusive(dev, "audiosys");3237if (IS_ERR(rstc))3238return dev_err_probe(dev, PTR_ERR(rstc),3239"could not get audiosys reset\n");32403241ret = bus_protect_enable(infra_ao);3242if (ret) {3243dev_err(dev, "bus_protect_enable failed\n");3244return ret;3245}32463247ret = reset_control_reset(rstc);3248if (ret) {3249dev_err(dev, "failed to trigger audio reset:%d\n", ret);3250return ret;3251}32523253ret = bus_protect_disable(infra_ao);3254if (ret) {3255dev_err(dev, "bus_protect_disable failed\n");3256return ret;3257}32583259/* initial audio related clock */3260ret = mt8188_afe_init_clock(afe);3261if (ret)3262return dev_err_probe(dev, ret, "init clock error");32633264spin_lock_init(&afe_priv->afe_ctrl_lock);32653266mutex_init(&afe->irq_alloc_lock);32673268/* irq initialize */3269afe->irqs_size = MT8188_AFE_IRQ_NUM;3270afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),3271GFP_KERNEL);3272if (!afe->irqs)3273return -ENOMEM;32743275for (i = 0; i < afe->irqs_size; i++)3276afe->irqs[i].irq_data = &irq_data[i];32773278/* init memif */3279afe->memif_size = MT8188_AFE_MEMIF_NUM;3280afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),3281GFP_KERNEL);3282if (!afe->memif)3283return -ENOMEM;32843285for (i = 0; i < afe->memif_size; i++) {3286afe->memif[i].data = &memif_data[i];3287afe->memif[i].irq_usage = mt8188_afe_memif_const_irqs[i];3288afe->memif[i].const_irq = 1;3289afe->irqs[afe->memif[i].irq_usage].irq_occupyed = true;3290}32913292/* request irq */3293irq_id = platform_get_irq(pdev, 0);3294if (irq_id < 0)3295return dev_err_probe(dev, irq_id, "no irq found");32963297ret = devm_request_irq(dev, irq_id, mt8188_afe_irq_handler,3298IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);3299if (ret)3300return dev_err_probe(dev, ret, "could not request_irq for asys-isr\n");33013302/* init sub_dais */3303INIT_LIST_HEAD(&afe->sub_dais);33043305for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {3306ret = dai_register_cbs[i](afe);3307if (ret)3308return dev_err_probe(dev, ret, "dai register i %d fail\n", i);3309}33103311/* init dai_driver and component_driver */3312ret = mtk_afe_combine_sub_dai(afe);3313if (ret)3314return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");33153316afe->mtk_afe_hardware = &mt8188_afe_hardware;3317afe->memif_fs = mt8188_memif_fs;3318afe->irq_fs = mt8188_irq_fs;33193320afe->runtime_resume = mt8188_afe_runtime_resume;3321afe->runtime_suspend = mt8188_afe_runtime_suspend;33223323platform_set_drvdata(pdev, afe);33243325ret = mt8188_afe_parse_of(afe, pdev->dev.of_node);3326if (ret)3327return ret;33283329ret = devm_pm_runtime_enable(dev);3330if (ret)3331return ret;33323333/* enable clock for regcache get default value from hw */3334afe_priv->pm_runtime_bypass_reg_ctl = true;3335ret = pm_runtime_resume_and_get(dev);3336if (ret)3337return dev_err_probe(dev, ret, "failed to resume device\n");33383339afe->regmap = devm_regmap_init_mmio(&pdev->dev, afe->base_addr,3340&mt8188_afe_regmap_config);3341if (IS_ERR(afe->regmap)) {3342ret = PTR_ERR(afe->regmap);3343goto err_pm_put;3344}33453346ret = regmap_register_patch(afe->regmap, mt8188_cg_patch,3347ARRAY_SIZE(mt8188_cg_patch));3348if (ret < 0) {3349dev_info(dev, "Failed to apply cg patch\n");3350goto err_pm_put;3351}33523353/* register component */3354ret = devm_snd_soc_register_component(dev, &mtk_afe_pcm_platform,3355afe->dai_drivers, afe->num_dai_drivers);3356if (ret) {3357dev_warn(dev, "err_platform\n");3358goto err_pm_put;3359}33603361mt8188_afe_init_registers(afe);33623363pm_runtime_put_sync(&pdev->dev);3364afe_priv->pm_runtime_bypass_reg_ctl = false;33653366regcache_cache_only(afe->regmap, true);3367regcache_mark_dirty(afe->regmap);33683369return 0;3370err_pm_put:3371pm_runtime_put_sync(dev);33723373return ret;3374}33753376static const struct of_device_id mt8188_afe_pcm_dt_match[] = {3377{ .compatible = "mediatek,mt8188-afe", },3378{},3379};3380MODULE_DEVICE_TABLE(of, mt8188_afe_pcm_dt_match);33813382static const struct dev_pm_ops mt8188_afe_pm_ops = {3383RUNTIME_PM_OPS(mt8188_afe_runtime_suspend,3384mt8188_afe_runtime_resume, NULL)3385};33863387static struct platform_driver mt8188_afe_pcm_driver = {3388.driver = {3389.name = "mt8188-audio",3390.of_match_table = mt8188_afe_pcm_dt_match,3391.pm = pm_ptr(&mt8188_afe_pm_ops),3392},3393.probe = mt8188_afe_pcm_dev_probe,3394};33953396module_platform_driver(mt8188_afe_pcm_driver);33973398MODULE_DESCRIPTION("MediaTek SoC AFE platform driver for ALSA 8188");3399MODULE_AUTHOR("Chun-Chia.Chiu <[email protected]>");3400MODULE_LICENSE("GPL");340134023403