Path: blob/master/sound/soc/mediatek/mt8189/mt8189-afe-pcm.c
38237 views
// SPDX-License-Identifier: GPL-2.01/*2* Mediatek ALSA SoC AFE platform driver for 81893*4* Copyright (c) 2025 MediaTek Inc.5* Author: Darren Ye <[email protected]>6*/78#include <linux/delay.h>9#include <linux/dma-mapping.h>10#include <linux/module.h>11#include <linux/of.h>12#include <linux/of_address.h>13#include <linux/of_device.h>14#include <linux/of_reserved_mem.h>15#include <linux/pm_runtime.h>16#include <linux/regmap.h>1718#include <sound/pcm.h>19#include <sound/soc.h>2021#include "mt8189-afe-clk.h"22#include "mt8189-afe-common.h"23#include "mt8189-interconnection.h"2425#include "../common/mtk-afe-fe-dai.h"26#include "../common/mtk-afe-platform-driver.h"2728static const struct snd_pcm_hardware mt8189_afe_hardware = {29.info = (SNDRV_PCM_INFO_MMAP |30SNDRV_PCM_INFO_NO_PERIOD_WAKEUP |31SNDRV_PCM_INFO_INTERLEAVED |32SNDRV_PCM_INFO_MMAP_VALID),33.formats = (SNDRV_PCM_FMTBIT_S16_LE |34SNDRV_PCM_FMTBIT_S24_LE |35SNDRV_PCM_FMTBIT_S32_LE),36.period_bytes_min = 96,37.period_bytes_max = 4 * 48 * 1024,38.periods_min = 2,39.periods_max = 256,40.buffer_bytes_max = 256 * 1024,41.fifo_size = 0,42};4344static unsigned int mt8189_rate_transform(struct device *dev, unsigned int rate)45{46switch (rate) {47case 8000:48return MTK_AFE_IPM2P0_RATE_8K;49case 11025:50return MTK_AFE_IPM2P0_RATE_11K;51case 12000:52return MTK_AFE_IPM2P0_RATE_12K;53case 16000:54return MTK_AFE_IPM2P0_RATE_16K;55case 22050:56return MTK_AFE_IPM2P0_RATE_22K;57case 24000:58return MTK_AFE_IPM2P0_RATE_24K;59case 32000:60return MTK_AFE_IPM2P0_RATE_32K;61case 44100:62return MTK_AFE_IPM2P0_RATE_44K;63case 48000:64return MTK_AFE_IPM2P0_RATE_48K;65case 88200:66return MTK_AFE_IPM2P0_RATE_88K;67case 96000:68return MTK_AFE_IPM2P0_RATE_96K;69case 176400:70return MTK_AFE_IPM2P0_RATE_176K;71case 192000:72return MTK_AFE_IPM2P0_RATE_192K;73/* not support 260K */74case 352800:75return MTK_AFE_IPM2P0_RATE_352K;76case 384000:77return MTK_AFE_IPM2P0_RATE_384K;78default:79dev_warn(dev, "rate %u invalid, use %d!!!\n",80rate, MTK_AFE_IPM2P0_RATE_48K);81return MTK_AFE_IPM2P0_RATE_48K;82}83}8485static inline unsigned int calculate_cm_update(unsigned int rate,86unsigned int ch)87{88return (((26000000 / rate) - 10) / (ch / 2)) - 1;89}9091static int mt8189_set_cm(struct mtk_base_afe *afe, int id,92bool update, bool swap, unsigned int ch)93{94struct mt8189_afe_private *afe_priv = afe->platform_priv;95unsigned int rate = afe_priv->cm_rate[id];96unsigned int rate_val = mt8189_rate_transform(afe->dev, rate);97unsigned int update_val = update ? calculate_cm_update(rate, ch) : 0x64;98int reg = AFE_CM0_CON0 + 0x10 * id;99100dev_dbg(afe->dev, "%s()-0, CM%d, rate %d, update %d, swap %d, ch %d\n",101__func__, id, rate, update, swap, ch);102103/* update cnt */104regmap_update_bits(afe->regmap, reg,105AFE_CM_UPDATE_CNT_MASK << AFE_CM_UPDATE_CNT_SFT,106update_val << AFE_CM_UPDATE_CNT_SFT);107108/* rate */109regmap_update_bits(afe->regmap, reg,110AFE_CM_1X_EN_SEL_FS_MASK << AFE_CM_1X_EN_SEL_FS_SFT,111rate_val << AFE_CM_1X_EN_SEL_FS_SFT);112113/* ch num */114regmap_update_bits(afe->regmap, reg,115AFE_CM_CH_NUM_MASK << AFE_CM_CH_NUM_SFT,116(ch - 1) << AFE_CM_CH_NUM_SFT);117118/* swap */119regmap_update_bits(afe->regmap, reg,120AFE_CM_BYTE_SWAP_MASK << AFE_CM_BYTE_SWAP_SFT,121swap << AFE_CM_BYTE_SWAP_SFT);122123return 0;124}125126static int mt8189_enable_cm_bypass(struct mtk_base_afe *afe, int id, bool en)127{128return regmap_update_bits(afe->regmap, AFE_CM0_CON0 + 0x10 * id,129AFE_CM_BYPASS_MODE_MASK <<130AFE_CM_BYPASS_MODE_SFT,131en << AFE_CM_BYPASS_MODE_SFT);132}133134static int mt8189_fe_startup(struct snd_pcm_substream *substream,135struct snd_soc_dai *dai)136{137struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);138struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);139struct snd_pcm_runtime *runtime = substream->runtime;140struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);141int memif_num = cpu_dai->id;142struct mtk_base_afe_memif *memif = &afe->memif[memif_num];143const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware;144int ret;145146dev_dbg(afe->dev, "%s(), memif_num: %d.\n", __func__, memif_num);147148memif->substream = substream;149150snd_pcm_hw_constraint_step(substream->runtime, 0,151SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16);152153snd_soc_set_runtime_hwparams(substream, mtk_afe_hardware);154155ret = snd_pcm_hw_constraint_integer(runtime,156SNDRV_PCM_HW_PARAM_PERIODS);157if (ret < 0)158dev_warn(afe->dev, "snd_pcm_hw_constraint_integer failed\n");159160/* dynamic allocate irq to memif */161if (memif->irq_usage < 0) {162int irq_id = mtk_dynamic_irq_acquire(afe);163164if (irq_id != afe->irqs_size) {165/* link */166memif->irq_usage = irq_id;167} else {168dev_err(afe->dev, "%s() error: no more asys irq\n",169__func__);170ret = -EBUSY;171}172}173174return ret;175}176177static void mt8189_fe_shutdown(struct snd_pcm_substream *substream,178struct snd_soc_dai *dai)179{180struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);181struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);182struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);183int memif_num = cpu_dai->id;184struct mtk_base_afe_memif *memif = &afe->memif[memif_num];185int irq_id = memif->irq_usage;186187dev_dbg(afe->dev, "%s(), memif_num: %d.\n", __func__, memif_num);188189memif->substream = NULL;190191if (!memif->const_irq) {192mtk_dynamic_irq_release(afe, irq_id);193memif->irq_usage = -1;194memif->substream = NULL;195}196}197198static int mt8189_fe_hw_params(struct snd_pcm_substream *substream,199struct snd_pcm_hw_params *params,200struct snd_soc_dai *dai)201{202struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);203struct mt8189_afe_private *afe_priv = afe->platform_priv;204int id = dai->id;205int cm;206207switch (id) {208case MT8189_MEMIF_VUL8:209case MT8189_MEMIF_VUL_CM0:210cm = CM0;211break;212case MT8189_MEMIF_VUL9:213case MT8189_MEMIF_VUL_CM1:214cm = CM1;215break;216default:217cm = CM0;218break;219}220221afe_priv->cm_rate[cm] = params_rate(params);222afe_priv->cm_channels = params_channels(params);223224return mtk_afe_fe_hw_params(substream, params, dai);225}226227static int mt8189_fe_trigger(struct snd_pcm_substream *substream, int cmd,228struct snd_soc_dai *dai)229{230struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);231struct snd_pcm_runtime *const runtime = substream->runtime;232struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);233struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);234int id = cpu_dai->id;235struct mtk_base_afe_memif *memif = &afe->memif[id];236int irq_id = memif->irq_usage;237struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];238const struct mtk_base_irq_data *irq_data = irqs->irq_data;239unsigned int counter = runtime->period_size;240unsigned int rate = runtime->rate;241unsigned int tmp_reg;242int fs;243int ret;244245dev_dbg(afe->dev, "%s(), %s cmd %d, irq_id %d, dai_id %d\n", __func__,246memif->data->name, cmd, irq_id, id);247248switch (cmd) {249case SNDRV_PCM_TRIGGER_START:250case SNDRV_PCM_TRIGGER_RESUME:251ret = mtk_memif_set_enable(afe, id);252if (ret) {253dev_err(afe->dev, "id %d, memif enable fail.\n", id);254return ret;255}256257/*258* for small latency record259* ul memif need read some data before irq enable260* the context of this triger ops is atmoic, so it cannot sleep261*/262if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)263if ((runtime->period_size * 1000) / rate <= 10)264udelay(300);265266regmap_update_bits(afe->regmap,267irq_data->irq_cnt_reg,268irq_data->irq_cnt_maskbit <<269irq_data->irq_cnt_shift,270counter << irq_data->irq_cnt_shift);271272/* set irq fs */273fs = afe->irq_fs(substream, rate);274if (fs < 0)275return -EINVAL;276277if (irq_data->irq_fs_reg >= 0)278regmap_update_bits(afe->regmap,279irq_data->irq_fs_reg,280irq_data->irq_fs_maskbit <<281irq_data->irq_fs_shift,282fs << irq_data->irq_fs_shift);283284/* enable interrupt */285regmap_update_bits(afe->regmap,286irq_data->irq_en_reg,2871 << irq_data->irq_en_shift,2881 << irq_data->irq_en_shift);289290return 0;291case SNDRV_PCM_TRIGGER_STOP:292case SNDRV_PCM_TRIGGER_SUSPEND:293ret = mtk_memif_set_disable(afe, id);294if (ret)295dev_warn(afe->dev, "id %d, memif disable fail\n", id);296297/* disable interrupt */298regmap_update_bits(afe->regmap,299irq_data->irq_en_reg,3001 << irq_data->irq_en_shift,3010 << irq_data->irq_en_shift);302303/*304* clear pending IRQ, if the register read as one, there is no305* need to write one to clear operation.306*/307regmap_read(afe->regmap, irq_data->irq_clr_reg, &tmp_reg);308regmap_update_bits(afe->regmap, irq_data->irq_clr_reg,309AFE_IRQ_CLR_CFG_MASK_SFT |310AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT,311tmp_reg ^ (AFE_IRQ_CLR_CFG_MASK_SFT |312AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT));313314return ret;315default:316return -EINVAL;317}318}319320static int mt8189_memif_fs(struct snd_pcm_substream *substream,321unsigned int rate)322{323struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);324struct snd_soc_component *component =325snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);326struct mtk_base_afe *afe = NULL;327328if (!component)329return -EINVAL;330331afe = snd_soc_component_get_drvdata(component);332if (!afe)333return -EINVAL;334335return mt8189_rate_transform(afe->dev, rate);336}337338static int mt8189_get_dai_fs(struct mtk_base_afe *afe,339int dai_id, unsigned int rate)340{341return mt8189_rate_transform(afe->dev, rate);342}343344static int mt8189_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)345{346struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);347struct snd_soc_component *component =348snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);349struct mtk_base_afe *afe = NULL;350351if (!component)352return -EINVAL;353afe = snd_soc_component_get_drvdata(component);354355return mt8189_rate_transform(afe->dev, rate);356}357358static int mt8189_get_memif_pbuf_size(struct snd_pcm_substream *substream)359{360struct snd_pcm_runtime *runtime = substream->runtime;361362if ((runtime->period_size * 1000) / runtime->rate > 10)363return MT8189_MEMIF_PBUF_SIZE_256_BYTES;364365return MT8189_MEMIF_PBUF_SIZE_32_BYTES;366}367368/* FE DAIs */369static const struct snd_soc_dai_ops mt8189_memif_dai_ops = {370.startup = mt8189_fe_startup,371.shutdown = mt8189_fe_shutdown,372.hw_params = mt8189_fe_hw_params,373.hw_free = mtk_afe_fe_hw_free,374.prepare = mtk_afe_fe_prepare,375.trigger = mt8189_fe_trigger,376};377378#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 | \379SNDRV_PCM_RATE_88200 | \380SNDRV_PCM_RATE_96000 | \381SNDRV_PCM_RATE_176400 | \382SNDRV_PCM_RATE_192000)383384#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 | \385SNDRV_PCM_RATE_16000 | \386SNDRV_PCM_RATE_32000 | \387SNDRV_PCM_RATE_48000)388389#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \390SNDRV_PCM_FMTBIT_S24_LE | \391SNDRV_PCM_FMTBIT_S32_LE)392393#define MT8189_FE_DAI_PLAYBACK(_name, _id, max_ch) \394{ \395.name = #_name, \396.id = _id, \397.playback = { \398.stream_name = #_name, \399.channels_min = 1, \400.channels_max = max_ch, \401.rates = MTK_PCM_RATES, \402.formats = MTK_PCM_FORMATS, \403}, \404.ops = &mt8189_memif_dai_ops, \405}406407#define MT8189_FE_DAI_CAPTURE(_name, _id, max_ch) \408{ \409.name = #_name, \410.id = _id, \411.capture = { \412.stream_name = #_name, \413.channels_min = 1, \414.channels_max = max_ch, \415.rates = MTK_PCM_RATES, \416.formats = MTK_PCM_FORMATS, \417}, \418.ops = &mt8189_memif_dai_ops, \419}420421static struct snd_soc_dai_driver mt8189_memif_dai_driver[] = {422/* FE DAIs: memory interfaces to CPU */423/* Playback */424MT8189_FE_DAI_PLAYBACK(DL0, MT8189_MEMIF_DL0, 2),425MT8189_FE_DAI_PLAYBACK(DL1, MT8189_MEMIF_DL1, 2),426MT8189_FE_DAI_PLAYBACK(DL2, MT8189_MEMIF_DL2, 2),427MT8189_FE_DAI_PLAYBACK(DL3, MT8189_MEMIF_DL3, 2),428MT8189_FE_DAI_PLAYBACK(DL4, MT8189_MEMIF_DL4, 2),429MT8189_FE_DAI_PLAYBACK(DL5, MT8189_MEMIF_DL5, 2),430MT8189_FE_DAI_PLAYBACK(DL6, MT8189_MEMIF_DL6, 2),431MT8189_FE_DAI_PLAYBACK(DL7, MT8189_MEMIF_DL7, 2),432MT8189_FE_DAI_PLAYBACK(DL8, MT8189_MEMIF_DL8, 2),433MT8189_FE_DAI_PLAYBACK(DL23, MT8189_MEMIF_DL23, 2),434MT8189_FE_DAI_PLAYBACK(DL24, MT8189_MEMIF_DL24, 2),435MT8189_FE_DAI_PLAYBACK(DL25, MT8189_MEMIF_DL25, 2),436MT8189_FE_DAI_PLAYBACK(DL_24CH, MT8189_MEMIF_DL_24CH, 8),437MT8189_FE_DAI_PLAYBACK(HDMI, MT8189_MEMIF_HDMI, 8),438/* Capture */439MT8189_FE_DAI_CAPTURE(UL0, MT8189_MEMIF_VUL0, 2),440MT8189_FE_DAI_CAPTURE(UL1, MT8189_MEMIF_VUL1, 2),441MT8189_FE_DAI_CAPTURE(UL2, MT8189_MEMIF_VUL2, 2),442MT8189_FE_DAI_CAPTURE(UL3, MT8189_MEMIF_VUL3, 2),443MT8189_FE_DAI_CAPTURE(UL4, MT8189_MEMIF_VUL4, 2),444MT8189_FE_DAI_CAPTURE(UL5, MT8189_MEMIF_VUL5, 2),445MT8189_FE_DAI_CAPTURE(UL6, MT8189_MEMIF_VUL6, 2),446MT8189_FE_DAI_CAPTURE(UL7, MT8189_MEMIF_VUL7, 2),447MT8189_FE_DAI_CAPTURE(UL8, MT8189_MEMIF_VUL8, 2),448MT8189_FE_DAI_CAPTURE(UL9, MT8189_MEMIF_VUL9, 16),449MT8189_FE_DAI_CAPTURE(UL10, MT8189_MEMIF_VUL10, 2),450MT8189_FE_DAI_CAPTURE(UL24, MT8189_MEMIF_VUL24, 2),451MT8189_FE_DAI_CAPTURE(UL25, MT8189_MEMIF_VUL25, 2),452MT8189_FE_DAI_CAPTURE(UL_CM0, MT8189_MEMIF_VUL_CM0, 8),453MT8189_FE_DAI_CAPTURE(UL_CM1, MT8189_MEMIF_VUL_CM1, 16),454MT8189_FE_DAI_CAPTURE(UL_ETDM_IN0, MT8189_MEMIF_ETDM_IN0, 2),455MT8189_FE_DAI_CAPTURE(UL_ETDM_IN1, MT8189_MEMIF_ETDM_IN1, 2),456};457458static int ul_cm0_event(struct snd_soc_dapm_widget *w,459struct snd_kcontrol *kcontrol,460int event)461{462struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);463struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);464struct mt8189_afe_private *afe_priv = afe->platform_priv;465unsigned int channels = afe_priv->cm_channels;466467dev_dbg(afe->dev, "%s(), event 0x%x, name %s, channels %d\n",468__func__, event, w->name, channels);469470switch (event) {471case SND_SOC_DAPM_PRE_PMU:472mt8189_enable_cm_bypass(afe, CM0, false);473mt8189_set_cm(afe, CM0, true, false, channels);474regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,475PDN_CM0_MASK_SFT, 0 << PDN_CM0_SFT);476477break;478case SND_SOC_DAPM_PRE_PMD:479mt8189_enable_cm_bypass(afe, CM0, true);480regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,481PDN_CM0_MASK_SFT, 1 << PDN_CM0_SFT);482break;483default:484break;485}486487return 0;488}489490static int ul_cm1_event(struct snd_soc_dapm_widget *w,491struct snd_kcontrol *kcontrol,492int event)493{494struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);495struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);496struct mt8189_afe_private *afe_priv = afe->platform_priv;497unsigned int channels = afe_priv->cm_channels;498499dev_dbg(afe->dev, "%s(), event 0x%x, name %s, channels %d\n",500__func__, event, w->name, channels);501502switch (event) {503case SND_SOC_DAPM_PRE_PMU:504mt8189_enable_cm_bypass(afe, CM1, false);505mt8189_set_cm(afe, CM1, true, false, channels);506regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,507PDN_CM1_MASK_SFT, 0 << PDN_CM1_SFT);508break;509case SND_SOC_DAPM_POST_PMD:510mt8189_enable_cm_bypass(afe, CM1, true);511regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,512PDN_CM1_MASK_SFT, 1 << PDN_CM1_SFT);513break;514default:515break;516}517518return 0;519}520521/*522* dma widget & routes523* The mixer controls and routes are by no means fully implemented,524* only the ones that are intended to be used are, as other wise a fully525* interconnected switch bar mixer would introduce way too many unused526* controls.527*/528static const struct snd_kcontrol_new memif_ul0_ch1_mix[] = {529/* Normal record */530SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN018_0,531I_ADDA_UL_CH1, 1, 0),532SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN018_0,533I_ADDA_UL_CH2, 1, 0),534SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN018_0,535I_ADDA_UL_CH3, 1, 0),536SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN018_0,537I_ADDA_UL_CH4, 1, 0),538/* AP DMIC */539SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH1", AFE_CONN018_0,540I_DMIC0_CH1, 1, 0),541SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH2", AFE_CONN018_0,542I_DMIC0_CH2, 1, 0),543SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN018_1,544I_DL0_CH1, 1, 0),545SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN018_1,546I_DL1_CH1, 1, 0),547SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN018_1,548I_DL2_CH1, 1, 0),549SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN018_1,550I_DL3_CH1, 1, 0),551SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN018_1,552I_DL4_CH1, 1, 0),553SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN018_1,554I_DL6_CH1, 1, 0),555SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH1", AFE_CONN018_1,556I_DL7_CH1, 1, 0),557SOC_DAPM_SINGLE_AUTODISABLE("DL23_CH1", AFE_CONN018_2,558I_DL23_CH1, 1, 0),559SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN018_1,560I_DL_24CH_CH1, 1, 0),561SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN018_4,562I_PCM_0_CAP_CH1, 1, 0),563SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN018_4,564I_I2SIN0_CH1, 1, 0),565SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH1", AFE_CONN018_4,566I_I2SIN1_CH1, 1, 0),567SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH1", AFE_CONN018_6,568I_SRC_0_OUT_CH1, 1, 0),569SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1", AFE_CONN018_6,570I_SRC_2_OUT_CH1, 1, 0),571};572573static const struct snd_kcontrol_new memif_ul0_ch2_mix[] = {574/* Normal record */575SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN019_0,576I_ADDA_UL_CH1, 1, 0),577SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN019_0,578I_ADDA_UL_CH2, 1, 0),579SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN019_0,580I_ADDA_UL_CH3, 1, 0),581SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN019_0,582I_ADDA_UL_CH4, 1, 0),583/* AP DMIC */584SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH2", AFE_CONN019_0,585I_DMIC0_CH2, 1, 0),586SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN019_1,587I_DL0_CH2, 1, 0),588SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN019_1,589I_DL1_CH2, 1, 0),590SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN019_1,591I_DL2_CH2, 1, 0),592SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN019_1,593I_DL3_CH2, 1, 0),594SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN019_1,595I_DL4_CH2, 1, 0),596SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN019_1,597I_DL6_CH2, 1, 0),598SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH2", AFE_CONN019_1,599I_DL7_CH2, 1, 0),600SOC_DAPM_SINGLE_AUTODISABLE("DL23_CH2", AFE_CONN018_2,601I_DL23_CH2, 1, 0),602SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN019_1,603I_DL_24CH_CH2, 1, 0),604SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN019_4,605I_PCM_0_CAP_CH1, 1, 0),606SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN019_4,607I_PCM_0_CAP_CH2, 1, 0),608SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN019_4,609I_I2SIN0_CH2, 1, 0),610SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH2", AFE_CONN019_4,611I_I2SIN1_CH2, 1, 0),612SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH2", AFE_CONN019_6,613I_SRC_0_OUT_CH2, 1, 0),614SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2", AFE_CONN019_6,615I_SRC_2_OUT_CH2, 1, 0),616};617618static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {619SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN020_0,620I_ADDA_UL_CH1, 1, 0),621SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN020_1,622I_DL0_CH1, 1, 0),623SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN020_1,624I_DL1_CH1, 1, 0),625SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN020_1,626I_DL2_CH1, 1, 0),627SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN020_1,628I_DL3_CH1, 1, 0),629SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN020_1,630I_DL4_CH1, 1, 0),631SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN020_1,632I_DL6_CH1, 1, 0),633SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH1", AFE_CONN020_1,634I_DL7_CH1, 1, 0),635SOC_DAPM_SINGLE_AUTODISABLE("DL23_CH1", AFE_CONN020_2,636I_DL23_CH1, 1, 0),637SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN020_1,638I_DL_24CH_CH1, 1, 0),639SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN020_4,640I_PCM_0_CAP_CH1, 1, 0),641SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN020_4,642I_I2SIN0_CH1, 1, 0),643SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH1", AFE_CONN020_4,644I_I2SIN1_CH1, 1, 0),645SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH1", AFE_CONN020_6,646I_SRC_0_OUT_CH1, 1, 0),647SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1", AFE_CONN020_6,648I_SRC_2_OUT_CH1, 1, 0),649};650651static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {652SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN021_0,653I_ADDA_UL_CH2, 1, 0),654SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN021_1,655I_DL0_CH2, 1, 0),656SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN021_1,657I_DL1_CH2, 1, 0),658SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN021_1,659I_DL2_CH2, 1, 0),660SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN021_1,661I_DL3_CH2, 1, 0),662SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN021_1,663I_DL4_CH2, 1, 0),664SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN021_1,665I_DL6_CH2, 1, 0),666SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH2", AFE_CONN021_1,667I_DL7_CH2, 1, 0),668SOC_DAPM_SINGLE_AUTODISABLE("DL23_CH2", AFE_CONN021_2,669I_DL23_CH2, 1, 0),670SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN021_1,671I_DL_24CH_CH2, 1, 0),672SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN021_4,673I_PCM_0_CAP_CH1, 1, 0),674SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN021_4,675I_PCM_0_CAP_CH2, 1, 0),676SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN021_4,677I_I2SIN0_CH2, 1, 0),678SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH2", AFE_CONN021_4,679I_I2SIN1_CH2, 1, 0),680SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH2", AFE_CONN021_6,681I_SRC_0_OUT_CH2, 1, 0),682SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2", AFE_CONN021_6,683I_SRC_2_OUT_CH2, 1, 0),684};685686static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {687SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN022_0,688I_ADDA_UL_CH1, 1, 0),689SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN022_0,690I_ADDA_UL_CH2, 1, 0),691SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN022_0,692I_ADDA_UL_CH3, 1, 0),693SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN022_0,694I_ADDA_UL_CH4, 1, 0),695/* AP DMIC */696SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH3", AFE_CONN022_0,697I_DMIC1_CH1, 1, 0),698SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN1_OUT_CH1", AFE_CONN022_0,699I_GAIN1_OUT_CH1, 1, 0),700SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH1", AFE_CONN022_6,701I_SRC_1_OUT_CH1, 1, 0),702};703704static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {705SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN023_0,706I_ADDA_UL_CH1, 1, 0),707SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN023_0,708I_ADDA_UL_CH2, 1, 0),709SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN023_0,710I_ADDA_UL_CH3, 1, 0),711SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN023_0,712I_ADDA_UL_CH4, 1, 0),713/* AP DMIC */714SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH4", AFE_CONN023_0,715I_DMIC1_CH2, 1, 0),716SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN1_OUT_CH2", AFE_CONN023_0,717I_GAIN1_OUT_CH2, 1, 0),718SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH2", AFE_CONN023_6,719I_SRC_1_OUT_CH2, 1, 0),720};721722static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {723SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN024_0,724I_ADDA_UL_CH1, 1, 0),725SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH1", AFE_CONN024_4,726I_I2SIN1_CH1, 1, 0),727SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH1", AFE_CONN024_6,728I_SRC_3_OUT_CH1, 1, 0),729};730731static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {732SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN025_0,733I_ADDA_UL_CH2, 1, 0),734SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH2", AFE_CONN025_4,735I_I2SIN1_CH2, 1, 0),736SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH2", AFE_CONN025_6,737I_SRC_3_OUT_CH2, 1, 0),738};739740static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {741SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN026_0,742I_ADDA_UL_CH1, 1, 0),743SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN026_1,744I_DL0_CH1, 1, 0),745SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN026_1,746I_DL1_CH1, 1, 0),747SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN026_1,748I_DL6_CH1, 1, 0),749SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN026_1,750I_DL2_CH1, 1, 0),751SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN026_1,752I_DL3_CH1, 1, 0),753SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN026_1,754I_DL_24CH_CH1, 1, 0),755SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN026_4,756I_PCM_0_CAP_CH1, 1, 0),757SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN0_OUT_CH1", AFE_CONN026_0,758I_GAIN0_OUT_CH1, 1, 0),759SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH1", AFE_CONN026_6,760I_SRC_3_OUT_CH1, 1, 0),761};762763static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = {764SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN027_0,765I_ADDA_UL_CH2, 1, 0),766SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN027_1,767I_DL0_CH2, 1, 0),768SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN027_1,769I_DL1_CH2, 1, 0),770SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN027_1,771I_DL6_CH2, 1, 0),772SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN027_1,773I_DL2_CH2, 1, 0),774SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN027_1,775I_DL3_CH2, 1, 0),776SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN027_1,777I_DL_24CH_CH2, 1, 0),778SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN027_4,779I_PCM_0_CAP_CH1, 1, 0),780SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN027_4,781I_PCM_0_CAP_CH2, 1, 0),782SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN0_OUT_CH2", AFE_CONN027_0,783I_GAIN0_OUT_CH2, 1, 0),784SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH2", AFE_CONN027_6,785I_SRC_3_OUT_CH2, 1, 0),786};787788static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = {789SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN028_0,790I_ADDA_UL_CH1, 1, 0),791SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN028_1,792I_DL0_CH1, 1, 0),793SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN028_1,794I_DL1_CH1, 1, 0),795SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN028_1,796I_DL6_CH1, 1, 0),797SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN028_1,798I_DL2_CH1, 1, 0),799SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN028_1,800I_DL3_CH1, 1, 0),801SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN028_1,802I_DL_24CH_CH1, 1, 0),803SOC_DAPM_SINGLE_AUTODISABLE("GAIN0_OUT_CH1", AFE_CONN028_0,804I_GAIN0_OUT_CH1, 1, 0),805SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH1", AFE_CONN028_6,806I_SRC_3_OUT_CH1, 1, 0),807};808809static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = {810SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN029_0,811I_ADDA_UL_CH2, 1, 0),812SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN029_1,813I_DL0_CH2, 1, 0),814SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN029_1,815I_DL1_CH2, 1, 0),816SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN029_1,817I_DL6_CH2, 1, 0),818SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN029_1,819I_DL2_CH2, 1, 0),820SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN029_1,821I_DL3_CH2, 1, 0),822SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN029_1,823I_DL_24CH_CH2, 1, 0),824SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN029_4,825I_PCM_0_CAP_CH1, 1, 0),826SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN029_4,827I_PCM_0_CAP_CH2, 1, 0),828SOC_DAPM_SINGLE_AUTODISABLE("GAIN0_OUT_CH2", AFE_CONN029_0,829I_GAIN0_OUT_CH2, 1, 0),830SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH2", AFE_CONN029_6,831I_SRC_3_OUT_CH2, 1, 0),832};833834static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = {835SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN030_0,836I_ADDA_UL_CH1, 1, 0),837SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH1", AFE_CONN030_0,838I_DMIC0_CH1, 1, 0),839SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN030_1,840I_DL1_CH1, 1, 0),841SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN030_1,842I_DL2_CH1, 1, 0),843SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN030_4,844I_I2SIN0_CH1, 1, 0),845SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_4_OUT_CH1", AFE_CONN030_6,846I_SRC_4_OUT_CH1, 1, 0),847};848849static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = {850SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN031_0,851I_ADDA_UL_CH2, 1, 0),852SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH2", AFE_CONN031_0,853I_DMIC0_CH2, 1, 0),854SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN031_1,855I_DL1_CH2, 1, 0),856SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN031_1,857I_DL2_CH2, 1, 0),858SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN031_4,859I_I2SIN0_CH2, 1, 0),860SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_4_OUT_CH2", AFE_CONN031_6,861I_SRC_4_OUT_CH2, 1, 0),862};863864static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = {865SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN032_0,866I_ADDA_UL_CH1, 1, 0),867SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN032_0,868I_ADDA_UL_CH2, 1, 0),869SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH3", AFE_CONN032_0,870I_DMIC1_CH1, 1, 0),871SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN032_1,872I_DL1_CH1, 1, 0),873SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN032_1,874I_DL2_CH1, 1, 0),875SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN032_4,876I_I2SIN0_CH1, 1, 0),877SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_4_OUT_CH1", AFE_CONN032_6,878I_SRC_4_OUT_CH1, 1, 0),879};880881static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = {882SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN033_0,883I_ADDA_UL_CH1, 1, 0),884SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN033_0,885I_ADDA_UL_CH2, 1, 0),886SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH4", AFE_CONN033_0,887I_DMIC1_CH2, 1, 0),888SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN033_1,889I_DL1_CH2, 1, 0),890SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN033_1,891I_DL2_CH2, 1, 0),892SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN033_4,893I_I2SIN0_CH2, 1, 0),894SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_4_OUT_CH2", AFE_CONN033_6,895I_SRC_4_OUT_CH2, 1, 0),896};897898static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = {899SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN034_0,900I_ADDA_UL_CH1, 1, 0),901};902903static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = {904SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN035_0,905I_ADDA_UL_CH1, 1, 0),906SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN035_4,907I_PCM_0_CAP_CH1, 1, 0),908SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN035_4,909I_PCM_0_CAP_CH2, 1, 0),910};911912static const struct snd_kcontrol_new memif_ul9_ch1_mix[] = {913SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN036_0,914I_ADDA_UL_CH1, 1, 0),915SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN036_0,916I_ADDA_UL_CH2, 1, 0),917SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN036_0,918I_ADDA_UL_CH3, 1, 0),919};920921static const struct snd_kcontrol_new memif_ul9_ch2_mix[] = {922SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN037_0,923I_ADDA_UL_CH1, 1, 0),924SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN037_0,925I_ADDA_UL_CH2, 1, 0),926SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN037_0,927I_ADDA_UL_CH3, 1, 0),928SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN037_0,929I_ADDA_UL_CH4, 1, 0),930};931932static const struct snd_kcontrol_new memif_ul24_ch1_mix[] = {933SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN066_0,934I_ADDA_UL_CH1, 1, 0),935};936937static const struct snd_kcontrol_new memif_ul24_ch2_mix[] = {938SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN067_0,939I_ADDA_UL_CH2, 1, 0),940};941942static const struct snd_kcontrol_new memif_ul_cm0_ch1_mix[] = {943SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN040_0,944I_ADDA_UL_CH1, 1, 0),945SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN040_0,946I_ADDA_UL_CH2, 1, 0),947SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN040_0,948I_ADDA_UL_CH3, 1, 0),949SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN040_0,950I_ADDA_UL_CH4, 1, 0),951SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH1", AFE_CONN040_0,952I_DMIC0_CH1, 1, 0),953SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN1_OUT_CH1", AFE_CONN040_0,954I_GAIN1_OUT_CH1, 1, 0),955SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH1", AFE_CONN040_6,956I_SRC_0_OUT_CH1, 1, 0),957SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH1", AFE_CONN040_6,958I_SRC_1_OUT_CH1, 1, 0),959};960961static const struct snd_kcontrol_new memif_ul_cm0_ch2_mix[] = {962SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN041_0,963I_ADDA_UL_CH1, 1, 0),964SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN041_0,965I_ADDA_UL_CH2, 1, 0),966SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN041_0,967I_ADDA_UL_CH3, 1, 0),968SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN041_0,969I_ADDA_UL_CH4, 1, 0),970SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH2", AFE_CONN041_0,971I_DMIC0_CH1, 1, 0),972SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN1_OUT_CH2", AFE_CONN041_0,973I_GAIN1_OUT_CH2, 1, 0),974SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH2", AFE_CONN041_6,975I_SRC_0_OUT_CH2, 1, 0),976SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH2", AFE_CONN041_6,977I_SRC_1_OUT_CH2, 1, 0),978};979980static const struct snd_kcontrol_new memif_ul_cm0_ch3_mix[] = {981SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN042_0,982I_ADDA_UL_CH1, 1, 0),983SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN042_0,984I_ADDA_UL_CH2, 1, 0),985SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN042_0,986I_ADDA_UL_CH3, 1, 0),987SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN042_0,988I_ADDA_UL_CH4, 1, 0),989SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH3", AFE_CONN042_0,990I_DMIC1_CH1, 1, 0),991};992993static const struct snd_kcontrol_new memif_ul_cm0_ch4_mix[] = {994SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN043_0,995I_ADDA_UL_CH1, 1, 0),996SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN043_0,997I_ADDA_UL_CH2, 1, 0),998SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN043_0,999I_ADDA_UL_CH3, 1, 0),1000SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN043_0,1001I_ADDA_UL_CH4, 1, 0),1002SOC_DAPM_SINGLE_AUTODISABLE("AP_DMIC_UL_CH4", AFE_CONN043_0,1003I_DMIC1_CH2, 1, 0),1004};10051006static const struct snd_kcontrol_new memif_ul_cm0_ch5_mix[] = {1007SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN044_0,1008I_ADDA_UL_CH1, 1, 0),1009SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN044_0,1010I_ADDA_UL_CH2, 1, 0),1011SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN044_0,1012I_ADDA_UL_CH3, 1, 0),1013SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN044_0,1014I_ADDA_UL_CH4, 1, 0),1015};10161017static const struct snd_kcontrol_new memif_ul_cm0_ch6_mix[] = {1018SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN045_0,1019I_ADDA_UL_CH1, 1, 0),1020SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN045_0,1021I_ADDA_UL_CH2, 1, 0),1022SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN045_0,1023I_ADDA_UL_CH3, 1, 0),1024SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN045_0,1025I_ADDA_UL_CH4, 1, 0),1026};10271028static const struct snd_kcontrol_new memif_ul_cm0_ch7_mix[] = {1029SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN046_0,1030I_ADDA_UL_CH1, 1, 0),1031SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN046_0,1032I_ADDA_UL_CH2, 1, 0),1033SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN046_0,1034I_ADDA_UL_CH3, 1, 0),1035SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN046_0,1036I_ADDA_UL_CH4, 1, 0),1037};10381039static const struct snd_kcontrol_new memif_ul_cm0_ch8_mix[] = {1040SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN047_0,1041I_ADDA_UL_CH1, 1, 0),1042SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN047_0,1043I_ADDA_UL_CH2, 1, 0),1044SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN047_0,1045I_ADDA_UL_CH3, 1, 0),1046SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN047_0,1047I_ADDA_UL_CH4, 1, 0),1048};10491050static const struct snd_kcontrol_new memif_ul_cm1_ch1_mix[] = {1051SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN048_0,1052I_ADDA_UL_CH1, 1, 0),1053SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN048_0,1054I_ADDA_UL_CH2, 1, 0),1055SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN048_0,1056I_ADDA_UL_CH3, 1, 0),1057SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN048_0,1058I_ADDA_UL_CH4, 1, 0),1059SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN048_0,1060I_ADDA_UL_CH5, 1, 0),1061SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN048_0,1062I_ADDA_UL_CH6, 1, 0),1063SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH1", AFE_CONN048_6,1064I_SRC_0_OUT_CH1, 1, 0),1065SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH1", AFE_CONN048_6,1066I_SRC_3_OUT_CH1, 1, 0),1067SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_4_OUT_CH1", AFE_CONN048_6,1068I_SRC_4_OUT_CH1, 1, 0),1069};10701071static const struct snd_kcontrol_new memif_ul_cm1_ch2_mix[] = {1072SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN049_0,1073I_ADDA_UL_CH1, 1, 0),1074SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN049_0,1075I_ADDA_UL_CH2, 1, 0),1076SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN049_0,1077I_ADDA_UL_CH3, 1, 0),1078SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN049_0,1079I_ADDA_UL_CH4, 1, 0),1080SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN049_0,1081I_ADDA_UL_CH5, 1, 0),1082SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN049_0,1083I_ADDA_UL_CH6, 1, 0),1084SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH2", AFE_CONN049_6,1085I_SRC_0_OUT_CH2, 1, 0),1086SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_3_OUT_CH2", AFE_CONN049_6,1087I_SRC_3_OUT_CH2, 1, 0),1088SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_4_OUT_CH2", AFE_CONN049_6,1089I_SRC_4_OUT_CH2, 1, 0),1090};10911092static const struct snd_kcontrol_new memif_ul_cm1_ch3_mix[] = {1093SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN050_0,1094I_ADDA_UL_CH1, 1, 0),1095SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN050_0,1096I_ADDA_UL_CH2, 1, 0),1097SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN050_0,1098I_ADDA_UL_CH3, 1, 0),1099SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN050_0,1100I_ADDA_UL_CH4, 1, 0),1101SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN050_0,1102I_ADDA_UL_CH5, 1, 0),1103SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN050_0,1104I_ADDA_UL_CH6, 1, 0),1105};11061107static const struct snd_kcontrol_new memif_ul_cm1_ch4_mix[] = {1108SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN051_0,1109I_ADDA_UL_CH1, 1, 0),1110SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN051_0,1111I_ADDA_UL_CH2, 1, 0),1112SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN051_0,1113I_ADDA_UL_CH3, 1, 0),1114SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN051_0,1115I_ADDA_UL_CH4, 1, 0),1116SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN051_0,1117I_ADDA_UL_CH5, 1, 0),1118SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN051_0,1119I_ADDA_UL_CH6, 1, 0),1120};11211122static const struct snd_kcontrol_new memif_ul_cm1_ch5_mix[] = {1123SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN052_0,1124I_ADDA_UL_CH1, 1, 0),1125SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN052_0,1126I_ADDA_UL_CH2, 1, 0),1127SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN052_0,1128I_ADDA_UL_CH3, 1, 0),1129SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN052_0,1130I_ADDA_UL_CH4, 1, 0),1131SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN052_0,1132I_ADDA_UL_CH5, 1, 0),1133SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN052_0,1134I_ADDA_UL_CH6, 1, 0),1135};11361137static const struct snd_kcontrol_new memif_ul_cm1_ch6_mix[] = {1138SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN053_0,1139I_ADDA_UL_CH1, 1, 0),1140SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN053_0,1141I_ADDA_UL_CH2, 1, 0),1142SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN053_0,1143I_ADDA_UL_CH3, 1, 0),1144SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN053_0,1145I_ADDA_UL_CH4, 1, 0),1146SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN053_0,1147I_ADDA_UL_CH5, 1, 0),1148SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN053_0,1149I_ADDA_UL_CH6, 1, 0),1150};11511152static const struct snd_kcontrol_new memif_ul_cm1_ch7_mix[] = {1153SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN054_0,1154I_ADDA_UL_CH1, 1, 0),1155SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN054_0,1156I_ADDA_UL_CH2, 1, 0),1157SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN054_0,1158I_ADDA_UL_CH3, 1, 0),1159SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN054_0,1160I_ADDA_UL_CH4, 1, 0),1161};11621163static const struct snd_kcontrol_new memif_ul_cm1_ch8_mix[] = {1164SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN055_0,1165I_ADDA_UL_CH1, 1, 0),1166SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN055_0,1167I_ADDA_UL_CH2, 1, 0),1168SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN055_0,1169I_ADDA_UL_CH3, 1, 0),1170SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN055_0,1171I_ADDA_UL_CH4, 1, 0),1172};11731174static const struct snd_kcontrol_new memif_ul_cm1_ch9_mix[] = {1175SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN056_0,1176I_ADDA_UL_CH1, 1, 0),1177SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN056_0,1178I_ADDA_UL_CH2, 1, 0),1179SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN056_0,1180I_ADDA_UL_CH3, 1, 0),1181SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN056_0,1182I_ADDA_UL_CH4, 1, 0),1183};11841185static const struct snd_kcontrol_new memif_ul_cm1_ch10_mix[] = {1186SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN057_0,1187I_ADDA_UL_CH1, 1, 0),1188SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN057_0,1189I_ADDA_UL_CH2, 1, 0),1190SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN057_0,1191I_ADDA_UL_CH3, 1, 0),1192SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN057_0,1193I_ADDA_UL_CH4, 1, 0),1194};11951196static const struct snd_kcontrol_new memif_ul_cm1_ch11_mix[] = {1197SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN058_0,1198I_ADDA_UL_CH1, 1, 0),1199SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN058_0,1200I_ADDA_UL_CH2, 1, 0),1201SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN058_0,1202I_ADDA_UL_CH3, 1, 0),1203SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN058_0,1204I_ADDA_UL_CH4, 1, 0),1205};12061207static const struct snd_kcontrol_new memif_ul_cm1_ch12_mix[] = {1208SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN059_0,1209I_ADDA_UL_CH1, 1, 0),1210SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN059_0,1211I_ADDA_UL_CH2, 1, 0),1212SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN059_0,1213I_ADDA_UL_CH3, 1, 0),1214SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN059_0,1215I_ADDA_UL_CH4, 1, 0),1216};12171218static const struct snd_kcontrol_new memif_ul_cm1_ch13_mix[] = {1219SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN060_0,1220I_ADDA_UL_CH1, 1, 0),1221SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN060_0,1222I_ADDA_UL_CH2, 1, 0),1223SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN060_0,1224I_ADDA_UL_CH3, 1, 0),1225SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN060_0,1226I_ADDA_UL_CH4, 1, 0),1227};12281229static const struct snd_kcontrol_new memif_ul_cm1_ch14_mix[] = {1230SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN061_0,1231I_ADDA_UL_CH1, 1, 0),1232SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN061_0,1233I_ADDA_UL_CH2, 1, 0),1234SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN061_0,1235I_ADDA_UL_CH3, 1, 0),1236SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN061_0,1237I_ADDA_UL_CH4, 1, 0),1238};12391240static const struct snd_kcontrol_new memif_ul_cm1_ch15_mix[] = {1241SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN062_0,1242I_ADDA_UL_CH1, 1, 0),1243SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN062_0,1244I_ADDA_UL_CH2, 1, 0),1245SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN062_0,1246I_ADDA_UL_CH3, 1, 0),1247SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN062_0,1248I_ADDA_UL_CH4, 1, 0),1249};12501251static const struct snd_kcontrol_new memif_ul_cm1_ch16_mix[] = {1252SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN063_0,1253I_ADDA_UL_CH1, 1, 0),1254SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN063_0,1255I_ADDA_UL_CH2, 1, 0),1256SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN063_0,1257I_ADDA_UL_CH3, 1, 0),1258SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN063_0,1259I_ADDA_UL_CH4, 1, 0),1260};12611262static const char * const cm0_mux_texts[] = {1263"CM0_2CH_PATH",1264"CM0_8CH_PATH",1265};12661267static const char * const cm1_mux_map_texts[] = {1268"CM1_2CH_PATH",1269"CM1_16CH_PATH",1270};12711272static SOC_ENUM_SINGLE_DECL(ul_cm0_mux_map_enum,1273AFE_CM0_CON0,1274AFE_CM0_OUTPUT_MUX_SFT,1275cm0_mux_texts);1276static SOC_ENUM_SINGLE_DECL(ul_cm1_mux_map_enum,1277AFE_CM1_CON0,1278AFE_CM1_OUTPUT_MUX_SFT,1279cm1_mux_map_texts);12801281static const struct snd_kcontrol_new ul_cm0_mux_control =1282SOC_DAPM_ENUM("CM0_UL_MUX Route", ul_cm0_mux_map_enum);1283static const struct snd_kcontrol_new ul_cm1_mux_control =1284SOC_DAPM_ENUM("CM1_UL_MUX Route", ul_cm1_mux_map_enum);12851286static const struct snd_soc_dapm_widget mt8189_memif_widgets[] = {1287/* inter-connections */1288SND_SOC_DAPM_MIXER("UL0_CH1", SND_SOC_NOPM, 0, 0,1289memif_ul0_ch1_mix, ARRAY_SIZE(memif_ul0_ch1_mix)),1290SND_SOC_DAPM_MIXER("UL0_CH2", SND_SOC_NOPM, 0, 0,1291memif_ul0_ch2_mix, ARRAY_SIZE(memif_ul0_ch2_mix)),12921293SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,1294memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),1295SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,1296memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),12971298SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,1299memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),1300SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,1301memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),13021303SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,1304memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),1305SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,1306memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),13071308SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0,1309memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)),1310SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0,1311memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)),13121313SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0,1314memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)),1315SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0,1316memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)),13171318SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0,1319memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)),1320SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0,1321memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)),13221323SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0,1324memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)),1325SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0,1326memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)),13271328SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0,1329memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)),1330SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0,1331memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)),13321333SND_SOC_DAPM_MIXER("UL9_CH1", SND_SOC_NOPM, 0, 0,1334memif_ul9_ch1_mix, ARRAY_SIZE(memif_ul9_ch1_mix)),1335SND_SOC_DAPM_MIXER("UL9_CH2", SND_SOC_NOPM, 0, 0,1336memif_ul9_ch2_mix, ARRAY_SIZE(memif_ul9_ch2_mix)),13371338SND_SOC_DAPM_MIXER("UL24_CH1", SND_SOC_NOPM, 0, 0,1339memif_ul24_ch1_mix, ARRAY_SIZE(memif_ul24_ch1_mix)),1340SND_SOC_DAPM_MIXER("UL24_CH2", SND_SOC_NOPM, 0, 0,1341memif_ul24_ch2_mix, ARRAY_SIZE(memif_ul24_ch2_mix)),13421343SND_SOC_DAPM_MIXER("UL_CM0_CH1", SND_SOC_NOPM, 0, 0,1344memif_ul_cm0_ch1_mix, ARRAY_SIZE(memif_ul_cm0_ch1_mix)),1345SND_SOC_DAPM_MIXER("UL_CM0_CH2", SND_SOC_NOPM, 0, 0,1346memif_ul_cm0_ch2_mix, ARRAY_SIZE(memif_ul_cm0_ch2_mix)),1347SND_SOC_DAPM_MIXER("UL_CM0_CH3", SND_SOC_NOPM, 0, 0,1348memif_ul_cm0_ch3_mix, ARRAY_SIZE(memif_ul_cm0_ch3_mix)),1349SND_SOC_DAPM_MIXER("UL_CM0_CH4", SND_SOC_NOPM, 0, 0,1350memif_ul_cm0_ch4_mix, ARRAY_SIZE(memif_ul_cm0_ch4_mix)),1351SND_SOC_DAPM_MIXER("UL_CM0_CH5", SND_SOC_NOPM, 0, 0,1352memif_ul_cm0_ch5_mix, ARRAY_SIZE(memif_ul_cm0_ch5_mix)),1353SND_SOC_DAPM_MIXER("UL_CM0_CH6", SND_SOC_NOPM, 0, 0,1354memif_ul_cm0_ch6_mix, ARRAY_SIZE(memif_ul_cm0_ch6_mix)),1355SND_SOC_DAPM_MIXER("UL_CM0_CH7", SND_SOC_NOPM, 0, 0,1356memif_ul_cm0_ch7_mix, ARRAY_SIZE(memif_ul_cm0_ch7_mix)),1357SND_SOC_DAPM_MIXER("UL_CM0_CH8", SND_SOC_NOPM, 0, 0,1358memif_ul_cm0_ch8_mix, ARRAY_SIZE(memif_ul_cm0_ch8_mix)),1359SND_SOC_DAPM_MUX_E("CM0_UL_MUX", SND_SOC_NOPM, 0, 0,1360&ul_cm0_mux_control,1361ul_cm0_event,1362SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),13631364SND_SOC_DAPM_MIXER("UL_CM1_CH1", SND_SOC_NOPM, 0, 0,1365memif_ul_cm1_ch1_mix, ARRAY_SIZE(memif_ul_cm1_ch1_mix)),1366SND_SOC_DAPM_MIXER("UL_CM1_CH2", SND_SOC_NOPM, 0, 0,1367memif_ul_cm1_ch2_mix, ARRAY_SIZE(memif_ul_cm1_ch2_mix)),1368SND_SOC_DAPM_MIXER("UL_CM1_CH3", SND_SOC_NOPM, 0, 0,1369memif_ul_cm1_ch3_mix, ARRAY_SIZE(memif_ul_cm1_ch3_mix)),1370SND_SOC_DAPM_MIXER("UL_CM1_CH4", SND_SOC_NOPM, 0, 0,1371memif_ul_cm1_ch4_mix, ARRAY_SIZE(memif_ul_cm1_ch4_mix)),1372SND_SOC_DAPM_MIXER("UL_CM1_CH5", SND_SOC_NOPM, 0, 0,1373memif_ul_cm1_ch5_mix, ARRAY_SIZE(memif_ul_cm1_ch5_mix)),1374SND_SOC_DAPM_MIXER("UL_CM1_CH6", SND_SOC_NOPM, 0, 0,1375memif_ul_cm1_ch6_mix, ARRAY_SIZE(memif_ul_cm1_ch6_mix)),1376SND_SOC_DAPM_MIXER("UL_CM1_CH7", SND_SOC_NOPM, 0, 0,1377memif_ul_cm1_ch7_mix, ARRAY_SIZE(memif_ul_cm1_ch7_mix)),1378SND_SOC_DAPM_MIXER("UL_CM1_CH8", SND_SOC_NOPM, 0, 0,1379memif_ul_cm1_ch8_mix, ARRAY_SIZE(memif_ul_cm1_ch8_mix)),1380SND_SOC_DAPM_MIXER("UL_CM1_CH9", SND_SOC_NOPM, 0, 0,1381memif_ul_cm1_ch9_mix, ARRAY_SIZE(memif_ul_cm1_ch9_mix)),1382SND_SOC_DAPM_MIXER("UL_CM1_CH10", SND_SOC_NOPM, 0, 0,1383memif_ul_cm1_ch10_mix, ARRAY_SIZE(memif_ul_cm1_ch10_mix)),1384SND_SOC_DAPM_MIXER("UL_CM1_CH11", SND_SOC_NOPM, 0, 0,1385memif_ul_cm1_ch11_mix, ARRAY_SIZE(memif_ul_cm1_ch11_mix)),1386SND_SOC_DAPM_MIXER("UL_CM1_CH12", SND_SOC_NOPM, 0, 0,1387memif_ul_cm1_ch12_mix, ARRAY_SIZE(memif_ul_cm1_ch12_mix)),1388SND_SOC_DAPM_MIXER("UL_CM1_CH13", SND_SOC_NOPM, 0, 0,1389memif_ul_cm1_ch13_mix, ARRAY_SIZE(memif_ul_cm1_ch13_mix)),1390SND_SOC_DAPM_MIXER("UL_CM1_CH14", SND_SOC_NOPM, 0, 0,1391memif_ul_cm1_ch14_mix, ARRAY_SIZE(memif_ul_cm1_ch14_mix)),1392SND_SOC_DAPM_MIXER("UL_CM1_CH15", SND_SOC_NOPM, 0, 0,1393memif_ul_cm1_ch15_mix, ARRAY_SIZE(memif_ul_cm1_ch15_mix)),1394SND_SOC_DAPM_MIXER("UL_CM1_CH16", SND_SOC_NOPM, 0, 0,1395memif_ul_cm1_ch16_mix, ARRAY_SIZE(memif_ul_cm1_ch16_mix)),1396SND_SOC_DAPM_MUX("CM1_UL_MUX", SND_SOC_NOPM, 0, 0,1397&ul_cm1_mux_control),1398SND_SOC_DAPM_SUPPLY("CM0_Enable",1399AFE_CM0_CON0, AFE_CM0_ON_SFT, 0,1400ul_cm0_event,1401SND_SOC_DAPM_PRE_PMU |1402SND_SOC_DAPM_PRE_PMD),14031404SND_SOC_DAPM_SUPPLY("CM1_Enable",1405AFE_CM1_CON0, AFE_CM0_ON_SFT, 0,1406ul_cm1_event,1407SND_SOC_DAPM_PRE_PMU |1408SND_SOC_DAPM_PRE_PMD),14091410/* dynamic pinctrl */1411SND_SOC_DAPM_PINCTRL("I2S0_PIN", "aud-gpio-i2s0-on", "aud-gpio-i2s0-off"),1412SND_SOC_DAPM_PINCTRL("I2S1_PIN", "aud-gpio-i2s1-on", "aud-gpio-i2s1-off"),1413SND_SOC_DAPM_PINCTRL("PCM0_PIN", "aud-gpio-pcm-on", "aud-gpio-pcm-off"),1414SND_SOC_DAPM_PINCTRL("AP_DMIC0_PIN", "aud-gpio-ap-dmic-on", "aud-gpio-ap-dmic-off"),1415SND_SOC_DAPM_PINCTRL("AP_DMIC1_PIN", "aud-gpio-ap-dmic1-on", "aud-gpio-ap-dmic1-off"),1416};14171418static const struct snd_soc_dapm_route mt8189_memif_routes[] = {1419{"UL0", NULL, "UL0_CH1"},1420{"UL0", NULL, "UL0_CH2"},1421/* Normal record */1422{"UL0_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},1423{"UL0_CH1", "ADDA_UL_CH2", "ADDA_UL_Mux"},1424{"UL0_CH1", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},1425{"UL0_CH1", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},1426{"UL0_CH2", "ADDA_UL_CH1", "ADDA_UL_Mux"},1427{"UL0_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},1428{"UL0_CH2", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},1429{"UL0_CH2", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},14301431{"UL0_CH1", "AP_DMIC_UL_CH1", "AP DMIC Capture"},1432{"UL0_CH1", "AP_DMIC_UL_CH2", "AP DMIC Capture"},1433{"UL0_CH2", "AP_DMIC_UL_CH2", "AP DMIC Capture"},14341435{"UL0_CH1", "I2SIN0_CH1", "I2SIN0"},1436{"UL0_CH2", "I2SIN0_CH2", "I2SIN0"},1437{"UL0_CH1", "I2SIN1_CH1", "I2SIN1"},1438{"UL0_CH2", "I2SIN1_CH2", "I2SIN1"},14391440{"UL0_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},1441{"UL0_CH2", "PCM_0_CAP_CH1", "PCM 0 Capture"},14421443{"UL1", NULL, "UL1_CH1"},1444{"UL1", NULL, "UL1_CH2"},14451446{"UL1_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},1447{"UL1_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},14481449{"UL1_CH1", "I2SIN0_CH1", "I2SIN0"},1450{"UL1_CH2", "I2SIN0_CH2", "I2SIN0"},1451{"UL1_CH1", "I2SIN1_CH1", "I2SIN1"},1452{"UL1_CH2", "I2SIN1_CH2", "I2SIN1"},14531454{"UL1_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},1455{"UL1_CH2", "PCM_0_CAP_CH1", "PCM 0 Capture"},14561457{"UL2", NULL, "UL2_CH1"},1458{"UL2", NULL, "UL2_CH2"},14591460{"UL2_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},1461{"UL2_CH1", "ADDA_UL_CH2", "ADDA_UL_Mux"},1462{"UL2_CH1", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},1463{"UL2_CH1", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},1464{"UL2_CH2", "ADDA_UL_CH1", "ADDA_UL_Mux"},1465{"UL2_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},1466{"UL2_CH2", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},1467{"UL2_CH2", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},14681469{"UL2_CH1", "AP_DMIC_UL_CH3", "AP DMIC CH34 Capture"},1470{"UL2_CH2", "AP_DMIC_UL_CH4", "AP DMIC CH34 Capture"},14711472{"UL3", NULL, "UL3_CH1"},1473{"UL3", NULL, "UL3_CH2"},14741475{"UL3_CH1", "ADDA_UL_CH1", "ADDA Capture"},1476{"UL3_CH2", "ADDA_UL_CH2", "ADDA Capture"},1477{"UL3_CH1", "I2SIN1_CH1", "I2SIN1"},1478{"UL3_CH2", "I2SIN1_CH2", "I2SIN1"},14791480{"UL4", NULL, "UL4_CH1"},1481{"UL4", NULL, "UL4_CH2"},1482{"UL4_CH1", "ADDA_UL_CH1", "ADDA Capture"},1483{"UL4_CH2", "ADDA_UL_CH2", "ADDA Capture"},14841485{"UL4_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},1486{"UL4_CH2", "PCM_0_CAP_CH1", "PCM 0 Capture"},14871488{"UL5", NULL, "UL5_CH1"},1489{"UL5", NULL, "UL5_CH2"},14901491{"UL5_CH1", "ADDA_UL_CH1", "ADDA Capture"},1492{"UL5_CH2", "ADDA_UL_CH2", "ADDA Capture"},14931494{"UL6", NULL, "UL6_CH1"},1495{"UL6", NULL, "UL6_CH2"},1496{"UL6_CH1", "ADDA_UL_CH1", "ADDA Capture"},1497{"UL6_CH2", "ADDA_UL_CH2", "ADDA Capture"},1498{"UL6_CH1", "I2SIN0_CH1", "I2SIN0"},1499{"UL6_CH2", "I2SIN0_CH2", "I2SIN0"},1500{"UL6_CH1", "AP_DMIC_UL_CH1", "AP DMIC Capture"},1501{"UL6_CH2", "AP_DMIC_UL_CH2", "AP DMIC Capture"},15021503{"UL7", NULL, "UL7_CH1"},1504{"UL7", NULL, "UL7_CH2"},1505{"UL7_CH1", "ADDA_UL_CH1", "ADDA Capture"},1506{"UL7_CH1", "ADDA_UL_CH2", "ADDA Capture"},1507{"UL7_CH2", "ADDA_UL_CH1", "ADDA Capture"},1508{"UL7_CH2", "ADDA_UL_CH2", "ADDA Capture"},1509{"UL7_CH1", "I2SIN0_CH1", "I2SIN0"},1510{"UL7_CH2", "I2SIN0_CH2", "I2SIN0"},1511{"UL7_CH1", "AP_DMIC_UL_CH3", "AP DMIC CH34 Capture"},1512{"UL7_CH2", "AP_DMIC_UL_CH4", "AP DMIC CH34 Capture"},15131514{"UL8", NULL, "CM0_UL_MUX"},1515{"CM0_UL_MUX", "CM0_2CH_PATH", "UL8_CH1"},1516{"CM0_UL_MUX", "CM0_2CH_PATH", "UL8_CH2"},1517{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH1"},1518{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH2"},1519{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH3"},1520{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH4"},1521{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH5"},1522{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH6"},1523{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH7"},1524{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH8"},15251526{"UL_CM0", NULL, "CM0_Enable"},15271528{"UL9", NULL, "CM1_UL_MUX"},1529{"CM1_UL_MUX", "CM1_2CH_PATH", "UL9_CH1"},1530{"CM1_UL_MUX", "CM1_2CH_PATH", "UL9_CH2"},1531{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH1"},1532{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH2"},1533{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH3"},1534{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH4"},1535{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH5"},1536{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH6"},1537{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH7"},1538{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH8"},1539{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH9"},1540{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH10"},1541{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH11"},1542{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH12"},1543{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH13"},1544{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH14"},1545{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH15"},1546{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH16"},15471548{"UL_CM1", NULL, "CM1_Enable"},15491550/* UL9 o36o37 <- ADDA */1551{"UL9_CH1", "ADDA_UL_CH1", "ADDA Capture"},1552{"UL9_CH1", "ADDA_UL_CH2", "ADDA Capture"},1553{"UL9_CH2", "ADDA_UL_CH1", "ADDA Capture"},1554{"UL9_CH2", "ADDA_UL_CH2", "ADDA Capture"},15551556{"UL24", NULL, "UL24_CH1"},1557{"UL24", NULL, "UL24_CH2"},1558{"UL24_CH1", "ADDA_UL_CH1", "ADDA Capture"},15591560{"UL_CM0", NULL, "UL_CM0_CH1"},1561{"UL_CM0", NULL, "UL_CM0_CH2"},1562{"UL_CM0", NULL, "UL_CM0_CH3"},1563{"UL_CM0", NULL, "UL_CM0_CH4"},1564{"UL_CM0", NULL, "UL_CM0_CH5"},1565{"UL_CM0", NULL, "UL_CM0_CH6"},1566{"UL_CM0", NULL, "UL_CM0_CH7"},1567{"UL_CM0", NULL, "UL_CM0_CH8"},1568{"UL_CM0_CH1", "ADDA_UL_CH1", "ADDA Capture"},1569{"UL_CM0_CH1", "ADDA_UL_CH2", "ADDA Capture"},1570{"UL_CM0_CH2", "ADDA_UL_CH1", "ADDA Capture"},1571{"UL_CM0_CH2", "ADDA_UL_CH2", "ADDA Capture"},1572{"UL_CM0_CH3", "ADDA_UL_CH1", "ADDA Capture"},1573{"UL_CM0_CH3", "ADDA_UL_CH2", "ADDA Capture"},1574{"UL_CM0_CH4", "ADDA_UL_CH1", "ADDA Capture"},1575{"UL_CM0_CH4", "ADDA_UL_CH2", "ADDA Capture"},1576{"UL_CM0_CH1", "AP_DMIC_UL_CH1", "AP DMIC Capture"},1577{"UL_CM0_CH2", "AP_DMIC_UL_CH2", "AP DMIC Capture"},1578{"UL_CM0_CH3", "AP_DMIC_UL_CH3", "AP DMIC CH34 Capture"},1579{"UL_CM0_CH4", "AP_DMIC_UL_CH4", "AP DMIC CH34 Capture"},15801581{"UL_CM1", NULL, "UL_CM1_CH1"},1582{"UL_CM1", NULL, "UL_CM1_CH2"},1583{"UL_CM1", NULL, "UL_CM1_CH3"},1584{"UL_CM1", NULL, "UL_CM1_CH4"},1585{"UL_CM1", NULL, "UL_CM1_CH5"},1586{"UL_CM1", NULL, "UL_CM1_CH6"},1587{"UL_CM1", NULL, "UL_CM1_CH7"},1588{"UL_CM1", NULL, "UL_CM1_CH8"},1589{"UL_CM1", NULL, "UL_CM1_CH9"},1590{"UL_CM1", NULL, "UL_CM1_CH10"},1591{"UL_CM1", NULL, "UL_CM1_CH11"},1592{"UL_CM1", NULL, "UL_CM1_CH12"},1593{"UL_CM1", NULL, "UL_CM1_CH13"},1594{"UL_CM1", NULL, "UL_CM1_CH14"},1595{"UL_CM1", NULL, "UL_CM1_CH15"},1596{"UL_CM1", NULL, "UL_CM1_CH16"},1597{"UL_CM1_CH1", "ADDA_UL_CH1", "ADDA Capture"},1598{"UL_CM1_CH1", "ADDA_UL_CH2", "ADDA Capture"},1599{"UL_CM1_CH2", "ADDA_UL_CH1", "ADDA Capture"},1600{"UL_CM1_CH2", "ADDA_UL_CH2", "ADDA Capture"},1601{"UL_CM1_CH3", "ADDA_UL_CH1", "ADDA Capture"},1602{"UL_CM1_CH3", "ADDA_UL_CH2", "ADDA Capture"},1603{"UL_CM1_CH4", "ADDA_UL_CH1", "ADDA Capture"},1604{"UL_CM1_CH4", "ADDA_UL_CH2", "ADDA Capture"},1605{"UL_CM1_CH5", "ADDA_UL_CH1", "ADDA Capture"},1606{"UL_CM1_CH5", "ADDA_UL_CH2", "ADDA Capture"},1607{"UL_CM1_CH6", "ADDA_UL_CH1", "ADDA Capture"},1608{"UL_CM1_CH6", "ADDA_UL_CH2", "ADDA Capture"},16091610/* Audio Pin */1611{"I2SOUT0", NULL, "I2S0_PIN"},1612{"I2SIN0", NULL, "I2S0_PIN"},1613{"I2SOUT1", NULL, "I2S1_PIN"},1614{"I2SIN1", NULL, "I2S1_PIN"},1615{"PCM 0 Playback", NULL, "PCM0_PIN"},1616{"AP DMIC Capture", NULL, "AP_DMIC0_PIN"},1617{"AP DMIC CH34 Capture", NULL, "AP_DMIC1_PIN"},1618};16191620#define MT8189_DL_MEMIF(_id) \1621[MT8189_MEMIF_##_id] = { \1622.name = #_id, \1623.id = MT8189_MEMIF_##_id, \1624.reg_ofs_base = AFE_##_id##_BASE, \1625.reg_ofs_cur = AFE_##_id##_CUR, \1626.reg_ofs_end = AFE_##_id##_END, \1627.reg_ofs_base_msb = AFE_##_id##_BASE_MSB, \1628.reg_ofs_cur_msb = AFE_##_id##_CUR_MSB, \1629.reg_ofs_end_msb = AFE_##_id##_END_MSB, \1630.fs_reg = AFE_##_id##_CON0, \1631.fs_shift = _id##_SEL_FS_SFT, \1632.fs_maskbit = _id##_SEL_FS_MASK, \1633.mono_reg = AFE_##_id##_CON0, \1634.mono_shift = _id##_MONO_SFT, \1635.enable_reg = AFE_##_id##_CON0, \1636.enable_shift = _id##_ON_SFT, \1637.hd_reg = AFE_##_id##_CON0, \1638.hd_shift = _id##_HD_MODE_SFT, \1639.hd_align_reg = AFE_##_id##_CON0, \1640.hd_align_mshift = _id##_HALIGN_SFT, \1641.agent_disable_reg = -1, \1642.agent_disable_shift = -1, \1643.msb_reg = -1, \1644.msb_shift = -1, \1645.pbuf_reg = AFE_##_id##_CON0, \1646.pbuf_mask = _id##_PBUF_SIZE_MASK, \1647.pbuf_shift = _id##_PBUF_SIZE_SFT, \1648.minlen_reg = AFE_##_id##_CON0, \1649.minlen_mask = _id##_MINLEN_MASK, \1650.minlen_shift = _id##_MINLEN_SFT, \1651}16521653#define MT8189_MULTI_DL_MEMIF(_id) \1654[MT8189_MEMIF_##_id] = { \1655.name = #_id, \1656.id = MT8189_MEMIF_##_id, \1657.reg_ofs_base = AFE_##_id##_BASE, \1658.reg_ofs_cur = AFE_##_id##_CUR, \1659.reg_ofs_end = AFE_##_id##_END, \1660.reg_ofs_base_msb = AFE_##_id##_BASE_MSB, \1661.reg_ofs_cur_msb = AFE_##_id##_CUR_MSB, \1662.reg_ofs_end_msb = AFE_##_id##_END_MSB, \1663.fs_reg = AFE_##_id##_CON0, \1664.fs_shift = _id##_SEL_FS_SFT, \1665.fs_maskbit = _id##_SEL_FS_MASK, \1666.mono_reg = -1, \1667.mono_shift = -1, \1668.enable_reg = AFE_##_id##_CON0, \1669.enable_shift = _id##_ON_SFT, \1670.hd_reg = AFE_##_id##_CON0, \1671.hd_shift = _id##_HD_MODE_SFT, \1672.hd_align_reg = AFE_##_id##_CON0, \1673.hd_align_mshift = _id##_HALIGN_SFT, \1674.agent_disable_reg = -1, \1675.agent_disable_shift = -1, \1676.msb_reg = -1, \1677.msb_shift = -1, \1678.pbuf_reg = AFE_##_id##_CON0, \1679.pbuf_mask = _id##_PBUF_SIZE_MASK, \1680.pbuf_shift = _id##_PBUF_SIZE_SFT, \1681.minlen_reg = AFE_##_id##_CON0, \1682.minlen_mask = _id##_MINLEN_MASK, \1683.minlen_shift = _id##_MINLEN_SFT, \1684.ch_num_reg = AFE_##_id##_CON0, \1685.ch_num_maskbit = _id##_NUM_MASK, \1686.ch_num_shift = _id##_NUM_SFT, \1687}16881689#define MT8189_UL_MEMIF(_id, _fs_shift, _fs_maskbit, _mono_shift) \1690[MT8189_MEMIF_##_id] = { \1691.name = #_id, \1692.id = MT8189_MEMIF_##_id, \1693.reg_ofs_base = AFE_##_id##_BASE, \1694.reg_ofs_cur = AFE_##_id##_CUR, \1695.reg_ofs_end = AFE_##_id##_END, \1696.reg_ofs_base_msb = AFE_##_id##_BASE_MSB, \1697.reg_ofs_cur_msb = AFE_##_id##_CUR_MSB, \1698.reg_ofs_end_msb = AFE_##_id##_END_MSB, \1699.fs_reg = AFE_##_id##_CON0, \1700.fs_shift = _fs_shift, \1701.fs_maskbit = _fs_maskbit, \1702.mono_reg = AFE_##_id##_CON0, \1703.mono_shift = _mono_shift, \1704.enable_reg = AFE_##_id##_CON0, \1705.enable_shift = _id##_ON_SFT, \1706.hd_reg = AFE_##_id##_CON0, \1707.hd_shift = _id##_HD_MODE_SFT, \1708.hd_align_reg = AFE_##_id##_CON0, \1709.hd_align_mshift = _id##_HALIGN_SFT, \1710.agent_disable_reg = -1, \1711.agent_disable_shift = -1, \1712.msb_reg = -1, \1713.msb_shift = -1, \1714}17151716/* For convenience with macros: missing register fields */1717#define HDMI_SEL_FS_SFT -11718#define HDMI_SEL_FS_MASK -117191720/* For convenience with macros: register name differences */1721#define AFE_HDMI_BASE AFE_HDMI_OUT_BASE1722#define AFE_HDMI_CUR AFE_HDMI_OUT_CUR1723#define AFE_HDMI_END AFE_HDMI_OUT_END1724#define AFE_HDMI_BASE_MSB AFE_HDMI_OUT_BASE_MSB1725#define AFE_HDMI_CUR_MSB AFE_HDMI_OUT_CUR_MSB1726#define AFE_HDMI_END_MSB AFE_HDMI_OUT_END_MSB1727#define AFE_HDMI_CON0 AFE_HDMI_OUT_CON01728#define HDMI_ON_SFT HDMI_OUT_ON_SFT1729#define HDMI_HD_MODE_SFT HDMI_OUT_HD_MODE_SFT1730#define HDMI_HALIGN_SFT HDMI_OUT_HALIGN_SFT1731#define HDMI_PBUF_SIZE_MASK HDMI_OUT_PBUF_SIZE_MASK1732#define HDMI_PBUF_SIZE_SFT HDMI_OUT_PBUF_SIZE_SFT1733#define HDMI_MINLEN_MASK HDMI_OUT_MINLEN_MASK1734#define HDMI_MINLEN_SFT HDMI_OUT_MINLEN_SFT1735#define HDMI_NUM_MASK HDMI_CH_NUM_MASK1736#define HDMI_NUM_SFT HDMI_CH_NUM_SFT17371738static const struct mtk_base_memif_data memif_data[MT8189_MEMIF_NUM] = {1739MT8189_DL_MEMIF(DL0),1740MT8189_DL_MEMIF(DL1),1741MT8189_DL_MEMIF(DL2),1742MT8189_DL_MEMIF(DL3),1743MT8189_DL_MEMIF(DL4),1744MT8189_DL_MEMIF(DL5),1745MT8189_DL_MEMIF(DL6),1746MT8189_DL_MEMIF(DL7),1747MT8189_DL_MEMIF(DL8),1748MT8189_DL_MEMIF(DL23),1749MT8189_DL_MEMIF(DL24),1750MT8189_DL_MEMIF(DL25),1751MT8189_MULTI_DL_MEMIF(DL_24CH),1752MT8189_MULTI_DL_MEMIF(HDMI),1753MT8189_UL_MEMIF(VUL0, VUL0_SEL_FS_SFT, VUL0_SEL_FS_MASK, VUL0_MONO_SFT),1754MT8189_UL_MEMIF(VUL1, VUL1_SEL_FS_SFT, VUL1_SEL_FS_MASK, VUL1_MONO_SFT),1755MT8189_UL_MEMIF(VUL2, VUL2_SEL_FS_SFT, VUL2_SEL_FS_MASK, VUL2_MONO_SFT),1756MT8189_UL_MEMIF(VUL3, VUL3_SEL_FS_SFT, VUL3_SEL_FS_MASK, VUL3_MONO_SFT),1757MT8189_UL_MEMIF(VUL4, VUL4_SEL_FS_SFT, VUL4_SEL_FS_MASK, VUL4_MONO_SFT),1758MT8189_UL_MEMIF(VUL5, VUL5_SEL_FS_SFT, VUL5_SEL_FS_MASK, VUL5_MONO_SFT),1759MT8189_UL_MEMIF(VUL6, VUL6_SEL_FS_SFT, VUL6_SEL_FS_MASK, VUL6_MONO_SFT),1760MT8189_UL_MEMIF(VUL7, VUL7_SEL_FS_SFT, VUL7_SEL_FS_MASK, VUL7_MONO_SFT),1761MT8189_UL_MEMIF(VUL8, VUL8_SEL_FS_SFT, VUL8_SEL_FS_MASK, VUL8_MONO_SFT),1762MT8189_UL_MEMIF(VUL9, VUL9_SEL_FS_SFT, VUL9_SEL_FS_MASK, VUL9_MONO_SFT),1763MT8189_UL_MEMIF(VUL10, VUL10_SEL_FS_SFT, VUL10_SEL_FS_MASK, VUL10_MONO_SFT),1764MT8189_UL_MEMIF(VUL24, VUL24_SEL_FS_SFT, VUL24_SEL_FS_MASK, VUL24_MONO_SFT),1765MT8189_UL_MEMIF(VUL25, VUL25_SEL_FS_SFT, VUL25_SEL_FS_MASK, VUL25_MONO_SFT),1766MT8189_UL_MEMIF(VUL_CM0, -1, -1, -1),1767MT8189_UL_MEMIF(VUL_CM1, -1, -1, -1),1768MT8189_UL_MEMIF(ETDM_IN0, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),1769MT8189_UL_MEMIF(ETDM_IN1, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),1770};17711772#define MT8189_AFE_IRQ(_id) \1773[MT8189_IRQ_##_id] = { \1774.id = MT8189_IRQ_##_id, \1775.irq_cnt_reg = AFE_IRQ##_id##_MCU_CFG1, \1776.irq_cnt_shift = AFE_IRQ_CNT_SHIFT, \1777.irq_cnt_maskbit = AFE_IRQ_CNT_MASK, \1778.irq_fs_reg = AFE_IRQ##_id##_MCU_CFG0, \1779.irq_fs_shift = AFE_IRQ##_id##_MCU_FS_SFT, \1780.irq_fs_maskbit = AFE_IRQ##_id##_MCU_FS_MASK, \1781.irq_en_reg = AFE_IRQ##_id##_MCU_CFG0, \1782.irq_en_shift = AFE_IRQ##_id##_MCU_ON_SFT, \1783.irq_clr_reg = AFE_IRQ##_id##_MCU_CFG1, \1784.irq_clr_shift = AFE_IRQ##_id##_CLR_CFG_SFT, \1785}17861787#define MT8189_AFE_TDM_IRQ(_id) \1788[MT8189_IRQ_##_id] = { \1789.id = MT8189_CUS_IRQ_TDM, \1790.irq_cnt_reg = AFE_CUSTOM_IRQ0_MCU_CFG1, \1791.irq_cnt_shift = AFE_CUSTOM_IRQ0_MCU_CNT_SFT, \1792.irq_cnt_maskbit = AFE_CUSTOM_IRQ0_MCU_CNT_MASK, \1793.irq_fs_reg = -1, \1794.irq_fs_shift = -1, \1795.irq_fs_maskbit = -1, \1796.irq_en_reg = AFE_CUSTOM_IRQ0_MCU_CFG0, \1797.irq_en_shift = AFE_CUSTOM_IRQ0_MCU_ON_SFT, \1798.irq_clr_reg = AFE_CUSTOM_IRQ0_MCU_CFG1, \1799.irq_clr_shift = AFE_CUSTOM_IRQ0_CLR_CFG_SFT, \1800}18011802static const struct mtk_base_irq_data irq_data[MT8189_IRQ_NUM] = {1803MT8189_AFE_IRQ(0),1804MT8189_AFE_IRQ(1),1805MT8189_AFE_IRQ(2),1806MT8189_AFE_IRQ(3),1807MT8189_AFE_IRQ(4),1808MT8189_AFE_IRQ(5),1809MT8189_AFE_IRQ(6),1810MT8189_AFE_IRQ(7),1811MT8189_AFE_IRQ(8),1812MT8189_AFE_IRQ(9),1813MT8189_AFE_IRQ(10),1814MT8189_AFE_IRQ(11),1815MT8189_AFE_IRQ(12),1816MT8189_AFE_IRQ(13),1817MT8189_AFE_IRQ(14),1818MT8189_AFE_IRQ(15),1819MT8189_AFE_IRQ(16),1820MT8189_AFE_IRQ(17),1821MT8189_AFE_IRQ(18),1822MT8189_AFE_IRQ(19),1823MT8189_AFE_IRQ(20),1824MT8189_AFE_IRQ(21),1825MT8189_AFE_IRQ(22),1826MT8189_AFE_IRQ(23),1827MT8189_AFE_IRQ(24),1828MT8189_AFE_IRQ(25),1829MT8189_AFE_IRQ(26),1830MT8189_AFE_TDM_IRQ(31),1831};18321833static const int memif_irq_usage[MT8189_MEMIF_NUM] = {1834/* TODO: verify each memif & irq */1835[MT8189_MEMIF_DL0] = MT8189_IRQ_0,1836[MT8189_MEMIF_DL1] = MT8189_IRQ_1,1837[MT8189_MEMIF_DL2] = MT8189_IRQ_2,1838[MT8189_MEMIF_DL3] = MT8189_IRQ_3,1839[MT8189_MEMIF_DL4] = MT8189_IRQ_4,1840[MT8189_MEMIF_DL5] = MT8189_IRQ_5,1841[MT8189_MEMIF_DL6] = MT8189_IRQ_6,1842[MT8189_MEMIF_DL7] = MT8189_IRQ_7,1843[MT8189_MEMIF_DL8] = MT8189_IRQ_8,1844[MT8189_MEMIF_DL23] = MT8189_IRQ_9,1845[MT8189_MEMIF_DL24] = MT8189_IRQ_10,1846[MT8189_MEMIF_DL25] = MT8189_IRQ_11,1847[MT8189_MEMIF_DL_24CH] = MT8189_IRQ_12,1848[MT8189_MEMIF_VUL0] = MT8189_IRQ_13,1849[MT8189_MEMIF_VUL1] = MT8189_IRQ_14,1850[MT8189_MEMIF_VUL2] = MT8189_IRQ_15,1851[MT8189_MEMIF_VUL3] = MT8189_IRQ_16,1852[MT8189_MEMIF_VUL4] = MT8189_IRQ_17,1853[MT8189_MEMIF_VUL5] = MT8189_IRQ_18,1854[MT8189_MEMIF_VUL6] = MT8189_IRQ_19,1855[MT8189_MEMIF_VUL7] = MT8189_IRQ_20,1856[MT8189_MEMIF_VUL8] = MT8189_IRQ_21,1857[MT8189_MEMIF_VUL9] = MT8189_IRQ_22,1858[MT8189_MEMIF_VUL10] = MT8189_IRQ_23,1859[MT8189_MEMIF_VUL24] = MT8189_IRQ_24,1860[MT8189_MEMIF_VUL25] = MT8189_IRQ_25,1861[MT8189_MEMIF_VUL_CM0] = MT8189_IRQ_26,1862[MT8189_MEMIF_VUL_CM1] = MT8189_IRQ_0,1863[MT8189_MEMIF_ETDM_IN0] = MT8189_IRQ_0,1864[MT8189_MEMIF_ETDM_IN1] = MT8189_IRQ_0,1865[MT8189_MEMIF_HDMI] = MT8189_IRQ_311866};18671868static bool mt8189_is_volatile_reg(struct device *dev, unsigned int reg)1869{1870/* these auto-gen reg has read-only bit, so put it as volatile */1871/* volatile reg cannot be cached, so cannot be set when power off */1872switch (reg) {1873case AUDIO_TOP_CON0:1874case AUDIO_TOP_CON1:1875case AUDIO_TOP_CON2:1876case AUDIO_TOP_CON3:1877case AUDIO_TOP_CON4:1878case AFE_APLL1_TUNER_MON0:1879case AFE_APLL2_TUNER_MON0:1880case AFE_SPM_CONTROL_ACK:1881case AUDIO_TOP_IP_VERSION:1882case AUDIO_ENGEN_CON0_MON:1883case AFE_CONNSYS_I2S_IPM_VER_MON:1884case AFE_CONNSYS_I2S_MON:1885case AFE_PCM_INTF_MON:1886case AFE_PCM_TOP_IP_VERSION:1887case AFE_IRQ_MCU_STATUS:1888case AFE_CUSTOM_IRQ_MCU_STATUS:1889case AFE_IRQ_MCU_MON0:1890case AFE_IRQ_MCU_MON1:1891case AFE_IRQ_MCU_MON2:1892case AFE_IRQ0_CNT_MON:1893case AFE_IRQ1_CNT_MON:1894case AFE_IRQ2_CNT_MON:1895case AFE_IRQ3_CNT_MON:1896case AFE_IRQ4_CNT_MON:1897case AFE_IRQ5_CNT_MON:1898case AFE_IRQ6_CNT_MON:1899case AFE_IRQ7_CNT_MON:1900case AFE_IRQ8_CNT_MON:1901case AFE_IRQ9_CNT_MON:1902case AFE_IRQ10_CNT_MON:1903case AFE_IRQ11_CNT_MON:1904case AFE_IRQ12_CNT_MON:1905case AFE_IRQ13_CNT_MON:1906case AFE_IRQ14_CNT_MON:1907case AFE_IRQ15_CNT_MON:1908case AFE_IRQ16_CNT_MON:1909case AFE_IRQ17_CNT_MON:1910case AFE_IRQ18_CNT_MON:1911case AFE_IRQ19_CNT_MON:1912case AFE_IRQ20_CNT_MON:1913case AFE_IRQ21_CNT_MON:1914case AFE_IRQ22_CNT_MON:1915case AFE_IRQ23_CNT_MON:1916case AFE_IRQ24_CNT_MON:1917case AFE_IRQ25_CNT_MON:1918case AFE_IRQ26_CNT_MON:1919case AFE_CM0_MON:1920case AFE_CM0_IP_VERSION:1921case AFE_CM1_MON:1922case AFE_CM1_IP_VERSION:1923case AFE_ADDA_UL0_SRC_DEBUG_MON0:1924case AFE_ADDA_UL0_SRC_MON0:1925case AFE_ADDA_UL0_SRC_MON1:1926case AFE_ADDA_UL0_IP_VERSION:1927case AFE_ADDA_DMIC0_SRC_DEBUG_MON0:1928case AFE_ADDA_DMIC0_SRC_MON0:1929case AFE_ADDA_DMIC0_SRC_MON1:1930case AFE_ADDA_DMIC0_IP_VERSION:1931case AFE_ADDA_DMIC1_SRC_DEBUG_MON0:1932case AFE_ADDA_DMIC1_SRC_MON0:1933case AFE_ADDA_DMIC1_SRC_MON1:1934case AFE_ADDA_DMIC1_IP_VERSION:1935case AFE_MTKAIF_IPM_VER_MON:1936case AFE_MTKAIF_MON:1937case AFE_AUD_PAD_TOP_MON:1938case AFE_ADDA_MTKAIFV4_MON0:1939case AFE_ADDA_MTKAIFV4_MON1:1940case AFE_ADDA6_MTKAIFV4_MON0:1941case ETDM_IN0_MON:1942case ETDM_IN1_MON:1943case ETDM_OUT0_MON:1944case ETDM_OUT1_MON:1945case ETDM_OUT4_MON:1946case AFE_CONN_MON0:1947case AFE_CONN_MON1:1948case AFE_CONN_MON2:1949case AFE_CONN_MON3:1950case AFE_CONN_MON4:1951case AFE_CONN_MON5:1952case AFE_CBIP_SLV_DECODER_MON0:1953case AFE_CBIP_SLV_DECODER_MON1:1954case AFE_CBIP_SLV_MUX_MON0:1955case AFE_CBIP_SLV_MUX_MON1:1956case AFE_DL0_CUR_MSB:1957case AFE_DL0_CUR:1958case AFE_DL0_RCH_MON:1959case AFE_DL0_LCH_MON:1960case AFE_DL1_CUR_MSB:1961case AFE_DL1_CUR:1962case AFE_DL1_RCH_MON:1963case AFE_DL1_LCH_MON:1964case AFE_DL2_CUR_MSB:1965case AFE_DL2_CUR:1966case AFE_DL2_RCH_MON:1967case AFE_DL2_LCH_MON:1968case AFE_DL3_CUR_MSB:1969case AFE_DL3_CUR:1970case AFE_DL3_RCH_MON:1971case AFE_DL3_LCH_MON:1972case AFE_DL4_CUR_MSB:1973case AFE_DL4_CUR:1974case AFE_DL4_RCH_MON:1975case AFE_DL4_LCH_MON:1976case AFE_DL5_CUR_MSB:1977case AFE_DL5_CUR:1978case AFE_DL5_RCH_MON:1979case AFE_DL5_LCH_MON:1980case AFE_DL6_CUR_MSB:1981case AFE_DL6_CUR:1982case AFE_DL6_RCH_MON:1983case AFE_DL6_LCH_MON:1984case AFE_DL7_CUR_MSB:1985case AFE_DL7_CUR:1986case AFE_DL7_RCH_MON:1987case AFE_DL7_LCH_MON:1988case AFE_DL8_CUR_MSB:1989case AFE_DL8_CUR:1990case AFE_DL8_RCH_MON:1991case AFE_DL8_LCH_MON:1992case AFE_DL_24CH_CUR_MSB:1993case AFE_DL_24CH_CUR:1994case AFE_DL23_CUR_MSB:1995case AFE_DL23_CUR:1996case AFE_DL23_RCH_MON:1997case AFE_DL23_LCH_MON:1998case AFE_DL24_CUR_MSB:1999case AFE_DL24_CUR:2000case AFE_DL24_RCH_MON:2001case AFE_DL24_LCH_MON:2002case AFE_DL25_CUR_MSB:2003case AFE_DL25_CUR:2004case AFE_DL25_RCH_MON:2005case AFE_DL25_LCH_MON:2006case AFE_VUL0_CUR_MSB:2007case AFE_VUL0_CUR:2008case AFE_VUL1_CUR_MSB:2009case AFE_VUL1_CUR:2010case AFE_VUL2_CUR_MSB:2011case AFE_VUL2_CUR:2012case AFE_VUL3_CUR_MSB:2013case AFE_VUL3_CUR:2014case AFE_VUL4_CUR_MSB:2015case AFE_VUL4_CUR:2016case AFE_VUL5_CUR_MSB:2017case AFE_VUL5_CUR:2018case AFE_VUL6_CUR_MSB:2019case AFE_VUL6_CUR:2020case AFE_VUL7_CUR_MSB:2021case AFE_VUL7_CUR:2022case AFE_VUL8_CUR_MSB:2023case AFE_VUL8_CUR:2024case AFE_VUL9_CUR_MSB:2025case AFE_VUL9_CUR:2026case AFE_VUL10_CUR_MSB:2027case AFE_VUL10_CUR:2028case AFE_VUL24_CUR_MSB:2029case AFE_VUL24_CUR:2030case AFE_VUL25_CUR_MSB:2031case AFE_VUL25_CUR:2032case AFE_VUL_CM0_CUR_MSB:2033case AFE_VUL_CM0_CUR:2034case AFE_VUL_CM1_CUR_MSB:2035case AFE_VUL_CM1_CUR:2036case AFE_ETDM_IN0_CUR_MSB:2037case AFE_ETDM_IN0_CUR:2038case AFE_ETDM_IN1_CUR_MSB:2039case AFE_ETDM_IN1_CUR:2040case AFE_HDMI_OUT_CUR_MSB:2041case AFE_HDMI_OUT_CUR:2042case AFE_HDMI_OUT_END:2043case AFE_HDMI_OUT_MON0:2044case AFE_PROT_SIDEBAND0_MON:2045case AFE_PROT_SIDEBAND1_MON:2046case AFE_PROT_SIDEBAND2_MON:2047case AFE_PROT_SIDEBAND3_MON:2048case AFE_DOMAIN_SIDEBAND0_MON:2049case AFE_DOMAIN_SIDEBAND1_MON:2050case AFE_DOMAIN_SIDEBAND2_MON:2051case AFE_DOMAIN_SIDEBAND3_MON:2052case AFE_DOMAIN_SIDEBAND4_MON:2053case AFE_DOMAIN_SIDEBAND5_MON:2054case AFE_DOMAIN_SIDEBAND6_MON:2055case AFE_DOMAIN_SIDEBAND7_MON:2056case AFE_DOMAIN_SIDEBAND8_MON:2057case AFE_DOMAIN_SIDEBAND9_MON:2058case AFE_PCM0_INTF_CON1_MASK_MON:2059case AFE_CONNSYS_I2S_CON_MASK_MON:2060case AFE_MTKAIF0_CFG0_MASK_MON:2061case AFE_MTKAIF1_CFG0_MASK_MON:2062case AFE_ADDA_UL0_SRC_CON0_MASK_MON:2063case AFE_ASRC_NEW_CON0:2064case AFE_ASRC_NEW_CON6:2065case AFE_ASRC_NEW_CON8:2066case AFE_ASRC_NEW_CON9:2067case AFE_ASRC_NEW_CON12:2068case AFE_ASRC_NEW_IP_VERSION:2069case AFE_GASRC0_NEW_CON0:2070case AFE_GASRC0_NEW_CON6:2071case AFE_GASRC0_NEW_CON8:2072case AFE_GASRC0_NEW_CON9:2073case AFE_GASRC0_NEW_CON10:2074case AFE_GASRC0_NEW_CON11:2075case AFE_GASRC0_NEW_CON12:2076case AFE_GASRC0_NEW_IP_VERSION:2077case AFE_GASRC1_NEW_CON0:2078case AFE_GASRC1_NEW_CON6:2079case AFE_GASRC1_NEW_CON8:2080case AFE_GASRC1_NEW_CON9:2081case AFE_GASRC1_NEW_CON12:2082case AFE_GASRC1_NEW_IP_VERSION:2083case AFE_GASRC2_NEW_CON0:2084case AFE_GASRC2_NEW_CON6:2085case AFE_GASRC2_NEW_CON8:2086case AFE_GASRC2_NEW_CON9:2087case AFE_GASRC2_NEW_CON12:2088case AFE_GASRC2_NEW_IP_VERSION:2089case AFE_GAIN0_CUR_L:2090case AFE_GAIN0_CUR_R:2091case AFE_GAIN1_CUR_L:2092case AFE_GAIN1_CUR_R:2093case AFE_GAIN2_CUR_L:2094case AFE_GAIN2_CUR_R:2095case AFE_GAIN3_CUR_L:2096case AFE_GAIN3_CUR_R:2097case AFE_IRQ_MCU_EN:2098case AFE_CUSTOM_IRQ_MCU_EN:2099case AFE_IRQ_MCU_DSP_EN:2100case AFE_IRQ_MCU_DSP2_EN:2101case AFE_DL5_CON0:2102case AFE_DL6_CON0:2103case AFE_DL23_CON0:2104case AFE_DL_24CH_CON0:2105case AFE_VUL1_CON0:2106case AFE_VUL3_CON0:2107case AFE_VUL4_CON0:2108case AFE_VUL5_CON0:2109case AFE_VUL9_CON0:2110case AFE_VUL25_CON0:2111case AFE_IRQ0_MCU_CFG0:2112case AFE_IRQ1_MCU_CFG0:2113case AFE_IRQ2_MCU_CFG0:2114case AFE_IRQ3_MCU_CFG0:2115case AFE_IRQ4_MCU_CFG0:2116case AFE_IRQ5_MCU_CFG0:2117case AFE_IRQ6_MCU_CFG0:2118case AFE_IRQ7_MCU_CFG0:2119case AFE_IRQ8_MCU_CFG0:2120case AFE_IRQ9_MCU_CFG0:2121case AFE_IRQ10_MCU_CFG0:2122case AFE_IRQ11_MCU_CFG0:2123case AFE_IRQ12_MCU_CFG0:2124case AFE_IRQ13_MCU_CFG0:2125case AFE_IRQ14_MCU_CFG0:2126case AFE_IRQ15_MCU_CFG0:2127case AFE_IRQ16_MCU_CFG0:2128case AFE_IRQ17_MCU_CFG0:2129case AFE_IRQ18_MCU_CFG0:2130case AFE_IRQ19_MCU_CFG0:2131case AFE_IRQ20_MCU_CFG0:2132case AFE_IRQ21_MCU_CFG0:2133case AFE_IRQ22_MCU_CFG0:2134case AFE_IRQ23_MCU_CFG0:2135case AFE_IRQ24_MCU_CFG0:2136case AFE_IRQ25_MCU_CFG0:2137case AFE_IRQ26_MCU_CFG0:2138case AFE_CUSTOM_IRQ0_MCU_CFG0:2139case AFE_IRQ0_MCU_CFG1:2140case AFE_IRQ1_MCU_CFG1:2141case AFE_IRQ2_MCU_CFG1:2142case AFE_IRQ3_MCU_CFG1:2143case AFE_IRQ4_MCU_CFG1:2144case AFE_IRQ5_MCU_CFG1:2145case AFE_IRQ6_MCU_CFG1:2146case AFE_IRQ7_MCU_CFG1:2147case AFE_IRQ8_MCU_CFG1:2148case AFE_IRQ9_MCU_CFG1:2149case AFE_IRQ10_MCU_CFG1:2150case AFE_IRQ11_MCU_CFG1:2151case AFE_IRQ12_MCU_CFG1:2152case AFE_IRQ13_MCU_CFG1:2153case AFE_IRQ14_MCU_CFG1:2154case AFE_IRQ15_MCU_CFG1:2155case AFE_IRQ16_MCU_CFG1:2156case AFE_IRQ17_MCU_CFG1:2157case AFE_IRQ18_MCU_CFG1:2158case AFE_IRQ19_MCU_CFG1:2159case AFE_IRQ20_MCU_CFG1:2160case AFE_IRQ21_MCU_CFG1:2161case AFE_IRQ22_MCU_CFG1:2162case AFE_IRQ23_MCU_CFG1:2163case AFE_IRQ24_MCU_CFG1:2164case AFE_IRQ25_MCU_CFG1:2165case AFE_IRQ26_MCU_CFG1:2166case AFE_CUSTOM_IRQ0_MCU_CFG1:2167/* for vow using */2168case AFE_IRQ_MCU_SCP_EN:2169case AFE_VUL_CM0_BASE_MSB:2170case AFE_VUL_CM0_BASE:2171case AFE_VUL_CM0_END_MSB:2172case AFE_VUL_CM0_END:2173case AFE_VUL_CM0_CON0:2174return true;2175default:2176return false;2177};2178}21792180static const struct regmap_config mt8189_afe_regmap_config = {2181.reg_bits = 32,2182.reg_stride = 4,2183.val_bits = 32,21842185.volatile_reg = mt8189_is_volatile_reg,21862187.max_register = AFE_MAX_REGISTER,2188.num_reg_defaults_raw = AFE_MAX_REGISTER,21892190.cache_type = REGCACHE_FLAT,2191};21922193static irqreturn_t mt8189_afe_irq_handler(int irq_id, void *dev)2194{2195struct mtk_base_afe *afe = dev;2196struct mtk_base_afe_irq *irq;2197u32 status;2198u32 status_mcu;2199u32 mcu_en;2200u32 cus_status;2201u32 cus_status_mcu;2202u32 cus_mcu_en;2203u32 tmp_reg;2204int ret, cus_ret;2205int i;2206struct timespec64 ts64;2207u64 t1, t2;2208/* one interrupt period = 5ms */2209const u64 timeout_limit = 5000000;22102211/* get irq that is sent to MCU */2212regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);2213regmap_read(afe->regmap, AFE_CUSTOM_IRQ_MCU_EN, &cus_mcu_en);22142215ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);2216cus_ret = regmap_read(afe->regmap, AFE_CUSTOM_IRQ_MCU_STATUS, &cus_status);2217/* only care IRQ which is sent to MCU */2218status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS;2219cus_status_mcu = cus_status & cus_mcu_en & AFE_IRQ_STATUS_BITS;2220if ((ret || status_mcu == 0) && (cus_ret || cus_status_mcu == 0)) {2221dev_err(afe->dev, "%s(), irq status err, ret %d, 0x%x:0x%x:0x%x:0x%x\n",2222__func__, ret, status, mcu_en, cus_status_mcu, cus_mcu_en);2223return IRQ_NONE;2224}22252226ktime_get_ts64(&ts64);2227t1 = ktime_get_ns();22282229for (i = 0; i < MT8189_MEMIF_NUM; i++) {2230struct mtk_base_afe_memif *memif = &afe->memif[i];22312232if (!memif->substream)2233continue;22342235if (memif->irq_usage < 0)2236continue;2237irq = &afe->irqs[memif->irq_usage];22382239if (i == MT8189_MEMIF_HDMI) {2240if (cus_status_mcu & BIT(irq->irq_data->id))2241snd_pcm_period_elapsed(memif->substream);2242} else if (status_mcu & BIT(irq->irq_data->id)) {2243snd_pcm_period_elapsed(memif->substream);2244}2245}22462247ktime_get_ts64(&ts64);2248t2 = ktime_get_ns();2249t2 = t2 - t1; /* in ns (10^9) */22502251if (t2 > timeout_limit)2252dev_warn(afe->dev, "IRQ handler exceeded time limit by %llu ns\n",2253t2 - timeout_limit);22542255/* clear irq */2256for (i = 0; i < MT8189_IRQ_NUM; ++i) {2257if (((cus_status_mcu & BIT(irq_data[i].id)) && i == MT8189_IRQ_31) ||2258((status_mcu & BIT(irq_data[i].id)) && i != MT8189_IRQ_31)) {2259regmap_read(afe->regmap, irq_data[i].irq_clr_reg, &tmp_reg);2260regmap_update_bits(afe->regmap, irq_data[i].irq_clr_reg,2261AFE_IRQ_CLR_CFG_MASK_SFT |2262AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT,2263tmp_reg ^ (AFE_IRQ_CLR_CFG_MASK_SFT |2264AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT));2265}2266}22672268return IRQ_HANDLED;2269}22702271static int mt8189_afe_runtime_suspend(struct device *dev)2272{2273struct mtk_base_afe *afe = dev_get_drvdata(dev);2274unsigned int value;2275unsigned int tmp_reg;2276int ret, i;22772278if (!afe->regmap) {2279dev_warn(afe->dev, "%s() skip regmap\n", __func__);2280goto skip_regmap;2281}22822283/* disable AFE */2284mt8189_afe_disable_main_clock(afe);22852286ret = regmap_read_poll_timeout(afe->regmap,2287AUDIO_ENGEN_CON0_MON,2288value,2289(value & AUDIO_ENGEN_MON_SFT) == 0,229020,22911 * 1000 * 1000);2292dev_dbg(afe->dev, "%s() read_poll ret %d\n", __func__, ret);2293if (ret)2294dev_warn(afe->dev, "%s(), ret %d\n", __func__, ret);22952296/* make sure all irq status are cleared */2297for (i = 0; i < MT8189_IRQ_NUM; i++) {2298regmap_read(afe->regmap, irq_data[i].irq_clr_reg, &tmp_reg);2299regmap_update_bits(afe->regmap, irq_data[i].irq_clr_reg,2300AFE_IRQ_CLR_CFG_MASK_SFT |2301AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT,2302tmp_reg ^ (AFE_IRQ_CLR_CFG_MASK_SFT |2303AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT));2304}23052306/* reset audio 26M request */2307regmap_update_bits(afe->regmap,2308AFE_SPM_CONTROL_REQ, 0x1, 0x0);23092310/* cache only */2311regcache_cache_only(afe->regmap, true);2312regcache_mark_dirty(afe->regmap);23132314skip_regmap:2315mt8189_afe_disable_reg_rw_clk(afe);2316return 0;2317}23182319static int mt8189_afe_runtime_resume(struct device *dev)2320{2321struct mtk_base_afe *afe = dev_get_drvdata(dev);2322int ret;23232324ret = mt8189_afe_enable_reg_rw_clk(afe);2325if (ret)2326return ret;23272328if (!afe->regmap) {2329dev_warn(afe->dev, "skip regmap\n");2330return 0;2331}23322333regcache_cache_only(afe->regmap, false);2334regcache_sync(afe->regmap);23352336/* set audio 26M request */2337regmap_update_bits(afe->regmap, AFE_SPM_CONTROL_REQ, 0x1, 0x1);2338regmap_update_bits(afe->regmap, AFE_CBIP_CFG0, 0x1, 0x1);23392340/* force cpu use 8_24 format when writing 32bit data */2341regmap_update_bits(afe->regmap, AFE_MEMIF_CON0,2342CPU_HD_ALIGN_MASK_SFT, 0 << CPU_HD_ALIGN_SFT);23432344/* enable AFE */2345mt8189_afe_enable_main_clock(afe);23462347return 0;2348}23492350static int mt8189_afe_component_probe(struct snd_soc_component *component)2351{2352struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);23532354/* enable clock for regcache get default value from hw */2355pm_runtime_get_sync(afe->dev);2356mtk_afe_add_sub_dai_control(component);2357pm_runtime_put_sync(afe->dev);23582359return 0;2360}23612362static int mt8189_afe_pcm_open(struct snd_soc_component *component,2363struct snd_pcm_substream *substream)2364{2365/* set the wait_for_avail to 2 sec*/2366substream->wait_time = msecs_to_jiffies(2 * 1000);23672368return 0;2369}23702371static void mt8189_afe_pcm_free(struct snd_soc_component *component,2372struct snd_pcm *pcm)2373{2374snd_pcm_lib_preallocate_free_for_all(pcm);2375}23762377static const struct snd_soc_component_driver mt8189_afe_component = {2378.name = AFE_PCM_NAME,2379.probe = mt8189_afe_component_probe,2380.pcm_construct = mtk_afe_pcm_new,2381.pcm_destruct = mt8189_afe_pcm_free,2382.open = mt8189_afe_pcm_open,2383.pointer = mtk_afe_pcm_pointer,2384};23852386static int mt8189_dai_memif_register(struct mtk_base_afe *afe)2387{2388struct mtk_base_afe_dai *dai;23892390dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2391if (!dai)2392return -ENOMEM;23932394list_add(&dai->list, &afe->sub_dais);23952396dai->dai_drivers = mt8189_memif_dai_driver;2397dai->num_dai_drivers = ARRAY_SIZE(mt8189_memif_dai_driver);2398dai->dapm_widgets = mt8189_memif_widgets;2399dai->num_dapm_widgets = ARRAY_SIZE(mt8189_memif_widgets);2400dai->dapm_routes = mt8189_memif_routes;2401dai->num_dapm_routes = ARRAY_SIZE(mt8189_memif_routes);24022403return 0;2404}24052406typedef int (*dai_register_cb)(struct mtk_base_afe *);2407static const dai_register_cb dai_register_cbs[] = {2408mt8189_dai_adda_register,2409mt8189_dai_i2s_register,2410mt8189_dai_pcm_register,2411mt8189_dai_tdm_register,2412mt8189_dai_memif_register,2413};24142415static const struct reg_sequence mt8189_cg_patch[] = {2416{ AUDIO_TOP_CON4, 0x361c },2417};24182419static int mt8189_afe_pcm_dev_probe(struct platform_device *pdev)2420{2421int ret, i;2422unsigned int tmp_reg;2423int irq_id;2424struct mtk_base_afe *afe;2425struct mt8189_afe_private *afe_priv;2426struct device *dev = &pdev->dev;24272428ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));2429if (ret)2430return ret;24312432ret = of_reserved_mem_device_init(dev);2433if (ret)2434dev_warn(dev, "failed to assign memory region: %d\n", ret);24352436afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);2437if (!afe)2438return -ENOMEM;24392440platform_set_drvdata(pdev, afe);24412442afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv),2443GFP_KERNEL);2444if (!afe->platform_priv)2445return -ENOMEM;24462447afe_priv = afe->platform_priv;2448afe->dev = dev;24492450afe->base_addr = devm_platform_ioremap_resource(pdev, 0);2451if (IS_ERR(afe->base_addr))2452return dev_err_probe(dev, PTR_ERR(afe->base_addr),2453"AFE base_addr not found\n");24542455/* init audio related clock */2456ret = mt8189_init_clock(afe);2457if (ret)2458return dev_err_probe(dev, ret, "init clock error.\n");24592460/* init memif */2461/* IPM2.0 no need banding */2462afe->memif_32bit_supported = 1;2463afe->memif_size = MT8189_MEMIF_NUM;2464afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),2465GFP_KERNEL);24662467if (!afe->memif)2468return -ENOMEM;24692470for (i = 0; i < afe->memif_size; i++) {2471afe->memif[i].data = &memif_data[i];2472afe->memif[i].irq_usage = memif_irq_usage[i];2473afe->memif[i].const_irq = 1;2474}24752476mutex_init(&afe->irq_alloc_lock);24772478/* init irq */2479afe->irqs_size = MT8189_IRQ_NUM;2480afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),2481GFP_KERNEL);24822483if (!afe->irqs)2484return -ENOMEM;24852486for (i = 0; i < afe->irqs_size; i++)2487afe->irqs[i].irq_data = &irq_data[i];24882489/* request irq */2490irq_id = platform_get_irq(pdev, 0);2491if (irq_id < 0)2492return dev_err_probe(dev, irq_id, "no irq found");24932494ret = devm_request_irq(dev, irq_id, mt8189_afe_irq_handler,2495IRQF_TRIGGER_NONE,2496"Afe_ISR_Handle", afe);2497if (ret)2498return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n");24992500/* init sub_dais */2501INIT_LIST_HEAD(&afe->sub_dais);25022503for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {2504ret = dai_register_cbs[i](afe);2505if (ret)2506return dev_err_probe(dev, ret, "dai register i %d fail\n", i);2507}25082509/* init dai_driver and component_driver */2510ret = mtk_afe_combine_sub_dai(afe);2511if (ret)2512return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");25132514/* others */2515afe->mtk_afe_hardware = &mt8189_afe_hardware;2516afe->memif_fs = mt8189_memif_fs;2517afe->irq_fs = mt8189_irq_fs;2518afe->get_dai_fs = mt8189_get_dai_fs;2519afe->get_memif_pbuf_size = mt8189_get_memif_pbuf_size;25202521afe->runtime_resume = mt8189_afe_runtime_resume;2522afe->runtime_suspend = mt8189_afe_runtime_suspend;25232524ret = devm_pm_runtime_enable(dev);2525if (ret)2526return ret;25272528/*2529* Audio device is part of genpd. Registering it as a syscore device2530* ensure the proper power-on sequence of the AFE device.2531*/2532dev_pm_syscore_device(dev, true);25332534/* enable clock for regcache get default value from hw */2535pm_runtime_get_sync(dev);25362537afe->regmap = devm_regmap_init_mmio(dev, afe->base_addr,2538&mt8189_afe_regmap_config);2539if (IS_ERR(afe->regmap))2540return PTR_ERR(afe->regmap);25412542ret = regmap_register_patch(afe->regmap, mt8189_cg_patch,2543ARRAY_SIZE(mt8189_cg_patch));2544if (ret < 0) {2545dev_err(dev, "Failed to apply cg patch\n");2546goto err_pm_disable;2547}25482549regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &tmp_reg);2550regmap_write(afe->regmap, AFE_IRQ_MCU_EN, 0xffffffff);2551regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &tmp_reg);25522553pm_runtime_put_sync(dev);25542555regcache_cache_only(afe->regmap, true);2556regcache_mark_dirty(afe->regmap);25572558/* register component */2559ret = devm_snd_soc_register_component(dev,2560&mt8189_afe_component,2561afe->dai_drivers,2562afe->num_dai_drivers);2563if (ret) {2564dev_err(dev, "afe component err: %d\n", ret);2565goto err_pm_disable;2566}25672568return 0;25692570err_pm_disable:2571pm_runtime_put_sync(dev);2572return ret;2573}25742575static void mt8189_afe_pcm_dev_remove(struct platform_device *pdev)2576{2577struct mtk_base_afe *afe = platform_get_drvdata(pdev);2578struct device *dev = &pdev->dev;25792580pm_runtime_put_sync(dev);2581if (!pm_runtime_status_suspended(dev))2582mt8189_afe_runtime_suspend(dev);25832584mt8189_afe_disable_main_clock(afe);2585/* disable afe clock */2586mt8189_afe_disable_reg_rw_clk(afe);2587of_reserved_mem_device_release(dev);2588}25892590static const struct of_device_id mt8189_afe_pcm_dt_match[] = {2591{ .compatible = "mediatek,mt8189-afe-pcm", },2592{},2593};2594MODULE_DEVICE_TABLE(of, mt8189_afe_pcm_dt_match);25952596static const struct dev_pm_ops mt8189_afe_pm_ops = {2597SET_RUNTIME_PM_OPS(mt8189_afe_runtime_suspend,2598mt8189_afe_runtime_resume, NULL)2599};26002601static struct platform_driver mt8189_afe_pcm_driver = {2602.driver = {2603.name = "mt8189-afe-pcm",2604.of_match_table = mt8189_afe_pcm_dt_match,2605.pm = &mt8189_afe_pm_ops,2606},2607.probe = mt8189_afe_pcm_dev_probe,2608.remove = mt8189_afe_pcm_dev_remove,2609};2610module_platform_driver(mt8189_afe_pcm_driver);26112612MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8189");2613MODULE_AUTHOR("Darren Ye <[email protected]>");2614MODULE_LICENSE("GPL");261526162617