~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/mediatek/mt8186/mt8186-afe-pcm.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 25 static 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 
 40 static int mt8186_fe_startup(struct snd_pcm_substream *substream,
 41                              struct snd_soc_dai *dai)
 42 {
 43         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 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 
 82 static void mt8186_fe_shutdown(struct snd_pcm_substream *substream,
 83                                struct snd_soc_dai *dai)
 84 {
 85         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 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 
103 static 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 = snd_soc_substream_to_rtd(substream);
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 
138 static 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 
153 static 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 = snd_soc_substream_to_rtd(substream);
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 
252 static int mt8186_memif_fs(struct snd_pcm_substream *substream,
253                            unsigned int rate)
254 {
255         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
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 
264 static 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 
270 static int mt8186_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
271 {
272         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
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 
280 static 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 
290 static int mt8186_fe_prepare(struct snd_pcm_substream *substream,
291                              struct snd_soc_dai *dai)
292 {
293         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
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 */
330 static 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 
354 static 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 */
563 static 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 
576 static 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 
612 static 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 
625 static 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 
661 static 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 
674 static 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 
692 static 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*/
703 static 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 
714 static 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 
727 static 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 
738 static 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 
751 static 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 
778 static 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 
805 static 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 
814 static 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 
819 static 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 
826 static 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 
833 static 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 
838 static 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 
843 static 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 
864 static 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 
885 static 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 
894 static 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 
903 static 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 
908 static 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 
913 static 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 
942 static 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 
971 static 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 
1000 static 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 
1029 static 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 
1058 static 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 
1087 static 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 
1116 static 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 
1145 static 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 
1172 static 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 
1199 static 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 
1226 static 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 */
1254 enum {
1255         UL5_IN_MUX_CM1 = 0,
1256         UL5_IN_MUX_NORMAL,
1257         UL5_IN_MUX_MASK = 0x1,
1258 };
1259 
1260 static const char * const ul5_in_mux_map[] = {
1261         "UL5_IN_FROM_CM1", "UL5_IN_FROM_Normal"
1262 };
1263 
1264 static int ul5_in_map_value[] = {
1265         UL5_IN_MUX_CM1,
1266         UL5_IN_MUX_NORMAL,
1267 };
1268 
1269 static 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 
1276 static const struct snd_kcontrol_new ul5_in_mux_control =
1277         SOC_DAPM_ENUM("UL5_IN_MUX Select", ul5_in_mux_map_enum);
1278 
1279 static 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 
1373 static 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 
1526 static 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 
2014 static 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 
2368 static 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 
2389 static 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 
2619 static 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 
2632 static 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 
2675 err_irq:
2676         /* clear irq */
2677         regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, status_mcu);
2678 
2679         return IRQ_HANDLED;
2680 }
2681 
2682 static 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 
2720 skip_regmap:
2721         mt8186_afe_disable_cgs(afe);
2722         mt8186_afe_disable_clock(afe);
2723 
2724         return 0;
2725 }
2726 
2727 static 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 
2761 skip_regmap:
2762         return 0;
2763 }
2764 
2765 static 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 
2773 static 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 
2780 static 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 
2802 typedef int (*dai_register_cb)(struct mtk_base_afe *);
2803 static 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 
2814 static 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 
2967 err_pm_disable:
2968         pm_runtime_put_noidle(dev);
2969         pm_runtime_set_suspended(dev);
2970 
2971         return ret;
2972 }
2973 
2974 static const struct of_device_id mt8186_afe_pcm_dt_match[] = {
2975         { .compatible = "mediatek,mt8186-sound", },
2976         {},
2977 };
2978 MODULE_DEVICE_TABLE(of, mt8186_afe_pcm_dt_match);
2979 
2980 static 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 
2985 static 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 
2994 module_platform_driver(mt8186_afe_pcm_driver);
2995 
2996 MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8186");
2997 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
2998 MODULE_LICENSE("GPL v2");
2999 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php