1// SPDX-License-Identifier: GPL-2.0
2//
3// Mediatek ALSA SoC AFE platform driver for 8186
4//
5// Copyright (c) 2022 MediaTek Inc.
6// Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
7
8#include <linux/delay.h>
9#include <linux/dma-mapping.h>
10#include <linux/module.h>
11#include <linux/of.h>
12#include <linux/of_address.h>
13#include <linux/pm_runtime.h>
14#include <linux/reset.h>
15#include <sound/soc.h>
16
17#include "../common/mtk-afe-platform-driver.h"
18#include "../common/mtk-afe-fe-dai.h"
19
20#include "mt8186-afe-common.h"
21#include "mt8186-afe-clk.h"
22#include "mt8186-afe-gpio.h"
23#include "mt8186-interconnection.h"
24
25static const struct snd_pcm_hardware mt8186_afe_hardware = {
26	.info = (SNDRV_PCM_INFO_MMAP |
27		 SNDRV_PCM_INFO_INTERLEAVED |
28		 SNDRV_PCM_INFO_MMAP_VALID),
29	.formats = (SNDRV_PCM_FMTBIT_S16_LE |
30		    SNDRV_PCM_FMTBIT_S24_LE |
31		    SNDRV_PCM_FMTBIT_S32_LE),
32	.period_bytes_min = 96,
33	.period_bytes_max = 4 * 48 * 1024,
34	.periods_min = 2,
35	.periods_max = 256,
36	.buffer_bytes_max = 4 * 48 * 1024,
37	.fifo_size = 0,
38};
39
40static int mt8186_fe_startup(struct snd_pcm_substream *substream,
41			     struct snd_soc_dai *dai)
42{
43	struct snd_soc_pcm_runtime *rtd = substream->private_data;
44	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
45	struct snd_pcm_runtime *runtime = substream->runtime;
46	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
47	struct mtk_base_afe_memif *memif = &afe->memif[id];
48	const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware;
49	int ret;
50
51	memif->substream = substream;
52
53	snd_pcm_hw_constraint_step(substream->runtime, 0,
54				   SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16);
55
56	snd_soc_set_runtime_hwparams(substream, mtk_afe_hardware);
57
58	ret = snd_pcm_hw_constraint_integer(runtime,
59					    SNDRV_PCM_HW_PARAM_PERIODS);
60	if (ret < 0) {
61		dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n");
62		return ret;
63	}
64
65	/* dynamic allocate irq to memif */
66	if (memif->irq_usage < 0) {
67		int irq_id = mtk_dynamic_irq_acquire(afe);
68
69		if (irq_id != afe->irqs_size) {
70			/* link */
71			memif->irq_usage = irq_id;
72		} else {
73			dev_err(afe->dev, "%s() error: no more asys irq\n",
74				__func__);
75			return -EBUSY;
76		}
77	}
78
79	return 0;
80}
81
82static void mt8186_fe_shutdown(struct snd_pcm_substream *substream,
83			       struct snd_soc_dai *dai)
84{
85	struct snd_soc_pcm_runtime *rtd = substream->private_data;
86	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
87	struct mt8186_afe_private *afe_priv = afe->platform_priv;
88	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
89	struct mtk_base_afe_memif *memif = &afe->memif[id];
90	int irq_id = memif->irq_usage;
91
92	memif->substream = NULL;
93	afe_priv->irq_cnt[id] = 0;
94	afe_priv->xrun_assert[id] = 0;
95
96	if (!memif->const_irq) {
97		mtk_dynamic_irq_release(afe, irq_id);
98		memif->irq_usage = -1;
99		memif->substream = NULL;
100	}
101}
102
103static int mt8186_fe_hw_params(struct snd_pcm_substream *substream,
104			       struct snd_pcm_hw_params *params,
105			       struct snd_soc_dai *dai)
106{
107	struct snd_soc_pcm_runtime *rtd = substream->private_data;
108	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
109	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
110	unsigned int channels = params_channels(params);
111	unsigned int rate = params_rate(params);
112	int ret;
113
114	ret = mtk_afe_fe_hw_params(substream, params, dai);
115	if (ret)
116		return ret;
117
118	/* channel merge configuration, enable control is in UL5_IN_MUX */
119	if (id == MT8186_MEMIF_VUL3) {
120		int update_cnt = 8;
121		unsigned int val = 0;
122		unsigned int mask = 0;
123		int fs_mode = mt8186_rate_transform(afe->dev, rate, id);
124
125		/* set rate, channel, update cnt, disable sgen */
126		val = fs_mode << CM1_FS_SELECT_SFT |
127			(channels - 1) << CHANNEL_MERGE0_CHNUM_SFT |
128			update_cnt << CHANNEL_MERGE0_UPDATE_CNT_SFT;
129		mask = CM1_FS_SELECT_MASK_SFT |
130			CHANNEL_MERGE0_CHNUM_MASK_SFT |
131			CHANNEL_MERGE0_UPDATE_CNT_MASK_SFT;
132		regmap_update_bits(afe->regmap, AFE_CM1_CON, mask, val);
133	}
134
135	return 0;
136}
137
138static int mt8186_fe_hw_free(struct snd_pcm_substream *substream,
139			     struct snd_soc_dai *dai)
140{
141	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
142	int ret;
143
144	ret = mtk_afe_fe_hw_free(substream, dai);
145	if (ret) {
146		dev_err(afe->dev, "%s failed\n", __func__);
147		return ret;
148	}
149
150	return 0;
151}
152
153static int mt8186_fe_trigger(struct snd_pcm_substream *substream, int cmd,
154			     struct snd_soc_dai *dai)
155{
156	struct snd_soc_pcm_runtime *rtd = substream->private_data;
157	struct snd_pcm_runtime * const runtime = substream->runtime;
158	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
159	struct mt8186_afe_private *afe_priv = afe->platform_priv;
160	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
161	struct mtk_base_afe_memif *memif = &afe->memif[id];
162	int irq_id = memif->irq_usage;
163	struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
164	const struct mtk_base_irq_data *irq_data = irqs->irq_data;
165	unsigned int rate = runtime->rate;
166	unsigned int counter;
167	int fs;
168	int ret;
169
170	dev_dbg(afe->dev, "%s(), %s cmd %d, irq_id %d\n",
171		__func__, memif->data->name, cmd, irq_id);
172
173	switch (cmd) {
174	case SNDRV_PCM_TRIGGER_START:
175	case SNDRV_PCM_TRIGGER_RESUME:
176		ret = mtk_memif_set_enable(afe, id);
177		if (ret) {
178			dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
179				__func__, id, ret);
180			return ret;
181		}
182
183		/*
184		 * for small latency record
185		 * ul memif need read some data before irq enable
186		 */
187		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
188		    ((runtime->period_size * 1000) / rate <= 10))
189			udelay(300);
190
191		/* set irq counter */
192		if (afe_priv->irq_cnt[id] > 0)
193			counter = afe_priv->irq_cnt[id];
194		else
195			counter = runtime->period_size;
196
197		regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
198				   irq_data->irq_cnt_maskbit
199				   << irq_data->irq_cnt_shift,
200				   counter << irq_data->irq_cnt_shift);
201
202		/* set irq fs */
203		fs = afe->irq_fs(substream, runtime->rate);
204		if (fs < 0)
205			return -EINVAL;
206
207		regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,
208				   irq_data->irq_fs_maskbit
209				   << irq_data->irq_fs_shift,
210				   fs << irq_data->irq_fs_shift);
211
212		/* enable interrupt */
213		if (runtime->stop_threshold != ~(0U))
214			regmap_update_bits(afe->regmap,
215					   irq_data->irq_en_reg,
216					   1 << irq_data->irq_en_shift,
217					   1 << irq_data->irq_en_shift);
218		return 0;
219	case SNDRV_PCM_TRIGGER_STOP:
220	case SNDRV_PCM_TRIGGER_SUSPEND:
221		if (afe_priv->xrun_assert[id] > 0) {
222			if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
223				int avail = snd_pcm_capture_avail(runtime);
224				/* alsa can trigger stop/start when occur xrun */
225				if (avail >= runtime->buffer_size)
226					dev_dbg(afe->dev, "%s(), id %d, xrun assert\n",
227						__func__, id);
228			}
229		}
230
231		ret = mtk_memif_set_disable(afe, id);
232		if (ret)
233			dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
234				__func__, id, ret);
235
236		/* disable interrupt */
237		if (runtime->stop_threshold != ~(0U))
238			regmap_update_bits(afe->regmap,
239					   irq_data->irq_en_reg,
240					   1 << irq_data->irq_en_shift,
241					   0 << irq_data->irq_en_shift);
242
243		/* clear pending IRQ */
244		regmap_write(afe->regmap, irq_data->irq_clr_reg,
245			     1 << irq_data->irq_clr_shift);
246		return ret;
247	default:
248		return -EINVAL;
249	}
250}
251
252static int mt8186_memif_fs(struct snd_pcm_substream *substream,
253			   unsigned int rate)
254{
255	struct snd_soc_pcm_runtime *rtd = substream->private_data;
256	struct snd_soc_component *component =
257		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
258	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
259	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
260
261	return mt8186_rate_transform(afe->dev, rate, id);
262}
263
264static int mt8186_get_dai_fs(struct mtk_base_afe *afe,
265			     int dai_id, unsigned int rate)
266{
267	return mt8186_rate_transform(afe->dev, rate, dai_id);
268}
269
270static int mt8186_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
271{
272	struct snd_soc_pcm_runtime *rtd = substream->private_data;
273	struct snd_soc_component *component =
274		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
275	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
276
277	return mt8186_general_rate_transform(afe->dev, rate);
278}
279
280static int mt8186_get_memif_pbuf_size(struct snd_pcm_substream *substream)
281{
282	struct snd_pcm_runtime *runtime = substream->runtime;
283
284	if ((runtime->period_size * 1000) / runtime->rate > 10)
285		return MT8186_MEMIF_PBUF_SIZE_256_BYTES;
286
287	return MT8186_MEMIF_PBUF_SIZE_32_BYTES;
288}
289
290static int mt8186_fe_prepare(struct snd_pcm_substream *substream,
291			     struct snd_soc_dai *dai)
292{
293	struct snd_soc_pcm_runtime *rtd = substream->private_data;
294	struct snd_pcm_runtime * const runtime = substream->runtime;
295	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
296	int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
297	struct mtk_base_afe_memif *memif = &afe->memif[id];
298	int irq_id = memif->irq_usage;
299	struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
300	const struct mtk_base_irq_data *irq_data = irqs->irq_data;
301	unsigned int counter = runtime->period_size;
302	int fs;
303	int ret;
304
305	ret = mtk_afe_fe_prepare(substream, dai);
306	if (ret)
307		return ret;
308
309	/* set irq counter */
310	regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
311			   irq_data->irq_cnt_maskbit
312			   << irq_data->irq_cnt_shift,
313			   counter << irq_data->irq_cnt_shift);
314
315	/* set irq fs */
316	fs = afe->irq_fs(substream, runtime->rate);
317
318	if (fs < 0)
319		return -EINVAL;
320
321	regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,
322			   irq_data->irq_fs_maskbit
323			   << irq_data->irq_fs_shift,
324			   fs << irq_data->irq_fs_shift);
325
326	return 0;
327}
328
329/* FE DAIs */
330static const struct snd_soc_dai_ops mt8186_memif_dai_ops = {
331	.startup	= mt8186_fe_startup,
332	.shutdown	= mt8186_fe_shutdown,
333	.hw_params	= mt8186_fe_hw_params,
334	.hw_free	= mt8186_fe_hw_free,
335	.prepare	= mt8186_fe_prepare,
336	.trigger	= mt8186_fe_trigger,
337};
338
339#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
340		       SNDRV_PCM_RATE_88200 |\
341		       SNDRV_PCM_RATE_96000 |\
342		       SNDRV_PCM_RATE_176400 |\
343		       SNDRV_PCM_RATE_192000)
344
345#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\
346			   SNDRV_PCM_RATE_16000 |\
347			   SNDRV_PCM_RATE_32000 |\
348			   SNDRV_PCM_RATE_48000)
349
350#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
351			 SNDRV_PCM_FMTBIT_S24_LE |\
352			 SNDRV_PCM_FMTBIT_S32_LE)
353
354static struct snd_soc_dai_driver mt8186_memif_dai_driver[] = {
355	/* FE DAIs: memory intefaces to CPU */
356	{
357		.name = "DL1",
358		.id = MT8186_MEMIF_DL1,
359		.playback = {
360			.stream_name = "DL1",
361			.channels_min = 1,
362			.channels_max = 2,
363			.rates = MTK_PCM_RATES,
364			.formats = MTK_PCM_FORMATS,
365		},
366		.ops = &mt8186_memif_dai_ops,
367	},
368	{
369		.name = "DL12",
370		.id = MT8186_MEMIF_DL12,
371		.playback = {
372			.stream_name = "DL12",
373			.channels_min = 1,
374			.channels_max = 4,
375			.rates = MTK_PCM_RATES,
376			.formats = MTK_PCM_FORMATS,
377		},
378		.ops = &mt8186_memif_dai_ops,
379	},
380	{
381		.name = "DL2",
382		.id = MT8186_MEMIF_DL2,
383		.playback = {
384			.stream_name = "DL2",
385			.channels_min = 1,
386			.channels_max = 2,
387			.rates = MTK_PCM_RATES,
388			.formats = MTK_PCM_FORMATS,
389		},
390		.ops = &mt8186_memif_dai_ops,
391	},
392	{
393		.name = "DL3",
394		.id = MT8186_MEMIF_DL3,
395		.playback = {
396			.stream_name = "DL3",
397			.channels_min = 1,
398			.channels_max = 2,
399			.rates = MTK_PCM_RATES,
400			.formats = MTK_PCM_FORMATS,
401		},
402		.ops = &mt8186_memif_dai_ops,
403	},
404	{
405		.name = "DL4",
406		.id = MT8186_MEMIF_DL4,
407		.playback = {
408			.stream_name = "DL4",
409			.channels_min = 1,
410			.channels_max = 2,
411			.rates = MTK_PCM_RATES,
412			.formats = MTK_PCM_FORMATS,
413		},
414		.ops = &mt8186_memif_dai_ops,
415	},
416	{
417		.name = "DL5",
418		.id = MT8186_MEMIF_DL5,
419		.playback = {
420			.stream_name = "DL5",
421			.channels_min = 1,
422			.channels_max = 2,
423			.rates = MTK_PCM_RATES,
424			.formats = MTK_PCM_FORMATS,
425		},
426		.ops = &mt8186_memif_dai_ops,
427	},
428	{
429		.name = "DL6",
430		.id = MT8186_MEMIF_DL6,
431		.playback = {
432			.stream_name = "DL6",
433			.channels_min = 1,
434			.channels_max = 2,
435			.rates = MTK_PCM_RATES,
436			.formats = MTK_PCM_FORMATS,
437		},
438		.ops = &mt8186_memif_dai_ops,
439	},
440	{
441		.name = "DL7",
442		.id = MT8186_MEMIF_DL7,
443		.playback = {
444			.stream_name = "DL7",
445			.channels_min = 1,
446			.channels_max = 2,
447			.rates = MTK_PCM_RATES,
448			.formats = MTK_PCM_FORMATS,
449		},
450		.ops = &mt8186_memif_dai_ops,
451	},
452	{
453		.name = "DL8",
454		.id = MT8186_MEMIF_DL8,
455		.playback = {
456			.stream_name = "DL8",
457			.channels_min = 1,
458			.channels_max = 2,
459			.rates = MTK_PCM_RATES,
460			.formats = MTK_PCM_FORMATS,
461		},
462		.ops = &mt8186_memif_dai_ops,
463	},
464	{
465		.name = "UL1",
466		.id = MT8186_MEMIF_VUL12,
467		.capture = {
468			.stream_name = "UL1",
469			.channels_min = 1,
470			.channels_max = 4,
471			.rates = MTK_PCM_RATES,
472			.formats = MTK_PCM_FORMATS,
473		},
474		.ops = &mt8186_memif_dai_ops,
475	},
476	{
477		.name = "UL2",
478		.id = MT8186_MEMIF_AWB,
479		.capture = {
480			.stream_name = "UL2",
481			.channels_min = 1,
482			.channels_max = 2,
483			.rates = MTK_PCM_RATES,
484			.formats = MTK_PCM_FORMATS,
485		},
486		.ops = &mt8186_memif_dai_ops,
487	},
488	{
489		.name = "UL3",
490		.id = MT8186_MEMIF_VUL2,
491		.capture = {
492			.stream_name = "UL3",
493			.channels_min = 1,
494			.channels_max = 2,
495			.rates = MTK_PCM_RATES,
496			.formats = MTK_PCM_FORMATS,
497		},
498		.ops = &mt8186_memif_dai_ops,
499	},
500	{
501		.name = "UL4",
502		.id = MT8186_MEMIF_AWB2,
503		.capture = {
504			.stream_name = "UL4",
505			.channels_min = 1,
506			.channels_max = 2,
507			.rates = MTK_PCM_RATES,
508			.formats = MTK_PCM_FORMATS,
509		},
510		.ops = &mt8186_memif_dai_ops,
511	},
512	{
513		.name = "UL5",
514		.id = MT8186_MEMIF_VUL3,
515		.capture = {
516			.stream_name = "UL5",
517			.channels_min = 1,
518			.channels_max = 12,
519			.rates = MTK_PCM_RATES,
520			.formats = MTK_PCM_FORMATS,
521		},
522		.ops = &mt8186_memif_dai_ops,
523	},
524	{
525		.name = "UL6",
526		.id = MT8186_MEMIF_VUL4,
527		.capture = {
528			.stream_name = "UL6",
529			.channels_min = 1,
530			.channels_max = 2,
531			.rates = MTK_PCM_RATES,
532			.formats = MTK_PCM_FORMATS,
533		},
534		.ops = &mt8186_memif_dai_ops,
535	},
536	{
537		.name = "UL7",
538		.id = MT8186_MEMIF_VUL5,
539		.capture = {
540			.stream_name = "UL7",
541			.channels_min = 1,
542			.channels_max = 2,
543			.rates = MTK_PCM_RATES,
544			.formats = MTK_PCM_FORMATS,
545		},
546		.ops = &mt8186_memif_dai_ops,
547	},
548	{
549		.name = "UL8",
550		.id = MT8186_MEMIF_VUL6,
551		.capture = {
552			.stream_name = "UL8",
553			.channels_min = 1,
554			.channels_max = 2,
555			.rates = MTK_PCM_RATES,
556			.formats = MTK_PCM_FORMATS,
557		},
558		.ops = &mt8186_memif_dai_ops,
559	}
560};
561
562/* kcontrol */
563static int mt8186_irq_cnt1_get(struct snd_kcontrol *kcontrol,
564			       struct snd_ctl_elem_value *ucontrol)
565{
566	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
567	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
568	struct mt8186_afe_private *afe_priv = afe->platform_priv;
569
570	ucontrol->value.integer.value[0] =
571		afe_priv->irq_cnt[MT8186_PRIMARY_MEMIF];
572
573	return 0;
574}
575
576static int mt8186_irq_cnt1_set(struct snd_kcontrol *kcontrol,
577			       struct snd_ctl_elem_value *ucontrol)
578{
579	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
580	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
581	struct mt8186_afe_private *afe_priv = afe->platform_priv;
582	int memif_num = MT8186_PRIMARY_MEMIF;
583	struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
584	int irq_id = memif->irq_usage;
585	int irq_cnt = afe_priv->irq_cnt[memif_num];
586
587	dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n",
588		__func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]);
589
590	if (irq_cnt == ucontrol->value.integer.value[0])
591		return 0;
592
593	irq_cnt = ucontrol->value.integer.value[0];
594	afe_priv->irq_cnt[memif_num] = irq_cnt;
595
596	if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) {
597		struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
598		const struct mtk_base_irq_data *irq_data = irqs->irq_data;
599
600		regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
601				   irq_data->irq_cnt_maskbit
602				   << irq_data->irq_cnt_shift,
603				   irq_cnt << irq_data->irq_cnt_shift);
604	} else {
605		dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n",
606			__func__, irq_id);
607	}
608
609	return 1;
610}
611
612static int mt8186_irq_cnt2_get(struct snd_kcontrol *kcontrol,
613			       struct snd_ctl_elem_value *ucontrol)
614{
615	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
616	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
617	struct mt8186_afe_private *afe_priv = afe->platform_priv;
618
619	ucontrol->value.integer.value[0] =
620		afe_priv->irq_cnt[MT8186_RECORD_MEMIF];
621
622	return 0;
623}
624
625static int mt8186_irq_cnt2_set(struct snd_kcontrol *kcontrol,
626			       struct snd_ctl_elem_value *ucontrol)
627{
628	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
629	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
630	struct mt8186_afe_private *afe_priv = afe->platform_priv;
631	int memif_num = MT8186_RECORD_MEMIF;
632	struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
633	int irq_id = memif->irq_usage;
634	int irq_cnt = afe_priv->irq_cnt[memif_num];
635
636	dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n",
637		__func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]);
638
639	if (irq_cnt == ucontrol->value.integer.value[0])
640		return 0;
641
642	irq_cnt = ucontrol->value.integer.value[0];
643	afe_priv->irq_cnt[memif_num] = irq_cnt;
644
645	if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) {
646		struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
647		const struct mtk_base_irq_data *irq_data = irqs->irq_data;
648
649		regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
650				   irq_data->irq_cnt_maskbit
651				   << irq_data->irq_cnt_shift,
652				   irq_cnt << irq_data->irq_cnt_shift);
653	} else {
654		dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n",
655			__func__, irq_id);
656	}
657
658	return 1;
659}
660
661static int mt8186_record_xrun_assert_get(struct snd_kcontrol *kcontrol,
662					 struct snd_ctl_elem_value *ucontrol)
663{
664	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
665	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
666	struct mt8186_afe_private *afe_priv = afe->platform_priv;
667	int xrun_assert = afe_priv->xrun_assert[MT8186_RECORD_MEMIF];
668
669	ucontrol->value.integer.value[0] = xrun_assert;
670
671	return 0;
672}
673
674static int mt8186_record_xrun_assert_set(struct snd_kcontrol *kcontrol,
675					 struct snd_ctl_elem_value *ucontrol)
676{
677	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
678	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
679	struct mt8186_afe_private *afe_priv = afe->platform_priv;
680	int xrun_assert = ucontrol->value.integer.value[0];
681
682	dev_dbg(afe->dev, "%s(), xrun_assert %d\n", __func__, xrun_assert);
683
684	if (xrun_assert == afe_priv->xrun_assert[MT8186_RECORD_MEMIF])
685		return 0;
686
687	afe_priv->xrun_assert[MT8186_RECORD_MEMIF] = xrun_assert;
688
689	return 1;
690}
691
692static const struct snd_kcontrol_new mt8186_pcm_kcontrols[] = {
693	SOC_SINGLE_EXT("Audio IRQ1 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0,
694		       mt8186_irq_cnt1_get, mt8186_irq_cnt1_set),
695	SOC_SINGLE_EXT("Audio IRQ2 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0,
696		       mt8186_irq_cnt2_get, mt8186_irq_cnt2_set),
697	SOC_SINGLE_EXT("record_xrun_assert", SND_SOC_NOPM, 0, 0x1, 0,
698		       mt8186_record_xrun_assert_get,
699		       mt8186_record_xrun_assert_set),
700};
701
702/* dma widget & routes*/
703static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {
704	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN21,
705				    I_ADDA_UL_CH1, 1, 0),
706	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN21,
707				    I_ADDA_UL_CH2, 1, 0),
708	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN21,
709				    I_ADDA_UL_CH3, 1, 0),
710	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN21_1,
711				    I_TDM_IN_CH1, 1, 0),
712};
713
714static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
715	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN22,
716				    I_ADDA_UL_CH1, 1, 0),
717	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN22,
718				    I_ADDA_UL_CH2, 1, 0),
719	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN22,
720				    I_ADDA_UL_CH3, 1, 0),
721	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN22,
722				    I_ADDA_UL_CH4, 1, 0),
723	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN22_1,
724				    I_TDM_IN_CH2, 1, 0),
725};
726
727static const struct snd_kcontrol_new memif_ul1_ch3_mix[] = {
728	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN9,
729				    I_ADDA_UL_CH1, 1, 0),
730	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN9,
731				    I_ADDA_UL_CH2, 1, 0),
732	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN9,
733				    I_ADDA_UL_CH3, 1, 0),
734	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN9_1,
735				    I_TDM_IN_CH3, 1, 0),
736};
737
738static const struct snd_kcontrol_new memif_ul1_ch4_mix[] = {
739	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN10,
740				    I_ADDA_UL_CH1, 1, 0),
741	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN10,
742				    I_ADDA_UL_CH2, 1, 0),
743	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN10,
744				    I_ADDA_UL_CH3, 1, 0),
745	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN10,
746				    I_ADDA_UL_CH4, 1, 0),
747	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN10_1,
748				    I_TDM_IN_CH4, 1, 0),
749};
750
751static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
752	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN5,
753				    I_I2S0_CH1, 1, 0),
754	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN5,
755				    I_DL1_CH1, 1, 0),
756	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN5,
757				    I_DL12_CH1, 1, 0),
758	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN5,
759				    I_DL2_CH1, 1, 0),
760	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN5,
761				    I_DL3_CH1, 1, 0),
762	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN5_1,
763				    I_DL4_CH1, 1, 0),
764	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN5_1,
765				    I_DL5_CH1, 1, 0),
766	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN5_1,
767				    I_DL6_CH1, 1, 0),
768	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN5,
769				    I_PCM_1_CAP_CH1, 1, 0),
770	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN5,
771				    I_I2S2_CH1, 1, 0),
772	SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN5_1,
773				    I_CONNSYS_I2S_CH1, 1, 0),
774	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1 Switch", AFE_CONN5_1,
775				    I_SRC_1_OUT_CH1, 1, 0),
776};
777
778static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {
779	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN6,
780				    I_I2S0_CH2, 1, 0),
781	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN6,
782				    I_DL1_CH2, 1, 0),
783	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN6,
784				    I_DL12_CH2, 1, 0),
785	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN6,
786				    I_DL2_CH2, 1, 0),
787	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN6,
788				    I_DL3_CH2, 1, 0),
789	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN6_1,
790				    I_DL4_CH2, 1, 0),
791	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN6_1,
792				    I_DL5_CH2, 1, 0),
793	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN6_1,
794				    I_DL6_CH2, 1, 0),
795	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN6,
796				    I_PCM_1_CAP_CH2, 1, 0),
797	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN6,
798				    I_I2S2_CH2, 1, 0),
799	SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN6_1,
800				    I_CONNSYS_I2S_CH2, 1, 0),
801	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2 Switch", AFE_CONN6_1,
802				    I_SRC_1_OUT_CH2, 1, 0),
803};
804
805static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {
806	SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN32_1,
807				    I_CONNSYS_I2S_CH1, 1, 0),
808	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN32,
809				    I_DL1_CH1, 1, 0),
810	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN32,
811				    I_DL2_CH1, 1, 0),
812};
813
814static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
815	SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN33_1,
816				    I_CONNSYS_I2S_CH2, 1, 0),
817};
818
819static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {
820	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN38,
821				    I_ADDA_UL_CH1, 1, 0),
822	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN38,
823				    I_I2S0_CH1, 1, 0),
824};
825
826static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = {
827	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN39,
828				    I_ADDA_UL_CH2, 1, 0),
829	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN39,
830				    I_I2S0_CH2, 1, 0),
831};
832
833static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = {
834	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN44,
835				    I_ADDA_UL_CH1, 1, 0),
836};
837
838static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = {
839	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN45,
840				    I_ADDA_UL_CH2, 1, 0),
841};
842
843static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = {
844	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN46,
845				    I_ADDA_UL_CH1, 1, 0),
846	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN46,
847				    I_DL1_CH1, 1, 0),
848	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN46,
849				    I_DL12_CH1, 1, 0),
850	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN46_1,
851				    I_DL6_CH1, 1, 0),
852	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN46,
853				    I_DL2_CH1, 1, 0),
854	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN46,
855				    I_DL3_CH1, 1, 0),
856	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN46_1,
857				    I_DL4_CH1, 1, 0),
858	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN46,
859				    I_PCM_1_CAP_CH1, 1, 0),
860	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1 Switch", AFE_CONN46,
861				    I_GAIN1_OUT_CH1, 1, 0),
862};
863
864static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = {
865	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN47,
866				    I_ADDA_UL_CH2, 1, 0),
867	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN47,
868				    I_DL1_CH2, 1, 0),
869	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN47,
870				    I_DL12_CH2, 1, 0),
871	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN47_1,
872				    I_DL6_CH2, 1, 0),
873	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN47,
874				    I_DL2_CH2, 1, 0),
875	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN47,
876				    I_DL3_CH2, 1, 0),
877	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN47_1,
878				    I_DL4_CH2, 1, 0),
879	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN47,
880				    I_PCM_1_CAP_CH2, 1, 0),
881	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2 Switch", AFE_CONN47,
882				    I_GAIN1_OUT_CH2, 1, 0),
883};
884
885static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = {
886	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN48,
887				    I_ADDA_UL_CH1, 1, 0),
888	SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH1 Switch", AFE_CONN48,
889				    I_GAIN2_OUT_CH1, 1, 0),
890	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1 Switch", AFE_CONN48_1,
891				    I_SRC_2_OUT_CH1, 1, 0),
892};
893
894static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = {
895	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN49,
896				    I_ADDA_UL_CH2, 1, 0),
897	SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH2 Switch", AFE_CONN49,
898				    I_GAIN2_OUT_CH2, 1, 0),
899	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2 Switch", AFE_CONN49_1,
900				    I_SRC_2_OUT_CH2, 1, 0),
901};
902
903static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = {
904	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN50,
905				    I_ADDA_UL_CH1, 1, 0),
906};
907
908static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = {
909	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN51,
910				    I_ADDA_UL_CH2, 1, 0),
911};
912
913static const struct snd_kcontrol_new hw_cm1_ch1_mix[] = {
914	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN58_1,
915				    I_TDM_IN_CH1, 1, 0),
916	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN58,
917				    I_I2S0_CH1, 1, 0),
918	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN58,
919				    I_I2S2_CH1, 1, 0),
920	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN58,
921				    I_ADDA_UL_CH1, 1, 0),
922	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN58,
923				    I_DL1_CH1, 1, 0),
924	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN58,
925				    I_DL12_CH1, 1, 0),
926	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN58,
927				    I_DL12_CH3, 1, 0),
928	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN58,
929				    I_DL2_CH1, 1, 0),
930	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN58,
931				    I_DL3_CH1, 1, 0),
932	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN58_1,
933				    I_DL4_CH1, 1, 0),
934	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN58_1,
935				    I_DL5_CH1, 1, 0),
936	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN58_1,
937				    I_SRC_1_OUT_CH1, 1, 0),
938	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN58_1,
939				    I_SRC_2_OUT_CH1, 1, 0),
940};
941
942static const struct snd_kcontrol_new hw_cm1_ch2_mix[] = {
943	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN59_1,
944				    I_TDM_IN_CH2, 1, 0),
945	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN59,
946				    I_I2S0_CH2, 1, 0),
947	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN59,
948				    I_I2S2_CH2, 1, 0),
949	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN59,
950				    I_ADDA_UL_CH2, 1, 0),
951	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN59,
952				    I_DL1_CH2, 1, 0),
953	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN59,
954				    I_DL12_CH2, 1, 0),
955	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN59,
956				    I_DL12_CH4, 1, 0),
957	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN59,
958				    I_DL2_CH2, 1, 0),
959	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN59,
960				    I_DL3_CH2, 1, 0),
961	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN59_1,
962				    I_DL4_CH2, 1, 0),
963	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN59_1,
964				    I_DL5_CH2, 1, 0),
965	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN59_1,
966				    I_SRC_1_OUT_CH2, 1, 0),
967	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN59_1,
968				    I_SRC_2_OUT_CH2, 1, 0),
969};
970
971static const struct snd_kcontrol_new hw_cm1_ch3_mix[] = {
972	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN60_1,
973				    I_TDM_IN_CH3, 1, 0),
974	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN60,
975				    I_I2S0_CH1, 1, 0),
976	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN60,
977				    I_I2S2_CH1, 1, 0),
978	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN60,
979				    I_ADDA_UL_CH1, 1, 0),
980	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN60,
981				    I_DL1_CH1, 1, 0),
982	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN60,
983				    I_DL12_CH1, 1, 0),
984	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN60,
985				    I_DL12_CH3, 1, 0),
986	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN60,
987				    I_DL2_CH1, 1, 0),
988	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN60,
989				    I_DL3_CH1, 1, 0),
990	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN60_1,
991				    I_DL4_CH1, 1, 0),
992	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN60_1,
993				    I_DL5_CH1, 1, 0),
994	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN60_1,
995				    I_SRC_1_OUT_CH1, 1, 0),
996	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN60_1,
997				    I_SRC_2_OUT_CH1, 1, 0),
998};
999
1000static const struct snd_kcontrol_new hw_cm1_ch4_mix[] = {
1001	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN61_1,
1002				    I_TDM_IN_CH4, 1, 0),
1003	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN61,
1004				    I_I2S0_CH2, 1, 0),
1005	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN61,
1006				    I_I2S2_CH2, 1, 0),
1007	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN61,
1008				    I_ADDA_UL_CH2, 1, 0),
1009	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN61,
1010				    I_DL1_CH2, 1, 0),
1011	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN61,
1012				    I_DL12_CH2, 1, 0),
1013	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN61,
1014				    I_DL12_CH4, 1, 0),
1015	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN61,
1016				    I_DL2_CH2, 1, 0),
1017	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN61,
1018				    I_DL3_CH2, 1, 0),
1019	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN61_1,
1020				    I_DL4_CH2, 1, 0),
1021	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN61_1,
1022				    I_DL5_CH2, 1, 0),
1023	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN61_1,
1024				    I_SRC_1_OUT_CH2, 1, 0),
1025	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN61_1,
1026				    I_SRC_2_OUT_CH2, 1, 0),
1027};
1028
1029static const struct snd_kcontrol_new hw_cm1_ch5_mix[] = {
1030	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH5 Switch", AFE_CONN62_1,
1031				    I_TDM_IN_CH5, 1, 0),
1032	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN62,
1033				    I_I2S0_CH1, 1, 0),
1034	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN62,
1035				    I_I2S2_CH1, 1, 0),
1036	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN62,
1037				    I_ADDA_UL_CH1, 1, 0),
1038	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN62,
1039				    I_DL1_CH1, 1, 0),
1040	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN62,
1041				    I_DL12_CH1, 1, 0),
1042	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN62,
1043				    I_DL12_CH3, 1, 0),
1044	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN62,
1045				    I_DL2_CH1, 1, 0),
1046	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN62,
1047				    I_DL3_CH1, 1, 0),
1048	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN62_1,
1049				    I_DL4_CH1, 1, 0),
1050	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN62_1,
1051				    I_DL5_CH1, 1, 0),
1052	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN62_1,
1053				    I_SRC_1_OUT_CH1, 1, 0),
1054	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN62_1,
1055				    I_SRC_2_OUT_CH1, 1, 0),
1056};
1057
1058static const struct snd_kcontrol_new hw_cm1_ch6_mix[] = {
1059	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH6 Switch", AFE_CONN63_1,
1060				    I_TDM_IN_CH6, 1, 0),
1061	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN63,
1062				    I_I2S0_CH2, 1, 0),
1063	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN63,
1064				    I_I2S2_CH2, 1, 0),
1065	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN63,
1066				    I_ADDA_UL_CH2, 1, 0),
1067	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN63,
1068				    I_DL1_CH2, 1, 0),
1069	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN63,
1070				    I_DL12_CH2, 1, 0),
1071	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN63,
1072				    I_DL12_CH4, 1, 0),
1073	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN63,
1074				    I_DL2_CH2, 1, 0),
1075	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN63,
1076				    I_DL3_CH2, 1, 0),
1077	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN63_1,
1078				    I_DL4_CH2, 1, 0),
1079	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN63_1,
1080				    I_DL5_CH2, 1, 0),
1081	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN63_1,
1082				    I_SRC_1_OUT_CH2, 1, 0),
1083	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN63_1,
1084				    I_SRC_2_OUT_CH2, 1, 0),
1085};
1086
1087static const struct snd_kcontrol_new hw_cm1_ch7_mix[] = {
1088	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH7 Switch", AFE_CONN64_1,
1089				    I_TDM_IN_CH7, 1, 0),
1090	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN64,
1091				    I_I2S0_CH1, 1, 0),
1092	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN64,
1093				    I_I2S2_CH1, 1, 0),
1094	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN64,
1095				    I_ADDA_UL_CH1, 1, 0),
1096	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN64,
1097				    I_DL1_CH1, 1, 0),
1098	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1v", AFE_CONN64,
1099				    I_DL12_CH1, 1, 0),
1100	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN64,
1101				    I_DL12_CH3, 1, 0),
1102	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN64,
1103				    I_DL2_CH1, 1, 0),
1104	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN64,
1105				    I_DL3_CH1, 1, 0),
1106	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN64_1,
1107				    I_DL4_CH1, 1, 0),
1108	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN64_1,
1109				    I_DL5_CH1, 1, 0),
1110	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN64_1,
1111				    I_SRC_1_OUT_CH1, 1, 0),
1112	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN64_1,
1113				    I_SRC_2_OUT_CH1, 1, 0),
1114};
1115
1116static const struct snd_kcontrol_new hw_cm1_ch8_mix[] = {
1117	SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH8 Switch", AFE_CONN65_1,
1118				    I_TDM_IN_CH8, 1, 0),
1119	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN65,
1120				    I_I2S0_CH2, 1, 0),
1121	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN65,
1122				    I_I2S2_CH2, 1, 0),
1123	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN65,
1124				    I_ADDA_UL_CH2, 1, 0),
1125	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN65,
1126				    I_DL1_CH2, 1, 0),
1127	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN65,
1128				    I_DL12_CH2, 1, 0),
1129	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN65,
1130				    I_DL12_CH4, 1, 0),
1131	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN65,
1132				    I_DL2_CH2, 1, 0),
1133	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN65,
1134				    I_DL3_CH2, 1, 0),
1135	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN65_1,
1136				    I_DL4_CH2, 1, 0),
1137	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN65_1,
1138				    I_DL5_CH2, 1, 0),
1139	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN65_1,
1140				    I_SRC_1_OUT_CH2, 1, 0),
1141	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN65_1,
1142				    I_SRC_2_OUT_CH2, 1, 0),
1143};
1144
1145static const struct snd_kcontrol_new hw_cm1_ch9_mix[] = {
1146	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN66,
1147				    I_I2S0_CH1, 1, 0),
1148	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN66,
1149				    I_I2S2_CH1, 1, 0),
1150	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN66,
1151				    I_ADDA_UL_CH1, 1, 0),
1152	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN66,
1153				    I_DL1_CH1, 1, 0),
1154	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN66,
1155				    I_DL12_CH1, 1, 0),
1156	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN66,
1157				    I_DL12_CH3, 1, 0),
1158	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN66,
1159				    I_DL2_CH1, 1, 0),
1160	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN66,
1161				    I_DL3_CH1, 1, 0),
1162	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN66_1,
1163				    I_DL4_CH1, 1, 0),
1164	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN66_1,
1165				    I_DL5_CH1, 1, 0),
1166	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN66_1,
1167				    I_SRC_1_OUT_CH1, 1, 0),
1168	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN66_1,
1169				    I_SRC_2_OUT_CH1, 1, 0),
1170};
1171
1172static const struct snd_kcontrol_new hw_cm1_ch10_mix[] = {
1173	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN67,
1174				    I_I2S0_CH2, 1, 0),
1175	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN67,
1176				    I_I2S2_CH2, 1, 0),
1177	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN67,
1178				    I_ADDA_UL_CH2, 1, 0),
1179	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN67,
1180				    I_DL1_CH2, 1, 0),
1181	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN67,
1182				    I_DL12_CH2, 1, 0),
1183	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN67,
1184				    I_DL12_CH4, 1, 0),
1185	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN67,
1186				    I_DL2_CH2, 1, 0),
1187	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN67,
1188				    I_DL3_CH2, 1, 0),
1189	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN67_1,
1190				    I_DL4_CH2, 1, 0),
1191	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN67_1,
1192				    I_DL5_CH2, 1, 0),
1193	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN67_1,
1194				    I_SRC_1_OUT_CH2, 1, 0),
1195	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN67_1,
1196				    I_SRC_2_OUT_CH2, 1, 0),
1197};
1198
1199static const struct snd_kcontrol_new hw_cm1_ch11_mix[] = {
1200	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN68,
1201				    I_I2S0_CH1, 1, 0),
1202	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN68,
1203				    I_I2S2_CH1, 1, 0),
1204	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN68,
1205				    I_ADDA_UL_CH1, 1, 0),
1206	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN68,
1207				    I_DL1_CH1, 1, 0),
1208	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN68,
1209				    I_DL12_CH1, 1, 0),
1210	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN68,
1211				    I_DL12_CH3, 1, 0),
1212	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN68,
1213				    I_DL2_CH1, 1, 0),
1214	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN68,
1215				    I_DL3_CH1, 1, 0),
1216	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN68_1,
1217				    I_DL4_CH1, 1, 0),
1218	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN68_1,
1219				    I_DL5_CH1, 1, 0),
1220	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN68_1,
1221				    I_SRC_1_OUT_CH1, 1, 0),
1222	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN68_1,
1223				    I_SRC_2_OUT_CH1, 1, 0),
1224};
1225
1226static const struct snd_kcontrol_new hw_cm1_ch12_mix[] = {
1227	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN69,
1228				    I_I2S0_CH2, 1, 0),
1229	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN69,
1230				    I_I2S2_CH2, 1, 0),
1231	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN69,
1232				    I_ADDA_UL_CH2, 1, 0),
1233	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN69,
1234				    I_DL1_CH2, 1, 0),
1235	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN69,
1236				    I_DL12_CH2, 1, 0),
1237	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN69,
1238				    I_DL12_CH4, 1, 0),
1239	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN69,
1240				    I_DL2_CH2, 1, 0),
1241	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN69,
1242				    I_DL3_CH2, 1, 0),
1243	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN69_1,
1244				    I_DL4_CH2, 1, 0),
1245	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN69_1,
1246				    I_DL5_CH2, 1, 0),
1247	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN69_1,
1248				    I_SRC_1_OUT_CH2, 1, 0),
1249	SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN69_1,
1250				    I_SRC_2_OUT_CH2, 1, 0),
1251};
1252
1253/* ADDA UL MUX */
1254enum {
1255	UL5_IN_MUX_CM1 = 0,
1256	UL5_IN_MUX_NORMAL,
1257	UL5_IN_MUX_MASK = 0x1,
1258};
1259
1260static const char * const ul5_in_mux_map[] = {
1261	"UL5_IN_FROM_CM1", "UL5_IN_FROM_Normal"
1262};
1263
1264static int ul5_in_map_value[] = {
1265	UL5_IN_MUX_CM1,
1266	UL5_IN_MUX_NORMAL,
1267};
1268
1269static SOC_VALUE_ENUM_SINGLE_DECL(ul5_in_mux_map_enum,
1270				  AFE_CM1_CON,
1271				  VUL3_BYPASS_CM_SFT,
1272				  VUL3_BYPASS_CM_MASK,
1273				  ul5_in_mux_map,
1274				  ul5_in_map_value);
1275
1276static const struct snd_kcontrol_new ul5_in_mux_control =
1277	SOC_DAPM_ENUM("UL5_IN_MUX Select", ul5_in_mux_map_enum);
1278
1279static const struct snd_soc_dapm_widget mt8186_memif_widgets[] = {
1280	/* inter-connections */
1281	SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,
1282			   memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),
1283	SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,
1284			   memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),
1285	SND_SOC_DAPM_MIXER("UL1_CH3", SND_SOC_NOPM, 0, 0,
1286			   memif_ul1_ch3_mix, ARRAY_SIZE(memif_ul1_ch3_mix)),
1287	SND_SOC_DAPM_MIXER("UL1_CH4", SND_SOC_NOPM, 0, 0,
1288			   memif_ul1_ch4_mix, ARRAY_SIZE(memif_ul1_ch4_mix)),
1289
1290	SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,
1291			   memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),
1292	SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,
1293			   memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),
1294
1295	SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,
1296			   memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),
1297	SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,
1298			   memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),
1299
1300	SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0,
1301			   memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)),
1302	SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0,
1303			   memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)),
1304
1305	SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0,
1306			   memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)),
1307	SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0,
1308			   memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)),
1309
1310	SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0,
1311			   memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)),
1312	SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0,
1313			   memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)),
1314
1315	SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0,
1316			   memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)),
1317	SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0,
1318			   memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)),
1319
1320	SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0,
1321			   memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)),
1322	SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0,
1323			   memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)),
1324
1325	SND_SOC_DAPM_MIXER("UL5_2CH", SND_SOC_NOPM, 0, 0, NULL, 0),
1326
1327	SND_SOC_DAPM_MIXER("HW_CM1", SND_SOC_NOPM, 0, 0, NULL, 0),
1328
1329	/* CM1 en*/
1330	SND_SOC_DAPM_SUPPLY_S("CM1_EN", 0, AFE_CM1_CON,
1331			      CHANNEL_MERGE0_EN_SFT, 0, NULL,
1332			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1333
1334	SND_SOC_DAPM_MIXER("HW_CM1_CH1", SND_SOC_NOPM, 0, 0,
1335			   hw_cm1_ch1_mix, ARRAY_SIZE(hw_cm1_ch1_mix)),
1336	SND_SOC_DAPM_MIXER("HW_CM1_CH2", SND_SOC_NOPM, 0, 0,
1337			   hw_cm1_ch2_mix, ARRAY_SIZE(hw_cm1_ch2_mix)),
1338	SND_SOC_DAPM_MIXER("HW_CM1_CH3", SND_SOC_NOPM, 0, 0,
1339			   hw_cm1_ch3_mix, ARRAY_SIZE(hw_cm1_ch3_mix)),
1340	SND_SOC_DAPM_MIXER("HW_CM1_CH4", SND_SOC_NOPM, 0, 0,
1341			   hw_cm1_ch4_mix, ARRAY_SIZE(hw_cm1_ch4_mix)),
1342	SND_SOC_DAPM_MIXER("HW_CM1_CH5", SND_SOC_NOPM, 0, 0,
1343			   hw_cm1_ch5_mix, ARRAY_SIZE(hw_cm1_ch5_mix)),
1344	SND_SOC_DAPM_MIXER("HW_CM1_CH6", SND_SOC_NOPM, 0, 0,
1345			   hw_cm1_ch6_mix, ARRAY_SIZE(hw_cm1_ch6_mix)),
1346	SND_SOC_DAPM_MIXER("HW_CM1_CH7", SND_SOC_NOPM, 0, 0,
1347			   hw_cm1_ch7_mix, ARRAY_SIZE(hw_cm1_ch7_mix)),
1348	SND_SOC_DAPM_MIXER("HW_CM1_CH8", SND_SOC_NOPM, 0, 0,
1349			   hw_cm1_ch8_mix, ARRAY_SIZE(hw_cm1_ch8_mix)),
1350	SND_SOC_DAPM_MIXER("HW_CM1_CH9", SND_SOC_NOPM, 0, 0,
1351			   hw_cm1_ch9_mix, ARRAY_SIZE(hw_cm1_ch9_mix)),
1352	SND_SOC_DAPM_MIXER("HW_CM1_CH10", SND_SOC_NOPM, 0, 0,
1353			   hw_cm1_ch10_mix, ARRAY_SIZE(hw_cm1_ch10_mix)),
1354	SND_SOC_DAPM_MIXER("HW_CM1_CH11", SND_SOC_NOPM, 0, 0,
1355			   hw_cm1_ch11_mix, ARRAY_SIZE(hw_cm1_ch11_mix)),
1356	SND_SOC_DAPM_MIXER("HW_CM1_CH12", SND_SOC_NOPM, 0, 0,
1357			   hw_cm1_ch12_mix, ARRAY_SIZE(hw_cm1_ch12_mix)),
1358
1359	SND_SOC_DAPM_MUX("UL5_IN_MUX", SND_SOC_NOPM, 0, 0,
1360			 &ul5_in_mux_control),
1361
1362	SND_SOC_DAPM_MIXER("DSP_DL1_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),
1363	SND_SOC_DAPM_MIXER("DSP_DL2_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),
1364
1365	SND_SOC_DAPM_INPUT("UL1_VIRTUAL_INPUT"),
1366	SND_SOC_DAPM_INPUT("UL2_VIRTUAL_INPUT"),
1367	SND_SOC_DAPM_INPUT("UL3_VIRTUAL_INPUT"),
1368	SND_SOC_DAPM_INPUT("UL4_VIRTUAL_INPUT"),
1369	SND_SOC_DAPM_INPUT("UL5_VIRTUAL_INPUT"),
1370	SND_SOC_DAPM_INPUT("UL6_VIRTUAL_INPUT"),
1371};
1372
1373static const struct snd_soc_dapm_route mt8186_memif_routes[] = {
1374	{"UL1", NULL, "UL1_CH1"},
1375	{"UL1", NULL, "UL1_CH2"},
1376	{"UL1", NULL, "UL1_CH3"},
1377	{"UL1", NULL, "UL1_CH4"},
1378	{"UL1_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1379	{"UL1_CH1", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1380	{"UL1_CH2", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1381	{"UL1_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1382	{"UL1_CH3", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1383	{"UL1_CH3", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1384	{"UL1_CH4", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1385	{"UL1_CH4", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1386	{"UL1_CH1", "TDM_IN_CH1 Switch", "TDM IN"},
1387	{"UL1_CH2", "TDM_IN_CH2 Switch", "TDM IN"},
1388	{"UL1_CH3", "TDM_IN_CH3 Switch", "TDM IN"},
1389	{"UL1_CH4", "TDM_IN_CH4 Switch", "TDM IN"},
1390
1391	{"UL2", NULL, "UL2_CH1"},
1392	{"UL2", NULL, "UL2_CH2"},
1393
1394	/* cannot connect FE to FE directly */
1395	{"UL2_CH1", "DL1_CH1 Switch", "Hostless_UL2 UL"},
1396	{"UL2_CH2", "DL1_CH2 Switch", "Hostless_UL2 UL"},
1397	{"UL2_CH1", "DL12_CH1 Switch", "Hostless_UL2 UL"},
1398	{"UL2_CH2", "DL12_CH2 Switch", "Hostless_UL2 UL"},
1399	{"UL2_CH1", "DL6_CH1 Switch", "Hostless_UL2 UL"},
1400	{"UL2_CH2", "DL6_CH2 Switch", "Hostless_UL2 UL"},
1401	{"UL2_CH1", "DL2_CH1 Switch", "Hostless_UL2 UL"},
1402	{"UL2_CH2", "DL2_CH2 Switch", "Hostless_UL2 UL"},
1403	{"UL2_CH1", "DL3_CH1 Switch", "Hostless_UL2 UL"},
1404	{"UL2_CH2", "DL3_CH2 Switch", "Hostless_UL2 UL"},
1405	{"UL2_CH1", "DL4_CH1 Switch", "Hostless_UL2 UL"},
1406	{"UL2_CH2", "DL4_CH2 Switch", "Hostless_UL2 UL"},
1407	{"UL2_CH1", "DL5_CH1 Switch", "Hostless_UL2 UL"},
1408	{"UL2_CH2", "DL5_CH2 Switch", "Hostless_UL2 UL"},
1409
1410	{"Hostless_UL2 UL", NULL, "UL2_VIRTUAL_INPUT"},
1411
1412	{"UL2_CH1", "I2S0_CH1 Switch", "I2S0"},
1413	{"UL2_CH2", "I2S0_CH2 Switch", "I2S0"},
1414	{"UL2_CH1", "I2S2_CH1 Switch", "I2S2"},
1415	{"UL2_CH2", "I2S2_CH2 Switch", "I2S2"},
1416
1417	{"UL2_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"},
1418	{"UL2_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"},
1419
1420	{"UL2_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"},
1421	{"UL2_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"},
1422
1423	{"UL2_CH1", "SRC_1_OUT_CH1 Switch", "HW_SRC_1_Out"},
1424	{"UL2_CH2", "SRC_1_OUT_CH2 Switch", "HW_SRC_1_Out"},
1425
1426	{"UL3", NULL, "UL3_CH1"},
1427	{"UL3", NULL, "UL3_CH2"},
1428	{"UL3_CH1", "CONNSYS_I2S_CH1 Switch", "Connsys I2S"},
1429	{"UL3_CH2", "CONNSYS_I2S_CH2 Switch", "Connsys I2S"},
1430
1431	{"UL4", NULL, "UL4_CH1"},
1432	{"UL4", NULL, "UL4_CH2"},
1433	{"UL4_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1434	{"UL4_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1435	{"UL4_CH1", "I2S0_CH1 Switch", "I2S0"},
1436	{"UL4_CH2", "I2S0_CH2 Switch", "I2S0"},
1437
1438	{"UL5", NULL, "UL5_IN_MUX"},
1439	{"UL5_IN_MUX", "UL5_IN_FROM_Normal", "UL5_2CH"},
1440	{"UL5_IN_MUX", "UL5_IN_FROM_CM1", "HW_CM1"},
1441	{"UL5_2CH", NULL, "UL5_CH1"},
1442	{"UL5_2CH", NULL, "UL5_CH2"},
1443	{"UL5_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1444	{"UL5_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1445	{"HW_CM1", NULL, "CM1_EN"},
1446	{"HW_CM1", NULL, "HW_CM1_CH1"},
1447	{"HW_CM1", NULL, "HW_CM1_CH2"},
1448	{"HW_CM1", NULL, "HW_CM1_CH3"},
1449	{"HW_CM1", NULL, "HW_CM1_CH4"},
1450	{"HW_CM1", NULL, "HW_CM1_CH5"},
1451	{"HW_CM1", NULL, "HW_CM1_CH6"},
1452	{"HW_CM1", NULL, "HW_CM1_CH7"},
1453	{"HW_CM1", NULL, "HW_CM1_CH8"},
1454	{"HW_CM1", NULL, "HW_CM1_CH9"},
1455	{"HW_CM1", NULL, "HW_CM1_CH10"},
1456	{"HW_CM1", NULL, "HW_CM1_CH11"},
1457	{"HW_CM1", NULL, "HW_CM1_CH12"},
1458	{"HW_CM1_CH1", "TDM_IN_CH1 Switch", "TDM IN"},
1459	{"HW_CM1_CH2", "TDM_IN_CH2 Switch", "TDM IN"},
1460	{"HW_CM1_CH3", "TDM_IN_CH3 Switch", "TDM IN"},
1461	{"HW_CM1_CH4", "TDM_IN_CH4 Switch", "TDM IN"},
1462	{"HW_CM1_CH5", "TDM_IN_CH5 Switch", "TDM IN"},
1463	{"HW_CM1_CH6", "TDM_IN_CH6 Switch", "TDM IN"},
1464	{"HW_CM1_CH7", "TDM_IN_CH7 Switch", "TDM IN"},
1465	{"HW_CM1_CH8", "TDM_IN_CH8 Switch", "TDM IN"},
1466	{"HW_CM1_CH9", "DL1_CH1 Switch", "Hostless_UL5 UL"},
1467	{"HW_CM1_CH10", "DL1_CH2 Switch", "Hostless_UL5 UL"},
1468
1469	{"HW_CM1_CH3", "DL1_CH1 Switch", "Hostless_UL5 UL"},
1470	{"HW_CM1_CH4", "DL1_CH2 Switch", "Hostless_UL5 UL"},
1471
1472	{"HW_CM1_CH3", "DL3_CH1 Switch", "Hostless_UL5 UL"},
1473	{"HW_CM1_CH4", "DL3_CH2 Switch", "Hostless_UL5 UL"},
1474
1475	{"HW_CM1_CH5", "HW_SRC1_OUT_CH1 Switch", "HW_SRC_1_Out"},
1476	{"HW_CM1_CH6", "HW_SRC1_OUT_CH2 Switch", "HW_SRC_1_Out"},
1477
1478	{"HW_CM1_CH9", "DL12_CH1 Switch", "Hostless_UL5 UL"},
1479	{"HW_CM1_CH10", "DL12_CH2 Switch", "Hostless_UL5 UL"},
1480	{"HW_CM1_CH11", "DL12_CH3 Switch", "Hostless_UL5 UL"},
1481	{"HW_CM1_CH12", "DL12_CH4 Switch", "Hostless_UL5 UL"},
1482
1483	{"Hostless_UL5 UL", NULL, "UL5_VIRTUAL_INPUT"},
1484
1485	{"UL6", NULL, "UL6_CH1"},
1486	{"UL6", NULL, "UL6_CH2"},
1487
1488	{"UL6_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1489	{"UL6_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1490	{"UL6_CH1", "DL1_CH1 Switch", "Hostless_UL6 UL"},
1491	{"UL6_CH2", "DL1_CH2 Switch", "Hostless_UL6 UL"},
1492	{"UL6_CH1", "DL2_CH1 Switch", "Hostless_UL6 UL"},
1493	{"UL6_CH2", "DL2_CH2 Switch", "Hostless_UL6 UL"},
1494	{"UL6_CH1", "DL12_CH1 Switch", "Hostless_UL6 UL"},
1495	{"UL6_CH2", "DL12_CH2 Switch", "Hostless_UL6 UL"},
1496	{"UL6_CH1", "DL6_CH1 Switch", "Hostless_UL6 UL"},
1497	{"UL6_CH2", "DL6_CH2 Switch", "Hostless_UL6 UL"},
1498	{"UL6_CH1", "DL3_CH1 Switch", "Hostless_UL6 UL"},
1499	{"UL6_CH2", "DL3_CH2 Switch", "Hostless_UL6 UL"},
1500	{"UL6_CH1", "DL4_CH1 Switch", "Hostless_UL6 UL"},
1501	{"UL6_CH2", "DL4_CH2 Switch", "Hostless_UL6 UL"},
1502	{"Hostless_UL6 UL", NULL, "UL6_VIRTUAL_INPUT"},
1503	{"UL6_CH1", "PCM_1_CAP_CH1 Switch", "PCM 1 Capture"},
1504	{"UL6_CH2", "PCM_1_CAP_CH2 Switch", "PCM 1 Capture"},
1505	{"UL6_CH1", "GAIN1_OUT_CH1 Switch", "HW Gain 1 Out"},
1506	{"UL6_CH2", "GAIN1_OUT_CH2 Switch", "HW Gain 1 Out"},
1507
1508	{"UL7", NULL, "UL7_CH1"},
1509	{"UL7", NULL, "UL7_CH2"},
1510	{"UL7_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1511	{"UL7_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1512	{"UL7_CH1", "HW_GAIN2_OUT_CH1 Switch", "HW Gain 2 Out"},
1513	{"UL7_CH2", "HW_GAIN2_OUT_CH2 Switch", "HW Gain 2 Out"},
1514	{"UL7_CH1", "HW_SRC_2_OUT_CH1 Switch", "HW_SRC_2_Out"},
1515	{"UL7_CH2", "HW_SRC_2_OUT_CH2 Switch", "HW_SRC_2_Out"},
1516
1517	{"UL8", NULL, "UL8_CH1"},
1518	{"UL8", NULL, "UL8_CH2"},
1519	{"UL8_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1520	{"UL8_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1521
1522	{"HW_GAIN2_IN_CH1", "ADDA_UL_CH1 Switch", "ADDA_UL_Mux"},
1523	{"HW_GAIN2_IN_CH2", "ADDA_UL_CH2 Switch", "ADDA_UL_Mux"},
1524};
1525
1526static const struct mtk_base_memif_data memif_data[MT8186_MEMIF_NUM] = {
1527	[MT8186_MEMIF_DL1] = {
1528		.name = "DL1",
1529		.id = MT8186_MEMIF_DL1,
1530		.reg_ofs_base = AFE_DL1_BASE,
1531		.reg_ofs_cur = AFE_DL1_CUR,
1532		.reg_ofs_end = AFE_DL1_END,
1533		.reg_ofs_base_msb = AFE_DL1_BASE_MSB,
1534		.reg_ofs_cur_msb = AFE_DL1_CUR_MSB,
1535		.reg_ofs_end_msb = AFE_DL1_END_MSB,
1536		.fs_reg = AFE_DL1_CON0,
1537		.fs_shift = DL1_MODE_SFT,
1538		.fs_maskbit = DL1_MODE_MASK,
1539		.mono_reg = AFE_DL1_CON0,
1540		.mono_shift = DL1_MONO_SFT,
1541		.enable_reg = AFE_DAC_CON0,
1542		.enable_shift = DL1_ON_SFT,
1543		.hd_reg = AFE_DL1_CON0,
1544		.hd_shift = DL1_HD_MODE_SFT,
1545		.hd_align_reg = AFE_DL1_CON0,
1546		.hd_align_mshift = DL1_HALIGN_SFT,
1547		.agent_disable_reg = -1,
1548		.agent_disable_shift = -1,
1549		.msb_reg = -1,
1550		.msb_shift = -1,
1551		.pbuf_reg = AFE_DL1_CON0,
1552		.pbuf_mask = DL1_PBUF_SIZE_MASK,
1553		.pbuf_shift = DL1_PBUF_SIZE_SFT,
1554		.minlen_reg = AFE_DL1_CON0,
1555		.minlen_mask = DL1_MINLEN_MASK,
1556		.minlen_shift = DL1_MINLEN_SFT,
1557	},
1558	[MT8186_MEMIF_DL12] = {
1559		.name = "DL12",
1560		.id = MT8186_MEMIF_DL12,
1561		.reg_ofs_base = AFE_DL12_BASE,
1562		.reg_ofs_cur = AFE_DL12_CUR,
1563		.reg_ofs_end = AFE_DL12_END,
1564		.reg_ofs_base_msb = AFE_DL12_BASE_MSB,
1565		.reg_ofs_cur_msb = AFE_DL12_CUR_MSB,
1566		.reg_ofs_end_msb = AFE_DL12_END_MSB,
1567		.fs_reg = AFE_DL12_CON0,
1568		.fs_shift = DL12_MODE_SFT,
1569		.fs_maskbit = DL12_MODE_MASK,
1570		.mono_reg = AFE_DL12_CON0,
1571		.mono_shift = DL12_MONO_SFT,
1572		.quad_ch_reg = AFE_DL12_CON0,
1573		.quad_ch_mask = DL12_4CH_EN_MASK,
1574		.quad_ch_shift = DL12_4CH_EN_SFT,
1575		.enable_reg = AFE_DAC_CON0,
1576		.enable_shift = DL12_ON_SFT,
1577		.hd_reg = AFE_DL12_CON0,
1578		.hd_shift = DL12_HD_MODE_SFT,
1579		.hd_align_reg = AFE_DL12_CON0,
1580		.hd_align_mshift = DL12_HALIGN_SFT,
1581		.agent_disable_reg = -1,
1582		.agent_disable_shift = -1,
1583		.msb_reg = -1,
1584		.msb_shift = -1,
1585		.pbuf_reg = AFE_DL12_CON0,
1586		.pbuf_mask = DL12_PBUF_SIZE_MASK,
1587		.pbuf_shift = DL12_PBUF_SIZE_SFT,
1588		.minlen_reg = AFE_DL12_CON0,
1589		.minlen_mask = DL12_MINLEN_MASK,
1590		.minlen_shift = DL12_MINLEN_SFT,
1591	},
1592	[MT8186_MEMIF_DL2] = {
1593		.name = "DL2",
1594		.id = MT8186_MEMIF_DL2,
1595		.reg_ofs_base = AFE_DL2_BASE,
1596		.reg_ofs_cur = AFE_DL2_CUR,
1597		.reg_ofs_end = AFE_DL2_END,
1598		.reg_ofs_base_msb = AFE_DL2_BASE_MSB,
1599		.reg_ofs_cur_msb = AFE_DL2_CUR_MSB,
1600		.reg_ofs_end_msb = AFE_DL2_END_MSB,
1601		.fs_reg = AFE_DL2_CON0,
1602		.fs_shift = DL2_MODE_SFT,
1603		.fs_maskbit = DL2_MODE_MASK,
1604		.mono_reg = AFE_DL2_CON0,
1605		.mono_shift = DL2_MONO_SFT,
1606		.enable_reg = AFE_DAC_CON0,
1607		.enable_shift = DL2_ON_SFT,
1608		.hd_reg = AFE_DL2_CON0,
1609		.hd_shift = DL2_HD_MODE_SFT,
1610		.hd_align_reg = AFE_DL2_CON0,
1611		.hd_align_mshift = DL2_HALIGN_SFT,
1612		.agent_disable_reg = -1,
1613		.agent_disable_shift = -1,
1614		.msb_reg = -1,
1615		.msb_shift = -1,
1616		.pbuf_reg = AFE_DL2_CON0,
1617		.pbuf_mask = DL2_PBUF_SIZE_MASK,
1618		.pbuf_shift = DL2_PBUF_SIZE_SFT,
1619		.minlen_reg = AFE_DL2_CON0,
1620		.minlen_mask = DL2_MINLEN_MASK,
1621		.minlen_shift = DL2_MINLEN_SFT,
1622	},
1623	[MT8186_MEMIF_DL3] = {
1624		.name = "DL3",
1625		.id = MT8186_MEMIF_DL3,
1626		.reg_ofs_base = AFE_DL3_BASE,
1627		.reg_ofs_cur = AFE_DL3_CUR,
1628		.reg_ofs_end = AFE_DL3_END,
1629		.reg_ofs_base_msb = AFE_DL3_BASE_MSB,
1630		.reg_ofs_cur_msb = AFE_DL3_CUR_MSB,
1631		.reg_ofs_end_msb = AFE_DL3_END_MSB,
1632		.fs_reg = AFE_DL3_CON0,
1633		.fs_shift = DL3_MODE_SFT,
1634		.fs_maskbit = DL3_MODE_MASK,
1635		.mono_reg = AFE_DL3_CON0,
1636		.mono_shift = DL3_MONO_SFT,
1637		.enable_reg = AFE_DAC_CON0,
1638		.enable_shift = DL3_ON_SFT,
1639		.hd_reg = AFE_DL3_CON0,
1640		.hd_shift = DL3_HD_MODE_SFT,
1641		.hd_align_reg = AFE_DL3_CON0,
1642		.hd_align_mshift = DL3_HALIGN_SFT,
1643		.agent_disable_reg = -1,
1644		.agent_disable_shift = -1,
1645		.msb_reg = -1,
1646		.msb_shift = -1,
1647		.pbuf_reg = AFE_DL3_CON0,
1648		.pbuf_mask = DL3_PBUF_SIZE_MASK,
1649		.pbuf_shift = DL3_PBUF_SIZE_SFT,
1650		.minlen_reg = AFE_DL3_CON0,
1651		.minlen_mask = DL3_MINLEN_MASK,
1652		.minlen_shift = DL3_MINLEN_SFT,
1653	},
1654	[MT8186_MEMIF_DL4] = {
1655		.name = "DL4",
1656		.id = MT8186_MEMIF_DL4,
1657		.reg_ofs_base = AFE_DL4_BASE,
1658		.reg_ofs_cur = AFE_DL4_CUR,
1659		.reg_ofs_end = AFE_DL4_END,
1660		.reg_ofs_base_msb = AFE_DL4_BASE_MSB,
1661		.reg_ofs_cur_msb = AFE_DL4_CUR_MSB,
1662		.reg_ofs_end_msb = AFE_DL4_END_MSB,
1663		.fs_reg = AFE_DL4_CON0,
1664		.fs_shift = DL4_MODE_SFT,
1665		.fs_maskbit = DL4_MODE_MASK,
1666		.mono_reg = AFE_DL4_CON0,
1667		.mono_shift = DL4_MONO_SFT,
1668		.enable_reg = AFE_DAC_CON0,
1669		.enable_shift = DL4_ON_SFT,
1670		.hd_reg = AFE_DL4_CON0,
1671		.hd_shift = DL4_HD_MODE_SFT,
1672		.hd_align_reg = AFE_DL4_CON0,
1673		.hd_align_mshift = DL4_HALIGN_SFT,
1674		.agent_disable_reg = -1,
1675		.agent_disable_shift = -1,
1676		.msb_reg = -1,
1677		.msb_shift = -1,
1678		.pbuf_reg = AFE_DL4_CON0,
1679		.pbuf_mask = DL4_PBUF_SIZE_MASK,
1680		.pbuf_shift = DL4_PBUF_SIZE_SFT,
1681		.minlen_reg = AFE_DL4_CON0,
1682		.minlen_mask = DL4_MINLEN_MASK,
1683		.minlen_shift = DL4_MINLEN_SFT,
1684	},
1685	[MT8186_MEMIF_DL5] = {
1686		.name = "DL5",
1687		.id = MT8186_MEMIF_DL5,
1688		.reg_ofs_base = AFE_DL5_BASE,
1689		.reg_ofs_cur = AFE_DL5_CUR,
1690		.reg_ofs_end = AFE_DL5_END,
1691		.reg_ofs_base_msb = AFE_DL5_BASE_MSB,
1692		.reg_ofs_cur_msb = AFE_DL5_CUR_MSB,
1693		.reg_ofs_end_msb = AFE_DL5_END_MSB,
1694		.fs_reg = AFE_DL5_CON0,
1695		.fs_shift = DL5_MODE_SFT,
1696		.fs_maskbit = DL5_MODE_MASK,
1697		.mono_reg = AFE_DL5_CON0,
1698		.mono_shift = DL5_MONO_SFT,
1699		.enable_reg = AFE_DAC_CON0,
1700		.enable_shift = DL5_ON_SFT,
1701		.hd_reg = AFE_DL5_CON0,
1702		.hd_shift = DL5_HD_MODE_SFT,
1703		.hd_align_reg = AFE_DL5_CON0,
1704		.hd_align_mshift = DL5_HALIGN_SFT,
1705		.agent_disable_reg = -1,
1706		.agent_disable_shift = -1,
1707		.msb_reg = -1,
1708		.msb_shift = -1,
1709		.pbuf_reg = AFE_DL5_CON0,
1710		.pbuf_mask = DL5_PBUF_SIZE_MASK,
1711		.pbuf_shift = DL5_PBUF_SIZE_SFT,
1712		.minlen_reg = AFE_DL5_CON0,
1713		.minlen_mask = DL5_MINLEN_MASK,
1714		.minlen_shift = DL5_MINLEN_SFT,
1715	},
1716	[MT8186_MEMIF_DL6] = {
1717		.name = "DL6",
1718		.id = MT8186_MEMIF_DL6,
1719		.reg_ofs_base = AFE_DL6_BASE,
1720		.reg_ofs_cur = AFE_DL6_CUR,
1721		.reg_ofs_end = AFE_DL6_END,
1722		.reg_ofs_base_msb = AFE_DL6_BASE_MSB,
1723		.reg_ofs_cur_msb = AFE_DL6_CUR_MSB,
1724		.reg_ofs_end_msb = AFE_DL6_END_MSB,
1725		.fs_reg = AFE_DL6_CON0,
1726		.fs_shift = DL6_MODE_SFT,
1727		.fs_maskbit = DL6_MODE_MASK,
1728		.mono_reg = AFE_DL6_CON0,
1729		.mono_shift = DL6_MONO_SFT,
1730		.enable_reg = AFE_DAC_CON0,
1731		.enable_shift = DL6_ON_SFT,
1732		.hd_reg = AFE_DL6_CON0,
1733		.hd_shift = DL6_HD_MODE_SFT,
1734		.hd_align_reg = AFE_DL6_CON0,
1735		.hd_align_mshift = DL6_HALIGN_SFT,
1736		.agent_disable_reg = -1,
1737		.agent_disable_shift = -1,
1738		.msb_reg = -1,
1739		.msb_shift = -1,
1740		.pbuf_reg = AFE_DL6_CON0,
1741		.pbuf_mask = DL6_PBUF_SIZE_MASK,
1742		.pbuf_shift = DL6_PBUF_SIZE_SFT,
1743		.minlen_reg = AFE_DL6_CON0,
1744		.minlen_mask = DL6_MINLEN_MASK,
1745		.minlen_shift = DL6_MINLEN_SFT,
1746	},
1747	[MT8186_MEMIF_DL7] = {
1748		.name = "DL7",
1749		.id = MT8186_MEMIF_DL7,
1750		.reg_ofs_base = AFE_DL7_BASE,
1751		.reg_ofs_cur = AFE_DL7_CUR,
1752		.reg_ofs_end = AFE_DL7_END,
1753		.reg_ofs_base_msb = AFE_DL7_BASE_MSB,
1754		.reg_ofs_cur_msb = AFE_DL7_CUR_MSB,
1755		.reg_ofs_end_msb = AFE_DL7_END_MSB,
1756		.fs_reg = AFE_DL7_CON0,
1757		.fs_shift = DL7_MODE_SFT,
1758		.fs_maskbit = DL7_MODE_MASK,
1759		.mono_reg = AFE_DL7_CON0,
1760		.mono_shift = DL7_MONO_SFT,
1761		.enable_reg = AFE_DAC_CON0,
1762		.enable_shift = DL7_ON_SFT,
1763		.hd_reg = AFE_DL7_CON0,
1764		.hd_shift = DL7_HD_MODE_SFT,
1765		.hd_align_reg = AFE_DL7_CON0,
1766		.hd_align_mshift = DL7_HALIGN_SFT,
1767		.agent_disable_reg = -1,
1768		.agent_disable_shift = -1,
1769		.msb_reg = -1,
1770		.msb_shift = -1,
1771		.pbuf_reg = AFE_DL7_CON0,
1772		.pbuf_mask = DL7_PBUF_SIZE_MASK,
1773		.pbuf_shift = DL7_PBUF_SIZE_SFT,
1774		.minlen_reg = AFE_DL7_CON0,
1775		.minlen_mask = DL7_MINLEN_MASK,
1776		.minlen_shift = DL7_MINLEN_SFT,
1777	},
1778	[MT8186_MEMIF_DL8] = {
1779		.name = "DL8",
1780		.id = MT8186_MEMIF_DL8,
1781		.reg_ofs_base = AFE_DL8_BASE,
1782		.reg_ofs_cur = AFE_DL8_CUR,
1783		.reg_ofs_end = AFE_DL8_END,
1784		.reg_ofs_base_msb = AFE_DL8_BASE_MSB,
1785		.reg_ofs_cur_msb = AFE_DL8_CUR_MSB,
1786		.reg_ofs_end_msb = AFE_DL8_END_MSB,
1787		.fs_reg = AFE_DL8_CON0,
1788		.fs_shift = DL8_MODE_SFT,
1789		.fs_maskbit = DL8_MODE_MASK,
1790		.mono_reg = AFE_DL8_CON0,
1791		.mono_shift = DL8_MONO_SFT,
1792		.enable_reg = AFE_DAC_CON0,
1793		.enable_shift = DL8_ON_SFT,
1794		.hd_reg = AFE_DL8_CON0,
1795		.hd_shift = DL8_HD_MODE_SFT,
1796		.hd_align_reg = AFE_DL8_CON0,
1797		.hd_align_mshift = DL8_HALIGN_SFT,
1798		.agent_disable_reg = -1,
1799		.agent_disable_shift = -1,
1800		.msb_reg = -1,
1801		.msb_shift = -1,
1802		.pbuf_reg = AFE_DL8_CON0,
1803		.pbuf_mask = DL8_PBUF_SIZE_MASK,
1804		.pbuf_shift = DL8_PBUF_SIZE_SFT,
1805		.minlen_reg = AFE_DL8_CON0,
1806		.minlen_mask = DL8_MINLEN_MASK,
1807		.minlen_shift = DL8_MINLEN_SFT,
1808	},
1809	[MT8186_MEMIF_VUL12] = {
1810		.name = "VUL12",
1811		.id = MT8186_MEMIF_VUL12,
1812		.reg_ofs_base = AFE_VUL12_BASE,
1813		.reg_ofs_cur = AFE_VUL12_CUR,
1814		.reg_ofs_end = AFE_VUL12_END,
1815		.reg_ofs_base_msb = AFE_VUL12_BASE_MSB,
1816		.reg_ofs_cur_msb = AFE_VUL12_CUR_MSB,
1817		.reg_ofs_end_msb = AFE_VUL12_END_MSB,
1818		.fs_reg = AFE_VUL12_CON0,
1819		.fs_shift = VUL12_MODE_SFT,
1820		.fs_maskbit = VUL12_MODE_MASK,
1821		.mono_reg = AFE_VUL12_CON0,
1822		.mono_shift = VUL12_MONO_SFT,
1823		.quad_ch_reg = AFE_VUL12_CON0,
1824		.quad_ch_mask = VUL12_4CH_EN_MASK,
1825		.quad_ch_shift = VUL12_4CH_EN_SFT,
1826		.enable_reg = AFE_DAC_CON0,
1827		.enable_shift = VUL12_ON_SFT,
1828		.hd_reg = AFE_VUL12_CON0,
1829		.hd_shift = VUL12_HD_MODE_SFT,
1830		.hd_align_reg = AFE_VUL12_CON0,
1831		.hd_align_mshift = VUL12_HALIGN_SFT,
1832		.agent_disable_reg = -1,
1833		.agent_disable_shift = -1,
1834		.msb_reg = -1,
1835		.msb_shift = -1,
1836	},
1837	[MT8186_MEMIF_VUL2] = {
1838		.name = "VUL2",
1839		.id = MT8186_MEMIF_VUL2,
1840		.reg_ofs_base = AFE_VUL2_BASE,
1841		.reg_ofs_cur = AFE_VUL2_CUR,
1842		.reg_ofs_end = AFE_VUL2_END,
1843		.reg_ofs_base_msb = AFE_VUL2_BASE_MSB,
1844		.reg_ofs_cur_msb = AFE_VUL2_CUR_MSB,
1845		.reg_ofs_end_msb = AFE_VUL2_END_MSB,
1846		.fs_reg = AFE_VUL2_CON0,
1847		.fs_shift = VUL2_MODE_SFT,
1848		.fs_maskbit = VUL2_MODE_MASK,
1849		.mono_reg = AFE_VUL2_CON0,
1850		.mono_shift = VUL2_MONO_SFT,
1851		.enable_reg = AFE_DAC_CON0,
1852		.enable_shift = VUL2_ON_SFT,
1853		.hd_reg = AFE_VUL2_CON0,
1854		.hd_shift = VUL2_HD_MODE_SFT,
1855		.hd_align_reg = AFE_VUL2_CON0,
1856		.hd_align_mshift = VUL2_HALIGN_SFT,
1857		.agent_disable_reg = -1,
1858		.agent_disable_shift = -1,
1859		.msb_reg = -1,
1860		.msb_shift = -1,
1861	},
1862	[MT8186_MEMIF_AWB] = {
1863		.name = "AWB",
1864		.id = MT8186_MEMIF_AWB,
1865		.reg_ofs_base = AFE_AWB_BASE,
1866		.reg_ofs_cur = AFE_AWB_CUR,
1867		.reg_ofs_end = AFE_AWB_END,
1868		.reg_ofs_base_msb = AFE_AWB_BASE_MSB,
1869		.reg_ofs_cur_msb = AFE_AWB_CUR_MSB,
1870		.reg_ofs_end_msb = AFE_AWB_END_MSB,
1871		.fs_reg = AFE_AWB_CON0,
1872		.fs_shift = AWB_MODE_SFT,
1873		.fs_maskbit = AWB_MODE_MASK,
1874		.mono_reg = AFE_AWB_CON0,
1875		.mono_shift = AWB_MONO_SFT,
1876		.enable_reg = AFE_DAC_CON0,
1877		.enable_shift = AWB_ON_SFT,
1878		.hd_reg = AFE_AWB_CON0,
1879		.hd_shift = AWB_HD_MODE_SFT,
1880		.hd_align_reg = AFE_AWB_CON0,
1881		.hd_align_mshift = AWB_HALIGN_SFT,
1882		.agent_disable_reg = -1,
1883		.agent_disable_shift = -1,
1884		.msb_reg = -1,
1885		.msb_shift = -1,
1886	},
1887	[MT8186_MEMIF_AWB2] = {
1888		.name = "AWB2",
1889		.id = MT8186_MEMIF_AWB2,
1890		.reg_ofs_base = AFE_AWB2_BASE,
1891		.reg_ofs_cur = AFE_AWB2_CUR,
1892		.reg_ofs_end = AFE_AWB2_END,
1893		.reg_ofs_base_msb = AFE_AWB2_BASE_MSB,
1894		.reg_ofs_cur_msb = AFE_AWB2_CUR_MSB,
1895		.reg_ofs_end_msb = AFE_AWB2_END_MSB,
1896		.fs_reg = AFE_AWB2_CON0,
1897		.fs_shift = AWB2_MODE_SFT,
1898		.fs_maskbit = AWB2_MODE_MASK,
1899		.mono_reg = AFE_AWB2_CON0,
1900		.mono_shift = AWB2_MONO_SFT,
1901		.enable_reg = AFE_DAC_CON0,
1902		.enable_shift = AWB2_ON_SFT,
1903		.hd_reg = AFE_AWB2_CON0,
1904		.hd_shift = AWB2_HD_MODE_SFT,
1905		.hd_align_reg = AFE_AWB2_CON0,
1906		.hd_align_mshift = AWB2_HALIGN_SFT,
1907		.agent_disable_reg = -1,
1908		.agent_disable_shift = -1,
1909		.msb_reg = -1,
1910		.msb_shift = -1,
1911	},
1912	[MT8186_MEMIF_VUL3] = {
1913		.name = "VUL3",
1914		.id = MT8186_MEMIF_VUL3,
1915		.reg_ofs_base = AFE_VUL3_BASE,
1916		.reg_ofs_cur = AFE_VUL3_CUR,
1917		.reg_ofs_end = AFE_VUL3_END,
1918		.reg_ofs_base_msb = AFE_VUL3_BASE_MSB,
1919		.reg_ofs_cur_msb = AFE_VUL3_CUR_MSB,
1920		.reg_ofs_end_msb = AFE_VUL3_END_MSB,
1921		.fs_reg = AFE_VUL3_CON0,
1922		.fs_shift = VUL3_MODE_SFT,
1923		.fs_maskbit = VUL3_MODE_MASK,
1924		.mono_reg = AFE_VUL3_CON0,
1925		.mono_shift = VUL3_MONO_SFT,
1926		.enable_reg = AFE_DAC_CON0,
1927		.enable_shift = VUL3_ON_SFT,
1928		.hd_reg = AFE_VUL3_CON0,
1929		.hd_shift = VUL3_HD_MODE_SFT,
1930		.hd_align_reg = AFE_VUL3_CON0,
1931		.hd_align_mshift = VUL3_HALIGN_SFT,
1932		.agent_disable_reg = -1,
1933		.agent_disable_shift = -1,
1934		.msb_reg = -1,
1935		.msb_shift = -1,
1936	},
1937	[MT8186_MEMIF_VUL4] = {
1938		.name = "VUL4",
1939		.id = MT8186_MEMIF_VUL4,
1940		.reg_ofs_base = AFE_VUL4_BASE,
1941		.reg_ofs_cur = AFE_VUL4_CUR,
1942		.reg_ofs_end = AFE_VUL4_END,
1943		.reg_ofs_base_msb = AFE_VUL4_BASE_MSB,
1944		.reg_ofs_cur_msb = AFE_VUL4_CUR_MSB,
1945		.reg_ofs_end_msb = AFE_VUL4_END_MSB,
1946		.fs_reg = AFE_VUL4_CON0,
1947		.fs_shift = VUL4_MODE_SFT,
1948		.fs_maskbit = VUL4_MODE_MASK,
1949		.mono_reg = AFE_VUL4_CON0,
1950		.mono_shift = VUL4_MONO_SFT,
1951		.enable_reg = AFE_DAC_CON0,
1952		.enable_shift = VUL4_ON_SFT,
1953		.hd_reg = AFE_VUL4_CON0,
1954		.hd_shift = VUL4_HD_MODE_SFT,
1955		.hd_align_reg = AFE_VUL4_CON0,
1956		.hd_align_mshift = VUL4_HALIGN_SFT,
1957		.agent_disable_reg = -1,
1958		.agent_disable_shift = -1,
1959		.msb_reg = -1,
1960		.msb_shift = -1,
1961	},
1962	[MT8186_MEMIF_VUL5] = {
1963		.name = "VUL5",
1964		.id = MT8186_MEMIF_VUL5,
1965		.reg_ofs_base = AFE_VUL5_BASE,
1966		.reg_ofs_cur = AFE_VUL5_CUR,
1967		.reg_ofs_end = AFE_VUL5_END,
1968		.reg_ofs_base_msb = AFE_VUL5_BASE_MSB,
1969		.reg_ofs_cur_msb = AFE_VUL5_CUR_MSB,
1970		.reg_ofs_end_msb = AFE_VUL5_END_MSB,
1971		.fs_reg = AFE_VUL5_CON0,
1972		.fs_shift = VUL5_MODE_SFT,
1973		.fs_maskbit = VUL5_MODE_MASK,
1974		.mono_reg = AFE_VUL5_CON0,
1975		.mono_shift = VUL5_MONO_SFT,
1976		.enable_reg = AFE_DAC_CON0,
1977		.enable_shift = VUL5_ON_SFT,
1978		.hd_reg = AFE_VUL5_CON0,
1979		.hd_shift = VUL5_HD_MODE_SFT,
1980		.hd_align_reg = AFE_VUL5_CON0,
1981		.hd_align_mshift = VUL5_HALIGN_SFT,
1982		.agent_disable_reg = -1,
1983		.agent_disable_shift = -1,
1984		.msb_reg = -1,
1985		.msb_shift = -1,
1986	},
1987	[MT8186_MEMIF_VUL6] = {
1988		.name = "VUL6",
1989		.id = MT8186_MEMIF_VUL6,
1990		.reg_ofs_base = AFE_VUL6_BASE,
1991		.reg_ofs_cur = AFE_VUL6_CUR,
1992		.reg_ofs_end = AFE_VUL6_END,
1993		.reg_ofs_base_msb = AFE_VUL6_BASE_MSB,
1994		.reg_ofs_cur_msb = AFE_VUL6_CUR_MSB,
1995		.reg_ofs_end_msb = AFE_VUL6_END_MSB,
1996		.fs_reg = AFE_VUL6_CON0,
1997		.fs_shift = VUL6_MODE_SFT,
1998		.fs_maskbit = VUL6_MODE_MASK,
1999		.mono_reg = AFE_VUL6_CON0,
2000		.mono_shift = VUL6_MONO_SFT,
2001		.enable_reg = AFE_DAC_CON0,
2002		.enable_shift = VUL6_ON_SFT,
2003		.hd_reg = AFE_VUL6_CON0,
2004		.hd_shift = VUL6_HD_MODE_SFT,
2005		.hd_align_reg = AFE_VUL6_CON0,
2006		.hd_align_mshift = VUL6_HALIGN_SFT,
2007		.agent_disable_reg = -1,
2008		.agent_disable_shift = -1,
2009		.msb_reg = -1,
2010		.msb_shift = -1,
2011	},
2012};
2013
2014static const struct mtk_base_irq_data irq_data[MT8186_IRQ_NUM] = {
2015	[MT8186_IRQ_0] = {
2016		.id = MT8186_IRQ_0,
2017		.irq_cnt_reg = AFE_IRQ_MCU_CNT0,
2018		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2019		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2020		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2021		.irq_fs_shift = IRQ0_MCU_MODE_SFT,
2022		.irq_fs_maskbit = IRQ0_MCU_MODE_MASK,
2023		.irq_en_reg = AFE_IRQ_MCU_CON0,
2024		.irq_en_shift = IRQ0_MCU_ON_SFT,
2025		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2026		.irq_clr_shift = IRQ0_MCU_CLR_SFT,
2027	},
2028	[MT8186_IRQ_1] = {
2029		.id = MT8186_IRQ_1,
2030		.irq_cnt_reg = AFE_IRQ_MCU_CNT1,
2031		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2032		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2033		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2034		.irq_fs_shift = IRQ1_MCU_MODE_SFT,
2035		.irq_fs_maskbit = IRQ1_MCU_MODE_MASK,
2036		.irq_en_reg = AFE_IRQ_MCU_CON0,
2037		.irq_en_shift = IRQ1_MCU_ON_SFT,
2038		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2039		.irq_clr_shift = IRQ1_MCU_CLR_SFT,
2040	},
2041	[MT8186_IRQ_2] = {
2042		.id = MT8186_IRQ_2,
2043		.irq_cnt_reg = AFE_IRQ_MCU_CNT2,
2044		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2045		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2046		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2047		.irq_fs_shift = IRQ2_MCU_MODE_SFT,
2048		.irq_fs_maskbit = IRQ2_MCU_MODE_MASK,
2049		.irq_en_reg = AFE_IRQ_MCU_CON0,
2050		.irq_en_shift = IRQ2_MCU_ON_SFT,
2051		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2052		.irq_clr_shift = IRQ2_MCU_CLR_SFT,
2053	},
2054	[MT8186_IRQ_3] = {
2055		.id = MT8186_IRQ_3,
2056		.irq_cnt_reg = AFE_IRQ_MCU_CNT3,
2057		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2058		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2059		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2060		.irq_fs_shift = IRQ3_MCU_MODE_SFT,
2061		.irq_fs_maskbit = IRQ3_MCU_MODE_MASK,
2062		.irq_en_reg = AFE_IRQ_MCU_CON0,
2063		.irq_en_shift = IRQ3_MCU_ON_SFT,
2064		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2065		.irq_clr_shift = IRQ3_MCU_CLR_SFT,
2066	},
2067	[MT8186_IRQ_4] = {
2068		.id = MT8186_IRQ_4,
2069		.irq_cnt_reg = AFE_IRQ_MCU_CNT4,
2070		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2071		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2072		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2073		.irq_fs_shift = IRQ4_MCU_MODE_SFT,
2074		.irq_fs_maskbit = IRQ4_MCU_MODE_MASK,
2075		.irq_en_reg = AFE_IRQ_MCU_CON0,
2076		.irq_en_shift = IRQ4_MCU_ON_SFT,
2077		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2078		.irq_clr_shift = IRQ4_MCU_CLR_SFT,
2079	},
2080	[MT8186_IRQ_5] = {
2081		.id = MT8186_IRQ_5,
2082		.irq_cnt_reg = AFE_IRQ_MCU_CNT5,
2083		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2084		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2085		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2086		.irq_fs_shift = IRQ5_MCU_MODE_SFT,
2087		.irq_fs_maskbit = IRQ5_MCU_MODE_MASK,
2088		.irq_en_reg = AFE_IRQ_MCU_CON0,
2089		.irq_en_shift = IRQ5_MCU_ON_SFT,
2090		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2091		.irq_clr_shift = IRQ5_MCU_CLR_SFT,
2092	},
2093	[MT8186_IRQ_6] = {
2094		.id = MT8186_IRQ_6,
2095		.irq_cnt_reg = AFE_IRQ_MCU_CNT6,
2096		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2097		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2098		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2099		.irq_fs_shift = IRQ6_MCU_MODE_SFT,
2100		.irq_fs_maskbit = IRQ6_MCU_MODE_MASK,
2101		.irq_en_reg = AFE_IRQ_MCU_CON0,
2102		.irq_en_shift = IRQ6_MCU_ON_SFT,
2103		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2104		.irq_clr_shift = IRQ6_MCU_CLR_SFT,
2105	},
2106	[MT8186_IRQ_7] = {
2107		.id = MT8186_IRQ_7,
2108		.irq_cnt_reg = AFE_IRQ_MCU_CNT7,
2109		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2110		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2111		.irq_fs_reg = AFE_IRQ_MCU_CON1,
2112		.irq_fs_shift = IRQ7_MCU_MODE_SFT,
2113		.irq_fs_maskbit = IRQ7_MCU_MODE_MASK,
2114		.irq_en_reg = AFE_IRQ_MCU_CON0,
2115		.irq_en_shift = IRQ7_MCU_ON_SFT,
2116		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2117		.irq_clr_shift = IRQ7_MCU_CLR_SFT,
2118	},
2119	[MT8186_IRQ_8] = {
2120		.id = MT8186_IRQ_8,
2121		.irq_cnt_reg = AFE_IRQ_MCU_CNT8,
2122		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2123		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2124		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2125		.irq_fs_shift = IRQ8_MCU_MODE_SFT,
2126		.irq_fs_maskbit = IRQ8_MCU_MODE_MASK,
2127		.irq_en_reg = AFE_IRQ_MCU_CON0,
2128		.irq_en_shift = IRQ8_MCU_ON_SFT,
2129		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2130		.irq_clr_shift = IRQ8_MCU_CLR_SFT,
2131	},
2132	[MT8186_IRQ_9] = {
2133		.id = MT8186_IRQ_9,
2134		.irq_cnt_reg = AFE_IRQ_MCU_CNT9,
2135		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2136		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2137		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2138		.irq_fs_shift = IRQ9_MCU_MODE_SFT,
2139		.irq_fs_maskbit = IRQ9_MCU_MODE_MASK,
2140		.irq_en_reg = AFE_IRQ_MCU_CON0,
2141		.irq_en_shift = IRQ9_MCU_ON_SFT,
2142		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2143		.irq_clr_shift = IRQ9_MCU_CLR_SFT,
2144	},
2145	[MT8186_IRQ_10] = {
2146		.id = MT8186_IRQ_10,
2147		.irq_cnt_reg = AFE_IRQ_MCU_CNT10,
2148		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2149		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2150		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2151		.irq_fs_shift = IRQ10_MCU_MODE_SFT,
2152		.irq_fs_maskbit = IRQ10_MCU_MODE_MASK,
2153		.irq_en_reg = AFE_IRQ_MCU_CON0,
2154		.irq_en_shift = IRQ10_MCU_ON_SFT,
2155		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2156		.irq_clr_shift = IRQ10_MCU_CLR_SFT,
2157	},
2158	[MT8186_IRQ_11] = {
2159		.id = MT8186_IRQ_11,
2160		.irq_cnt_reg = AFE_IRQ_MCU_CNT11,
2161		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2162		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2163		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2164		.irq_fs_shift = IRQ11_MCU_MODE_SFT,
2165		.irq_fs_maskbit = IRQ11_MCU_MODE_MASK,
2166		.irq_en_reg = AFE_IRQ_MCU_CON0,
2167		.irq_en_shift = IRQ11_MCU_ON_SFT,
2168		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2169		.irq_clr_shift = IRQ11_MCU_CLR_SFT,
2170	},
2171	[MT8186_IRQ_12] = {
2172		.id = MT8186_IRQ_12,
2173		.irq_cnt_reg = AFE_IRQ_MCU_CNT12,
2174		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2175		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2176		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2177		.irq_fs_shift = IRQ12_MCU_MODE_SFT,
2178		.irq_fs_maskbit = IRQ12_MCU_MODE_MASK,
2179		.irq_en_reg = AFE_IRQ_MCU_CON0,
2180		.irq_en_shift = IRQ12_MCU_ON_SFT,
2181		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2182		.irq_clr_shift = IRQ12_MCU_CLR_SFT,
2183	},
2184	[MT8186_IRQ_13] = {
2185		.id = MT8186_IRQ_13,
2186		.irq_cnt_reg = AFE_IRQ_MCU_CNT13,
2187		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2188		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2189		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2190		.irq_fs_shift = IRQ13_MCU_MODE_SFT,
2191		.irq_fs_maskbit = IRQ13_MCU_MODE_MASK,
2192		.irq_en_reg = AFE_IRQ_MCU_CON0,
2193		.irq_en_shift = IRQ13_MCU_ON_SFT,
2194		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2195		.irq_clr_shift = IRQ13_MCU_CLR_SFT,
2196	},
2197	[MT8186_IRQ_14] = {
2198		.id = MT8186_IRQ_14,
2199		.irq_cnt_reg = AFE_IRQ_MCU_CNT14,
2200		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2201		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2202		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2203		.irq_fs_shift = IRQ14_MCU_MODE_SFT,
2204		.irq_fs_maskbit = IRQ14_MCU_MODE_MASK,
2205		.irq_en_reg = AFE_IRQ_MCU_CON0,
2206		.irq_en_shift = IRQ14_MCU_ON_SFT,
2207		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2208		.irq_clr_shift = IRQ14_MCU_CLR_SFT,
2209	},
2210	[MT8186_IRQ_15] = {
2211		.id = MT8186_IRQ_15,
2212		.irq_cnt_reg = AFE_IRQ_MCU_CNT15,
2213		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2214		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2215		.irq_fs_reg = AFE_IRQ_MCU_CON2,
2216		.irq_fs_shift = IRQ15_MCU_MODE_SFT,
2217		.irq_fs_maskbit = IRQ15_MCU_MODE_MASK,
2218		.irq_en_reg = AFE_IRQ_MCU_CON0,
2219		.irq_en_shift = IRQ15_MCU_ON_SFT,
2220		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2221		.irq_clr_shift = IRQ15_MCU_CLR_SFT,
2222	},
2223	[MT8186_IRQ_16] = {
2224		.id = MT8186_IRQ_16,
2225		.irq_cnt_reg = AFE_IRQ_MCU_CNT16,
2226		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2227		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2228		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2229		.irq_fs_shift = IRQ16_MCU_MODE_SFT,
2230		.irq_fs_maskbit = IRQ16_MCU_MODE_MASK,
2231		.irq_en_reg = AFE_IRQ_MCU_CON0,
2232		.irq_en_shift = IRQ16_MCU_ON_SFT,
2233		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2234		.irq_clr_shift = IRQ16_MCU_CLR_SFT,
2235	},
2236	[MT8186_IRQ_17] = {
2237		.id = MT8186_IRQ_17,
2238		.irq_cnt_reg = AFE_IRQ_MCU_CNT17,
2239		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2240		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2241		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2242		.irq_fs_shift = IRQ17_MCU_MODE_SFT,
2243		.irq_fs_maskbit = IRQ17_MCU_MODE_MASK,
2244		.irq_en_reg = AFE_IRQ_MCU_CON0,
2245		.irq_en_shift = IRQ17_MCU_ON_SFT,
2246		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2247		.irq_clr_shift = IRQ17_MCU_CLR_SFT,
2248	},
2249	[MT8186_IRQ_18] = {
2250		.id = MT8186_IRQ_18,
2251		.irq_cnt_reg = AFE_IRQ_MCU_CNT18,
2252		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2253		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2254		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2255		.irq_fs_shift = IRQ18_MCU_MODE_SFT,
2256		.irq_fs_maskbit = IRQ18_MCU_MODE_MASK,
2257		.irq_en_reg = AFE_IRQ_MCU_CON0,
2258		.irq_en_shift = IRQ18_MCU_ON_SFT,
2259		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2260		.irq_clr_shift = IRQ18_MCU_CLR_SFT,
2261	},
2262	[MT8186_IRQ_19] = {
2263		.id = MT8186_IRQ_19,
2264		.irq_cnt_reg = AFE_IRQ_MCU_CNT19,
2265		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2266		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2267		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2268		.irq_fs_shift = IRQ19_MCU_MODE_SFT,
2269		.irq_fs_maskbit = IRQ19_MCU_MODE_MASK,
2270		.irq_en_reg = AFE_IRQ_MCU_CON0,
2271		.irq_en_shift = IRQ19_MCU_ON_SFT,
2272		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2273		.irq_clr_shift = IRQ19_MCU_CLR_SFT,
2274	},
2275	[MT8186_IRQ_20] = {
2276		.id = MT8186_IRQ_20,
2277		.irq_cnt_reg = AFE_IRQ_MCU_CNT20,
2278		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2279		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2280		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2281		.irq_fs_shift = IRQ20_MCU_MODE_SFT,
2282		.irq_fs_maskbit = IRQ20_MCU_MODE_MASK,
2283		.irq_en_reg = AFE_IRQ_MCU_CON0,
2284		.irq_en_shift = IRQ20_MCU_ON_SFT,
2285		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2286		.irq_clr_shift = IRQ20_MCU_CLR_SFT,
2287	},
2288	[MT8186_IRQ_21] = {
2289		.id = MT8186_IRQ_21,
2290		.irq_cnt_reg = AFE_IRQ_MCU_CNT21,
2291		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2292		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2293		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2294		.irq_fs_shift = IRQ21_MCU_MODE_SFT,
2295		.irq_fs_maskbit = IRQ21_MCU_MODE_MASK,
2296		.irq_en_reg = AFE_IRQ_MCU_CON0,
2297		.irq_en_shift = IRQ21_MCU_ON_SFT,
2298		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2299		.irq_clr_shift = IRQ21_MCU_CLR_SFT,
2300	},
2301	[MT8186_IRQ_22] = {
2302		.id = MT8186_IRQ_22,
2303		.irq_cnt_reg = AFE_IRQ_MCU_CNT22,
2304		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2305		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2306		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2307		.irq_fs_shift = IRQ22_MCU_MODE_SFT,
2308		.irq_fs_maskbit = IRQ22_MCU_MODE_MASK,
2309		.irq_en_reg = AFE_IRQ_MCU_CON0,
2310		.irq_en_shift = IRQ22_MCU_ON_SFT,
2311		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2312		.irq_clr_shift = IRQ22_MCU_CLR_SFT,
2313	},
2314	[MT8186_IRQ_23] = {
2315		.id = MT8186_IRQ_23,
2316		.irq_cnt_reg = AFE_IRQ_MCU_CNT23,
2317		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2318		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2319		.irq_fs_reg = AFE_IRQ_MCU_CON3,
2320		.irq_fs_shift = IRQ23_MCU_MODE_SFT,
2321		.irq_fs_maskbit = IRQ23_MCU_MODE_MASK,
2322		.irq_en_reg = AFE_IRQ_MCU_CON0,
2323		.irq_en_shift = IRQ23_MCU_ON_SFT,
2324		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2325		.irq_clr_shift = IRQ23_MCU_CLR_SFT,
2326	},
2327	[MT8186_IRQ_24] = {
2328		.id = MT8186_IRQ_24,
2329		.irq_cnt_reg = AFE_IRQ_MCU_CNT24,
2330		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2331		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2332		.irq_fs_reg = AFE_IRQ_MCU_CON4,
2333		.irq_fs_shift = IRQ24_MCU_MODE_SFT,
2334		.irq_fs_maskbit = IRQ24_MCU_MODE_MASK,
2335		.irq_en_reg = AFE_IRQ_MCU_CON0,
2336		.irq_en_shift = IRQ24_MCU_ON_SFT,
2337		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2338		.irq_clr_shift = IRQ24_MCU_CLR_SFT,
2339	},
2340	[MT8186_IRQ_25] = {
2341		.id = MT8186_IRQ_25,
2342		.irq_cnt_reg = AFE_IRQ_MCU_CNT25,
2343		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2344		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2345		.irq_fs_reg = AFE_IRQ_MCU_CON4,
2346		.irq_fs_shift = IRQ25_MCU_MODE_SFT,
2347		.irq_fs_maskbit = IRQ25_MCU_MODE_MASK,
2348		.irq_en_reg = AFE_IRQ_MCU_CON0,
2349		.irq_en_shift = IRQ25_MCU_ON_SFT,
2350		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2351		.irq_clr_shift = IRQ25_MCU_CLR_SFT,
2352	},
2353	[MT8186_IRQ_26] = {
2354		.id = MT8186_IRQ_26,
2355		.irq_cnt_reg = AFE_IRQ_MCU_CNT26,
2356		.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,
2357		.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,
2358		.irq_fs_reg = AFE_IRQ_MCU_CON4,
2359		.irq_fs_shift = IRQ26_MCU_MODE_SFT,
2360		.irq_fs_maskbit = IRQ26_MCU_MODE_MASK,
2361		.irq_en_reg = AFE_IRQ_MCU_CON0,
2362		.irq_en_shift = IRQ26_MCU_ON_SFT,
2363		.irq_clr_reg = AFE_IRQ_MCU_CLR,
2364		.irq_clr_shift = IRQ26_MCU_CLR_SFT,
2365	},
2366};
2367
2368static const int memif_irq_usage[MT8186_MEMIF_NUM] = {
2369	/* TODO: verify each memif & irq */
2370	[MT8186_MEMIF_DL1] = MT8186_IRQ_0,
2371	[MT8186_MEMIF_DL2] = MT8186_IRQ_1,
2372	[MT8186_MEMIF_DL3] = MT8186_IRQ_2,
2373	[MT8186_MEMIF_DL4] = MT8186_IRQ_3,
2374	[MT8186_MEMIF_DL5] = MT8186_IRQ_4,
2375	[MT8186_MEMIF_DL6] = MT8186_IRQ_5,
2376	[MT8186_MEMIF_DL7] = MT8186_IRQ_6,
2377	[MT8186_MEMIF_DL8] = MT8186_IRQ_7,
2378	[MT8186_MEMIF_DL12] = MT8186_IRQ_9,
2379	[MT8186_MEMIF_VUL12] = MT8186_IRQ_10,
2380	[MT8186_MEMIF_VUL2] = MT8186_IRQ_11,
2381	[MT8186_MEMIF_AWB] = MT8186_IRQ_12,
2382	[MT8186_MEMIF_AWB2] = MT8186_IRQ_13,
2383	[MT8186_MEMIF_VUL3] = MT8186_IRQ_14,
2384	[MT8186_MEMIF_VUL4] = MT8186_IRQ_15,
2385	[MT8186_MEMIF_VUL5] = MT8186_IRQ_16,
2386	[MT8186_MEMIF_VUL6] = MT8186_IRQ_17,
2387};
2388
2389static bool mt8186_is_volatile_reg(struct device *dev, unsigned int reg)
2390{
2391	/* these auto-gen reg has read-only bit, so put it as volatile */
2392	/* volatile reg cannot be cached, so cannot be set when power off */
2393	switch (reg) {
2394	case AUDIO_TOP_CON0:	/* reg bit controlled by CCF */
2395	case AUDIO_TOP_CON1:	/* reg bit controlled by CCF */
2396	case AUDIO_TOP_CON2:
2397	case AUDIO_TOP_CON3:
2398	case AFE_DAC_CON0:
2399	case AFE_DL1_CUR_MSB:
2400	case AFE_DL1_CUR:
2401	case AFE_DL1_END:
2402	case AFE_DL2_CUR_MSB:
2403	case AFE_DL2_CUR:
2404	case AFE_DL2_END:
2405	case AFE_DL3_CUR_MSB:
2406	case AFE_DL3_CUR:
2407	case AFE_DL3_END:
2408	case AFE_DL4_CUR_MSB:
2409	case AFE_DL4_CUR:
2410	case AFE_DL4_END:
2411	case AFE_DL12_CUR_MSB:
2412	case AFE_DL12_CUR:
2413	case AFE_DL12_END:
2414	case AFE_ADDA_SRC_DEBUG_MON0:
2415	case AFE_ADDA_SRC_DEBUG_MON1:
2416	case AFE_ADDA_UL_SRC_MON0:
2417	case AFE_ADDA_UL_SRC_MON1:
2418	case AFE_SECURE_CON0:
2419	case AFE_SRAM_BOUND:
2420	case AFE_SECURE_CON1:
2421	case AFE_VUL_CUR_MSB:
2422	case AFE_VUL_CUR:
2423	case AFE_VUL_END:
2424	case AFE_SIDETONE_MON:
2425	case AFE_SIDETONE_CON0:
2426	case AFE_SIDETONE_COEFF:
2427	case AFE_VUL2_CUR_MSB:
2428	case AFE_VUL2_CUR:
2429	case AFE_VUL2_END:
2430	case AFE_VUL3_CUR_MSB:
2431	case AFE_VUL3_CUR:
2432	case AFE_VUL3_END:
2433	case AFE_I2S_MON:
2434	case AFE_DAC_MON:
2435	case AFE_IRQ0_MCU_CNT_MON:
2436	case AFE_IRQ6_MCU_CNT_MON:
2437	case AFE_VUL4_CUR_MSB:
2438	case AFE_VUL4_CUR:
2439	case AFE_VUL4_END:
2440	case AFE_VUL12_CUR_MSB:
2441	case AFE_VUL12_CUR:
2442	case AFE_VUL12_END:
2443	case AFE_IRQ3_MCU_CNT_MON:
2444	case AFE_IRQ4_MCU_CNT_MON:
2445	case AFE_IRQ_MCU_STATUS:
2446	case AFE_IRQ_MCU_CLR:
2447	case AFE_IRQ_MCU_MON2:
2448	case AFE_IRQ1_MCU_CNT_MON:
2449	case AFE_IRQ2_MCU_CNT_MON:
2450	case AFE_IRQ5_MCU_CNT_MON:
2451	case AFE_IRQ7_MCU_CNT_MON:
2452	case AFE_IRQ_MCU_MISS_CLR:
2453	case AFE_GAIN1_CUR:
2454	case AFE_GAIN2_CUR:
2455	case AFE_SRAM_DELSEL_CON1:
2456	case PCM_INTF_CON2:
2457	case FPGA_CFG0:
2458	case FPGA_CFG1:
2459	case FPGA_CFG2:
2460	case FPGA_CFG3:
2461	case AUDIO_TOP_DBG_MON0:
2462	case AUDIO_TOP_DBG_MON1:
2463	case AFE_IRQ8_MCU_CNT_MON:
2464	case AFE_IRQ11_MCU_CNT_MON:
2465	case AFE_IRQ12_MCU_CNT_MON:
2466	case AFE_IRQ9_MCU_CNT_MON:
2467	case AFE_IRQ10_MCU_CNT_MON:
2468	case AFE_IRQ13_MCU_CNT_MON:
2469	case AFE_IRQ14_MCU_CNT_MON:
2470	case AFE_IRQ15_MCU_CNT_MON:
2471	case AFE_IRQ16_MCU_CNT_MON:
2472	case AFE_IRQ17_MCU_CNT_MON:
2473	case AFE_IRQ18_MCU_CNT_MON:
2474	case AFE_IRQ19_MCU_CNT_MON:
2475	case AFE_IRQ20_MCU_CNT_MON:
2476	case AFE_IRQ21_MCU_CNT_MON:
2477	case AFE_IRQ22_MCU_CNT_MON:
2478	case AFE_IRQ23_MCU_CNT_MON:
2479	case AFE_IRQ24_MCU_CNT_MON:
2480	case AFE_IRQ25_MCU_CNT_MON:
2481	case AFE_IRQ26_MCU_CNT_MON:
2482	case AFE_IRQ31_MCU_CNT_MON:
2483	case AFE_CBIP_MON0:
2484	case AFE_CBIP_SLV_MUX_MON0:
2485	case AFE_CBIP_SLV_DECODER_MON0:
2486	case AFE_ADDA6_MTKAIF_MON0:
2487	case AFE_ADDA6_MTKAIF_MON1:
2488	case AFE_AWB_CUR_MSB:
2489	case AFE_AWB_CUR:
2490	case AFE_AWB_END:
2491	case AFE_AWB2_CUR_MSB:
2492	case AFE_AWB2_CUR:
2493	case AFE_AWB2_END:
2494	case AFE_DAI_CUR_MSB:
2495	case AFE_DAI_CUR:
2496	case AFE_DAI_END:
2497	case AFE_DAI2_CUR_MSB:
2498	case AFE_DAI2_CUR:
2499	case AFE_DAI2_END:
2500	case AFE_ADDA6_SRC_DEBUG_MON0:
2501	case AFE_ADD6A_UL_SRC_MON0:
2502	case AFE_ADDA6_UL_SRC_MON1:
2503	case AFE_MOD_DAI_CUR_MSB:
2504	case AFE_MOD_DAI_CUR:
2505	case AFE_MOD_DAI_END:
2506	case AFE_AWB_RCH_MON:
2507	case AFE_AWB_LCH_MON:
2508	case AFE_VUL_RCH_MON:
2509	case AFE_VUL_LCH_MON:
2510	case AFE_VUL12_RCH_MON:
2511	case AFE_VUL12_LCH_MON:
2512	case AFE_VUL2_RCH_MON:
2513	case AFE_VUL2_LCH_MON:
2514	case AFE_DAI_DATA_MON:
2515	case AFE_MOD_DAI_DATA_MON:
2516	case AFE_DAI2_DATA_MON:
2517	case AFE_AWB2_RCH_MON:
2518	case AFE_AWB2_LCH_MON:
2519	case AFE_VUL3_RCH_MON:
2520	case AFE_VUL3_LCH_MON:
2521	case AFE_VUL4_RCH_MON:
2522	case AFE_VUL4_LCH_MON:
2523	case AFE_VUL5_RCH_MON:
2524	case AFE_VUL5_LCH_MON:
2525	case AFE_VUL6_RCH_MON:
2526	case AFE_VUL6_LCH_MON:
2527	case AFE_DL1_RCH_MON:
2528	case AFE_DL1_LCH_MON:
2529	case AFE_DL2_RCH_MON:
2530	case AFE_DL2_LCH_MON:
2531	case AFE_DL12_RCH1_MON:
2532	case AFE_DL12_LCH1_MON:
2533	case AFE_DL12_RCH2_MON:
2534	case AFE_DL12_LCH2_MON:
2535	case AFE_DL3_RCH_MON:
2536	case AFE_DL3_LCH_MON:
2537	case AFE_DL4_RCH_MON:
2538	case AFE_DL4_LCH_MON:
2539	case AFE_DL5_RCH_MON:
2540	case AFE_DL5_LCH_MON:
2541	case AFE_DL6_RCH_MON:
2542	case AFE_DL6_LCH_MON:
2543	case AFE_DL7_RCH_MON:
2544	case AFE_DL7_LCH_MON:
2545	case AFE_DL8_RCH_MON:
2546	case AFE_DL8_LCH_MON:
2547	case AFE_VUL5_CUR_MSB:
2548	case AFE_VUL5_CUR:
2549	case AFE_VUL5_END:
2550	case AFE_VUL6_CUR_MSB:
2551	case AFE_VUL6_CUR:
2552	case AFE_VUL6_END:
2553	case AFE_ADDA_DL_SDM_FIFO_MON:
2554	case AFE_ADDA_DL_SRC_LCH_MON:
2555	case AFE_ADDA_DL_SRC_RCH_MON:
2556	case AFE_ADDA_DL_SDM_OUT_MON:
2557	case AFE_CONNSYS_I2S_MON:
2558	case AFE_ASRC_2CH_CON0:
2559	case AFE_ASRC_2CH_CON2:
2560	case AFE_ASRC_2CH_CON3:
2561	case AFE_ASRC_2CH_CON4:
2562	case AFE_ASRC_2CH_CON5:
2563	case AFE_ASRC_2CH_CON7:
2564	case AFE_ASRC_2CH_CON8:
2565	case AFE_ASRC_2CH_CON12:
2566	case AFE_ASRC_2CH_CON13:
2567	case AFE_ADDA_MTKAIF_MON0:
2568	case AFE_ADDA_MTKAIF_MON1:
2569	case AFE_AUD_PAD_TOP:
2570	case AFE_DL_NLE_R_MON0:
2571	case AFE_DL_NLE_R_MON1:
2572	case AFE_DL_NLE_R_MON2:
2573	case AFE_DL_NLE_L_MON0:
2574	case AFE_DL_NLE_L_MON1:
2575	case AFE_DL_NLE_L_MON2:
2576	case AFE_GENERAL1_ASRC_2CH_CON0:
2577	case AFE_GENERAL1_ASRC_2CH_CON2:
2578	case AFE_GENERAL1_ASRC_2CH_CON3:
2579	case AFE_GENERAL1_ASRC_2CH_CON4:
2580	case AFE_GENERAL1_ASRC_2CH_CON5:
2581	case AFE_GENERAL1_ASRC_2CH_CON7:
2582	case AFE_GENERAL1_ASRC_2CH_CON8:
2583	case AFE_GENERAL1_ASRC_2CH_CON12:
2584	case AFE_GENERAL1_ASRC_2CH_CON13:
2585	case AFE_GENERAL2_ASRC_2CH_CON0:
2586	case AFE_GENERAL2_ASRC_2CH_CON2:
2587	case AFE_GENERAL2_ASRC_2CH_CON3:
2588	case AFE_GENERAL2_ASRC_2CH_CON4:
2589	case AFE_GENERAL2_ASRC_2CH_CON5:
2590	case AFE_GENERAL2_ASRC_2CH_CON7:
2591	case AFE_GENERAL2_ASRC_2CH_CON8:
2592	case AFE_GENERAL2_ASRC_2CH_CON12:
2593	case AFE_GENERAL2_ASRC_2CH_CON13:
2594	case AFE_DL5_CUR_MSB:
2595	case AFE_DL5_CUR:
2596	case AFE_DL5_END:
2597	case AFE_DL6_CUR_MSB:
2598	case AFE_DL6_CUR:
2599	case AFE_DL6_END:
2600	case AFE_DL7_CUR_MSB:
2601	case AFE_DL7_CUR:
2602	case AFE_DL7_END:
2603	case AFE_DL8_CUR_MSB:
2604	case AFE_DL8_CUR:
2605	case AFE_DL8_END:
2606	case AFE_PROT_SIDEBAND_MON:
2607	case AFE_DOMAIN_SIDEBAND0_MON:
2608	case AFE_DOMAIN_SIDEBAND1_MON:
2609	case AFE_DOMAIN_SIDEBAND2_MON:
2610	case AFE_DOMAIN_SIDEBAND3_MON:
2611	case AFE_APLL1_TUNER_CFG:	/* [20:31] is monitor */
2612	case AFE_APLL2_TUNER_CFG:	/* [20:31] is monitor */
2613		return true;
2614	default:
2615		return false;
2616	};
2617}
2618
2619static const struct regmap_config mt8186_afe_regmap_config = {
2620	.reg_bits = 32,
2621	.reg_stride = 4,
2622	.val_bits = 32,
2623
2624	.volatile_reg = mt8186_is_volatile_reg,
2625
2626	.max_register = AFE_MAX_REGISTER,
2627	.num_reg_defaults_raw = AFE_MAX_REGISTER,
2628
2629	.cache_type = REGCACHE_FLAT,
2630};
2631
2632static irqreturn_t mt8186_afe_irq_handler(int irq_id, void *dev)
2633{
2634	struct mtk_base_afe *afe = dev;
2635	struct mtk_base_afe_irq *irq;
2636	unsigned int status;
2637	unsigned int status_mcu;
2638	unsigned int mcu_en;
2639	int ret;
2640	int i;
2641
2642	/* get irq that is sent to MCU */
2643	ret = regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);
2644	if (ret) {
2645		dev_err(afe->dev, "%s, get irq direction fail, ret %d", __func__, ret);
2646		return ret;
2647	}
2648
2649	ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);
2650	/* only care IRQ which is sent to MCU */
2651	status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS;
2652
2653	if (ret || status_mcu == 0) {
2654		dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",
2655			__func__, ret, status, mcu_en);
2656
2657		goto err_irq;
2658	}
2659
2660	for (i = 0; i < MT8186_MEMIF_NUM; i++) {
2661		struct mtk_base_afe_memif *memif = &afe->memif[i];
2662
2663		if (!memif->substream)
2664			continue;
2665
2666		if (memif->irq_usage < 0)
2667			continue;
2668
2669		irq = &afe->irqs[memif->irq_usage];
2670
2671		if (status_mcu & (1 << irq->irq_data->irq_en_shift))
2672			snd_pcm_period_elapsed(memif->substream);
2673	}
2674
2675err_irq:
2676	/* clear irq */
2677	regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, status_mcu);
2678
2679	return IRQ_HANDLED;
2680}
2681
2682static int mt8186_afe_runtime_suspend(struct device *dev)
2683{
2684	struct mtk_base_afe *afe = dev_get_drvdata(dev);
2685	struct mt8186_afe_private *afe_priv = afe->platform_priv;
2686	unsigned int value = 0;
2687	int ret;
2688
2689	if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)
2690		goto skip_regmap;
2691
2692	/* disable AFE */
2693	regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x0);
2694
2695	ret = regmap_read_poll_timeout(afe->regmap,
2696				       AFE_DAC_MON,
2697				       value,
2698				       (value & AFE_ON_RETM_MASK_SFT) == 0,
2699				       20,
2700				       1 * 1000 * 1000);
2701	if (ret) {
2702		dev_err(afe->dev, "%s(), ret %d\n", __func__, ret);
2703		return ret;
2704	}
2705
2706	/* make sure all irq status are cleared */
2707	regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);
2708	regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);
2709
2710	/* reset sgen */
2711	regmap_write(afe->regmap, AFE_SINEGEN_CON0, 0x0);
2712	regmap_update_bits(afe->regmap, AFE_SINEGEN_CON2,
2713			   INNER_LOOP_BACK_MODE_MASK_SFT,
2714			   0x3f << INNER_LOOP_BACK_MODE_SFT);
2715
2716	/* cache only */
2717	regcache_cache_only(afe->regmap, true);
2718	regcache_mark_dirty(afe->regmap);
2719
2720skip_regmap:
2721	mt8186_afe_disable_cgs(afe);
2722	mt8186_afe_disable_clock(afe);
2723
2724	return 0;
2725}
2726
2727static int mt8186_afe_runtime_resume(struct device *dev)
2728{
2729	struct mtk_base_afe *afe = dev_get_drvdata(dev);
2730	struct mt8186_afe_private *afe_priv = afe->platform_priv;
2731	int ret;
2732
2733	ret = mt8186_afe_enable_clock(afe);
2734	if (ret)
2735		return ret;
2736
2737	ret = mt8186_afe_enable_cgs(afe);
2738	if (ret)
2739		return ret;
2740
2741	if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)
2742		goto skip_regmap;
2743
2744	regcache_cache_only(afe->regmap, false);
2745	regcache_sync(afe->regmap);
2746
2747	/* enable audio sys DCM for power saving */
2748	regmap_update_bits(afe_priv->infracfg, PERI_BUS_DCM_CTRL, BIT(29), BIT(29));
2749	regmap_update_bits(afe->regmap, AUDIO_TOP_CON0, BIT(29), BIT(29));
2750
2751	/* force cpu use 8_24 format when writing 32bit data */
2752	regmap_update_bits(afe->regmap, AFE_MEMIF_CON0, CPU_HD_ALIGN_MASK_SFT, 0);
2753
2754	/* set all output port to 24bit */
2755	regmap_write(afe->regmap, AFE_CONN_24BIT, 0xffffffff);
2756	regmap_write(afe->regmap, AFE_CONN_24BIT_1, 0xffffffff);
2757
2758	/* enable AFE */
2759	regmap_update_bits(afe->regmap, AFE_DAC_CON0, AUDIO_AFE_ON_MASK_SFT, BIT(0));
2760
2761skip_regmap:
2762	return 0;
2763}
2764
2765static int mt8186_afe_component_probe(struct snd_soc_component *component)
2766{
2767	mtk_afe_add_sub_dai_control(component);
2768	mt8186_add_misc_control(component);
2769
2770	return 0;
2771}
2772
2773static const struct snd_soc_component_driver mt8186_afe_component = {
2774	.name = AFE_PCM_NAME,
2775	.pcm_construct = mtk_afe_pcm_new,
2776	.pointer = mtk_afe_pcm_pointer,
2777	.probe = mt8186_afe_component_probe,
2778};
2779
2780static int mt8186_dai_memif_register(struct mtk_base_afe *afe)
2781{
2782	struct mtk_base_afe_dai *dai;
2783
2784	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
2785	if (!dai)
2786		return -ENOMEM;
2787
2788	list_add(&dai->list, &afe->sub_dais);
2789
2790	dai->dai_drivers = mt8186_memif_dai_driver;
2791	dai->num_dai_drivers = ARRAY_SIZE(mt8186_memif_dai_driver);
2792
2793	dai->controls = mt8186_pcm_kcontrols;
2794	dai->num_controls = ARRAY_SIZE(mt8186_pcm_kcontrols);
2795	dai->dapm_widgets = mt8186_memif_widgets;
2796	dai->num_dapm_widgets = ARRAY_SIZE(mt8186_memif_widgets);
2797	dai->dapm_routes = mt8186_memif_routes;
2798	dai->num_dapm_routes = ARRAY_SIZE(mt8186_memif_routes);
2799	return 0;
2800}
2801
2802typedef int (*dai_register_cb)(struct mtk_base_afe *);
2803static const dai_register_cb dai_register_cbs[] = {
2804	mt8186_dai_adda_register,
2805	mt8186_dai_i2s_register,
2806	mt8186_dai_tdm_register,
2807	mt8186_dai_hw_gain_register,
2808	mt8186_dai_src_register,
2809	mt8186_dai_pcm_register,
2810	mt8186_dai_hostless_register,
2811	mt8186_dai_memif_register,
2812};
2813
2814static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)
2815{
2816	struct mtk_base_afe *afe;
2817	struct mt8186_afe_private *afe_priv;
2818	struct reset_control *rstc;
2819	struct device *dev = &pdev->dev;
2820	int i, ret, irq_id;
2821
2822	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));
2823	if (ret)
2824		return ret;
2825
2826	afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);
2827	if (!afe)
2828		return -ENOMEM;
2829	platform_set_drvdata(pdev, afe);
2830
2831	afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv), GFP_KERNEL);
2832	if (!afe->platform_priv)
2833		return -ENOMEM;
2834
2835	afe_priv = afe->platform_priv;
2836	afe->dev = &pdev->dev;
2837
2838	afe->base_addr = devm_platform_ioremap_resource(pdev, 0);
2839	if (IS_ERR(afe->base_addr))
2840		return PTR_ERR(afe->base_addr);
2841
2842	/* init audio related clock */
2843	ret = mt8186_init_clock(afe);
2844	if (ret) {
2845		dev_err(dev, "init clock error, ret %d\n", ret);
2846		return ret;
2847	}
2848
2849	/* init memif */
2850	afe->memif_32bit_supported = 0;
2851	afe->memif_size = MT8186_MEMIF_NUM;
2852	afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif), GFP_KERNEL);
2853	if (!afe->memif)
2854		return -ENOMEM;
2855
2856	for (i = 0; i < afe->memif_size; i++) {
2857		afe->memif[i].data = &memif_data[i];
2858		afe->memif[i].irq_usage = memif_irq_usage[i];
2859		afe->memif[i].const_irq = 1;
2860	}
2861
2862	mutex_init(&afe->irq_alloc_lock);	/* needed when dynamic irq */
2863
2864	/* init irq */
2865	afe->irqs_size = MT8186_IRQ_NUM;
2866	afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
2867				 GFP_KERNEL);
2868
2869	if (!afe->irqs)
2870		return -ENOMEM;
2871
2872	for (i = 0; i < afe->irqs_size; i++)
2873		afe->irqs[i].irq_data = &irq_data[i];
2874
2875	/* request irq */
2876	irq_id = platform_get_irq(pdev, 0);
2877	if (irq_id <= 0)
2878		return dev_err_probe(dev, irq_id < 0 ? irq_id : -ENXIO,
2879				     "no irq found");
2880
2881	ret = devm_request_irq(dev, irq_id, mt8186_afe_irq_handler,
2882			       IRQF_TRIGGER_NONE,
2883			       "Afe_ISR_Handle", (void *)afe);
2884	if (ret)
2885		return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n");
2886
2887	ret = enable_irq_wake(irq_id);
2888	if (ret < 0)
2889		return dev_err_probe(dev, ret, "enable_irq_wake %d\n", irq_id);
2890
2891	/* init sub_dais */
2892	INIT_LIST_HEAD(&afe->sub_dais);
2893
2894	for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
2895		ret = dai_register_cbs[i](afe);
2896		if (ret)
2897			return dev_err_probe(dev, ret, "dai register i %d fail\n", i);
2898	}
2899
2900	/* init dai_driver and component_driver */
2901	ret = mtk_afe_combine_sub_dai(afe);
2902	if (ret)
2903		return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");
2904
2905	/* reset controller to reset audio regs before regmap cache */
2906	rstc = devm_reset_control_get_exclusive(dev, "audiosys");
2907	if (IS_ERR(rstc))
2908		return dev_err_probe(dev, PTR_ERR(rstc), "could not get audiosys reset\n");
2909
2910	ret = reset_control_reset(rstc);
2911	if (ret)
2912		return dev_err_probe(dev, ret, "failed to trigger audio reset\n");
2913
2914	/* enable clock for regcache get default value from hw */
2915	afe_priv->pm_runtime_bypass_reg_ctl = true;
2916
2917	ret = devm_pm_runtime_enable(dev);
2918	if (ret)
2919		return ret;
2920
2921	ret = pm_runtime_resume_and_get(dev);
2922	if (ret)
2923		return dev_err_probe(dev, ret, "failed to resume device\n");
2924
2925	afe->regmap = devm_regmap_init_mmio(dev, afe->base_addr,
2926					    &mt8186_afe_regmap_config);
2927	if (IS_ERR(afe->regmap)) {
2928		ret = PTR_ERR(afe->regmap);
2929		goto err_pm_disable;
2930	}
2931
2932	/* others */
2933	afe->mtk_afe_hardware = &mt8186_afe_hardware;
2934	afe->memif_fs = mt8186_memif_fs;
2935	afe->irq_fs = mt8186_irq_fs;
2936	afe->get_dai_fs = mt8186_get_dai_fs;
2937	afe->get_memif_pbuf_size = mt8186_get_memif_pbuf_size;
2938
2939	afe->runtime_resume = mt8186_afe_runtime_resume;
2940	afe->runtime_suspend = mt8186_afe_runtime_suspend;
2941
2942	/* register platform */
2943	dev_dbg(dev, "%s(), devm_snd_soc_register_component\n", __func__);
2944
2945	ret = devm_snd_soc_register_component(dev,
2946					      &mt8186_afe_component,
2947					      afe->dai_drivers,
2948					      afe->num_dai_drivers);
2949	if (ret) {
2950		dev_err(dev, "err_dai_component\n");
2951		goto err_pm_disable;
2952	}
2953
2954	ret = pm_runtime_put_sync(dev);
2955	if (ret) {
2956		pm_runtime_get_noresume(dev);
2957		dev_err(dev, "failed to suspend device: %d\n", ret);
2958		goto err_pm_disable;
2959	}
2960	afe_priv->pm_runtime_bypass_reg_ctl = false;
2961
2962	regcache_cache_only(afe->regmap, true);
2963	regcache_mark_dirty(afe->regmap);
2964
2965	return 0;
2966
2967err_pm_disable:
2968	pm_runtime_put_noidle(dev);
2969	pm_runtime_set_suspended(dev);
2970
2971	return ret;
2972}
2973
2974static const struct of_device_id mt8186_afe_pcm_dt_match[] = {
2975	{ .compatible = "mediatek,mt8186-sound", },
2976	{},
2977};
2978MODULE_DEVICE_TABLE(of, mt8186_afe_pcm_dt_match);
2979
2980static const struct dev_pm_ops mt8186_afe_pm_ops = {
2981	SET_RUNTIME_PM_OPS(mt8186_afe_runtime_suspend,
2982			   mt8186_afe_runtime_resume, NULL)
2983};
2984
2985static struct platform_driver mt8186_afe_pcm_driver = {
2986	.driver = {
2987		   .name = "mt8186-audio",
2988		   .of_match_table = mt8186_afe_pcm_dt_match,
2989		   .pm = &mt8186_afe_pm_ops,
2990	},
2991	.probe = mt8186_afe_pcm_dev_probe,
2992};
2993
2994module_platform_driver(mt8186_afe_pcm_driver);
2995
2996MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8186");
2997MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
2998MODULE_LICENSE("GPL v2");
2999