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