xref: /linux/sound/soc/mediatek/mt8196/mt8196-afe-pcm.c (revision efe86f088f48f18c27b648e5724048947f3b7fb4)
157513aabSDarren Ye // SPDX-License-Identifier: GPL-2.0
257513aabSDarren Ye /*
357513aabSDarren Ye  *  Mediatek ALSA SoC AFE platform driver for 8196
457513aabSDarren Ye  *
557513aabSDarren Ye  *  Copyright (c) 2025 MediaTek Inc.
657513aabSDarren Ye  *  Author: Darren Ye <darren.ye@mediatek.com>
757513aabSDarren Ye  */
857513aabSDarren Ye 
957513aabSDarren Ye #include <linux/delay.h>
1057513aabSDarren Ye #include <linux/dma-mapping.h>
1157513aabSDarren Ye #include <linux/module.h>
1257513aabSDarren Ye #include <linux/of.h>
1357513aabSDarren Ye #include <linux/of_address.h>
1457513aabSDarren Ye #include <linux/of_device.h>
1557513aabSDarren Ye #include <linux/of_reserved_mem.h>
1657513aabSDarren Ye #include <linux/pm_runtime.h>
1757513aabSDarren Ye #include <linux/regmap.h>
1857513aabSDarren Ye 
1957513aabSDarren Ye #include <sound/pcm.h>
2057513aabSDarren Ye #include <sound/soc.h>
2157513aabSDarren Ye 
2257513aabSDarren Ye #include "mt8196-afe-clk.h"
2357513aabSDarren Ye #include "mt8196-afe-common.h"
2457513aabSDarren Ye #include "mt8196-interconnection.h"
2557513aabSDarren Ye 
2657513aabSDarren Ye #include "../common/mtk-afe-fe-dai.h"
2757513aabSDarren Ye #include "../common/mtk-afe-platform-driver.h"
2857513aabSDarren Ye 
2957513aabSDarren Ye static const struct snd_pcm_hardware mt8196_afe_hardware = {
3057513aabSDarren Ye 	.info = (SNDRV_PCM_INFO_MMAP |
3157513aabSDarren Ye 		 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP |
3257513aabSDarren Ye 		 SNDRV_PCM_INFO_INTERLEAVED |
3357513aabSDarren Ye 		 SNDRV_PCM_INFO_MMAP_VALID),
3457513aabSDarren Ye 	.formats = (SNDRV_PCM_FMTBIT_S16_LE |
3557513aabSDarren Ye 		    SNDRV_PCM_FMTBIT_S24_LE |
3657513aabSDarren Ye 		    SNDRV_PCM_FMTBIT_S32_LE),
3757513aabSDarren Ye 	.period_bytes_min = 96,
3857513aabSDarren Ye 	.period_bytes_max = 4 * 48 * 1024,
3957513aabSDarren Ye 	.periods_min = 2,
4057513aabSDarren Ye 	.periods_max = 256,
4157513aabSDarren Ye 	.buffer_bytes_max = 256 * 1024,
4257513aabSDarren Ye 	.fifo_size = 0,
4357513aabSDarren Ye };
4457513aabSDarren Ye 
4557513aabSDarren Ye static unsigned int mt8196_rate_transform(struct device *dev,
4657513aabSDarren Ye 					  unsigned int rate)
4757513aabSDarren Ye {
4857513aabSDarren Ye 	switch (rate) {
4957513aabSDarren Ye 	case 8000:
5057513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_8K;
5157513aabSDarren Ye 	case 11025:
5257513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_11K;
5357513aabSDarren Ye 	case 12000:
5457513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_12K;
5557513aabSDarren Ye 	case 16000:
5657513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_16K;
5757513aabSDarren Ye 	case 22050:
5857513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_22K;
5957513aabSDarren Ye 	case 24000:
6057513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_24K;
6157513aabSDarren Ye 	case 32000:
6257513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_32K;
6357513aabSDarren Ye 	case 44100:
6457513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_44K;
6557513aabSDarren Ye 	case 48000:
6657513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_48K;
6757513aabSDarren Ye 	case 88200:
6857513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_88K;
6957513aabSDarren Ye 	case 96000:
7057513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_96K;
7157513aabSDarren Ye 	case 176400:
7257513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_176K;
7357513aabSDarren Ye 	case 192000:
7457513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_192K;
7557513aabSDarren Ye 	/* not support 260K */
7657513aabSDarren Ye 	case 352800:
7757513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_352K;
7857513aabSDarren Ye 	case 384000:
7957513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_384K;
8057513aabSDarren Ye 	default:
8157513aabSDarren Ye 		dev_err(dev, "rate %u invalid, use %d!!!\n",
8257513aabSDarren Ye 			rate, MTK_AFE_IPM2P0_RATE_48K);
8357513aabSDarren Ye 		return MTK_AFE_IPM2P0_RATE_48K;
8457513aabSDarren Ye 	}
8557513aabSDarren Ye }
8657513aabSDarren Ye 
8757513aabSDarren Ye static int mt8196_set_cm(struct mtk_base_afe *afe, int id,
8857513aabSDarren Ye 			 bool update, bool swap, unsigned int ch)
8957513aabSDarren Ye {
9057513aabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
9157513aabSDarren Ye 	unsigned int rate = afe_priv->cm_rate[id];
9257513aabSDarren Ye 	unsigned int rate_val = mt8196_rate_transform(afe->dev, rate);
9357513aabSDarren Ye 	unsigned int ch_pair = ch / 2;
9457513aabSDarren Ye 	unsigned int update_val;
9557513aabSDarren Ye 	int reg = AFE_CM0_CON0 + 0x10 * id;
9657513aabSDarren Ye 
9757513aabSDarren Ye 	if (update && ch_pair)
9857513aabSDarren Ye 		update_val = (26000000 / rate - 10) / ch_pair - 1;
9957513aabSDarren Ye 	else
10057513aabSDarren Ye 		update_val = 0x64;
10157513aabSDarren Ye 
10257513aabSDarren Ye 	dev_dbg(afe->dev, "CM%d, rate %d, update %d, swap %d, ch %d, update_val: %d\n",
10357513aabSDarren Ye 		id, rate, update, swap, ch, update_val);
10457513aabSDarren Ye 
10557513aabSDarren Ye 	/* update cnt */
10657513aabSDarren Ye 	regmap_update_bits(afe->regmap, reg,
10757513aabSDarren Ye 			   AFE_CM_UPDATE_CNT_MASK << AFE_CM_UPDATE_CNT_SFT,
10857513aabSDarren Ye 			   update_val << AFE_CM_UPDATE_CNT_SFT);
10957513aabSDarren Ye 
11057513aabSDarren Ye 	/* rate */
11157513aabSDarren Ye 	regmap_update_bits(afe->regmap, reg,
11257513aabSDarren Ye 			   AFE_CM_1X_EN_SEL_FS_MASK << AFE_CM_1X_EN_SEL_FS_SFT,
11357513aabSDarren Ye 			   rate_val << AFE_CM_1X_EN_SEL_FS_SFT);
11457513aabSDarren Ye 
11557513aabSDarren Ye 	/* ch num */
11657513aabSDarren Ye 	ch = ch - 1;
11757513aabSDarren Ye 	regmap_update_bits(afe->regmap, reg,
11857513aabSDarren Ye 			   AFE_CM_CH_NUM_MASK << AFE_CM_CH_NUM_SFT,
11957513aabSDarren Ye 			   ch << AFE_CM_CH_NUM_SFT);
12057513aabSDarren Ye 
12157513aabSDarren Ye 	/* swap */
12257513aabSDarren Ye 	regmap_update_bits(afe->regmap, reg,
12357513aabSDarren Ye 			   AFE_CM_BYTE_SWAP_MASK << AFE_CM_BYTE_SWAP_SFT,
12457513aabSDarren Ye 			   swap << AFE_CM_BYTE_SWAP_SFT);
12557513aabSDarren Ye 
12657513aabSDarren Ye 	return 0;
12757513aabSDarren Ye }
12857513aabSDarren Ye 
12957513aabSDarren Ye static int mt8196_enable_cm_bypass(struct mtk_base_afe *afe, int id, bool en)
13057513aabSDarren Ye {
13157513aabSDarren Ye 	return regmap_update_bits(afe->regmap,
13257513aabSDarren Ye 				  AFE_CM0_CON0 + 0x10 * id,
13357513aabSDarren Ye 				  AFE_CM_BYPASS_MODE_MASK << AFE_CM_BYPASS_MODE_SFT,
13457513aabSDarren Ye 				  en << AFE_CM_BYPASS_MODE_SFT);
13557513aabSDarren Ye }
13657513aabSDarren Ye 
13757513aabSDarren Ye static int mt8196_fe_startup(struct snd_pcm_substream *substream,
13857513aabSDarren Ye 			     struct snd_soc_dai *dai)
13957513aabSDarren Ye {
14057513aabSDarren Ye 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
14157513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
14257513aabSDarren Ye 	struct snd_pcm_runtime *runtime = substream->runtime;
14357513aabSDarren Ye 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
14457513aabSDarren Ye 	int memif_num = cpu_dai->id;
14557513aabSDarren Ye 	struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
14657513aabSDarren Ye 	const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware;
14757513aabSDarren Ye 	int ret;
14857513aabSDarren Ye 
14957513aabSDarren Ye 	dev_dbg(afe->dev, "memif_num: %d.\n", memif_num);
15057513aabSDarren Ye 
15157513aabSDarren Ye 	memif->substream = substream;
15257513aabSDarren Ye 
15357513aabSDarren Ye 	snd_pcm_hw_constraint_step(substream->runtime, 0,
15457513aabSDarren Ye 				   SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16);
15557513aabSDarren Ye 
15657513aabSDarren Ye 	if (memif_num == MT8196_MEMIF_VUL_CM0)
15757513aabSDarren Ye 		snd_pcm_hw_constraint_step(substream->runtime, 0,
15857513aabSDarren Ye 					   SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 16);
15957513aabSDarren Ye 
16057513aabSDarren Ye 	snd_soc_set_runtime_hwparams(substream, mtk_afe_hardware);
16157513aabSDarren Ye 
16257513aabSDarren Ye 	ret = snd_pcm_hw_constraint_integer(runtime,
16357513aabSDarren Ye 					    SNDRV_PCM_HW_PARAM_PERIODS);
16457513aabSDarren Ye 	if (ret < 0)
16557513aabSDarren Ye 		dev_warn(afe->dev, "snd_pcm_hw_constraint_integer failed\n");
16657513aabSDarren Ye 
16757513aabSDarren Ye 	/* dynamic allocate irq to memif */
16857513aabSDarren Ye 	if (memif->irq_usage < 0) {
16957513aabSDarren Ye 		int irq_id = mtk_dynamic_irq_acquire(afe);
17057513aabSDarren Ye 
17157513aabSDarren Ye 		if (irq_id != afe->irqs_size) {
17257513aabSDarren Ye 			/* link */
17357513aabSDarren Ye 			memif->irq_usage = irq_id;
17457513aabSDarren Ye 		} else {
17557513aabSDarren Ye 			dev_err(afe->dev, "no more asys irq\n");
17657513aabSDarren Ye 			ret = -EBUSY;
17757513aabSDarren Ye 		}
17857513aabSDarren Ye 	}
17957513aabSDarren Ye 	return ret;
18057513aabSDarren Ye }
18157513aabSDarren Ye 
18257513aabSDarren Ye static void mt8196_fe_shutdown(struct snd_pcm_substream *substream,
18357513aabSDarren Ye 			       struct snd_soc_dai *dai)
18457513aabSDarren Ye {
18557513aabSDarren Ye 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
18657513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
18757513aabSDarren Ye 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
18857513aabSDarren Ye 	int memif_num = cpu_dai->id;
18957513aabSDarren Ye 	struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
19057513aabSDarren Ye 	int irq_id = memif->irq_usage;
19157513aabSDarren Ye 
19257513aabSDarren Ye 	dev_dbg(afe->dev, "memif_num: %d.\n", memif_num);
19357513aabSDarren Ye 
19457513aabSDarren Ye 	memif->substream = NULL;
19557513aabSDarren Ye 
19657513aabSDarren Ye 	if (!memif->const_irq) {
19757513aabSDarren Ye 		mtk_dynamic_irq_release(afe, irq_id);
19857513aabSDarren Ye 		memif->irq_usage = -1;
19957513aabSDarren Ye 		memif->substream = NULL;
20057513aabSDarren Ye 	}
20157513aabSDarren Ye }
20257513aabSDarren Ye 
20357513aabSDarren Ye static int mt8196_fe_hw_params(struct snd_pcm_substream *substream,
20457513aabSDarren Ye 			       struct snd_pcm_hw_params *params,
20557513aabSDarren Ye 			       struct snd_soc_dai *dai)
20657513aabSDarren Ye {
20757513aabSDarren Ye 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
20857513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
20957513aabSDarren Ye 	unsigned int channels = params_channels(params);
21057513aabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
21157513aabSDarren Ye 	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
21257513aabSDarren Ye 	struct mtk_base_afe_memif *memif = &afe->memif[id];
21357513aabSDarren Ye 	const struct mtk_base_memif_data *data = memif->data;
21457513aabSDarren Ye 	int cm;
21557513aabSDarren Ye 
21657513aabSDarren Ye 	afe_priv->cm_channels = channels;
21757513aabSDarren Ye 
21857513aabSDarren Ye 	/* set channels */
21957513aabSDarren Ye 	if (data->ch_num_shift >= 0) {
22057513aabSDarren Ye 		regmap_update_bits(afe->regmap, data->ch_num_reg,
22157513aabSDarren Ye 				   data->ch_num_maskbit << data->ch_num_shift,
22257513aabSDarren Ye 				   channels << data->ch_num_shift);
22357513aabSDarren Ye 	}
22457513aabSDarren Ye 
22557513aabSDarren Ye 	switch (id) {
22657513aabSDarren Ye 	case MT8196_MEMIF_VUL8:
22757513aabSDarren Ye 	case MT8196_MEMIF_VUL_CM0:
22857513aabSDarren Ye 		cm = CM0;
22957513aabSDarren Ye 		break;
23057513aabSDarren Ye 	case MT8196_MEMIF_VUL9:
23157513aabSDarren Ye 	case MT8196_MEMIF_VUL_CM1:
23257513aabSDarren Ye 		cm = CM1;
23357513aabSDarren Ye 		break;
23457513aabSDarren Ye 	case MT8196_MEMIF_VUL10:
23557513aabSDarren Ye 	case MT8196_MEMIF_VUL_CM2:
23657513aabSDarren Ye 		cm = CM2;
23757513aabSDarren Ye 		break;
23857513aabSDarren Ye 	default:
23957513aabSDarren Ye 		cm = CM0;
24057513aabSDarren Ye 		break;
24157513aabSDarren Ye 	}
24257513aabSDarren Ye 
24357513aabSDarren Ye 	afe_priv->cm_rate[cm] = params_rate(params);
24457513aabSDarren Ye 
24557513aabSDarren Ye 	return mtk_afe_fe_hw_params(substream, params, dai);
24657513aabSDarren Ye }
24757513aabSDarren Ye 
24857513aabSDarren Ye static int mt8196_fe_trigger(struct snd_pcm_substream *substream, int cmd,
24957513aabSDarren Ye 			     struct snd_soc_dai *dai)
25057513aabSDarren Ye {
25157513aabSDarren Ye 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
25257513aabSDarren Ye 	struct snd_pcm_runtime *const runtime = substream->runtime;
25357513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
25457513aabSDarren Ye 	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
25557513aabSDarren Ye 	struct mtk_base_afe_memif *memif = &afe->memif[id];
25657513aabSDarren Ye 	int irq_id = memif->irq_usage;
25757513aabSDarren Ye 	struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
25857513aabSDarren Ye 	const struct mtk_base_irq_data *irq_data = irqs->irq_data;
25957513aabSDarren Ye 	unsigned int counter = runtime->period_size;
26057513aabSDarren Ye 	unsigned int rate = runtime->rate;
26157513aabSDarren Ye 	unsigned int tmp_reg;
26257513aabSDarren Ye 	int fs;
26357513aabSDarren Ye 	int ret;
26457513aabSDarren Ye 
26557513aabSDarren Ye 	dev_dbg(afe->dev, "%s cmd %d, irq_id %d\n", memif->data->name, cmd, irq_id);
26657513aabSDarren Ye 
26757513aabSDarren Ye 	switch (cmd) {
26857513aabSDarren Ye 	case SNDRV_PCM_TRIGGER_START:
26957513aabSDarren Ye 	case SNDRV_PCM_TRIGGER_RESUME:
27057513aabSDarren Ye 		dev_dbg(afe->dev, "%s cmd %d, id %d\n", memif->data->name, cmd, id);
27157513aabSDarren Ye 
27257513aabSDarren Ye 		ret = mtk_memif_set_enable(afe, id);
27357513aabSDarren Ye 		if (ret) {
27457513aabSDarren Ye 			dev_err(afe->dev, "id %d, memif enable fail.\n", id);
27557513aabSDarren Ye 			return ret;
27657513aabSDarren Ye 		}
27757513aabSDarren Ye 
27857513aabSDarren Ye 		/*
27957513aabSDarren Ye 		 * for small latency record
28057513aabSDarren Ye 		 * ul memif need read some data before irq enable.
28157513aabSDarren Ye 		 * the context of this ops triger is atmoic, so it cannot sleep.
28257513aabSDarren Ye 		 */
28357513aabSDarren Ye 		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
28457513aabSDarren Ye 			if ((runtime->period_size * 1000) / rate <= 10)
28557513aabSDarren Ye 				udelay(300);
28657513aabSDarren Ye 
28757513aabSDarren Ye 		regmap_update_bits(afe->regmap,
28857513aabSDarren Ye 				   irq_data->irq_cnt_reg,
28957513aabSDarren Ye 				   irq_data->irq_cnt_maskbit << irq_data->irq_cnt_shift,
29057513aabSDarren Ye 				   counter << irq_data->irq_cnt_shift);
29157513aabSDarren Ye 
29257513aabSDarren Ye 		/* set irq fs */
29357513aabSDarren Ye 		fs = afe->irq_fs(substream, rate);
29457513aabSDarren Ye 		if (fs < 0)
29557513aabSDarren Ye 			return -EINVAL;
29657513aabSDarren Ye 
29757513aabSDarren Ye 		if (irq_data->irq_fs_reg >= 0)
29857513aabSDarren Ye 			regmap_update_bits(afe->regmap,
29957513aabSDarren Ye 					   irq_data->irq_fs_reg,
30057513aabSDarren Ye 					   irq_data->irq_fs_maskbit << irq_data->irq_fs_shift,
30157513aabSDarren Ye 					   fs << irq_data->irq_fs_shift);
30257513aabSDarren Ye 
30357513aabSDarren Ye 		/* enable interrupt */
30457513aabSDarren Ye 		regmap_update_bits(afe->regmap,
30557513aabSDarren Ye 				   irq_data->irq_en_reg,
30657513aabSDarren Ye 				   1 << irq_data->irq_en_shift,
30757513aabSDarren Ye 				   1 << irq_data->irq_en_shift);
30857513aabSDarren Ye 
30957513aabSDarren Ye 		return 0;
31057513aabSDarren Ye 	case SNDRV_PCM_TRIGGER_STOP:
31157513aabSDarren Ye 	case SNDRV_PCM_TRIGGER_SUSPEND:
31257513aabSDarren Ye 		ret = mtk_memif_set_disable(afe, id);
31357513aabSDarren Ye 		if (ret)
31457513aabSDarren Ye 			dev_warn(afe->dev, "id %d, memif disable fail\n", id);
31557513aabSDarren Ye 
31657513aabSDarren Ye 		/* disable interrupt */
31757513aabSDarren Ye 		regmap_update_bits(afe->regmap,
31857513aabSDarren Ye 				   irq_data->irq_en_reg,
31957513aabSDarren Ye 				   1 << irq_data->irq_en_shift,
32057513aabSDarren Ye 				   0 << irq_data->irq_en_shift);
32157513aabSDarren Ye 
32257513aabSDarren Ye 		/*
32357513aabSDarren Ye 		 * clear pending IRQ, if the register read as one, there is no need to write
32457513aabSDarren Ye 		 * one to clear operaton.
32557513aabSDarren Ye 		 */
32657513aabSDarren Ye 		regmap_read(afe->regmap, irq_data->irq_clr_reg, &tmp_reg);
32757513aabSDarren Ye 		regmap_update_bits(afe->regmap, irq_data->irq_clr_reg,
32857513aabSDarren Ye 				   AFE_IRQ_CLR_CFG_MASK_SFT | AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT,
32957513aabSDarren Ye 				   tmp_reg ^ (AFE_IRQ_CLR_CFG_MASK_SFT |
33057513aabSDarren Ye 				   AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT));
33157513aabSDarren Ye 
33257513aabSDarren Ye 		return ret;
33357513aabSDarren Ye 	default:
33457513aabSDarren Ye 		return -EINVAL;
33557513aabSDarren Ye 	}
33657513aabSDarren Ye }
33757513aabSDarren Ye 
33857513aabSDarren Ye static int mt8196_memif_fs(struct snd_pcm_substream *substream,
33957513aabSDarren Ye 			   unsigned int rate)
34057513aabSDarren Ye {
34157513aabSDarren Ye 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
34257513aabSDarren Ye 	struct snd_soc_component *component =
34357513aabSDarren Ye 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
34457513aabSDarren Ye 	struct mtk_base_afe *afe = NULL;
34557513aabSDarren Ye 	unsigned int rate_reg;
34657513aabSDarren Ye 
34757513aabSDarren Ye 	if (!component)
34857513aabSDarren Ye 		return -EINVAL;
34957513aabSDarren Ye 
35057513aabSDarren Ye 	afe = snd_soc_component_get_drvdata(component);
35157513aabSDarren Ye 	if (!afe)
35257513aabSDarren Ye 		return -EINVAL;
35357513aabSDarren Ye 
35457513aabSDarren Ye 	rate_reg = mt8196_rate_transform(afe->dev, rate);
35557513aabSDarren Ye 
35657513aabSDarren Ye 	return rate_reg;
35757513aabSDarren Ye }
35857513aabSDarren Ye 
35957513aabSDarren Ye static int mt8196_get_dai_fs(struct mtk_base_afe *afe,
36057513aabSDarren Ye 			     int dai_id, unsigned int rate)
36157513aabSDarren Ye {
36257513aabSDarren Ye 	return mt8196_rate_transform(afe->dev, rate);
36357513aabSDarren Ye }
36457513aabSDarren Ye 
36557513aabSDarren Ye static int mt8196_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
36657513aabSDarren Ye {
36757513aabSDarren Ye 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
36857513aabSDarren Ye 	struct snd_soc_component *component =
36957513aabSDarren Ye 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
37057513aabSDarren Ye 	struct mtk_base_afe *afe = NULL;
37157513aabSDarren Ye 
37257513aabSDarren Ye 	if (!component)
37357513aabSDarren Ye 		return -EINVAL;
37457513aabSDarren Ye 	afe = snd_soc_component_get_drvdata(component);
37557513aabSDarren Ye 	return mt8196_rate_transform(afe->dev, rate);
37657513aabSDarren Ye }
37757513aabSDarren Ye 
37857513aabSDarren Ye static int mt8196_get_memif_pbuf_size(struct snd_pcm_substream *substream)
37957513aabSDarren Ye {
38057513aabSDarren Ye 	struct snd_pcm_runtime *runtime = substream->runtime;
38157513aabSDarren Ye 
38257513aabSDarren Ye 	if ((runtime->period_size * 1000) / runtime->rate > 10)
38357513aabSDarren Ye 		return MT8196_MEMIF_PBUF_SIZE_256_BYTES;
38457513aabSDarren Ye 	else
38557513aabSDarren Ye 		return MT8196_MEMIF_PBUF_SIZE_32_BYTES;
38657513aabSDarren Ye }
38757513aabSDarren Ye 
38857513aabSDarren Ye /* FE DAIs */
38957513aabSDarren Ye static const struct snd_soc_dai_ops mt8196_memif_dai_ops = {
39057513aabSDarren Ye 	.startup        = mt8196_fe_startup,
39157513aabSDarren Ye 	.shutdown       = mt8196_fe_shutdown,
39257513aabSDarren Ye 	.hw_params      = mt8196_fe_hw_params,
39357513aabSDarren Ye 	.hw_free        = mtk_afe_fe_hw_free,
39457513aabSDarren Ye 	.prepare        = mtk_afe_fe_prepare,
39557513aabSDarren Ye 	.trigger        = mt8196_fe_trigger,
39657513aabSDarren Ye };
39757513aabSDarren Ye 
39857513aabSDarren Ye #define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
39957513aabSDarren Ye 		       SNDRV_PCM_RATE_88200 |\
40057513aabSDarren Ye 		       SNDRV_PCM_RATE_96000 |\
40157513aabSDarren Ye 		       SNDRV_PCM_RATE_176400 |\
40257513aabSDarren Ye 		       SNDRV_PCM_RATE_192000)
40357513aabSDarren Ye 
40457513aabSDarren Ye #define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\
40557513aabSDarren Ye 			   SNDRV_PCM_RATE_16000 |\
40657513aabSDarren Ye 			   SNDRV_PCM_RATE_32000 |\
40757513aabSDarren Ye 			   SNDRV_PCM_RATE_48000)
40857513aabSDarren Ye 
40957513aabSDarren Ye #define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
41057513aabSDarren Ye 			 SNDRV_PCM_FMTBIT_S24_LE |\
41157513aabSDarren Ye 			 SNDRV_PCM_FMTBIT_S32_LE)
41257513aabSDarren Ye 
41357513aabSDarren Ye #define MT8196_FE_DAI(_name, _id, max_ch, dir) \
41457513aabSDarren Ye { \
41557513aabSDarren Ye 	.name = #_name, \
41657513aabSDarren Ye 	.id = _id, \
41757513aabSDarren Ye 	.dir = { \
41857513aabSDarren Ye 		.stream_name = #_name, \
41957513aabSDarren Ye 		.channels_min = 1, \
42057513aabSDarren Ye 		.channels_max = max_ch, \
42157513aabSDarren Ye 		.rates = MTK_PCM_RATES, \
42257513aabSDarren Ye 		.formats = MTK_PCM_FORMATS, \
42357513aabSDarren Ye 	}, \
42457513aabSDarren Ye 	.ops = &mt8196_memif_dai_ops, \
42557513aabSDarren Ye }
42657513aabSDarren Ye 
42757513aabSDarren Ye static struct snd_soc_dai_driver mt8196_memif_dai_driver[] = {
42857513aabSDarren Ye 	/* FE DAIs: memory intefaces to CPU */
42957513aabSDarren Ye 	/* Playback */
43057513aabSDarren Ye 	MT8196_FE_DAI(DL0, MT8196_MEMIF_DL0, 2, playback),
43157513aabSDarren Ye 	MT8196_FE_DAI(DL1, MT8196_MEMIF_DL1, 2, playback),
43257513aabSDarren Ye 	MT8196_FE_DAI(DL2, MT8196_MEMIF_DL2, 2, playback),
43357513aabSDarren Ye 	MT8196_FE_DAI(DL3, MT8196_MEMIF_DL3, 2, playback),
43457513aabSDarren Ye 	MT8196_FE_DAI(DL4, MT8196_MEMIF_DL4, 2, playback),
43557513aabSDarren Ye 	MT8196_FE_DAI(DL5, MT8196_MEMIF_DL5, 2, playback),
43657513aabSDarren Ye 	MT8196_FE_DAI(DL6, MT8196_MEMIF_DL6, 2, playback),
43757513aabSDarren Ye 	MT8196_FE_DAI(DL7, MT8196_MEMIF_DL7, 2, playback),
43857513aabSDarren Ye 	MT8196_FE_DAI(DL8, MT8196_MEMIF_DL8, 2, playback),
43957513aabSDarren Ye 	MT8196_FE_DAI(DL23, MT8196_MEMIF_DL23, 2, playback),
44057513aabSDarren Ye 	MT8196_FE_DAI(DL24, MT8196_MEMIF_DL24, 2, playback),
44157513aabSDarren Ye 	MT8196_FE_DAI(DL25, MT8196_MEMIF_DL25, 2, playback),
44257513aabSDarren Ye 	MT8196_FE_DAI(DL26, MT8196_MEMIF_DL26, 2, playback),
44357513aabSDarren Ye 	MT8196_FE_DAI(DL_4CH, MT8196_MEMIF_DL_4CH, 4, playback),
44457513aabSDarren Ye 	MT8196_FE_DAI(DL_24CH, MT8196_MEMIF_DL_24CH, 8, playback),
44557513aabSDarren Ye 	MT8196_FE_DAI(HDMI, MT8196_MEMIF_HDMI, 8, playback),
44657513aabSDarren Ye 	/* Capture */
44757513aabSDarren Ye 	MT8196_FE_DAI(UL0, MT8196_MEMIF_VUL0, 2, capture),
44857513aabSDarren Ye 	MT8196_FE_DAI(UL1, MT8196_MEMIF_VUL1, 2, capture),
44957513aabSDarren Ye 	MT8196_FE_DAI(UL2, MT8196_MEMIF_VUL2, 2, capture),
45057513aabSDarren Ye 	MT8196_FE_DAI(UL3, MT8196_MEMIF_VUL3, 2, capture),
45157513aabSDarren Ye 	MT8196_FE_DAI(UL4, MT8196_MEMIF_VUL4, 2, capture),
45257513aabSDarren Ye 	MT8196_FE_DAI(UL5, MT8196_MEMIF_VUL5, 2, capture),
45357513aabSDarren Ye 	MT8196_FE_DAI(UL6, MT8196_MEMIF_VUL6, 2, capture),
45457513aabSDarren Ye 	MT8196_FE_DAI(UL7, MT8196_MEMIF_VUL7, 2, capture),
45557513aabSDarren Ye 	MT8196_FE_DAI(UL8, MT8196_MEMIF_VUL8, 2, capture),
45657513aabSDarren Ye 	MT8196_FE_DAI(UL9, MT8196_MEMIF_VUL9, 16, capture),
45757513aabSDarren Ye 	MT8196_FE_DAI(UL10, MT8196_MEMIF_VUL10, 2, capture),
45857513aabSDarren Ye 	MT8196_FE_DAI(UL24, MT8196_MEMIF_VUL24, 2, capture),
45957513aabSDarren Ye 	MT8196_FE_DAI(UL25, MT8196_MEMIF_VUL25, 2, capture),
46057513aabSDarren Ye 	MT8196_FE_DAI(UL26, MT8196_MEMIF_VUL26, 2, capture),
46157513aabSDarren Ye 	MT8196_FE_DAI(UL_CM0, MT8196_MEMIF_VUL_CM0, 8, capture),
46257513aabSDarren Ye 	MT8196_FE_DAI(UL_CM1, MT8196_MEMIF_VUL_CM1, 16, capture),
46357513aabSDarren Ye 	MT8196_FE_DAI(UL_CM2, MT8196_MEMIF_VUL_CM2, 32, capture),
46457513aabSDarren Ye 	MT8196_FE_DAI(UL_ETDM_IN0, MT8196_MEMIF_ETDM_IN0, 2, capture),
46557513aabSDarren Ye 	MT8196_FE_DAI(UL_ETDM_IN1, MT8196_MEMIF_ETDM_IN1, 2, capture),
46657513aabSDarren Ye 	MT8196_FE_DAI(UL_ETDM_IN2, MT8196_MEMIF_ETDM_IN2, 2, capture),
46757513aabSDarren Ye 	MT8196_FE_DAI(UL_ETDM_IN3, MT8196_MEMIF_ETDM_IN3, 2, capture),
46857513aabSDarren Ye 	MT8196_FE_DAI(UL_ETDM_IN4, MT8196_MEMIF_ETDM_IN4, 2, capture),
46957513aabSDarren Ye 	MT8196_FE_DAI(UL_ETDM_IN6, MT8196_MEMIF_ETDM_IN6, 2, capture),
47057513aabSDarren Ye };
47157513aabSDarren Ye 
47257513aabSDarren Ye static int ul_cm0_event(struct snd_soc_dapm_widget *w,
47357513aabSDarren Ye 			struct snd_kcontrol *kcontrol,
47457513aabSDarren Ye 			int event)
47557513aabSDarren Ye {
47657513aabSDarren Ye 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
47757513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
47857513aabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
47957513aabSDarren Ye 	unsigned int channels = afe_priv->cm_channels;
48057513aabSDarren Ye 
48157513aabSDarren Ye 	dev_dbg(afe->dev, "event 0x%x, name %s, channels %u\n",
48257513aabSDarren Ye 		event, w->name, channels);
48357513aabSDarren Ye 
48457513aabSDarren Ye 	switch (event) {
48557513aabSDarren Ye 	case SND_SOC_DAPM_PRE_PMU:
48657513aabSDarren Ye 		mt8196_enable_cm_bypass(afe, CM0, false);
48757513aabSDarren Ye 		mt8196_set_cm(afe, CM0, true, false, channels);
48857513aabSDarren Ye 		regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
48957513aabSDarren Ye 				   PDN_CM0_MASK_SFT, 0 << PDN_CM0_SFT);
49057513aabSDarren Ye 		break;
49157513aabSDarren Ye 	case SND_SOC_DAPM_POST_PMD:
49257513aabSDarren Ye 		mt8196_enable_cm_bypass(afe, CM0, true);
49357513aabSDarren Ye 		regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
49457513aabSDarren Ye 				   PDN_CM0_MASK_SFT, 1 << PDN_CM0_SFT);
49557513aabSDarren Ye 		break;
49657513aabSDarren Ye 	default:
49757513aabSDarren Ye 		break;
49857513aabSDarren Ye 	}
49957513aabSDarren Ye 
50057513aabSDarren Ye 	return 0;
50157513aabSDarren Ye }
50257513aabSDarren Ye 
50357513aabSDarren Ye static int ul_cm1_event(struct snd_soc_dapm_widget *w,
50457513aabSDarren Ye 			struct snd_kcontrol *kcontrol,
50557513aabSDarren Ye 			int event)
50657513aabSDarren Ye {
50757513aabSDarren Ye 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
50857513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
50957513aabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
51057513aabSDarren Ye 	unsigned int channels = afe_priv->cm_channels;
51157513aabSDarren Ye 
51257513aabSDarren Ye 	dev_dbg(afe->dev, "event 0x%x, name %s, channels %u\n",
51357513aabSDarren Ye 		event, w->name, channels);
51457513aabSDarren Ye 
51557513aabSDarren Ye 	switch (event) {
51657513aabSDarren Ye 	case SND_SOC_DAPM_PRE_PMU:
51757513aabSDarren Ye 		mt8196_enable_cm_bypass(afe, CM1, false);
51857513aabSDarren Ye 		mt8196_set_cm(afe, CM1, true, false, channels);
51957513aabSDarren Ye 		regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
52057513aabSDarren Ye 				   PDN_CM1_MASK_SFT, 0 << PDN_CM1_SFT);
52157513aabSDarren Ye 		break;
52257513aabSDarren Ye 	case SND_SOC_DAPM_POST_PMD:
52357513aabSDarren Ye 		mt8196_enable_cm_bypass(afe, CM1, true);
52457513aabSDarren Ye 		regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
52557513aabSDarren Ye 				   PDN_CM1_MASK_SFT, 1 << PDN_CM1_SFT);
52657513aabSDarren Ye 		break;
52757513aabSDarren Ye 	default:
52857513aabSDarren Ye 		break;
52957513aabSDarren Ye 	}
53057513aabSDarren Ye 
53157513aabSDarren Ye 	return 0;
53257513aabSDarren Ye }
53357513aabSDarren Ye 
53457513aabSDarren Ye static int ul_cm2_event(struct snd_soc_dapm_widget *w,
53557513aabSDarren Ye 			struct snd_kcontrol *kcontrol,
53657513aabSDarren Ye 			int event)
53757513aabSDarren Ye {
53857513aabSDarren Ye 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
53957513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
54057513aabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
54157513aabSDarren Ye 	unsigned int channels = afe_priv->cm_channels;
54257513aabSDarren Ye 
54357513aabSDarren Ye 	dev_dbg(afe->dev, "event 0x%x, name %s, channels %u\n",
54457513aabSDarren Ye 		event, w->name, channels);
54557513aabSDarren Ye 
54657513aabSDarren Ye 	switch (event) {
54757513aabSDarren Ye 	case SND_SOC_DAPM_PRE_PMU:
54857513aabSDarren Ye 		mt8196_enable_cm_bypass(afe, CM2, false);
54957513aabSDarren Ye 		mt8196_set_cm(afe, CM2, true, false, channels);
55057513aabSDarren Ye 		regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
55157513aabSDarren Ye 				   PDN_CM2_MASK_SFT, 0 << PDN_CM2_SFT);
55257513aabSDarren Ye 		break;
55357513aabSDarren Ye 	case SND_SOC_DAPM_POST_PMD:
55457513aabSDarren Ye 		mt8196_enable_cm_bypass(afe, CM2, true);
55557513aabSDarren Ye 		regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
55657513aabSDarren Ye 				   PDN_CM2_MASK_SFT, 1 << PDN_CM2_SFT);
55757513aabSDarren Ye 		break;
55857513aabSDarren Ye 	default:
55957513aabSDarren Ye 		break;
56057513aabSDarren Ye 	}
56157513aabSDarren Ye 
56257513aabSDarren Ye 	return 0;
56357513aabSDarren Ye }
56457513aabSDarren Ye 
56557513aabSDarren Ye /*
56657513aabSDarren Ye  * dma widget & routes
56757513aabSDarren Ye  * The mixer controls and routes are by no means fully implemented,
56857513aabSDarren Ye  * only the ones that are intended to be used are, as other wise a fully
56957513aabSDarren Ye  * interconnected switch bar mixer would introduce way too many unused
57057513aabSDarren Ye  * controls.
57157513aabSDarren Ye  */
57257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul0_ch1_mix[] = {
57357513aabSDarren Ye 	/* Normal record */
57457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN018_0,
57557513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
57657513aabSDarren Ye };
57757513aabSDarren Ye 
57857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul0_ch2_mix[] = {
57957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN019_0,
58057513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
58157513aabSDarren Ye };
58257513aabSDarren Ye 
58357513aabSDarren Ye static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {
58457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN4_CH1", AFE_CONN020_4,
58557513aabSDarren Ye 				    I_I2SIN4_CH1, 1, 0),
58657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH1", AFE_CONN020_5,
58757513aabSDarren Ye 				    I_I2SIN6_CH1, 1, 0),
58857513aabSDarren Ye };
58957513aabSDarren Ye 
59057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
59157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN4_CH2", AFE_CONN021_4,
59257513aabSDarren Ye 				    I_I2SIN4_CH2, 1, 0),
59357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH2", AFE_CONN021_5,
59457513aabSDarren Ye 				    I_I2SIN6_CH2, 1, 0),
59557513aabSDarren Ye };
59657513aabSDarren Ye 
59757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
59857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN022_0,
59957513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
60057513aabSDarren Ye };
60157513aabSDarren Ye 
60257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {
60357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN023_0,
60457513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
60557513aabSDarren Ye };
60657513aabSDarren Ye 
60757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {
60857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN024_4,
60957513aabSDarren Ye 				    I_I2SIN0_CH1, 1, 0),
61057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH1", AFE_CONN024_4,
61157513aabSDarren Ye 				    I_I2SIN1_CH1, 1, 0),
61257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN3_CH1", AFE_CONN024_4,
61357513aabSDarren Ye 				    I_I2SIN3_CH1, 1, 0),
61457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN4_CH1", AFE_CONN024_4,
61557513aabSDarren Ye 				    I_I2SIN4_CH1, 1, 0),
61657513aabSDarren Ye };
61757513aabSDarren Ye 
61857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
61957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN025_4,
62057513aabSDarren Ye 				    I_I2SIN0_CH2, 1, 0),
62157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN1_CH2", AFE_CONN025_4,
62257513aabSDarren Ye 				    I_I2SIN1_CH2, 1, 0),
62357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN3_CH2", AFE_CONN025_4,
62457513aabSDarren Ye 				    I_I2SIN3_CH2, 1, 0),
62557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN4_CH2", AFE_CONN025_4,
62657513aabSDarren Ye 				    I_I2SIN4_CH2, 1, 0),
62757513aabSDarren Ye };
62857513aabSDarren Ye 
62957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {
63057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN026_0,
63157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
63257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN026_1,
63357513aabSDarren Ye 				    I_DL0_CH1, 1, 0),
63457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN026_1,
63557513aabSDarren Ye 				    I_DL1_CH1, 1, 0),
63657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN026_1,
63757513aabSDarren Ye 				    I_DL6_CH1, 1, 0),
63857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN026_1,
63957513aabSDarren Ye 				    I_DL2_CH1, 1, 0),
64057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN026_1,
64157513aabSDarren Ye 				    I_DL3_CH1, 1, 0),
64257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN026_1,
64357513aabSDarren Ye 				    I_DL_24CH_CH1, 1, 0),
64457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN026_4,
64557513aabSDarren Ye 				    I_I2SIN0_CH1, 1, 0),
64657513aabSDarren Ye };
64757513aabSDarren Ye 
64857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = {
64957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN027_0,
65057513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
65157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN027_1,
65257513aabSDarren Ye 				    I_DL0_CH2, 1, 0),
65357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN027_1,
65457513aabSDarren Ye 				    I_DL1_CH2, 1, 0),
65557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN027_1,
65657513aabSDarren Ye 				    I_DL6_CH2, 1, 0),
65757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN027_1,
65857513aabSDarren Ye 				    I_DL2_CH2, 1, 0),
65957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN027_1,
66057513aabSDarren Ye 				    I_DL3_CH2, 1, 0),
66157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN027_1,
66257513aabSDarren Ye 				    I_DL_24CH_CH2, 1, 0),
66357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN027_4,
66457513aabSDarren Ye 				    I_I2SIN0_CH2, 1, 0),
66557513aabSDarren Ye };
66657513aabSDarren Ye 
66757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = {
66857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN3_CH1", AFE_CONN028_4,
66957513aabSDarren Ye 				    I_I2SIN3_CH1, 1, 0),
67057513aabSDarren Ye };
67157513aabSDarren Ye 
67257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = {
67357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN3_CH2", AFE_CONN029_4,
67457513aabSDarren Ye 				    I_I2SIN3_CH2, 1, 0),
67557513aabSDarren Ye };
67657513aabSDarren Ye 
67757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = {
67857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN030_0,
67957513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
68057513aabSDarren Ye };
68157513aabSDarren Ye 
68257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = {
68357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN031_0,
68457513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
68557513aabSDarren Ye };
68657513aabSDarren Ye 
68757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = {
68857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN032_0,
68957513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
69057513aabSDarren Ye };
69157513aabSDarren Ye 
69257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = {
69357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN033_0,
69457513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
69557513aabSDarren Ye };
69657513aabSDarren Ye 
69757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = {
69857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN034_0,
69957513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
70057513aabSDarren Ye };
70157513aabSDarren Ye 
70257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = {
70357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN035_0,
70457513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
70557513aabSDarren Ye };
70657513aabSDarren Ye 
70757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul9_ch1_mix[] = {
70857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN036_0,
70957513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
71057513aabSDarren Ye };
71157513aabSDarren Ye 
71257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul9_ch2_mix[] = {
71357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN037_0,
71457513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
71557513aabSDarren Ye };
71657513aabSDarren Ye 
71757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul10_ch1_mix[] = {
71857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN038_0,
71957513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
72057513aabSDarren Ye };
72157513aabSDarren Ye 
72257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul10_ch2_mix[] = {
72357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN039_0,
72457513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
72557513aabSDarren Ye };
72657513aabSDarren Ye 
72757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul24_ch1_mix[] = {
72857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN066_4,
72957513aabSDarren Ye 				    I_I2SIN0_CH1, 1, 0),
73057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH1", AFE_CONN066_5,
73157513aabSDarren Ye 				    I_I2SIN6_CH1, 1, 0),
73257513aabSDarren Ye };
73357513aabSDarren Ye 
73457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul24_ch2_mix[] = {
73557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN067_4,
73657513aabSDarren Ye 				    I_I2SIN0_CH2, 1, 0),
73757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH2", AFE_CONN067_5,
73857513aabSDarren Ye 				    I_I2SIN6_CH2, 1, 0),
73957513aabSDarren Ye };
74057513aabSDarren Ye 
74157513aabSDarren Ye static const struct snd_kcontrol_new memif_ul25_ch1_mix[] = {
74257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN068_4,
74357513aabSDarren Ye 				    I_I2SIN0_CH1, 1, 0),
74457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH1", AFE_CONN068_5,
74557513aabSDarren Ye 				    I_I2SIN6_CH1, 1, 0),
74657513aabSDarren Ye };
74757513aabSDarren Ye 
74857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul25_ch2_mix[] = {
74957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN069_4,
75057513aabSDarren Ye 				    I_I2SIN0_CH2, 1, 0),
75157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH2", AFE_CONN069_5,
75257513aabSDarren Ye 				    I_I2SIN6_CH2, 1, 0),
75357513aabSDarren Ye };
75457513aabSDarren Ye 
75557513aabSDarren Ye static const struct snd_kcontrol_new memif_ul26_ch1_mix[] = {
75657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH1", AFE_CONN070_4,
75757513aabSDarren Ye 				    I_I2SIN0_CH1, 1, 0),
75857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH1", AFE_CONN070_5,
75957513aabSDarren Ye 				    I_I2SIN6_CH1, 1, 0),
76057513aabSDarren Ye };
76157513aabSDarren Ye 
76257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul26_ch2_mix[] = {
76357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN0_CH2", AFE_CONN071_4,
76457513aabSDarren Ye 				    I_I2SIN0_CH2, 1, 0),
76557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("I2SIN6_CH2", AFE_CONN071_5,
76657513aabSDarren Ye 				    I_I2SIN6_CH2, 1, 0),
76757513aabSDarren Ye };
76857513aabSDarren Ye 
76957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch1_mix[] = {
77057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN040_0,
77157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
77257513aabSDarren Ye };
77357513aabSDarren Ye 
77457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch2_mix[] = {
77557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN041_0,
77657513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
77757513aabSDarren Ye };
77857513aabSDarren Ye 
77957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch3_mix[] = {
78057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN042_0,
78157513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
78257513aabSDarren Ye };
78357513aabSDarren Ye 
78457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch4_mix[] = {
78557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN043_0,
78657513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
78757513aabSDarren Ye };
78857513aabSDarren Ye 
78957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch5_mix[] = {
79057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN044_0,
79157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
79257513aabSDarren Ye };
79357513aabSDarren Ye 
79457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch6_mix[] = {
79557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN045_0,
79657513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
79757513aabSDarren Ye };
79857513aabSDarren Ye 
79957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch7_mix[] = {
80057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN046_0,
80157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
80257513aabSDarren Ye };
80357513aabSDarren Ye 
80457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm0_ch8_mix[] = {
80557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN047_0,
80657513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
80757513aabSDarren Ye };
80857513aabSDarren Ye 
80957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch1_mix[] = {
81057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN048_0,
81157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
81257513aabSDarren Ye };
81357513aabSDarren Ye 
81457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch2_mix[] = {
81557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN049_0,
81657513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
81757513aabSDarren Ye };
81857513aabSDarren Ye 
81957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch3_mix[] = {
82057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN050_0,
82157513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
82257513aabSDarren Ye };
82357513aabSDarren Ye 
82457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch4_mix[] = {
82557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN051_0,
82657513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
82757513aabSDarren Ye };
82857513aabSDarren Ye 
82957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch5_mix[] = {
83057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN052_0,
83157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
83257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN052_0,
83357513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
83457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN052_0,
83557513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
83657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN052_0,
83757513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
83857513aabSDarren Ye };
83957513aabSDarren Ye 
84057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch6_mix[] = {
84157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN053_0,
84257513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
84357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN053_0,
84457513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
84557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN053_0,
84657513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
84757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN053_0,
84857513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
84957513aabSDarren Ye };
85057513aabSDarren Ye 
85157513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch7_mix[] = {
85257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN054_0,
85357513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
85457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN054_0,
85557513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
85657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN054_0,
85757513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
85857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN054_0,
85957513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
86057513aabSDarren Ye };
86157513aabSDarren Ye 
86257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch8_mix[] = {
86357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN055_0,
86457513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
86557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN055_0,
86657513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
86757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN055_0,
86857513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
86957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN055_0,
87057513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
87157513aabSDarren Ye };
87257513aabSDarren Ye 
87357513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch9_mix[] = {
87457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN056_0,
87557513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
87657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN056_0,
87757513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
87857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN056_0,
87957513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
88057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN056_0,
88157513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
88257513aabSDarren Ye };
88357513aabSDarren Ye 
88457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch10_mix[] = {
88557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN057_0,
88657513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
88757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN057_0,
88857513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
88957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN057_0,
89057513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
89157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN057_0,
89257513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
89357513aabSDarren Ye };
89457513aabSDarren Ye 
89557513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch11_mix[] = {
89657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN058_0,
89757513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
89857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN058_0,
89957513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
90057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN058_0,
90157513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
90257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN058_0,
90357513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
90457513aabSDarren Ye };
90557513aabSDarren Ye 
90657513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch12_mix[] = {
90757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN059_0,
90857513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
90957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN059_0,
91057513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
91157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN059_0,
91257513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
91357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN059_0,
91457513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
91557513aabSDarren Ye };
91657513aabSDarren Ye 
91757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch13_mix[] = {
91857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN060_0,
91957513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
92057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN060_0,
92157513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
92257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN060_0,
92357513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
92457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN060_0,
92557513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
92657513aabSDarren Ye };
92757513aabSDarren Ye 
92857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch14_mix[] = {
92957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN061_0,
93057513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
93157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN061_0,
93257513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
93357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN061_0,
93457513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
93557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN061_0,
93657513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
93757513aabSDarren Ye };
93857513aabSDarren Ye 
93957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch15_mix[] = {
94057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN062_0,
94157513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
94257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN062_0,
94357513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
94457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN062_0,
94557513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
94657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN062_0,
94757513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
94857513aabSDarren Ye };
94957513aabSDarren Ye 
95057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm1_ch16_mix[] = {
95157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN063_0,
95257513aabSDarren Ye 				    I_ADDA_UL_CH1, 1, 0),
95357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN063_0,
95457513aabSDarren Ye 				    I_ADDA_UL_CH2, 1, 0),
95557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN063_0,
95657513aabSDarren Ye 				    I_ADDA_UL_CH3, 1, 0),
95757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN063_0,
95857513aabSDarren Ye 				    I_ADDA_UL_CH4, 1, 0),
95957513aabSDarren Ye };
96057513aabSDarren Ye 
96157513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch1_mix[] = {
96257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN064_0, I_ADDA_UL_CH1, 1, 0),
96357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN064_0, I_ADDA_UL_CH2, 1, 0),
96457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN064_0, I_ADDA_UL_CH3, 1, 0),
96557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN064_0, I_ADDA_UL_CH4, 1, 0),
96657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN064_0, I_ADDA_UL_CH5, 1, 0),
96757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN064_0, I_ADDA_UL_CH6, 1, 0),
96857513aabSDarren Ye };
96957513aabSDarren Ye 
97057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch2_mix[] = {
97157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN065_0, I_ADDA_UL_CH1, 1, 0),
97257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN065_0, I_ADDA_UL_CH2, 1, 0),
97357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN065_0, I_ADDA_UL_CH3, 1, 0),
97457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN065_0, I_ADDA_UL_CH4, 1, 0),
97557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN065_0, I_ADDA_UL_CH5, 1, 0),
97657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN065_0, I_ADDA_UL_CH6, 1, 0),
97757513aabSDarren Ye };
97857513aabSDarren Ye 
97957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch3_mix[] = {
98057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN066_0, I_ADDA_UL_CH1, 1, 0),
98157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN066_0, I_ADDA_UL_CH2, 1, 0),
98257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN066_0, I_ADDA_UL_CH3, 1, 0),
98357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN066_0, I_ADDA_UL_CH4, 1, 0),
98457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN066_0, I_ADDA_UL_CH5, 1, 0),
98557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN066_0, I_ADDA_UL_CH6, 1, 0)
98657513aabSDarren Ye };
98757513aabSDarren Ye 
98857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch4_mix[] = {
98957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN067_0, I_ADDA_UL_CH1, 1, 0),
99057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN067_0, I_ADDA_UL_CH2, 1, 0),
99157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN067_0, I_ADDA_UL_CH3, 1, 0),
99257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN067_0, I_ADDA_UL_CH4, 1, 0),
99357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN067_0, I_ADDA_UL_CH5, 1, 0),
99457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN067_0, I_ADDA_UL_CH6, 1, 0)
99557513aabSDarren Ye };
99657513aabSDarren Ye 
99757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch5_mix[] = {
99857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN068_0, I_ADDA_UL_CH1, 1, 0),
99957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN068_0, I_ADDA_UL_CH2, 1, 0),
100057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN068_0, I_ADDA_UL_CH3, 1, 0),
100157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN068_0, I_ADDA_UL_CH4, 1, 0),
100257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN068_0, I_ADDA_UL_CH5, 1, 0),
100357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN068_0, I_ADDA_UL_CH6, 1, 0)
100457513aabSDarren Ye };
100557513aabSDarren Ye 
100657513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch6_mix[] = {
100757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN069_0, I_ADDA_UL_CH1, 1, 0),
100857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN069_0, I_ADDA_UL_CH2, 1, 0),
100957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN069_0, I_ADDA_UL_CH3, 1, 0),
101057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN069_0, I_ADDA_UL_CH4, 1, 0),
101157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH5", AFE_CONN069_0, I_ADDA_UL_CH5, 1, 0),
101257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH6", AFE_CONN069_0, I_ADDA_UL_CH6, 1, 0)
101357513aabSDarren Ye };
101457513aabSDarren Ye 
101557513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch7_mix[] = {
101657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN070_0, I_ADDA_UL_CH1, 1, 0),
101757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN070_0, I_ADDA_UL_CH2, 1, 0),
101857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN070_0, I_ADDA_UL_CH3, 1, 0),
101957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN070_0, I_ADDA_UL_CH4, 1, 0),
102057513aabSDarren Ye };
102157513aabSDarren Ye 
102257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch8_mix[] = {
102357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN071_0, I_ADDA_UL_CH1, 1, 0),
102457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN071_0, I_ADDA_UL_CH2, 1, 0),
102557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN071_0, I_ADDA_UL_CH3, 1, 0),
102657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN071_0, I_ADDA_UL_CH4, 1, 0),
102757513aabSDarren Ye };
102857513aabSDarren Ye 
102957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch9_mix[] = {
103057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN072_0, I_ADDA_UL_CH1, 1, 0),
103157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN072_0, I_ADDA_UL_CH2, 1, 0),
103257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN072_0, I_ADDA_UL_CH3, 1, 0),
103357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN072_0, I_ADDA_UL_CH4, 1, 0),
103457513aabSDarren Ye };
103557513aabSDarren Ye 
103657513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch10_mix[] = {
103757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN073_0, I_ADDA_UL_CH1, 1, 0),
103857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN073_0, I_ADDA_UL_CH2, 1, 0),
103957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN073_0, I_ADDA_UL_CH3, 1, 0),
104057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN073_0, I_ADDA_UL_CH4, 1, 0),
104157513aabSDarren Ye };
104257513aabSDarren Ye 
104357513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch11_mix[] = {
104457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN074_0, I_ADDA_UL_CH1, 1, 0),
104557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN074_0, I_ADDA_UL_CH2, 1, 0),
104657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN074_0, I_ADDA_UL_CH3, 1, 0),
104757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN074_0, I_ADDA_UL_CH4, 1, 0),
104857513aabSDarren Ye };
104957513aabSDarren Ye 
105057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch12_mix[] = {
105157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN075_0, I_ADDA_UL_CH1, 1, 0),
105257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN075_0, I_ADDA_UL_CH2, 1, 0),
105357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN075_0, I_ADDA_UL_CH3, 1, 0),
105457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN075_0, I_ADDA_UL_CH4, 1, 0),
105557513aabSDarren Ye };
105657513aabSDarren Ye 
105757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch13_mix[] = {
105857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN076_0, I_ADDA_UL_CH1, 1, 0),
105957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN076_0, I_ADDA_UL_CH2, 1, 0),
106057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN076_0, I_ADDA_UL_CH3, 1, 0),
106157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN076_0, I_ADDA_UL_CH4, 1, 0),
106257513aabSDarren Ye };
106357513aabSDarren Ye 
106457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch14_mix[] = {
106557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN077_0, I_ADDA_UL_CH1, 1, 0),
106657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN077_0, I_ADDA_UL_CH2, 1, 0),
106757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN077_0, I_ADDA_UL_CH3, 1, 0),
106857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN077_0, I_ADDA_UL_CH4, 1, 0),
106957513aabSDarren Ye };
107057513aabSDarren Ye 
107157513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch15_mix[] = {
107257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN078_0, I_ADDA_UL_CH1, 1, 0),
107357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN078_0, I_ADDA_UL_CH2, 1, 0),
107457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN078_0, I_ADDA_UL_CH3, 1, 0),
107557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN078_0, I_ADDA_UL_CH4, 1, 0),
107657513aabSDarren Ye };
107757513aabSDarren Ye 
107857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch16_mix[] = {
107957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN079_0, I_ADDA_UL_CH1, 1, 0),
108057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN079_0, I_ADDA_UL_CH2, 1, 0),
108157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN079_0, I_ADDA_UL_CH3, 1, 0),
108257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN079_0, I_ADDA_UL_CH4, 1, 0),
108357513aabSDarren Ye };
108457513aabSDarren Ye 
108557513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch17_mix[] = {
108657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN080_0, I_ADDA_UL_CH1, 1, 0),
108757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN080_0, I_ADDA_UL_CH2, 1, 0),
108857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN080_0, I_ADDA_UL_CH3, 1, 0),
108957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN080_0, I_ADDA_UL_CH4, 1, 0),
109057513aabSDarren Ye };
109157513aabSDarren Ye 
109257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch18_mix[] = {
109357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN081_0, I_ADDA_UL_CH1, 1, 0),
109457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN081_0, I_ADDA_UL_CH2, 1, 0),
109557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN081_0, I_ADDA_UL_CH3, 1, 0),
109657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN081_0, I_ADDA_UL_CH4, 1, 0),
109757513aabSDarren Ye };
109857513aabSDarren Ye 
109957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch19_mix[] = {
110057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN082_0, I_ADDA_UL_CH1, 1, 0),
110157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN082_0, I_ADDA_UL_CH2, 1, 0),
110257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN082_0, I_ADDA_UL_CH3, 1, 0),
110357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN082_0, I_ADDA_UL_CH4, 1, 0),
110457513aabSDarren Ye };
110557513aabSDarren Ye 
110657513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch20_mix[] = {
110757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN083_0, I_ADDA_UL_CH1, 1, 0),
110857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN083_0, I_ADDA_UL_CH2, 1, 0),
110957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN083_0, I_ADDA_UL_CH3, 1, 0),
111057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN083_0, I_ADDA_UL_CH4, 1, 0),
111157513aabSDarren Ye };
111257513aabSDarren Ye 
111357513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch21_mix[] = {
111457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN084_0, I_ADDA_UL_CH1, 1, 0),
111557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN084_0, I_ADDA_UL_CH2, 1, 0),
111657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN084_0, I_ADDA_UL_CH3, 1, 0),
111757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN084_0, I_ADDA_UL_CH4, 1, 0),
111857513aabSDarren Ye };
111957513aabSDarren Ye 
112057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch22_mix[] = {
112157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN085_0, I_ADDA_UL_CH1, 1, 0),
112257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN085_0, I_ADDA_UL_CH2, 1, 0),
112357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN085_0, I_ADDA_UL_CH3, 1, 0),
112457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN085_0, I_ADDA_UL_CH4, 1, 0),
112557513aabSDarren Ye };
112657513aabSDarren Ye 
112757513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch23_mix[] = {
112857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN086_0, I_ADDA_UL_CH1, 1, 0),
112957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN086_0, I_ADDA_UL_CH2, 1, 0),
113057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN086_0, I_ADDA_UL_CH3, 1, 0),
113157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN086_0, I_ADDA_UL_CH4, 1, 0),
113257513aabSDarren Ye };
113357513aabSDarren Ye 
113457513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch24_mix[] = {
113557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN087_0, I_ADDA_UL_CH1, 1, 0),
113657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN087_0, I_ADDA_UL_CH2, 1, 0),
113757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN087_0, I_ADDA_UL_CH3, 1, 0),
113857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN087_0, I_ADDA_UL_CH4, 1, 0),
113957513aabSDarren Ye };
114057513aabSDarren Ye 
114157513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch25_mix[] = {
114257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN088_0, I_ADDA_UL_CH1, 1, 0),
114357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN088_0, I_ADDA_UL_CH2, 1, 0),
114457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN088_0, I_ADDA_UL_CH3, 1, 0),
114557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN088_0, I_ADDA_UL_CH4, 1, 0),
114657513aabSDarren Ye };
114757513aabSDarren Ye 
114857513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch26_mix[] = {
114957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN089_0, I_ADDA_UL_CH1, 1, 0),
115057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN089_0, I_ADDA_UL_CH2, 1, 0),
115157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN089_0, I_ADDA_UL_CH3, 1, 0),
115257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN089_0, I_ADDA_UL_CH4, 1, 0),
115357513aabSDarren Ye };
115457513aabSDarren Ye 
115557513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch27_mix[] = {
115657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN090_0, I_ADDA_UL_CH1, 1, 0),
115757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN090_0, I_ADDA_UL_CH2, 1, 0),
115857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN090_0, I_ADDA_UL_CH3, 1, 0),
115957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN090_0, I_ADDA_UL_CH4, 1, 0),
116057513aabSDarren Ye };
116157513aabSDarren Ye 
116257513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch28_mix[] = {
116357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN091_0, I_ADDA_UL_CH1, 1, 0),
116457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN091_0, I_ADDA_UL_CH2, 1, 0),
116557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN091_0, I_ADDA_UL_CH3, 1, 0),
116657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN091_0, I_ADDA_UL_CH4, 1, 0),
116757513aabSDarren Ye };
116857513aabSDarren Ye 
116957513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch29_mix[] = {
117057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN092_0, I_ADDA_UL_CH1, 1, 0),
117157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN092_0, I_ADDA_UL_CH2, 1, 0),
117257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN092_0, I_ADDA_UL_CH3, 1, 0),
117357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN092_0, I_ADDA_UL_CH4, 1, 0),
117457513aabSDarren Ye };
117557513aabSDarren Ye 
117657513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch30_mix[] = {
117757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN093_0, I_ADDA_UL_CH1, 1, 0),
117857513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN093_0, I_ADDA_UL_CH2, 1, 0),
117957513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN093_0, I_ADDA_UL_CH3, 1, 0),
118057513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN093_0, I_ADDA_UL_CH4, 1, 0),
118157513aabSDarren Ye };
118257513aabSDarren Ye 
118357513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch31_mix[] = {
118457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN094_0, I_ADDA_UL_CH1, 1, 0),
118557513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN094_0, I_ADDA_UL_CH2, 1, 0),
118657513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN094_0, I_ADDA_UL_CH3, 1, 0),
118757513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN094_0, I_ADDA_UL_CH4, 1, 0),
118857513aabSDarren Ye };
118957513aabSDarren Ye 
119057513aabSDarren Ye static const struct snd_kcontrol_new memif_ul_cm2_ch32_mix[] = {
119157513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN095_0, I_ADDA_UL_CH1, 1, 0),
119257513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN095_0, I_ADDA_UL_CH2, 1, 0),
119357513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN095_0, I_ADDA_UL_CH3, 1, 0),
119457513aabSDarren Ye 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN095_0, I_ADDA_UL_CH4, 1, 0),
119557513aabSDarren Ye };
119657513aabSDarren Ye 
119757513aabSDarren Ye static const char * const cm0_mux_map[] = {
119857513aabSDarren Ye 	"UL8_2CH_PATH",
119957513aabSDarren Ye 	"CM0_8CH_PATH",
120057513aabSDarren Ye };
120157513aabSDarren Ye 
120257513aabSDarren Ye static const char * const cm1_mux_map[] = {
120357513aabSDarren Ye 	"UL9_2CH_PATH",
120457513aabSDarren Ye 	"CM1_16CH_PATH",
120557513aabSDarren Ye };
120657513aabSDarren Ye 
120757513aabSDarren Ye static const char * const cm2_mux_map[] = {
120857513aabSDarren Ye 	"UL10_2CH_PATH",
120957513aabSDarren Ye 	"CM2_32CH_PATH",
121057513aabSDarren Ye };
121157513aabSDarren Ye 
121257513aabSDarren Ye static SOC_ENUM_SINGLE_DECL(ul_cm0_mux_map_enum, AFE_CM0_CON0,
121357513aabSDarren Ye 	AFE_CM0_OUTPUT_MUX_SFT, cm0_mux_map);
121457513aabSDarren Ye 
121557513aabSDarren Ye static SOC_ENUM_SINGLE_DECL(ul_cm1_mux_map_enum, AFE_CM1_CON0,
121657513aabSDarren Ye 	AFE_CM1_OUTPUT_MUX_SFT, cm1_mux_map);
121757513aabSDarren Ye 
121857513aabSDarren Ye static SOC_ENUM_SINGLE_DECL(ul_cm2_mux_map_enum, AFE_CM2_CON0,
121957513aabSDarren Ye 	AFE_CM2_OUTPUT_MUX_SFT, cm2_mux_map);
122057513aabSDarren Ye 
122157513aabSDarren Ye static const struct snd_kcontrol_new ul_cm0_mux_control =
122257513aabSDarren Ye 	SOC_DAPM_ENUM("CM0_UL_MUX Route", ul_cm0_mux_map_enum);
122357513aabSDarren Ye 
122457513aabSDarren Ye static const struct snd_kcontrol_new ul_cm1_mux_control =
122557513aabSDarren Ye 	SOC_DAPM_ENUM("CM1_UL_MUX Route", ul_cm1_mux_map_enum);
122657513aabSDarren Ye 
122757513aabSDarren Ye static const struct snd_kcontrol_new ul_cm2_mux_control =
122857513aabSDarren Ye 	SOC_DAPM_ENUM("CM2_UL_MUX Route", ul_cm2_mux_map_enum);
122957513aabSDarren Ye 
123057513aabSDarren Ye static const struct snd_soc_dapm_widget mt8196_memif_widgets[] = {
123157513aabSDarren Ye 	/* inter-connections */
123257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL0_CH1", SND_SOC_NOPM, 0, 0,
123357513aabSDarren Ye 			   memif_ul0_ch1_mix, ARRAY_SIZE(memif_ul0_ch1_mix)),
123457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL0_CH2", SND_SOC_NOPM, 0, 0,
123557513aabSDarren Ye 			   memif_ul0_ch2_mix, ARRAY_SIZE(memif_ul0_ch2_mix)),
123657513aabSDarren Ye 
123757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,
123857513aabSDarren Ye 			   memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),
123957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,
124057513aabSDarren Ye 			   memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),
124157513aabSDarren Ye 
124257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,
124357513aabSDarren Ye 			   memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),
124457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,
124557513aabSDarren Ye 			   memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),
124657513aabSDarren Ye 
124757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,
124857513aabSDarren Ye 			   memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),
124957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,
125057513aabSDarren Ye 			   memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),
125157513aabSDarren Ye 
125257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0,
125357513aabSDarren Ye 			   memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)),
125457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0,
125557513aabSDarren Ye 			   memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)),
125657513aabSDarren Ye 
125757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0,
125857513aabSDarren Ye 			   memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)),
125957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0,
126057513aabSDarren Ye 			   memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)),
126157513aabSDarren Ye 
126257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0,
126357513aabSDarren Ye 			   memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)),
126457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0,
126557513aabSDarren Ye 			   memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)),
126657513aabSDarren Ye 
126757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0,
126857513aabSDarren Ye 			   memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)),
126957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0,
127057513aabSDarren Ye 			   memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)),
127157513aabSDarren Ye 
127257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0,
127357513aabSDarren Ye 			   memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)),
127457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0,
127557513aabSDarren Ye 			   memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)),
127657513aabSDarren Ye 
127757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL9_CH1", SND_SOC_NOPM, 0, 0,
127857513aabSDarren Ye 			   memif_ul9_ch1_mix, ARRAY_SIZE(memif_ul9_ch1_mix)),
127957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL9_CH2", SND_SOC_NOPM, 0, 0,
128057513aabSDarren Ye 			   memif_ul9_ch2_mix, ARRAY_SIZE(memif_ul9_ch2_mix)),
128157513aabSDarren Ye 
128257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL10_CH1", SND_SOC_NOPM, 0, 0,
128357513aabSDarren Ye 			   memif_ul10_ch1_mix, ARRAY_SIZE(memif_ul10_ch1_mix)),
128457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL10_CH2", SND_SOC_NOPM, 0, 0,
128557513aabSDarren Ye 			   memif_ul10_ch2_mix, ARRAY_SIZE(memif_ul10_ch2_mix)),
128657513aabSDarren Ye 
128757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL24_CH1", SND_SOC_NOPM, 0, 0,
128857513aabSDarren Ye 			   memif_ul24_ch1_mix, ARRAY_SIZE(memif_ul24_ch1_mix)),
128957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL24_CH2", SND_SOC_NOPM, 0, 0,
129057513aabSDarren Ye 			   memif_ul24_ch2_mix, ARRAY_SIZE(memif_ul24_ch2_mix)),
129157513aabSDarren Ye 
129257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL25_CH1", SND_SOC_NOPM, 0, 0,
129357513aabSDarren Ye 			   memif_ul25_ch1_mix, ARRAY_SIZE(memif_ul25_ch1_mix)),
129457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL25_CH2", SND_SOC_NOPM, 0, 0,
129557513aabSDarren Ye 			   memif_ul25_ch2_mix, ARRAY_SIZE(memif_ul25_ch2_mix)),
129657513aabSDarren Ye 
129757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL26_CH1", SND_SOC_NOPM, 0, 0,
129857513aabSDarren Ye 			   memif_ul26_ch1_mix, ARRAY_SIZE(memif_ul26_ch1_mix)),
129957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL26_CH2", SND_SOC_NOPM, 0, 0,
130057513aabSDarren Ye 			   memif_ul26_ch2_mix, ARRAY_SIZE(memif_ul26_ch2_mix)),
130157513aabSDarren Ye 
130257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH1", SND_SOC_NOPM, 0, 0,
130357513aabSDarren Ye 			   memif_ul_cm0_ch1_mix, ARRAY_SIZE(memif_ul_cm0_ch1_mix)),
130457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH2", SND_SOC_NOPM, 0, 0,
130557513aabSDarren Ye 			   memif_ul_cm0_ch2_mix, ARRAY_SIZE(memif_ul_cm0_ch2_mix)),
130657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH3", SND_SOC_NOPM, 0, 0,
130757513aabSDarren Ye 			   memif_ul_cm0_ch3_mix, ARRAY_SIZE(memif_ul_cm0_ch3_mix)),
130857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH4", SND_SOC_NOPM, 0, 0,
130957513aabSDarren Ye 			   memif_ul_cm0_ch4_mix, ARRAY_SIZE(memif_ul_cm0_ch4_mix)),
131057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH5", SND_SOC_NOPM, 0, 0,
131157513aabSDarren Ye 			   memif_ul_cm0_ch5_mix, ARRAY_SIZE(memif_ul_cm0_ch5_mix)),
131257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH6", SND_SOC_NOPM, 0, 0,
131357513aabSDarren Ye 			   memif_ul_cm0_ch6_mix, ARRAY_SIZE(memif_ul_cm0_ch6_mix)),
131457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH7", SND_SOC_NOPM, 0, 0,
131557513aabSDarren Ye 			   memif_ul_cm0_ch7_mix, ARRAY_SIZE(memif_ul_cm0_ch7_mix)),
131657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM0_CH8", SND_SOC_NOPM, 0, 0,
131757513aabSDarren Ye 			   memif_ul_cm0_ch8_mix, ARRAY_SIZE(memif_ul_cm0_ch8_mix)),
131857513aabSDarren Ye 	SND_SOC_DAPM_MUX("CM0_UL_MUX", SND_SOC_NOPM, 0, 0,
131957513aabSDarren Ye 			 &ul_cm0_mux_control),
132057513aabSDarren Ye 
132157513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH1", SND_SOC_NOPM, 0, 0,
132257513aabSDarren Ye 			   memif_ul_cm1_ch1_mix, ARRAY_SIZE(memif_ul_cm1_ch1_mix)),
132357513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH2", SND_SOC_NOPM, 0, 0,
132457513aabSDarren Ye 			   memif_ul_cm1_ch2_mix, ARRAY_SIZE(memif_ul_cm1_ch2_mix)),
132557513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH3", SND_SOC_NOPM, 0, 0,
132657513aabSDarren Ye 			   memif_ul_cm1_ch3_mix, ARRAY_SIZE(memif_ul_cm1_ch3_mix)),
132757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH4", SND_SOC_NOPM, 0, 0,
132857513aabSDarren Ye 			   memif_ul_cm1_ch4_mix, ARRAY_SIZE(memif_ul_cm1_ch4_mix)),
132957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH5", SND_SOC_NOPM, 0, 0,
133057513aabSDarren Ye 			   memif_ul_cm1_ch5_mix, ARRAY_SIZE(memif_ul_cm1_ch5_mix)),
133157513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH6", SND_SOC_NOPM, 0, 0,
133257513aabSDarren Ye 			   memif_ul_cm1_ch6_mix, ARRAY_SIZE(memif_ul_cm1_ch6_mix)),
133357513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH7", SND_SOC_NOPM, 0, 0,
133457513aabSDarren Ye 			   memif_ul_cm1_ch7_mix, ARRAY_SIZE(memif_ul_cm1_ch7_mix)),
133557513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH8", SND_SOC_NOPM, 0, 0,
133657513aabSDarren Ye 			   memif_ul_cm1_ch8_mix, ARRAY_SIZE(memif_ul_cm1_ch8_mix)),
133757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH9", SND_SOC_NOPM, 0, 0,
133857513aabSDarren Ye 			   memif_ul_cm1_ch9_mix, ARRAY_SIZE(memif_ul_cm1_ch9_mix)),
133957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH10", SND_SOC_NOPM, 0, 0,
134057513aabSDarren Ye 			   memif_ul_cm1_ch10_mix, ARRAY_SIZE(memif_ul_cm1_ch10_mix)),
134157513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH11", SND_SOC_NOPM, 0, 0,
134257513aabSDarren Ye 			   memif_ul_cm1_ch11_mix, ARRAY_SIZE(memif_ul_cm1_ch11_mix)),
134357513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH12", SND_SOC_NOPM, 0, 0,
134457513aabSDarren Ye 			   memif_ul_cm1_ch12_mix, ARRAY_SIZE(memif_ul_cm1_ch12_mix)),
134557513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH13", SND_SOC_NOPM, 0, 0,
134657513aabSDarren Ye 			   memif_ul_cm1_ch13_mix, ARRAY_SIZE(memif_ul_cm1_ch13_mix)),
134757513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH14", SND_SOC_NOPM, 0, 0,
134857513aabSDarren Ye 			   memif_ul_cm1_ch14_mix, ARRAY_SIZE(memif_ul_cm1_ch14_mix)),
134957513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH15", SND_SOC_NOPM, 0, 0,
135057513aabSDarren Ye 			   memif_ul_cm1_ch15_mix, ARRAY_SIZE(memif_ul_cm1_ch15_mix)),
135157513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM1_CH16", SND_SOC_NOPM, 0, 0,
135257513aabSDarren Ye 			   memif_ul_cm1_ch16_mix, ARRAY_SIZE(memif_ul_cm1_ch16_mix)),
135357513aabSDarren Ye 	SND_SOC_DAPM_MUX("CM1_UL_MUX", SND_SOC_NOPM, 0, 0,
135457513aabSDarren Ye 			 &ul_cm1_mux_control),
135557513aabSDarren Ye 
135657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH1", SND_SOC_NOPM, 0, 0,
135757513aabSDarren Ye 			   memif_ul_cm2_ch1_mix, ARRAY_SIZE(memif_ul_cm2_ch1_mix)),
135857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH2", SND_SOC_NOPM, 0, 0,
135957513aabSDarren Ye 			   memif_ul_cm2_ch2_mix, ARRAY_SIZE(memif_ul_cm2_ch2_mix)),
136057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH3", SND_SOC_NOPM, 0, 0,
136157513aabSDarren Ye 			   memif_ul_cm2_ch3_mix, ARRAY_SIZE(memif_ul_cm2_ch3_mix)),
136257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH4", SND_SOC_NOPM, 0, 0,
136357513aabSDarren Ye 			   memif_ul_cm2_ch4_mix, ARRAY_SIZE(memif_ul_cm2_ch4_mix)),
136457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH5", SND_SOC_NOPM, 0, 0,
136557513aabSDarren Ye 			   memif_ul_cm2_ch5_mix, ARRAY_SIZE(memif_ul_cm2_ch5_mix)),
136657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH6", SND_SOC_NOPM, 0, 0,
136757513aabSDarren Ye 			   memif_ul_cm2_ch6_mix, ARRAY_SIZE(memif_ul_cm2_ch6_mix)),
136857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH7", SND_SOC_NOPM, 0, 0,
136957513aabSDarren Ye 			   memif_ul_cm2_ch7_mix, ARRAY_SIZE(memif_ul_cm2_ch7_mix)),
137057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH8", SND_SOC_NOPM, 0, 0,
137157513aabSDarren Ye 			   memif_ul_cm2_ch8_mix, ARRAY_SIZE(memif_ul_cm2_ch8_mix)),
137257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH9", SND_SOC_NOPM, 0, 0,
137357513aabSDarren Ye 			   memif_ul_cm2_ch9_mix, ARRAY_SIZE(memif_ul_cm2_ch9_mix)),
137457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH10", SND_SOC_NOPM, 0, 0,
137557513aabSDarren Ye 			   memif_ul_cm2_ch10_mix, ARRAY_SIZE(memif_ul_cm2_ch10_mix)),
137657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH11", SND_SOC_NOPM, 0, 0,
137757513aabSDarren Ye 			   memif_ul_cm2_ch11_mix, ARRAY_SIZE(memif_ul_cm2_ch11_mix)),
137857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH12", SND_SOC_NOPM, 0, 0,
137957513aabSDarren Ye 			   memif_ul_cm2_ch12_mix, ARRAY_SIZE(memif_ul_cm2_ch12_mix)),
138057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH13", SND_SOC_NOPM, 0, 0,
138157513aabSDarren Ye 			   memif_ul_cm2_ch13_mix, ARRAY_SIZE(memif_ul_cm2_ch13_mix)),
138257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH14", SND_SOC_NOPM, 0, 0,
138357513aabSDarren Ye 			   memif_ul_cm2_ch14_mix, ARRAY_SIZE(memif_ul_cm2_ch14_mix)),
138457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH15", SND_SOC_NOPM, 0, 0,
138557513aabSDarren Ye 			   memif_ul_cm2_ch15_mix, ARRAY_SIZE(memif_ul_cm2_ch15_mix)),
138657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH16", SND_SOC_NOPM, 0, 0,
138757513aabSDarren Ye 			   memif_ul_cm2_ch16_mix, ARRAY_SIZE(memif_ul_cm2_ch16_mix)),
138857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH17", SND_SOC_NOPM, 0, 0,
138957513aabSDarren Ye 			   memif_ul_cm2_ch17_mix, ARRAY_SIZE(memif_ul_cm2_ch17_mix)),
139057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH18", SND_SOC_NOPM, 0, 0,
139157513aabSDarren Ye 			   memif_ul_cm2_ch18_mix, ARRAY_SIZE(memif_ul_cm2_ch18_mix)),
139257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH19", SND_SOC_NOPM, 0, 0,
139357513aabSDarren Ye 			   memif_ul_cm2_ch19_mix, ARRAY_SIZE(memif_ul_cm2_ch19_mix)),
139457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH20", SND_SOC_NOPM, 0, 0,
139557513aabSDarren Ye 			   memif_ul_cm2_ch20_mix, ARRAY_SIZE(memif_ul_cm2_ch20_mix)),
139657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH21", SND_SOC_NOPM, 0, 0,
139757513aabSDarren Ye 			   memif_ul_cm2_ch21_mix, ARRAY_SIZE(memif_ul_cm2_ch21_mix)),
139857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH22", SND_SOC_NOPM, 0, 0,
139957513aabSDarren Ye 			   memif_ul_cm2_ch22_mix, ARRAY_SIZE(memif_ul_cm2_ch22_mix)),
140057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH23", SND_SOC_NOPM, 0, 0,
140157513aabSDarren Ye 			   memif_ul_cm2_ch23_mix, ARRAY_SIZE(memif_ul_cm2_ch23_mix)),
140257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH24", SND_SOC_NOPM, 0, 0,
140357513aabSDarren Ye 			   memif_ul_cm2_ch24_mix, ARRAY_SIZE(memif_ul_cm2_ch24_mix)),
140457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH25", SND_SOC_NOPM, 0, 0,
140557513aabSDarren Ye 			   memif_ul_cm2_ch25_mix, ARRAY_SIZE(memif_ul_cm2_ch25_mix)),
140657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH26", SND_SOC_NOPM, 0, 0,
140757513aabSDarren Ye 			   memif_ul_cm2_ch26_mix, ARRAY_SIZE(memif_ul_cm2_ch26_mix)),
140857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH27", SND_SOC_NOPM, 0, 0,
140957513aabSDarren Ye 			   memif_ul_cm2_ch27_mix, ARRAY_SIZE(memif_ul_cm2_ch27_mix)),
141057513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH28", SND_SOC_NOPM, 0, 0,
141157513aabSDarren Ye 			   memif_ul_cm2_ch28_mix, ARRAY_SIZE(memif_ul_cm2_ch28_mix)),
141257513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH29", SND_SOC_NOPM, 0, 0,
141357513aabSDarren Ye 			   memif_ul_cm2_ch29_mix, ARRAY_SIZE(memif_ul_cm2_ch29_mix)),
141457513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH30", SND_SOC_NOPM, 0, 0,
141557513aabSDarren Ye 			   memif_ul_cm2_ch30_mix, ARRAY_SIZE(memif_ul_cm2_ch30_mix)),
141657513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH31", SND_SOC_NOPM, 0, 0,
141757513aabSDarren Ye 			   memif_ul_cm2_ch31_mix, ARRAY_SIZE(memif_ul_cm2_ch31_mix)),
141857513aabSDarren Ye 	SND_SOC_DAPM_MIXER("UL_CM2_CH32", SND_SOC_NOPM, 0, 0,
141957513aabSDarren Ye 			   memif_ul_cm2_ch32_mix, ARRAY_SIZE(memif_ul_cm2_ch32_mix)),
142057513aabSDarren Ye 	SND_SOC_DAPM_MUX("CM2_UL_MUX", SND_SOC_NOPM, 0, 0,
142157513aabSDarren Ye 			 &ul_cm2_mux_control),
142257513aabSDarren Ye 
142357513aabSDarren Ye 	SND_SOC_DAPM_SUPPLY("CM0_Enable",
142457513aabSDarren Ye 			    AFE_CM0_CON0, AFE_CM0_ON_SFT, 0,
142557513aabSDarren Ye 			    ul_cm0_event,
142657513aabSDarren Ye 			    SND_SOC_DAPM_PRE_PMU |
142757513aabSDarren Ye 			    SND_SOC_DAPM_PRE_PMD),
142857513aabSDarren Ye 
142957513aabSDarren Ye 	SND_SOC_DAPM_SUPPLY("CM1_Enable",
143057513aabSDarren Ye 			    AFE_CM1_CON0, AFE_CM1_ON_SFT, 0,
143157513aabSDarren Ye 			    ul_cm1_event,
143257513aabSDarren Ye 			    SND_SOC_DAPM_PRE_PMU |
143357513aabSDarren Ye 			    SND_SOC_DAPM_PRE_PMD),
143457513aabSDarren Ye 
143557513aabSDarren Ye 	SND_SOC_DAPM_SUPPLY("CM2_Enable",
143657513aabSDarren Ye 			    AFE_CM2_CON0, AFE_CM2_ON_SFT, 0,
143757513aabSDarren Ye 			    ul_cm2_event,
143857513aabSDarren Ye 			    SND_SOC_DAPM_PRE_PMU |
143957513aabSDarren Ye 			    SND_SOC_DAPM_PRE_PMD),
144057513aabSDarren Ye 
144157513aabSDarren Ye 	/* dynamic pinctrl */
144257513aabSDarren Ye 	SND_SOC_DAPM_PINCTRL("I2S3_PIN", "aud-gpio-i2s3-on", "aud-gpio-i2s3-off"),
144357513aabSDarren Ye 	SND_SOC_DAPM_PINCTRL("I2S4_PIN", "aud-gpio-i2s4-on", "aud-gpio-i2s4-off"),
144457513aabSDarren Ye 	SND_SOC_DAPM_PINCTRL("I2S6_PIN", "aud-gpio-i2s6-on", "aud-gpio-i2s6-off"),
144557513aabSDarren Ye 	SND_SOC_DAPM_PINCTRL("AP_DMIC0_PIN", "aud-gpio-ap-dmic-on", "aud-gpio-ap-dmic-off"),
144657513aabSDarren Ye 	SND_SOC_DAPM_PINCTRL("AP_DMIC1_PIN", "aud-gpio-ap-dmic1-on", "aud-gpio-ap-dmic1-off"),
144757513aabSDarren Ye };
144857513aabSDarren Ye 
144957513aabSDarren Ye static const struct snd_soc_dapm_route mt8196_memif_routes[] = {
145057513aabSDarren Ye 	{"UL0", NULL, "UL0_CH1"},
145157513aabSDarren Ye 	{"UL0", NULL, "UL0_CH2"},
145257513aabSDarren Ye 	/* Normal record */
145357513aabSDarren Ye 	{"UL0_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
145457513aabSDarren Ye 	{"UL0_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
145557513aabSDarren Ye 
145657513aabSDarren Ye 	{"UL1", NULL, "UL1_CH1"},
145757513aabSDarren Ye 	{"UL1", NULL, "UL1_CH2"},
145857513aabSDarren Ye 	{"UL1_CH1", "I2SIN4_CH1", "I2SIN4"},
145957513aabSDarren Ye 	{"UL1_CH2", "I2SIN4_CH2", "I2SIN4"},
146057513aabSDarren Ye 	{"UL1_CH1", "I2SIN6_CH1", "I2SIN6"},
146157513aabSDarren Ye 	{"UL1_CH2", "I2SIN6_CH2", "I2SIN6"},
146257513aabSDarren Ye 
146357513aabSDarren Ye 	{"UL2", NULL, "UL2_CH1"},
146457513aabSDarren Ye 	{"UL2", NULL, "UL2_CH2"},
146557513aabSDarren Ye 	{"UL2_CH1", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},
146657513aabSDarren Ye 	{"UL2_CH2", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},
146757513aabSDarren Ye 
146857513aabSDarren Ye 	{"UL3", NULL, "UL3_CH1"},
146957513aabSDarren Ye 	{"UL3", NULL, "UL3_CH2"},
147057513aabSDarren Ye 	{"UL3_CH1", "I2SIN0_CH1", "I2SIN0"},
147157513aabSDarren Ye 	{"UL3_CH2", "I2SIN0_CH2", "I2SIN0"},
147257513aabSDarren Ye 	{"UL3_CH1", "I2SIN1_CH1", "I2SIN1"},
147357513aabSDarren Ye 	{"UL3_CH2", "I2SIN1_CH2", "I2SIN1"},
147457513aabSDarren Ye 	{"UL3_CH1", "I2SIN3_CH1", "I2SIN3"},
147557513aabSDarren Ye 	{"UL3_CH2", "I2SIN3_CH2", "I2SIN3"},
147657513aabSDarren Ye 	{"UL3_CH1", "I2SIN4_CH1", "I2SIN4"},
147757513aabSDarren Ye 	{"UL3_CH2", "I2SIN4_CH2", "I2SIN4"},
147857513aabSDarren Ye 
147957513aabSDarren Ye 	{"UL4", NULL, "UL4_CH1"},
148057513aabSDarren Ye 	{"UL4", NULL, "UL4_CH2"},
148157513aabSDarren Ye 	{"UL4_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
148257513aabSDarren Ye 	{"UL4_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
148357513aabSDarren Ye 	{"UL4_CH1", "I2SIN0_CH1", "I2SIN0"},
148457513aabSDarren Ye 	{"UL4_CH2", "I2SIN0_CH2", "I2SIN0"},
148557513aabSDarren Ye 
148657513aabSDarren Ye 	{"UL5", NULL, "UL5_CH1"},
148757513aabSDarren Ye 	{"UL5", NULL, "UL5_CH2"},
148857513aabSDarren Ye 	{"UL5_CH1", "I2SIN3_CH1", "I2SIN3"},
148957513aabSDarren Ye 	{"UL5_CH2", "I2SIN3_CH2", "I2SIN3"},
149057513aabSDarren Ye 
149157513aabSDarren Ye 	{"UL6", NULL, "UL6_CH1"},
149257513aabSDarren Ye 	{"UL6", NULL, "UL6_CH2"},
149357513aabSDarren Ye 	{"UL6_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
149457513aabSDarren Ye 	{"UL6_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
149557513aabSDarren Ye 
149657513aabSDarren Ye 	{"UL7", NULL, "UL7_CH1"},
149757513aabSDarren Ye 	{"UL7", NULL, "UL7_CH2"},
149857513aabSDarren Ye 	{"UL7_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
149957513aabSDarren Ye 	{"UL7_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
150057513aabSDarren Ye 
150157513aabSDarren Ye 	{"UL8", NULL, "CM0_UL_MUX"},
150257513aabSDarren Ye 	{"CM0_UL_MUX", "UL8_2CH_PATH", "UL8_CH1"},
150357513aabSDarren Ye 	{"CM0_UL_MUX", "UL8_2CH_PATH", "UL8_CH2"},
150457513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH1"},
150557513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH2"},
150657513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH3"},
150757513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH4"},
150857513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH5"},
150957513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH6"},
151057513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH7"},
151157513aabSDarren Ye 	{"CM0_UL_MUX", "CM0_8CH_PATH", "UL_CM0_CH8"},
151257513aabSDarren Ye 
151357513aabSDarren Ye 	{"UL_CM0", NULL, "CM0_Enable"},
151457513aabSDarren Ye 
151557513aabSDarren Ye 	/* UL9 */
151657513aabSDarren Ye 	{"UL9", NULL, "CM1_UL_MUX"},
151757513aabSDarren Ye 	{"CM1_UL_MUX", "UL9_2CH_PATH", "UL9_CH1"},
151857513aabSDarren Ye 	{"CM1_UL_MUX", "UL9_2CH_PATH", "UL9_CH2"},
151957513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH1"},
152057513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH2"},
152157513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH3"},
152257513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH4"},
152357513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH5"},
152457513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH6"},
152557513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH7"},
152657513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH8"},
152757513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH9"},
152857513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH10"},
152957513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH11"},
153057513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH12"},
153157513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH13"},
153257513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH14"},
153357513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH15"},
153457513aabSDarren Ye 	{"CM1_UL_MUX", "CM1_16CH_PATH", "UL_CM1_CH16"},
153557513aabSDarren Ye 
153657513aabSDarren Ye 	{"UL_CM1", NULL, "CM1_Enable"},
153757513aabSDarren Ye 
153857513aabSDarren Ye 	{"UL9_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
153957513aabSDarren Ye 	{"UL9_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
154057513aabSDarren Ye 
154157513aabSDarren Ye 	{"UL10", NULL, "CM2_UL_MUX"},
154257513aabSDarren Ye 	{"CM2_UL_MUX", "UL10_2CH_PATH", "UL10_CH1"},
154357513aabSDarren Ye 	{"CM2_UL_MUX", "UL10_2CH_PATH", "UL10_CH2"},
154457513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH1"},
154557513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH2"},
154657513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH3"},
154757513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH4"},
154857513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH5"},
154957513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH6"},
155057513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH7"},
155157513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH8"},
155257513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH9"},
155357513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH10"},
155457513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH11"},
155557513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH12"},
155657513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH13"},
155757513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH14"},
155857513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH15"},
155957513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH16"},
156057513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH17"},
156157513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH18"},
156257513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH19"},
156357513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH20"},
156457513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH21"},
156557513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH22"},
156657513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH23"},
156757513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH24"},
156857513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH25"},
156957513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH26"},
157057513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH27"},
157157513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH28"},
157257513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH29"},
157357513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH30"},
157457513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH31"},
157557513aabSDarren Ye 	{"CM2_UL_MUX", "CM2_32CH_PATH", "UL_CM2_CH32"},
157657513aabSDarren Ye 
157757513aabSDarren Ye 	{"UL_CM2", NULL, "CM2_Enable"},
157857513aabSDarren Ye 
157957513aabSDarren Ye 	{"UL10_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
158057513aabSDarren Ye 	{"UL10_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
158157513aabSDarren Ye 
158257513aabSDarren Ye 	{"UL24", NULL, "UL24_CH1"},
158357513aabSDarren Ye 	{"UL24", NULL, "UL24_CH2"},
158457513aabSDarren Ye 	{"UL24_CH1", "I2SIN6_CH1", "I2SIN6"},
158557513aabSDarren Ye 	{"UL24_CH2", "I2SIN6_CH2", "I2SIN6"},
158657513aabSDarren Ye 	{"UL24_CH1", "I2SIN0_CH1", "I2SIN0"},
158757513aabSDarren Ye 	{"UL24_CH2", "I2SIN0_CH2", "I2SIN0"},
158857513aabSDarren Ye 
158957513aabSDarren Ye 	{"UL25", NULL, "UL25_CH1"},
159057513aabSDarren Ye 	{"UL25", NULL, "UL25_CH2"},
159157513aabSDarren Ye 	{"UL25_CH1", "I2SIN6_CH1", "I2SIN6"},
159257513aabSDarren Ye 	{"UL25_CH2", "I2SIN6_CH2", "I2SIN6"},
159357513aabSDarren Ye 	{"UL25_CH1", "I2SIN0_CH1", "I2SIN0"},
159457513aabSDarren Ye 	{"UL25_CH2", "I2SIN0_CH2", "I2SIN0"},
159557513aabSDarren Ye 
159657513aabSDarren Ye 	{"UL26", NULL, "UL26_CH1"},
159757513aabSDarren Ye 	{"UL26", NULL, "UL26_CH2"},
159857513aabSDarren Ye 	{"UL26_CH1", "I2SIN6_CH1", "I2SIN6"},
159957513aabSDarren Ye 	{"UL26_CH2", "I2SIN6_CH2", "I2SIN6"},
160057513aabSDarren Ye 	{"UL26_CH1", "I2SIN0_CH1", "I2SIN0"},
160157513aabSDarren Ye 	{"UL26_CH2", "I2SIN0_CH2", "I2SIN0"},
160257513aabSDarren Ye 
160357513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH1"},
160457513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH2"},
160557513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH3"},
160657513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH4"},
160757513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH5"},
160857513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH6"},
160957513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH7"},
161057513aabSDarren Ye 	{"UL_CM0", NULL, "UL_CM0_CH8"},
161157513aabSDarren Ye 	{"UL_CM0_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
161257513aabSDarren Ye 	{"UL_CM0_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
161357513aabSDarren Ye 	{"UL_CM0_CH3", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},
161457513aabSDarren Ye 	{"UL_CM0_CH4", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},
161557513aabSDarren Ye 
161657513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH1"},
161757513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH2"},
161857513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH3"},
161957513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH4"},
162057513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH5"},
162157513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH6"},
162257513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH7"},
162357513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH8"},
162457513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH9"},
162557513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH10"},
162657513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH11"},
162757513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH12"},
162857513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH13"},
162957513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH14"},
163057513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH15"},
163157513aabSDarren Ye 	{"UL_CM1", NULL, "UL_CM1_CH16"},
163257513aabSDarren Ye 	{"UL_CM1_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
163357513aabSDarren Ye 	{"UL_CM1_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
163457513aabSDarren Ye 	{"UL_CM1_CH3", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},
163557513aabSDarren Ye 	{"UL_CM1_CH4", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},
163657513aabSDarren Ye 
163757513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH1"},
163857513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH2"},
163957513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH3"},
164057513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH4"},
164157513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH5"},
164257513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH6"},
164357513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH7"},
164457513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH8"},
164557513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH9"},
164657513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH10"},
164757513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH11"},
164857513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH12"},
164957513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH13"},
165057513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH14"},
165157513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH15"},
165257513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH16"},
165357513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH17"},
165457513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH18"},
165557513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH19"},
165657513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH20"},
165757513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH21"},
165857513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH22"},
165957513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH23"},
166057513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH24"},
166157513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH25"},
166257513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH26"},
166357513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH27"},
166457513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH28"},
166557513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH29"},
166657513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH30"},
166757513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH31"},
166857513aabSDarren Ye 	{"UL_CM2", NULL, "UL_CM2_CH32"},
166957513aabSDarren Ye 	{"UL_CM2_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
167057513aabSDarren Ye 	{"UL_CM2_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
167157513aabSDarren Ye 	{"UL_CM2_CH3", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},
167257513aabSDarren Ye 	{"UL_CM2_CH4", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},
167357513aabSDarren Ye 
167457513aabSDarren Ye 	/* Audio Pin */
167557513aabSDarren Ye 	{"I2SOUT4", NULL, "I2S4_PIN"},
167657513aabSDarren Ye 	{"I2SIN4", NULL, "I2S4_PIN"},
167757513aabSDarren Ye 	{"I2SOUT6", NULL, "I2S6_PIN"},
167857513aabSDarren Ye 	{"I2SIN6", NULL, "I2S6_PIN"},
167957513aabSDarren Ye 	{"I2SOUT3", NULL, "I2S3_PIN"},
168057513aabSDarren Ye 	{"I2SIN3", NULL, "I2S3_PIN"},
168157513aabSDarren Ye 	{"AP DMIC Capture", NULL, "AP_DMIC0_PIN"},
168257513aabSDarren Ye 	{"AP DMIC CH34 Capture", NULL, "AP_DMIC1_PIN"},
168357513aabSDarren Ye };
168457513aabSDarren Ye 
168557513aabSDarren Ye #define MT8196_DL_MEMIF(_id) \
168657513aabSDarren Ye 	[MT8196_MEMIF_##_id] = { \
168757513aabSDarren Ye 		.name = #_id, \
168857513aabSDarren Ye 		.id = MT8196_MEMIF_##_id, \
168957513aabSDarren Ye 		.reg_ofs_base = AFE_##_id##_BASE, \
169057513aabSDarren Ye 		.reg_ofs_cur = AFE_##_id##_CUR, \
169157513aabSDarren Ye 		.reg_ofs_end = AFE_##_id##_END, \
169257513aabSDarren Ye 		.reg_ofs_base_msb = AFE_##_id##_BASE_MSB, \
169357513aabSDarren Ye 		.reg_ofs_cur_msb = AFE_##_id##_CUR_MSB, \
169457513aabSDarren Ye 		.reg_ofs_end_msb = AFE_##_id##_END_MSB, \
169557513aabSDarren Ye 		.fs_reg = AFE_##_id##_CON0, \
169657513aabSDarren Ye 		.fs_shift = _id##_SEL_FS_SFT, \
169757513aabSDarren Ye 		.fs_maskbit = _id##_SEL_FS_MASK, \
169857513aabSDarren Ye 		.mono_reg = AFE_##_id##_CON0, \
169957513aabSDarren Ye 		.mono_shift = _id##_MONO_SFT, \
170057513aabSDarren Ye 		.enable_reg = AFE_##_id##_CON0, \
170157513aabSDarren Ye 		.enable_shift = _id##_ON_SFT, \
170257513aabSDarren Ye 		.hd_reg = AFE_##_id##_CON0, \
170357513aabSDarren Ye 		.hd_shift = _id##_HD_MODE_SFT, \
170457513aabSDarren Ye 		.hd_align_reg = AFE_##_id##_CON0, \
170557513aabSDarren Ye 		.hd_align_mshift = _id##_HALIGN_SFT, \
170657513aabSDarren Ye 		.agent_disable_reg = -1, \
170757513aabSDarren Ye 		.agent_disable_shift = -1, \
170857513aabSDarren Ye 		.msb_reg = -1, \
170957513aabSDarren Ye 		.msb_shift = -1, \
171057513aabSDarren Ye 		.pbuf_reg = AFE_##_id##_CON0, \
171157513aabSDarren Ye 		.pbuf_mask = _id##_PBUF_SIZE_MASK, \
171257513aabSDarren Ye 		.pbuf_shift = _id##_PBUF_SIZE_SFT, \
171357513aabSDarren Ye 		.minlen_reg = AFE_##_id##_CON0, \
171457513aabSDarren Ye 		.minlen_mask = _id##_MINLEN_MASK, \
171557513aabSDarren Ye 		.minlen_shift = _id##_MINLEN_SFT, \
171657513aabSDarren Ye }
171757513aabSDarren Ye 
171857513aabSDarren Ye #define MT8196_MULTI_DL_MEMIF(_id) \
171957513aabSDarren Ye 	[MT8196_MEMIF_##_id] = { \
172057513aabSDarren Ye 		.name = #_id, \
172157513aabSDarren Ye 		.id = MT8196_MEMIF_##_id, \
172257513aabSDarren Ye 		.reg_ofs_base = AFE_##_id##_BASE, \
172357513aabSDarren Ye 		.reg_ofs_cur = AFE_##_id##_CUR, \
172457513aabSDarren Ye 		.reg_ofs_end = AFE_##_id##_END, \
172557513aabSDarren Ye 		.reg_ofs_base_msb = AFE_##_id##_BASE_MSB, \
172657513aabSDarren Ye 		.reg_ofs_cur_msb = AFE_##_id##_CUR_MSB, \
172757513aabSDarren Ye 		.reg_ofs_end_msb = AFE_##_id##_END_MSB, \
172857513aabSDarren Ye 		.fs_reg = AFE_##_id##_CON0, \
172957513aabSDarren Ye 		.fs_shift = _id##_SEL_FS_SFT, \
173057513aabSDarren Ye 		.fs_maskbit = _id##_SEL_FS_MASK, \
173157513aabSDarren Ye 		.mono_reg = -1, \
173257513aabSDarren Ye 		.mono_shift = -1, \
173357513aabSDarren Ye 		.enable_reg = AFE_##_id##_CON0, \
173457513aabSDarren Ye 		.enable_shift = _id##_ON_SFT, \
173557513aabSDarren Ye 		.hd_reg = AFE_##_id##_CON0, \
173657513aabSDarren Ye 		.hd_shift = _id##_HD_MODE_SFT, \
173757513aabSDarren Ye 		.hd_align_reg = AFE_##_id##_CON0, \
173857513aabSDarren Ye 		.hd_align_mshift = _id##_HALIGN_SFT, \
173957513aabSDarren Ye 		.agent_disable_reg = -1, \
174057513aabSDarren Ye 		.agent_disable_shift = -1, \
174157513aabSDarren Ye 		.msb_reg = -1, \
174257513aabSDarren Ye 		.msb_shift = -1, \
174357513aabSDarren Ye 		.pbuf_reg = AFE_##_id##_CON0, \
174457513aabSDarren Ye 		.pbuf_mask = _id##_PBUF_SIZE_MASK, \
174557513aabSDarren Ye 		.pbuf_shift = _id##_PBUF_SIZE_SFT, \
174657513aabSDarren Ye 		.minlen_reg = AFE_##_id##_CON0, \
174757513aabSDarren Ye 		.minlen_mask = _id##_MINLEN_MASK, \
174857513aabSDarren Ye 		.minlen_shift = _id##_MINLEN_SFT, \
174957513aabSDarren Ye 		.ch_num_reg = AFE_##_id##_CON0, \
175057513aabSDarren Ye 		.ch_num_maskbit = _id##_NUM_MASK, \
175157513aabSDarren Ye 		.ch_num_shift = _id##_NUM_SFT, \
175257513aabSDarren Ye }
175357513aabSDarren Ye 
175457513aabSDarren Ye #define MT8196_UL_MEMIF(_id, _fs_shift, _fs_maskbit, _mono_shift) \
175557513aabSDarren Ye 	[MT8196_MEMIF_##_id] = { \
175657513aabSDarren Ye 		.name = #_id, \
175757513aabSDarren Ye 		.id = MT8196_MEMIF_##_id, \
175857513aabSDarren Ye 		.reg_ofs_base = AFE_##_id##_BASE, \
175957513aabSDarren Ye 		.reg_ofs_cur = AFE_##_id##_CUR, \
176057513aabSDarren Ye 		.reg_ofs_end = AFE_##_id##_END, \
176157513aabSDarren Ye 		.reg_ofs_base_msb = AFE_##_id##_BASE_MSB, \
176257513aabSDarren Ye 		.reg_ofs_cur_msb = AFE_##_id##_CUR_MSB, \
176357513aabSDarren Ye 		.reg_ofs_end_msb = AFE_##_id##_END_MSB, \
176457513aabSDarren Ye 		.fs_reg = AFE_##_id##_CON0, \
176557513aabSDarren Ye 		.fs_shift = _fs_shift, \
176657513aabSDarren Ye 		.fs_maskbit = _fs_maskbit, \
176757513aabSDarren Ye 		.mono_reg = AFE_##_id##_CON0, \
176857513aabSDarren Ye 		.mono_shift = _mono_shift, \
176957513aabSDarren Ye 		.enable_reg = AFE_##_id##_CON0, \
177057513aabSDarren Ye 		.enable_shift = _id##_ON_SFT, \
177157513aabSDarren Ye 		.hd_reg = AFE_##_id##_CON0, \
177257513aabSDarren Ye 		.hd_shift = _id##_HD_MODE_SFT, \
177357513aabSDarren Ye 		.hd_align_reg = AFE_##_id##_CON0, \
177457513aabSDarren Ye 		.hd_align_mshift = _id##_HALIGN_SFT, \
177557513aabSDarren Ye 		.agent_disable_reg = -1, \
177657513aabSDarren Ye 		.agent_disable_shift = -1, \
177757513aabSDarren Ye 		.msb_reg = -1, \
177857513aabSDarren Ye 		.msb_shift = -1, \
177957513aabSDarren Ye 	}
178057513aabSDarren Ye 
178157513aabSDarren Ye /* For convenience with macros: missing register fields */
178257513aabSDarren Ye #define HDMI_SEL_FS_SFT			-1
178357513aabSDarren Ye #define HDMI_SEL_FS_MASK		-1
178457513aabSDarren Ye 
178557513aabSDarren Ye /* For convenience with macros: register name differences */
178657513aabSDarren Ye #define AFE_HDMI_BASE			AFE_HDMI_OUT_BASE
178757513aabSDarren Ye #define AFE_HDMI_CUR			AFE_HDMI_OUT_CUR
178857513aabSDarren Ye #define AFE_HDMI_END			AFE_HDMI_OUT_END
178957513aabSDarren Ye #define AFE_HDMI_BASE_MSB		AFE_HDMI_OUT_BASE_MSB
179057513aabSDarren Ye #define AFE_HDMI_CUR_MSB		AFE_HDMI_OUT_CUR_MSB
179157513aabSDarren Ye #define AFE_HDMI_END_MSB		AFE_HDMI_OUT_END_MSB
179257513aabSDarren Ye #define AFE_HDMI_CON0			AFE_HDMI_OUT_CON0
179357513aabSDarren Ye #define HDMI_ON_SFT				HDMI_OUT_ON_SFT
179457513aabSDarren Ye #define HDMI_HD_MODE_SFT		HDMI_OUT_HD_MODE_SFT
179557513aabSDarren Ye #define HDMI_HALIGN_SFT			HDMI_OUT_HALIGN_SFT
179657513aabSDarren Ye #define HDMI_PBUF_SIZE_MASK		HDMI_OUT_PBUF_SIZE_MASK
179757513aabSDarren Ye #define HDMI_PBUF_SIZE_SFT		HDMI_OUT_PBUF_SIZE_SFT
179857513aabSDarren Ye #define HDMI_MINLEN_MASK		HDMI_OUT_MINLEN_MASK
179957513aabSDarren Ye #define HDMI_MINLEN_SFT			HDMI_OUT_MINLEN_SFT
180057513aabSDarren Ye #define HDMI_NUM_MASK			HDMI_CH_NUM_MASK
180157513aabSDarren Ye #define HDMI_NUM_SFT			HDMI_CH_NUM_SFT
180257513aabSDarren Ye 
180357513aabSDarren Ye static const struct mtk_base_memif_data memif_data[MT8196_MEMIF_NUM] = {
180457513aabSDarren Ye 	MT8196_DL_MEMIF(DL0),
180557513aabSDarren Ye 	MT8196_DL_MEMIF(DL1),
180657513aabSDarren Ye 	MT8196_DL_MEMIF(DL2),
180757513aabSDarren Ye 	MT8196_DL_MEMIF(DL3),
180857513aabSDarren Ye 	MT8196_DL_MEMIF(DL4),
180957513aabSDarren Ye 	MT8196_DL_MEMIF(DL5),
181057513aabSDarren Ye 	MT8196_DL_MEMIF(DL6),
181157513aabSDarren Ye 	MT8196_DL_MEMIF(DL7),
181257513aabSDarren Ye 	MT8196_DL_MEMIF(DL8),
181357513aabSDarren Ye 	MT8196_DL_MEMIF(DL23),
181457513aabSDarren Ye 	MT8196_DL_MEMIF(DL24),
181557513aabSDarren Ye 	MT8196_DL_MEMIF(DL25),
181657513aabSDarren Ye 	MT8196_DL_MEMIF(DL26),
181757513aabSDarren Ye 	MT8196_MULTI_DL_MEMIF(DL_4CH),
181857513aabSDarren Ye 	MT8196_MULTI_DL_MEMIF(DL_24CH),
181957513aabSDarren Ye 	MT8196_MULTI_DL_MEMIF(HDMI),
182057513aabSDarren Ye 	MT8196_UL_MEMIF(VUL0, VUL0_SEL_FS_SFT, VUL0_SEL_FS_MASK, VUL0_MONO_SFT),
182157513aabSDarren Ye 	MT8196_UL_MEMIF(VUL1, VUL1_SEL_FS_SFT, VUL1_SEL_FS_MASK, VUL1_MONO_SFT),
182257513aabSDarren Ye 	MT8196_UL_MEMIF(VUL2, VUL2_SEL_FS_SFT, VUL2_SEL_FS_MASK, VUL2_MONO_SFT),
182357513aabSDarren Ye 	MT8196_UL_MEMIF(VUL3, VUL3_SEL_FS_SFT, VUL3_SEL_FS_MASK, VUL3_MONO_SFT),
182457513aabSDarren Ye 	MT8196_UL_MEMIF(VUL4, VUL4_SEL_FS_SFT, VUL4_SEL_FS_MASK, VUL4_MONO_SFT),
182557513aabSDarren Ye 	MT8196_UL_MEMIF(VUL5, VUL5_SEL_FS_SFT, VUL5_SEL_FS_MASK, VUL5_MONO_SFT),
182657513aabSDarren Ye 	MT8196_UL_MEMIF(VUL6, VUL6_SEL_FS_SFT, VUL6_SEL_FS_MASK, VUL6_MONO_SFT),
182757513aabSDarren Ye 	MT8196_UL_MEMIF(VUL7, VUL7_SEL_FS_SFT, VUL7_SEL_FS_MASK, VUL7_MONO_SFT),
182857513aabSDarren Ye 	MT8196_UL_MEMIF(VUL8, VUL8_SEL_FS_SFT, VUL8_SEL_FS_MASK, VUL8_MONO_SFT),
182957513aabSDarren Ye 	MT8196_UL_MEMIF(VUL9, VUL9_SEL_FS_SFT, VUL9_SEL_FS_MASK, VUL9_MONO_SFT),
183057513aabSDarren Ye 	MT8196_UL_MEMIF(VUL10, VUL10_SEL_FS_SFT, VUL10_SEL_FS_MASK, VUL10_MONO_SFT),
183157513aabSDarren Ye 	MT8196_UL_MEMIF(VUL24, VUL24_SEL_FS_SFT, VUL24_SEL_FS_MASK, VUL24_MONO_SFT),
183257513aabSDarren Ye 	MT8196_UL_MEMIF(VUL25, VUL25_SEL_FS_SFT, VUL25_SEL_FS_MASK, VUL25_MONO_SFT),
183357513aabSDarren Ye 	MT8196_UL_MEMIF(VUL26, VUL26_SEL_FS_SFT, VUL26_SEL_FS_MASK, VUL26_MONO_SFT),
183457513aabSDarren Ye 	MT8196_UL_MEMIF(VUL_CM0, -1, -1, -1),
183557513aabSDarren Ye 	MT8196_UL_MEMIF(VUL_CM1, -1, -1, -1),
183657513aabSDarren Ye 	MT8196_UL_MEMIF(VUL_CM2, -1, -1, -1),
183757513aabSDarren Ye 	MT8196_UL_MEMIF(ETDM_IN0, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),
183857513aabSDarren Ye 	MT8196_UL_MEMIF(ETDM_IN1, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),
183957513aabSDarren Ye 	MT8196_UL_MEMIF(ETDM_IN2, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),
184057513aabSDarren Ye 	MT8196_UL_MEMIF(ETDM_IN3, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),
184157513aabSDarren Ye 	MT8196_UL_MEMIF(ETDM_IN4, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),
184257513aabSDarren Ye 	MT8196_UL_MEMIF(ETDM_IN6, REG_FS_TIMING_SEL_SFT, REG_FS_TIMING_SEL_MASK, -1),
184357513aabSDarren Ye };
184457513aabSDarren Ye 
184557513aabSDarren Ye #define MT8196_AFE_IRQ(_id)	\
184657513aabSDarren Ye 	[MT8196_IRQ_##_id] = { \
184757513aabSDarren Ye 		.id = MT8196_IRQ_##_id, \
184857513aabSDarren Ye 		.irq_cnt_reg = AFE_IRQ##_id##_MCU_CFG1, \
184957513aabSDarren Ye 		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT, \
185057513aabSDarren Ye 		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK, \
185157513aabSDarren Ye 		.irq_fs_reg = AFE_IRQ##_id##_MCU_CFG0, \
185257513aabSDarren Ye 		.irq_fs_shift = AFE_IRQ##_id##_MCU_FS_SFT, \
185357513aabSDarren Ye 		.irq_fs_maskbit = AFE_IRQ##_id##_MCU_FS_MASK, \
185457513aabSDarren Ye 		.irq_en_reg = AFE_IRQ##_id##_MCU_CFG0, \
185557513aabSDarren Ye 		.irq_en_shift = AFE_IRQ##_id##_MCU_ON_SFT, \
185657513aabSDarren Ye 		.irq_clr_reg = AFE_IRQ##_id##_MCU_CFG1, \
185757513aabSDarren Ye 		.irq_clr_shift = AFE_IRQ##_id##_CLR_CFG_SFT, \
185857513aabSDarren Ye 	}
185957513aabSDarren Ye 
186057513aabSDarren Ye #define MT8196_AFE_TDM_IRQ(_id)	\
186157513aabSDarren Ye 	[MT8196_IRQ_##_id] = { \
186257513aabSDarren Ye 		.id = MT8196_CUS_IRQ_TDM, \
186357513aabSDarren Ye 		.irq_cnt_reg = AFE_CUSTOM_IRQ0_MCU_CFG1, \
186457513aabSDarren Ye 		.irq_cnt_shift = AFE_CUSTOM_IRQ0_MCU_CNT_SFT, \
186557513aabSDarren Ye 		.irq_cnt_maskbit = AFE_CUSTOM_IRQ0_MCU_CNT_MASK, \
186657513aabSDarren Ye 		.irq_fs_reg = -1, \
186757513aabSDarren Ye 		.irq_fs_shift = -1, \
186857513aabSDarren Ye 		.irq_fs_maskbit = -1, \
186957513aabSDarren Ye 		.irq_en_reg = AFE_CUSTOM_IRQ0_MCU_CFG0, \
187057513aabSDarren Ye 		.irq_en_shift = AFE_CUSTOM_IRQ0_MCU_ON_SFT, \
187157513aabSDarren Ye 		.irq_clr_reg = AFE_CUSTOM_IRQ0_MCU_CFG1, \
187257513aabSDarren Ye 		.irq_clr_shift = AFE_CUSTOM_IRQ0_CLR_CFG_SFT, \
187357513aabSDarren Ye 	}
187457513aabSDarren Ye 
187557513aabSDarren Ye static const struct mtk_base_irq_data irq_data[MT8196_IRQ_NUM] = {
187657513aabSDarren Ye 	MT8196_AFE_IRQ(0),
187757513aabSDarren Ye 	MT8196_AFE_IRQ(1),
187857513aabSDarren Ye 	MT8196_AFE_IRQ(2),
187957513aabSDarren Ye 	MT8196_AFE_IRQ(3),
188057513aabSDarren Ye 	MT8196_AFE_IRQ(4),
188157513aabSDarren Ye 	MT8196_AFE_IRQ(5),
188257513aabSDarren Ye 	MT8196_AFE_IRQ(6),
188357513aabSDarren Ye 	MT8196_AFE_IRQ(7),
188457513aabSDarren Ye 	MT8196_AFE_IRQ(8),
188557513aabSDarren Ye 	MT8196_AFE_IRQ(9),
188657513aabSDarren Ye 	MT8196_AFE_IRQ(10),
188757513aabSDarren Ye 	MT8196_AFE_IRQ(11),
188857513aabSDarren Ye 	MT8196_AFE_IRQ(12),
188957513aabSDarren Ye 	MT8196_AFE_IRQ(13),
189057513aabSDarren Ye 	MT8196_AFE_IRQ(14),
189157513aabSDarren Ye 	MT8196_AFE_IRQ(15),
189257513aabSDarren Ye 	MT8196_AFE_IRQ(16),
189357513aabSDarren Ye 	MT8196_AFE_IRQ(17),
189457513aabSDarren Ye 	MT8196_AFE_IRQ(18),
189557513aabSDarren Ye 	MT8196_AFE_IRQ(19),
189657513aabSDarren Ye 	MT8196_AFE_IRQ(20),
189757513aabSDarren Ye 	MT8196_AFE_IRQ(21),
189857513aabSDarren Ye 	MT8196_AFE_IRQ(22),
189957513aabSDarren Ye 	MT8196_AFE_IRQ(23),
190057513aabSDarren Ye 	MT8196_AFE_IRQ(24),
190157513aabSDarren Ye 	MT8196_AFE_IRQ(25),
190257513aabSDarren Ye 	MT8196_AFE_IRQ(26),
190357513aabSDarren Ye 	MT8196_AFE_TDM_IRQ(31),
190457513aabSDarren Ye };
190557513aabSDarren Ye 
190657513aabSDarren Ye static const int memif_irq_usage[MT8196_MEMIF_NUM] = {
190757513aabSDarren Ye 	/* TODO: verify each memif & irq */
190857513aabSDarren Ye 	[MT8196_MEMIF_DL0] = MT8196_IRQ_0,
190957513aabSDarren Ye 	[MT8196_MEMIF_DL1] = MT8196_IRQ_1,
191057513aabSDarren Ye 	[MT8196_MEMIF_DL2] = MT8196_IRQ_2,
191157513aabSDarren Ye 	[MT8196_MEMIF_DL3] = MT8196_IRQ_3,
191257513aabSDarren Ye 	[MT8196_MEMIF_DL4] = MT8196_IRQ_4,
191357513aabSDarren Ye 	[MT8196_MEMIF_DL5] = MT8196_IRQ_5,
191457513aabSDarren Ye 	[MT8196_MEMIF_DL6] = MT8196_IRQ_6,
191557513aabSDarren Ye 	[MT8196_MEMIF_DL7] = MT8196_IRQ_7,
191657513aabSDarren Ye 	[MT8196_MEMIF_DL8] = MT8196_IRQ_8,
191757513aabSDarren Ye 	[MT8196_MEMIF_DL23] = MT8196_IRQ_9,
191857513aabSDarren Ye 	[MT8196_MEMIF_DL24] = MT8196_IRQ_10,
191957513aabSDarren Ye 	[MT8196_MEMIF_DL25] = MT8196_IRQ_11,
192057513aabSDarren Ye 	[MT8196_MEMIF_DL26] = MT8196_IRQ_0,
192157513aabSDarren Ye 	[MT8196_MEMIF_DL_4CH] = MT8196_IRQ_0,
192257513aabSDarren Ye 	[MT8196_MEMIF_DL_24CH] = MT8196_IRQ_12,
192357513aabSDarren Ye 	[MT8196_MEMIF_VUL0] = MT8196_IRQ_13,
192457513aabSDarren Ye 	[MT8196_MEMIF_VUL1] = MT8196_IRQ_14,
192557513aabSDarren Ye 	[MT8196_MEMIF_VUL2] = MT8196_IRQ_15,
192657513aabSDarren Ye 	[MT8196_MEMIF_VUL3] = MT8196_IRQ_16,
192757513aabSDarren Ye 	[MT8196_MEMIF_VUL4] = MT8196_IRQ_17,
192857513aabSDarren Ye 	[MT8196_MEMIF_VUL5] = MT8196_IRQ_18,
192957513aabSDarren Ye 	[MT8196_MEMIF_VUL6] = MT8196_IRQ_19,
193057513aabSDarren Ye 	[MT8196_MEMIF_VUL7] = MT8196_IRQ_20,
193157513aabSDarren Ye 	[MT8196_MEMIF_VUL8] = MT8196_IRQ_21,
193257513aabSDarren Ye 	[MT8196_MEMIF_VUL9] = MT8196_IRQ_22,
193357513aabSDarren Ye 	[MT8196_MEMIF_VUL10] = MT8196_IRQ_23,
193457513aabSDarren Ye 	[MT8196_MEMIF_VUL24] = MT8196_IRQ_24,
193557513aabSDarren Ye 	[MT8196_MEMIF_VUL25] = MT8196_IRQ_25,
193657513aabSDarren Ye 	[MT8196_MEMIF_VUL26] = MT8196_IRQ_0,
193757513aabSDarren Ye 	[MT8196_MEMIF_VUL_CM0] = MT8196_IRQ_26,
193857513aabSDarren Ye 	[MT8196_MEMIF_VUL_CM1] = MT8196_IRQ_0,
193957513aabSDarren Ye 	[MT8196_MEMIF_VUL_CM2] = MT8196_IRQ_0,
194057513aabSDarren Ye 	[MT8196_MEMIF_ETDM_IN0] = MT8196_IRQ_0,
194157513aabSDarren Ye 	[MT8196_MEMIF_ETDM_IN1] = MT8196_IRQ_0,
194257513aabSDarren Ye 	[MT8196_MEMIF_ETDM_IN2] = MT8196_IRQ_0,
194357513aabSDarren Ye 	[MT8196_MEMIF_ETDM_IN3] = MT8196_IRQ_0,
194457513aabSDarren Ye 	[MT8196_MEMIF_ETDM_IN4] = MT8196_IRQ_0,
194557513aabSDarren Ye 	[MT8196_MEMIF_ETDM_IN6] = MT8196_IRQ_0,
194657513aabSDarren Ye 	[MT8196_MEMIF_HDMI] = MT8196_IRQ_31
194757513aabSDarren Ye };
194857513aabSDarren Ye 
194957513aabSDarren Ye static bool mt8196_is_volatile_reg(struct device *dev, unsigned int reg)
195057513aabSDarren Ye {
195157513aabSDarren Ye 	/* these auto-gen reg has read-only bit, so put it as volatile */
195257513aabSDarren Ye 	/* volatile reg cannot be cached, so cannot be set when power off */
195357513aabSDarren Ye 	switch (reg) {
195457513aabSDarren Ye 	case AUDIO_TOP_CON0 ... AUDIO_TOP_CON4:
195557513aabSDarren Ye 	case AFE_APLL1_TUNER_MON0:
195657513aabSDarren Ye 	case AFE_APLL2_TUNER_MON0:
195757513aabSDarren Ye 	case AFE_SPM_CONTROL_ACK:
195857513aabSDarren Ye 	case AUDIO_TOP_IP_VERSION:
195957513aabSDarren Ye 	case AUDIO_ENGEN_CON0_MON:
196057513aabSDarren Ye 	case AUD_TOP_MON_RG:
196157513aabSDarren Ye 	case AFE_CONNSYS_I2S_IPM_VER_MON:
196257513aabSDarren Ye 	case AFE_CONNSYS_I2S_MON:
196357513aabSDarren Ye 	case AFE_PCM_INTF_MON:
196457513aabSDarren Ye 	case AFE_PCM_TOP_IP_VERSION:
196557513aabSDarren Ye 	case AFE_IRQ_MCU_STATUS:
196657513aabSDarren Ye 	case AFE_CUSTOM_IRQ_MCU_STATUS:
196757513aabSDarren Ye 	case AFE_IRQ_MCU_MON0 ... AFE_IRQ26_CNT_MON:
196857513aabSDarren Ye 	case AFE_CUSTOM_IRQ0_CNT_MON:
196957513aabSDarren Ye 	case AFE_STF_MON:
197057513aabSDarren Ye 	case AFE_STF_IP_VERSION:
197157513aabSDarren Ye 	case AFE_CM0_MON:
197257513aabSDarren Ye 	case AFE_CM0_IP_VERSION:
197357513aabSDarren Ye 	case AFE_CM1_MON:
197457513aabSDarren Ye 	case AFE_CM1_IP_VERSION:
197557513aabSDarren Ye 	case AFE_ADDA_UL0_SRC_DEBUG_MON0 ... AFE_ADDA_UL0_SRC_MON1:
197657513aabSDarren Ye 	case AFE_ADDA_UL0_IP_VERSION:
197757513aabSDarren Ye 	case AFE_ADDA_UL1_SRC_DEBUG_MON0 ... AFE_ADDA_UL1_SRC_MON1:
197857513aabSDarren Ye 	case AFE_ADDA_UL1_IP_VERSION:
197957513aabSDarren Ye 	case AFE_MTKAIF_IPM_VER_MON:
198057513aabSDarren Ye 	case AFE_MTKAIF_MON:
198157513aabSDarren Ye 	case AFE_AUD_PAD_TOP_MON:
198257513aabSDarren Ye 	case AFE_ADDA_MTKAIFV4_MON0 ... AFE_ADDA6_MTKAIFV4_MON0:
198357513aabSDarren Ye 	case ETDM_IN0_MON:
198457513aabSDarren Ye 	case ETDM_IN1_MON:
198557513aabSDarren Ye 	case ETDM_IN2_MON:
198657513aabSDarren Ye 	case ETDM_IN4_MON:
198757513aabSDarren Ye 	case ETDM_IN6_MON:
198857513aabSDarren Ye 	case ETDM_OUT0_MON:
198957513aabSDarren Ye 	case ETDM_OUT1_MON:
199057513aabSDarren Ye 	case ETDM_OUT2_MON:
199157513aabSDarren Ye 	case ETDM_OUT4_MON:
199257513aabSDarren Ye 	case ETDM_OUT6_MON:
199357513aabSDarren Ye 	case AFE_DPTX_MON:
199457513aabSDarren Ye 	case AFE_TDM_TOP_IP_VERSION:
199557513aabSDarren Ye 	case AFE_CONN_MON0 ... AFE_CONN_MON5:
199657513aabSDarren Ye 	case AFE_CBIP_SLV_DECODER_MON0 ... AFE_CBIP_SLV_MUX_MON1:
199757513aabSDarren Ye 	case AFE_DL0_CUR_MSB ... AFE_DL0_CUR:
199857513aabSDarren Ye 	case AFE_DL0_RCH_MON ... AFE_DL0_LCH_MON:
199957513aabSDarren Ye 	case AFE_DL1_CUR_MSB ... AFE_DL1_CUR:
200057513aabSDarren Ye 	case AFE_DL1_RCH_MON ... AFE_DL1_LCH_MON:
200157513aabSDarren Ye 	case AFE_DL2_CUR_MSB ... AFE_DL2_CUR:
200257513aabSDarren Ye 	case AFE_DL2_RCH_MON ... AFE_DL2_LCH_MON:
200357513aabSDarren Ye 	case AFE_DL3_CUR_MSB ... AFE_DL3_CUR:
200457513aabSDarren Ye 	case AFE_DL3_RCH_MON ... AFE_DL3_LCH_MON:
200557513aabSDarren Ye 	case AFE_DL4_CUR_MSB ... AFE_DL4_CUR:
200657513aabSDarren Ye 	case AFE_DL4_RCH_MON ... AFE_DL4_LCH_MON:
200757513aabSDarren Ye 	case AFE_DL5_CUR_MSB ... AFE_DL5_CUR:
200857513aabSDarren Ye 	case AFE_DL5_RCH_MON ... AFE_DL5_LCH_MON:
200957513aabSDarren Ye 	case AFE_DL6_CUR_MSB ... AFE_DL6_CUR:
201057513aabSDarren Ye 	case AFE_DL6_RCH_MON ... AFE_DL6_LCH_MON:
201157513aabSDarren Ye 	case AFE_DL7_CUR_MSB ... AFE_DL7_CUR:
201257513aabSDarren Ye 	case AFE_DL7_RCH_MON ... AFE_DL7_LCH_MON:
201357513aabSDarren Ye 	case AFE_DL8_CUR_MSB ... AFE_DL8_CUR:
201457513aabSDarren Ye 	case AFE_DL8_RCH_MON ... AFE_DL8_LCH_MON:
201557513aabSDarren Ye 	case AFE_DL_24CH_CUR_MSB ... AFE_DL_24CH_CUR:
201657513aabSDarren Ye 	case AFE_DL_4CH_CUR_MSB ... AFE_DL_4CH_CUR:
201757513aabSDarren Ye 	case AFE_DL23_CUR_MSB ... AFE_DL23_CUR:
201857513aabSDarren Ye 	case AFE_DL23_RCH_MON ... AFE_DL23_LCH_MON:
201957513aabSDarren Ye 	case AFE_DL24_CUR_MSB ... AFE_DL24_CUR:
202057513aabSDarren Ye 	case AFE_DL24_RCH_MON ... AFE_DL24_LCH_MON:
202157513aabSDarren Ye 	case AFE_DL25_CUR_MSB ... AFE_DL25_CUR:
202257513aabSDarren Ye 	case AFE_DL25_RCH_MON ... AFE_DL25_LCH_MON:
202357513aabSDarren Ye 	case AFE_DL26_CUR_MSB ... AFE_DL26_CUR:
202457513aabSDarren Ye 	case AFE_DL26_RCH_MON ... AFE_DL26_LCH_MON:
202557513aabSDarren Ye 	case AFE_VUL0_CUR_MSB ... AFE_VUL0_CUR:
202657513aabSDarren Ye 	case AFE_VUL1_CUR_MSB ... AFE_VUL1_CUR:
202757513aabSDarren Ye 	case AFE_VUL2_CUR_MSB ... AFE_VUL2_CUR:
202857513aabSDarren Ye 	case AFE_VUL3_CUR_MSB ... AFE_VUL3_CUR:
202957513aabSDarren Ye 	case AFE_VUL4_CUR_MSB ... AFE_VUL4_CUR:
203057513aabSDarren Ye 	case AFE_VUL5_CUR_MSB ... AFE_VUL5_CUR:
203157513aabSDarren Ye 	case AFE_VUL6_CUR_MSB ... AFE_VUL6_CUR:
203257513aabSDarren Ye 	case AFE_VUL7_CUR_MSB ... AFE_VUL7_CUR:
203357513aabSDarren Ye 	case AFE_VUL8_CUR_MSB ... AFE_VUL8_CUR:
203457513aabSDarren Ye 	case AFE_VUL9_CUR_MSB ... AFE_VUL9_CUR:
203557513aabSDarren Ye 	case AFE_VUL10_CUR_MSB ... AFE_VUL10_CUR:
203657513aabSDarren Ye 	case AFE_VUL24_CUR_MSB ... AFE_VUL24_CUR:
203757513aabSDarren Ye 	case AFE_VUL25_CUR_MSB ... AFE_VUL25_CUR:
203857513aabSDarren Ye 	case AFE_VUL25_RCH_MON ... AFE_VUL25_LCH_MON:
203957513aabSDarren Ye 	case AFE_VUL26_CUR_MSB ... AFE_VUL26_CUR:
204057513aabSDarren Ye 	case AFE_VUL_CM0_BASE_MSB ... AFE_VUL_CM0_CON0:
204157513aabSDarren Ye 	case AFE_VUL_CM1_CUR_MSB ... AFE_VUL_CM1_CUR:
204257513aabSDarren Ye 	case AFE_VUL_CM2_CUR_MSB ... AFE_VUL_CM2_CUR:
204357513aabSDarren Ye 	case AFE_ETDM_IN0_CUR_MSB ... AFE_ETDM_IN0_CUR:
204457513aabSDarren Ye 	case AFE_ETDM_IN1_CUR_MSB ... AFE_ETDM_IN1_CUR:
204557513aabSDarren Ye 	case AFE_ETDM_IN2_CUR_MSB ... AFE_ETDM_IN2_CUR:
204657513aabSDarren Ye 	case AFE_ETDM_IN3_CUR_MSB ... AFE_ETDM_IN3_CUR:
204757513aabSDarren Ye 	case AFE_ETDM_IN4_CUR_MSB ... AFE_ETDM_IN4_CUR:
204857513aabSDarren Ye 	case AFE_ETDM_IN6_CUR_MSB ... AFE_ETDM_IN6_CUR:
204957513aabSDarren Ye 	case AFE_HDMI_OUT_CUR_MSB ... AFE_HDMI_OUT_CUR:
205057513aabSDarren Ye 	case AFE_HDMI_OUT_END:
205157513aabSDarren Ye 	case AFE_PROT_SIDEBAND0_MON ... AFE_DOMAIN_SIDEBAND9_MON:
205257513aabSDarren Ye 	case AFE_PCM0_INTF_CON1_MASK_MON ... AFE_ADDA_UL1_SRC_CON0_MASK_MON:
205357513aabSDarren Ye 	case AFE_IRQ_MCU_EN ... AFE_IRQ_MCU_DSP2_EN:
205457513aabSDarren Ye 	case AFE_CUSTOM_IRQ_MCU_EN:
205557513aabSDarren Ye 	case AFE_DL5_CON0:
205657513aabSDarren Ye 	case AFE_DL6_CON0:
205757513aabSDarren Ye 	case AFE_DL23_CON0:
205857513aabSDarren Ye 	case AFE_DL_24CH_CON0:
205957513aabSDarren Ye 	case AFE_VUL1_CON0:
206057513aabSDarren Ye 	case AFE_VUL3_CON0:
206157513aabSDarren Ye 	case AFE_VUL4_CON0:
206257513aabSDarren Ye 	case AFE_VUL5_CON0:
206357513aabSDarren Ye 	case AFE_VUL9_CON0:
206457513aabSDarren Ye 	case AFE_VUL25_CON0:
206557513aabSDarren Ye 	case AFE_IRQ0_MCU_CFG0 ... AFE_IRQ26_MCU_CFG1:
206657513aabSDarren Ye 		return true;
206757513aabSDarren Ye 	default:
206857513aabSDarren Ye 		return false;
206957513aabSDarren Ye 	};
207057513aabSDarren Ye }
207157513aabSDarren Ye 
207257513aabSDarren Ye static const struct regmap_config mt8196_afe_regmap_config = {
207357513aabSDarren Ye 	.reg_bits = 32,
207457513aabSDarren Ye 	.reg_stride = 4,
207557513aabSDarren Ye 	.val_bits = 32,
207657513aabSDarren Ye 
207757513aabSDarren Ye 	.volatile_reg = mt8196_is_volatile_reg,
207857513aabSDarren Ye 
207957513aabSDarren Ye 	.max_register = AFE_MAX_REGISTER,
208057513aabSDarren Ye 	.num_reg_defaults_raw = AFE_MAX_REGISTER,
208157513aabSDarren Ye 
208257513aabSDarren Ye 	.cache_type = REGCACHE_FLAT,
208357513aabSDarren Ye };
208457513aabSDarren Ye 
208557513aabSDarren Ye static irqreturn_t mt8196_afe_irq_handler(int irq_id, void *dev)
208657513aabSDarren Ye {
208757513aabSDarren Ye 	struct mtk_base_afe *afe = dev;
208857513aabSDarren Ye 	struct mtk_base_afe_irq *irq;
208957513aabSDarren Ye 	u32 status;
209057513aabSDarren Ye 	u32 status_mcu;
209157513aabSDarren Ye 	u32 mcu_en;
209257513aabSDarren Ye 	u32 cus_status;
209357513aabSDarren Ye 	u32 cus_status_mcu;
209457513aabSDarren Ye 	u32 cus_mcu_en;
209557513aabSDarren Ye 	u32 tmp_reg;
209657513aabSDarren Ye 	int ret, cus_ret;
209757513aabSDarren Ye 	int i;
209857513aabSDarren Ye 	struct timespec64 ts64;
209957513aabSDarren Ye 	u64 t1, t2;
210057513aabSDarren Ye 	/* one interrupt period = 5ms */
210157513aabSDarren Ye 	const u64 timeout_limit = 5000000;
210257513aabSDarren Ye 
210357513aabSDarren Ye 	/* get irq that is sent to MCU */
210457513aabSDarren Ye 	regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);
210557513aabSDarren Ye 	regmap_read(afe->regmap, AFE_CUSTOM_IRQ_MCU_EN, &cus_mcu_en);
210657513aabSDarren Ye 
210757513aabSDarren Ye 	ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);
210857513aabSDarren Ye 	cus_ret = regmap_read(afe->regmap, AFE_CUSTOM_IRQ_MCU_STATUS, &cus_status);
210957513aabSDarren Ye 	/* only care IRQ which is sent to MCU */
211057513aabSDarren Ye 	status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS;
211157513aabSDarren Ye 	cus_status_mcu = cus_status & cus_mcu_en & AFE_IRQ_STATUS_BITS;
211257513aabSDarren Ye 	if ((ret || !status_mcu) && (cus_ret || !cus_status_mcu)) {
211357513aabSDarren Ye 		dev_err(afe->dev, "ret %d, sat 0x%x, en 0x%x,csat 0x%x, cen 0x%x\n",
211457513aabSDarren Ye 			ret, status, mcu_en, cus_status_mcu, cus_mcu_en);
211557513aabSDarren Ye 		return IRQ_NONE;
211657513aabSDarren Ye 	}
211757513aabSDarren Ye 
211857513aabSDarren Ye 	ktime_get_ts64(&ts64);
211957513aabSDarren Ye 	t1 = ktime_get_ns();
212057513aabSDarren Ye 
212157513aabSDarren Ye 	for (i = 0; i < MT8196_MEMIF_NUM; i++) {
212257513aabSDarren Ye 		struct mtk_base_afe_memif *memif = &afe->memif[i];
212357513aabSDarren Ye 
212457513aabSDarren Ye 		if (!memif->substream)
212557513aabSDarren Ye 			continue;
212657513aabSDarren Ye 
212757513aabSDarren Ye 		if (memif->irq_usage < 0)
212857513aabSDarren Ye 			continue;
212957513aabSDarren Ye 		irq = &afe->irqs[memif->irq_usage];
213057513aabSDarren Ye 
213157513aabSDarren Ye 		if (i == MT8196_MEMIF_HDMI) {
213257513aabSDarren Ye 			if (cus_status_mcu & BIT(irq->irq_data->id))
213357513aabSDarren Ye 				snd_pcm_period_elapsed(memif->substream);
213457513aabSDarren Ye 		} else {
213557513aabSDarren Ye 			if (status_mcu & BIT(irq->irq_data->id))
213657513aabSDarren Ye 				snd_pcm_period_elapsed(memif->substream);
213757513aabSDarren Ye 		}
213857513aabSDarren Ye 	}
213957513aabSDarren Ye 
214057513aabSDarren Ye 	ktime_get_ts64(&ts64);
214157513aabSDarren Ye 	t2 = ktime_get_ns();
214257513aabSDarren Ye 	t2 = t2 - t1; /* in ns (10^9) */
214357513aabSDarren Ye 
214457513aabSDarren Ye 	if (t2 > timeout_limit)
214557513aabSDarren Ye 		dev_warn(afe->dev, "IRQ handler exceeded time limit by %llu ns\n",
214657513aabSDarren Ye 			 t2 - timeout_limit);
214757513aabSDarren Ye 
214857513aabSDarren Ye 	/* clear irq */
214957513aabSDarren Ye 	for (i = 0; i < MT8196_IRQ_NUM; ++i) {
215057513aabSDarren Ye 		/* cus_status_mcu only bit0 is used for TDM */
215157513aabSDarren Ye 		if ((status_mcu & BIT(i)) || (cus_status_mcu & 0x1)) {
215257513aabSDarren Ye 			regmap_read(afe->regmap, irq_data[i].irq_clr_reg, &tmp_reg);
215357513aabSDarren Ye 			regmap_update_bits(afe->regmap, irq_data[i].irq_clr_reg,
215457513aabSDarren Ye 					   AFE_IRQ_CLR_CFG_MASK_SFT |
215557513aabSDarren Ye 					   AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT,
215657513aabSDarren Ye 					   tmp_reg ^ (AFE_IRQ_CLR_CFG_MASK_SFT |
215757513aabSDarren Ye 					   AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT));
215857513aabSDarren Ye 		}
215957513aabSDarren Ye 	}
216057513aabSDarren Ye 
216157513aabSDarren Ye 	return IRQ_HANDLED;
216257513aabSDarren Ye }
216357513aabSDarren Ye 
216457513aabSDarren Ye static int mt8196_afe_runtime_suspend(struct device *dev)
216557513aabSDarren Ye {
216657513aabSDarren Ye 	struct mtk_base_afe *afe = dev_get_drvdata(dev);
216757513aabSDarren Ye 	unsigned int value;
216857513aabSDarren Ye 	unsigned int tmp_reg;
216957513aabSDarren Ye 	int ret, i;
217057513aabSDarren Ye 
217157513aabSDarren Ye 	if (!afe->regmap) {
217257513aabSDarren Ye 		dev_err(afe->dev, "skip regmap\n");
217357513aabSDarren Ye 		goto skip_regmap;
217457513aabSDarren Ye 	}
217557513aabSDarren Ye 
217657513aabSDarren Ye 	/* disable AFE */
217757513aabSDarren Ye 	mt8196_afe_disable_main_clock(afe);
217857513aabSDarren Ye 
217957513aabSDarren Ye 	ret = regmap_read_poll_timeout(afe->regmap,
218057513aabSDarren Ye 				       AUDIO_ENGEN_CON0_MON,
218157513aabSDarren Ye 				       value,
218257513aabSDarren Ye 				       (value & AUDIO_ENGEN_MON_SFT) == 0,
218357513aabSDarren Ye 				       20,
218457513aabSDarren Ye 				       1 * 1000 * 1000);
218557513aabSDarren Ye 	dev_dbg(afe->dev, "read_poll ret %d\n", ret);
218657513aabSDarren Ye 	if (ret)
218757513aabSDarren Ye 		dev_warn(afe->dev, "ret %d\n", ret);
218857513aabSDarren Ye 
218957513aabSDarren Ye 	/* make sure all irq status are cleared */
219057513aabSDarren Ye 	for (i = 0; i < MT8196_IRQ_NUM; ++i) {
219157513aabSDarren Ye 		regmap_read(afe->regmap, irq_data[i].irq_clr_reg, &tmp_reg);
219257513aabSDarren Ye 		regmap_update_bits(afe->regmap, irq_data[i].irq_clr_reg,
219357513aabSDarren Ye 				   AFE_IRQ_CLR_CFG_MASK_SFT | AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT,
219457513aabSDarren Ye 				   tmp_reg ^ (AFE_IRQ_CLR_CFG_MASK_SFT |
219557513aabSDarren Ye 				   AFE_IRQ_MISS_FLAG_CLR_CFG_MASK_SFT));
219657513aabSDarren Ye 	}
219757513aabSDarren Ye 
219857513aabSDarren Ye 	/* reset audio 26M request */
219957513aabSDarren Ye 	regmap_update_bits(afe->regmap,
220057513aabSDarren Ye 			   AFE_SPM_CONTROL_REQ, 0x1, 0x0);
220157513aabSDarren Ye 
220257513aabSDarren Ye 	/* cache only */
220357513aabSDarren Ye 	regcache_cache_only(afe->regmap, true);
220457513aabSDarren Ye 	regcache_mark_dirty(afe->regmap);
220557513aabSDarren Ye 
220657513aabSDarren Ye skip_regmap:
220757513aabSDarren Ye 	mt8196_afe_disable_reg_rw_clk(afe);
220857513aabSDarren Ye 	return 0;
220957513aabSDarren Ye }
221057513aabSDarren Ye 
221157513aabSDarren Ye static int mt8196_afe_runtime_resume(struct device *dev)
221257513aabSDarren Ye {
221357513aabSDarren Ye 	struct mtk_base_afe *afe = dev_get_drvdata(dev);
221457513aabSDarren Ye 	int ret = 0;
221557513aabSDarren Ye 
221657513aabSDarren Ye 	ret = mt8196_afe_enable_reg_rw_clk(afe);
221757513aabSDarren Ye 	if (ret)
221857513aabSDarren Ye 		return ret;
221957513aabSDarren Ye 
222057513aabSDarren Ye 	if (!afe->regmap) {
222157513aabSDarren Ye 		dev_warn(afe->dev, "skip regmap\n");
222257513aabSDarren Ye 		goto skip_regmap;
222357513aabSDarren Ye 	}
222457513aabSDarren Ye 	regcache_cache_only(afe->regmap, false);
222557513aabSDarren Ye 	regcache_sync(afe->regmap);
222657513aabSDarren Ye 
222757513aabSDarren Ye 	/* set audio 26M request */
222857513aabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_SPM_CONTROL_REQ, 0x1, 0x1);
222957513aabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_CBIP_CFG0, 0x1, 0x1);
223057513aabSDarren Ye 
223157513aabSDarren Ye 	/* force cpu use 8_24 format when writing 32bit data */
223257513aabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_MEMIF_CON0,
223357513aabSDarren Ye 			   CPU_HD_ALIGN_MASK_SFT, 0 << CPU_HD_ALIGN_SFT);
223457513aabSDarren Ye 
223557513aabSDarren Ye 	/* enable AFE */
223657513aabSDarren Ye 	mt8196_afe_enable_main_clock(afe);
223757513aabSDarren Ye 
223857513aabSDarren Ye skip_regmap:
223957513aabSDarren Ye 	return 0;
224057513aabSDarren Ye }
224157513aabSDarren Ye 
224257513aabSDarren Ye static int mt8196_afe_component_probe(struct snd_soc_component *component)
224357513aabSDarren Ye {
224457513aabSDarren Ye 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
2245*e3835313SCássio Gabriel 	int ret;
224657513aabSDarren Ye 
224757513aabSDarren Ye 	/* enable clock for regcache get default value from hw */
2248*e3835313SCássio Gabriel 	ret = pm_runtime_resume_and_get(afe->dev);
2249*e3835313SCássio Gabriel 	if (ret)
2250*e3835313SCássio Gabriel 		return dev_err_probe(afe->dev, ret, "failed to resume device\n");
2251*e3835313SCássio Gabriel 
225257513aabSDarren Ye 	mtk_afe_add_sub_dai_control(component);
225357513aabSDarren Ye 	pm_runtime_put_sync(afe->dev);
2254*e3835313SCássio Gabriel 
225557513aabSDarren Ye 	return 0;
225657513aabSDarren Ye }
225757513aabSDarren Ye 
225857513aabSDarren Ye static int mt8196_afe_pcm_open(struct snd_soc_component *component,
225957513aabSDarren Ye 			       struct snd_pcm_substream *substream)
226057513aabSDarren Ye {
226157513aabSDarren Ye 	/* set the wait_for_avail to 2 sec*/
226257513aabSDarren Ye 	substream->wait_time = msecs_to_jiffies(2 * 1000);
226357513aabSDarren Ye 
226457513aabSDarren Ye 	return 0;
226557513aabSDarren Ye }
226657513aabSDarren Ye 
226757513aabSDarren Ye static void mt8196_afe_pcm_free(struct snd_soc_component *component, struct snd_pcm *pcm)
226857513aabSDarren Ye {
226957513aabSDarren Ye 	snd_pcm_lib_preallocate_free_for_all(pcm);
227057513aabSDarren Ye }
227157513aabSDarren Ye 
227257513aabSDarren Ye static const struct snd_soc_component_driver mt8196_afe_component = {
227357513aabSDarren Ye 	.name = AFE_PCM_NAME,
227457513aabSDarren Ye 	.probe = mt8196_afe_component_probe,
227557513aabSDarren Ye 	.pcm_new = mtk_afe_pcm_new,
227657513aabSDarren Ye 	.pcm_free = mt8196_afe_pcm_free,
227757513aabSDarren Ye 	.open = mt8196_afe_pcm_open,
227857513aabSDarren Ye 	.pointer = mtk_afe_pcm_pointer,
227957513aabSDarren Ye };
228057513aabSDarren Ye 
228157513aabSDarren Ye static int mt8196_dai_memif_register(struct mtk_base_afe *afe)
228257513aabSDarren Ye {
228357513aabSDarren Ye 	struct mtk_base_afe_dai *dai;
228457513aabSDarren Ye 
228557513aabSDarren Ye 	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
228657513aabSDarren Ye 	if (!dai)
228757513aabSDarren Ye 		return -ENOMEM;
228857513aabSDarren Ye 
228957513aabSDarren Ye 	list_add(&dai->list, &afe->sub_dais);
229057513aabSDarren Ye 
229157513aabSDarren Ye 	dai->dai_drivers = mt8196_memif_dai_driver;
229257513aabSDarren Ye 	dai->num_dai_drivers = ARRAY_SIZE(mt8196_memif_dai_driver);
229357513aabSDarren Ye 	dai->dapm_widgets = mt8196_memif_widgets;
229457513aabSDarren Ye 	dai->num_dapm_widgets = ARRAY_SIZE(mt8196_memif_widgets);
229557513aabSDarren Ye 	dai->dapm_routes = mt8196_memif_routes;
229657513aabSDarren Ye 	dai->num_dapm_routes = ARRAY_SIZE(mt8196_memif_routes);
229757513aabSDarren Ye 	return 0;
229857513aabSDarren Ye }
229957513aabSDarren Ye 
230057513aabSDarren Ye typedef int (*dai_register_cb)(struct mtk_base_afe *);
230157513aabSDarren Ye static const dai_register_cb dai_register_cbs[] = {
230257513aabSDarren Ye 	mt8196_dai_adda_register,
230357513aabSDarren Ye 	mt8196_dai_i2s_register,
230457513aabSDarren Ye 	mt8196_dai_tdm_register,
230557513aabSDarren Ye 	mt8196_dai_memif_register,
230657513aabSDarren Ye };
230757513aabSDarren Ye 
230857513aabSDarren Ye static const struct reg_sequence mt8196_cg_patch[] = {
230957513aabSDarren Ye 	{ AUDIO_TOP_CON4, 0x361c },
231057513aabSDarren Ye };
231157513aabSDarren Ye 
2312*e3835313SCássio Gabriel static void mt8196_afe_release_reserved_mem(void *data)
2313*e3835313SCássio Gabriel {
2314*e3835313SCássio Gabriel 	of_reserved_mem_device_release(data);
2315*e3835313SCássio Gabriel }
2316*e3835313SCássio Gabriel 
231757513aabSDarren Ye static int mt8196_afe_pcm_dev_probe(struct platform_device *pdev)
231857513aabSDarren Ye {
231957513aabSDarren Ye 	int ret, i;
232057513aabSDarren Ye 	unsigned int tmp_reg;
232157513aabSDarren Ye 	int irq_id;
232257513aabSDarren Ye 	struct mtk_base_afe *afe;
232357513aabSDarren Ye 	struct mt8196_afe_private *afe_priv;
232457513aabSDarren Ye 	struct device *dev = &pdev->dev;
232557513aabSDarren Ye 
232657513aabSDarren Ye 	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));
232757513aabSDarren Ye 	if (ret)
232857513aabSDarren Ye 		return ret;
232957513aabSDarren Ye 
233057513aabSDarren Ye 	ret = of_reserved_mem_device_init(dev);
2331*e3835313SCássio Gabriel 	if (ret) {
233257513aabSDarren Ye 		dev_err(dev, "failed to assign memory region: %d\n", ret);
2333*e3835313SCássio Gabriel 	} else {
2334*e3835313SCássio Gabriel 		ret = devm_add_action_or_reset(dev, mt8196_afe_release_reserved_mem, dev);
2335*e3835313SCássio Gabriel 		if (ret)
2336*e3835313SCássio Gabriel 			return ret;
2337*e3835313SCássio Gabriel 	}
233857513aabSDarren Ye 
233957513aabSDarren Ye 	afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);
234057513aabSDarren Ye 	if (!afe)
234157513aabSDarren Ye 		return -ENOMEM;
234257513aabSDarren Ye 
234357513aabSDarren Ye 	platform_set_drvdata(pdev, afe);
234457513aabSDarren Ye 
234557513aabSDarren Ye 	afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv),
234657513aabSDarren Ye 					  GFP_KERNEL);
234757513aabSDarren Ye 	if (!afe->platform_priv)
234857513aabSDarren Ye 		return -ENOMEM;
234957513aabSDarren Ye 
235057513aabSDarren Ye 	afe_priv = afe->platform_priv;
235157513aabSDarren Ye 	afe->dev = dev;
235257513aabSDarren Ye 
235357513aabSDarren Ye 	afe->base_addr = devm_platform_ioremap_resource(pdev, 0);
235457513aabSDarren Ye 	if (IS_ERR(afe->base_addr))
235557513aabSDarren Ye 		return dev_err_probe(dev, PTR_ERR(afe->base_addr),
235657513aabSDarren Ye 				     "AFE base_addr not found\n");
235757513aabSDarren Ye 
235857513aabSDarren Ye 	/* init audio related clock */
235957513aabSDarren Ye 	ret = mt8196_init_clock(afe);
236057513aabSDarren Ye 	if (ret)
236157513aabSDarren Ye 		return dev_err_probe(dev, ret, "init clock error.\n");
236257513aabSDarren Ye 
236357513aabSDarren Ye 	/* init memif */
236457513aabSDarren Ye 	/* IPM2.0 no need banding */
236557513aabSDarren Ye 	afe->memif_32bit_supported = 1;
236657513aabSDarren Ye 	afe->memif_size = MT8196_MEMIF_NUM;
236757513aabSDarren Ye 	afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
236857513aabSDarren Ye 				  GFP_KERNEL);
236957513aabSDarren Ye 
237057513aabSDarren Ye 	if (!afe->memif)
237157513aabSDarren Ye 		return -ENOMEM;
237257513aabSDarren Ye 
237357513aabSDarren Ye 	for (i = 0; i < afe->memif_size; i++) {
237457513aabSDarren Ye 		afe->memif[i].data = &memif_data[i];
237557513aabSDarren Ye 		afe->memif[i].irq_usage = memif_irq_usage[i];
237657513aabSDarren Ye 		afe->memif[i].const_irq = 1;
237757513aabSDarren Ye 	}
237857513aabSDarren Ye 
237957513aabSDarren Ye 	mutex_init(&afe->irq_alloc_lock);
238057513aabSDarren Ye 
238157513aabSDarren Ye 	/* init irq */
238257513aabSDarren Ye 	afe->irqs_size = MT8196_IRQ_NUM;
238357513aabSDarren Ye 	afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
238457513aabSDarren Ye 				 GFP_KERNEL);
238557513aabSDarren Ye 
238657513aabSDarren Ye 	if (!afe->irqs)
238757513aabSDarren Ye 		return -ENOMEM;
238857513aabSDarren Ye 
238957513aabSDarren Ye 	for (i = 0; i < afe->irqs_size; i++)
239057513aabSDarren Ye 		afe->irqs[i].irq_data = &irq_data[i];
239157513aabSDarren Ye 
239257513aabSDarren Ye 	/* request irq */
239357513aabSDarren Ye 	irq_id = platform_get_irq(pdev, 0);
239457513aabSDarren Ye 	if (irq_id < 0)
239557513aabSDarren Ye 		return dev_err_probe(dev, irq_id, "no irq found");
239657513aabSDarren Ye 
239757513aabSDarren Ye 	ret = devm_request_irq(dev, irq_id, mt8196_afe_irq_handler,
239857513aabSDarren Ye 			       IRQF_TRIGGER_NONE,
239957513aabSDarren Ye 			       "Afe_ISR_Handle", afe);
240057513aabSDarren Ye 	if (ret)
240157513aabSDarren Ye 		return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n");
240257513aabSDarren Ye 
240357513aabSDarren Ye 	/* init sub_dais */
240457513aabSDarren Ye 	INIT_LIST_HEAD(&afe->sub_dais);
240557513aabSDarren Ye 
240657513aabSDarren Ye 	for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
240757513aabSDarren Ye 		ret = dai_register_cbs[i](afe);
240857513aabSDarren Ye 		if (ret)
240957513aabSDarren Ye 			return dev_err_probe(dev, ret, "dai register i %d fail\n", i);
241057513aabSDarren Ye 	}
241157513aabSDarren Ye 
241257513aabSDarren Ye 	/* init dai_driver and component_driver */
241357513aabSDarren Ye 	ret = mtk_afe_combine_sub_dai(afe);
241457513aabSDarren Ye 	if (ret)
241557513aabSDarren Ye 		return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");
241657513aabSDarren Ye 
241757513aabSDarren Ye 	/* others */
241857513aabSDarren Ye 	afe->mtk_afe_hardware = &mt8196_afe_hardware;
241957513aabSDarren Ye 	afe->memif_fs = mt8196_memif_fs;
242057513aabSDarren Ye 	afe->irq_fs = mt8196_irq_fs;
242157513aabSDarren Ye 	afe->get_dai_fs = mt8196_get_dai_fs;
242257513aabSDarren Ye 	afe->get_memif_pbuf_size = mt8196_get_memif_pbuf_size;
242357513aabSDarren Ye 
242457513aabSDarren Ye 	afe->runtime_resume = mt8196_afe_runtime_resume;
242557513aabSDarren Ye 	afe->runtime_suspend = mt8196_afe_runtime_suspend;
242657513aabSDarren Ye 
242757513aabSDarren Ye 	ret = devm_pm_runtime_enable(dev);
242857513aabSDarren Ye 	if (ret)
242957513aabSDarren Ye 		return ret;
243057513aabSDarren Ye 
243157513aabSDarren Ye /*
243257513aabSDarren Ye  * Audio device is part of genpd. Registering it as a syscore device ensure
243357513aabSDarren Ye  * the proper power-on sequence of the AFE device.
243457513aabSDarren Ye  */
243557513aabSDarren Ye 	dev_pm_syscore_device(dev, true);
243657513aabSDarren Ye 
243757513aabSDarren Ye 	/* enable clock for regcache get default value from hw */
2438*e3835313SCássio Gabriel 	ret = pm_runtime_resume_and_get(dev);
2439*e3835313SCássio Gabriel 	if (ret)
2440*e3835313SCássio Gabriel 		return dev_err_probe(dev, ret, "failed to resume device\n");
244157513aabSDarren Ye 
244257513aabSDarren Ye 	afe->regmap = devm_regmap_init_mmio(dev, afe->base_addr,
244357513aabSDarren Ye 					    &mt8196_afe_regmap_config);
2444*e3835313SCássio Gabriel 	if (IS_ERR(afe->regmap)) {
2445*e3835313SCássio Gabriel 		ret = PTR_ERR(afe->regmap);
2446*e3835313SCássio Gabriel 		goto err_pm_put;
2447*e3835313SCássio Gabriel 	}
244857513aabSDarren Ye 
244957513aabSDarren Ye 	ret = regmap_register_patch(afe->regmap, mt8196_cg_patch,
245057513aabSDarren Ye 				    ARRAY_SIZE(mt8196_cg_patch));
245157513aabSDarren Ye 	if (ret < 0) {
245257513aabSDarren Ye 		dev_err(dev, "Failed to apply cg patch\n");
2453*e3835313SCássio Gabriel 		goto err_pm_put;
245457513aabSDarren Ye 	}
245557513aabSDarren Ye 
245657513aabSDarren Ye 	regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &tmp_reg);
245757513aabSDarren Ye 	regmap_write(afe->regmap, AFE_IRQ_MCU_EN, 0xffffffff);
245857513aabSDarren Ye 	regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &tmp_reg);
245957513aabSDarren Ye 
246057513aabSDarren Ye 	pm_runtime_put_sync(dev);
246157513aabSDarren Ye 
246257513aabSDarren Ye 	regcache_cache_only(afe->regmap, true);
246357513aabSDarren Ye 	regcache_mark_dirty(afe->regmap);
246457513aabSDarren Ye 
246557513aabSDarren Ye 	/* register component */
246657513aabSDarren Ye 	ret = devm_snd_soc_register_component(dev,
246757513aabSDarren Ye 					      &mt8196_afe_component,
246857513aabSDarren Ye 					      afe->dai_drivers,
246957513aabSDarren Ye 					      afe->num_dai_drivers);
247057513aabSDarren Ye 	if (ret) {
247157513aabSDarren Ye 		dev_err(dev, "afe component err\n");
2472*e3835313SCássio Gabriel 		return ret;
247357513aabSDarren Ye 	}
247457513aabSDarren Ye 
247557513aabSDarren Ye 	return 0;
247657513aabSDarren Ye 
2477*e3835313SCássio Gabriel err_pm_put:
247857513aabSDarren Ye 	pm_runtime_put_sync(dev);
247957513aabSDarren Ye 	return ret;
248057513aabSDarren Ye }
248157513aabSDarren Ye 
248257513aabSDarren Ye static void mt8196_afe_pcm_dev_remove(struct platform_device *pdev)
248357513aabSDarren Ye {
248457513aabSDarren Ye 	struct mtk_base_afe *afe = platform_get_drvdata(pdev);
248557513aabSDarren Ye 	struct device *dev = &pdev->dev;
248657513aabSDarren Ye 
248757513aabSDarren Ye 	if (!pm_runtime_status_suspended(dev))
248857513aabSDarren Ye 		mt8196_afe_runtime_suspend(dev);
248957513aabSDarren Ye 
249057513aabSDarren Ye 	mt8196_afe_disable_main_clock(afe);
249157513aabSDarren Ye 	/* disable afe clock */
249257513aabSDarren Ye 	mt8196_afe_disable_reg_rw_clk(afe);
249357513aabSDarren Ye }
249457513aabSDarren Ye 
249557513aabSDarren Ye static const struct of_device_id mt8196_afe_pcm_dt_match[] = {
249657513aabSDarren Ye 	{ .compatible = "mediatek,mt8196-afe", },
249757513aabSDarren Ye 	{ /* sentinel */ },
249857513aabSDarren Ye };
249957513aabSDarren Ye MODULE_DEVICE_TABLE(of, mt8196_afe_pcm_dt_match);
250057513aabSDarren Ye 
250157513aabSDarren Ye static const struct dev_pm_ops mt8196_afe_pm_ops = {
250257513aabSDarren Ye 	SET_RUNTIME_PM_OPS(mt8196_afe_runtime_suspend,
250357513aabSDarren Ye 			   mt8196_afe_runtime_resume, NULL)
250457513aabSDarren Ye };
250557513aabSDarren Ye 
250657513aabSDarren Ye static struct platform_driver mt8196_afe_pcm_driver = {
250757513aabSDarren Ye 	.driver = {
250857513aabSDarren Ye 		.name = "mt8196-afe",
250957513aabSDarren Ye 		.of_match_table = mt8196_afe_pcm_dt_match,
251057513aabSDarren Ye 		.pm = &mt8196_afe_pm_ops,
251157513aabSDarren Ye 	},
251257513aabSDarren Ye 	.probe = mt8196_afe_pcm_dev_probe,
251357513aabSDarren Ye 	.remove = mt8196_afe_pcm_dev_remove,
251457513aabSDarren Ye };
251557513aabSDarren Ye module_platform_driver(mt8196_afe_pcm_driver);
251657513aabSDarren Ye 
251757513aabSDarren Ye MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8196");
251857513aabSDarren Ye MODULE_AUTHOR("Darren Ye <darren.ye@mediatek.com>");
251957513aabSDarren Ye MODULE_LICENSE("GPL");
2520