Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/sound/soc/mediatek/mt8186/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 92 kB image not shown  

Quelle  mt8186-afe-pcm.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
//
// Mediatek ALSA SoC AFE platform driver for 8186
//
// Copyright (c) 2022 MediaTek Inc.
// Author: Jiaxin Yu <jiaxin.yu@mediatek.com>

#include <linux/delay.h>
#include <linux/dma-mapping.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_reserved_mem.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <sound/soc.h>

#include "../common/mtk-afe-platform-driver.h"
#include "../common/mtk-afe-fe-dai.h"

#include "mt8186-afe-common.h"
#include "mt8186-afe-clk.h"
#include "mt8186-afe-gpio.h"
#include "mt8186-interconnection.h"

static const struct snd_pcm_hardware mt8186_afe_hardware = {
 .info = (SNDRV_PCM_INFO_MMAP |
   SNDRV_PCM_INFO_INTERLEAVED |
   SNDRV_PCM_INFO_MMAP_VALID),
 .formats = (SNDRV_PCM_FMTBIT_S16_LE |
      SNDRV_PCM_FMTBIT_S24_LE |
      SNDRV_PCM_FMTBIT_S32_LE),
 .period_bytes_min = 96,
 .period_bytes_max = 4 * 48 * 1024,
 .periods_min = 2,
 .periods_max = 256,
 .buffer_bytes_max = 4 * 48 * 1024,
 .fifo_size = 0,
};

static int mt8186_fe_startup(struct snd_pcm_substream *substream,
        struct snd_soc_dai *dai)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 struct snd_pcm_runtime *runtime = substream->runtime;
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 struct mtk_base_afe_memif *memif = &afe->memif[id];
 const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware;
 int ret;

 memif->substream = substream;

 snd_pcm_hw_constraint_step(substream->runtime, 0,
       SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16);

 snd_soc_set_runtime_hwparams(substream, mtk_afe_hardware);

 ret = snd_pcm_hw_constraint_integer(runtime,
         SNDRV_PCM_HW_PARAM_PERIODS);
 if (ret < 0) {
  dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n");
  return ret;
 }

 /* dynamic allocate irq to memif */
 if (memif->irq_usage < 0) {
  int irq_id = mtk_dynamic_irq_acquire(afe);

  if (irq_id != afe->irqs_size) {
   /* link */
   memif->irq_usage = irq_id;
  } else {
   dev_err(afe->dev, "%s() error: no more asys irq\n",
    __func__);
   return -EBUSY;
  }
 }

 return 0;
}

static void mt8186_fe_shutdown(struct snd_pcm_substream *substream,
          struct snd_soc_dai *dai)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 struct mtk_base_afe_memif *memif = &afe->memif[id];
 int irq_id = memif->irq_usage;

 memif->substream = NULL;
 afe_priv->irq_cnt[id] = 0;
 afe_priv->xrun_assert[id] = 0;

 if (!memif->const_irq) {
  mtk_dynamic_irq_release(afe, irq_id);
  memif->irq_usage = -1;
  memif->substream = NULL;
 }
}

static int mt8186_fe_hw_params(struct snd_pcm_substream *substream,
          struct snd_pcm_hw_params *params,
          struct snd_soc_dai *dai)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 unsigned int channels = params_channels(params);
 unsigned int rate = params_rate(params);
 int ret;

 ret = mtk_afe_fe_hw_params(substream, params, dai);
 if (ret)
  return ret;

 /* channel merge configuration, enable control is in UL5_IN_MUX */
 if (id == MT8186_MEMIF_VUL3) {
  int update_cnt = 8;
  unsigned int val = 0;
  unsigned int mask = 0;
  int fs_mode = mt8186_rate_transform(afe->dev, rate, id);

  /* set rate, channel, update cnt, disable sgen */
  val = fs_mode << CM1_FS_SELECT_SFT |
   (channels - 1) << CHANNEL_MERGE0_CHNUM_SFT |
   update_cnt << CHANNEL_MERGE0_UPDATE_CNT_SFT;
  mask = CM1_FS_SELECT_MASK_SFT |
   CHANNEL_MERGE0_CHNUM_MASK_SFT |
   CHANNEL_MERGE0_UPDATE_CNT_MASK_SFT;
  regmap_update_bits(afe->regmap, AFE_CM1_CON, mask, val);
 }

 return 0;
}

static int mt8186_fe_hw_free(struct snd_pcm_substream *substream,
        struct snd_soc_dai *dai)
{
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 int ret;

 ret = mtk_afe_fe_hw_free(substream, dai);
 if (ret) {
  dev_err(afe->dev, "%s failed\n", __func__);
  return ret;
 }

 return 0;
}

static int mt8186_fe_trigger(struct snd_pcm_substream *substream, int cmd,
        struct snd_soc_dai *dai)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct snd_pcm_runtime * const runtime = substream->runtime;
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 struct mtk_base_afe_memif *memif = &afe->memif[id];
 int irq_id = memif->irq_usage;
 struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
 const struct mtk_base_irq_data *irq_data = irqs->irq_data;
 unsigned int rate = runtime->rate;
 unsigned int counter;
 int fs;
 int ret;

 dev_dbg(afe->dev, "%s(), %s cmd %d, irq_id %d\n",
  __func__, memif->data->name, cmd, irq_id);

 switch (cmd) {
 case SNDRV_PCM_TRIGGER_START:
 case SNDRV_PCM_TRIGGER_RESUME:
  ret = mtk_memif_set_enable(afe, id);
  if (ret) {
   dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
    __func__, id, ret);
   return ret;
  }

  /*
 * for small latency record
 * ul memif need read some data before irq enable
 */

  if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
      ((runtime->period_size * 1000) / rate <= 10))
   udelay(300);

  /* set irq counter */
  if (afe_priv->irq_cnt[id] > 0)
   counter = afe_priv->irq_cnt[id];
  else
   counter = runtime->period_size;

  regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
       irq_data->irq_cnt_maskbit
       << irq_data->irq_cnt_shift,
       counter << irq_data->irq_cnt_shift);

  /* set irq fs */
  fs = afe->irq_fs(substream, runtime->rate);
  if (fs < 0)
   return -EINVAL;

  regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,
       irq_data->irq_fs_maskbit
       << irq_data->irq_fs_shift,
       fs << irq_data->irq_fs_shift);

  /* enable interrupt */
  if (runtime->stop_threshold != ~(0U))
   regmap_update_bits(afe->regmap,
        irq_data->irq_en_reg,
        1 << irq_data->irq_en_shift,
        1 << irq_data->irq_en_shift);
  return 0;
 case SNDRV_PCM_TRIGGER_STOP:
 case SNDRV_PCM_TRIGGER_SUSPEND:
  if (afe_priv->xrun_assert[id] > 0) {
   if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
    int avail = snd_pcm_capture_avail(runtime);
    /* alsa can trigger stop/start when occur xrun */
    if (avail >= runtime->buffer_size)
     dev_dbg(afe->dev, "%s(), id %d, xrun assert\n",
      __func__, id);
   }
  }

  ret = mtk_memif_set_disable(afe, id);
  if (ret)
   dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
    __func__, id, ret);

  /* disable interrupt */
  if (runtime->stop_threshold != ~(0U))
   regmap_update_bits(afe->regmap,
        irq_data->irq_en_reg,
        1 << irq_data->irq_en_shift,
        0 << irq_data->irq_en_shift);

  /* clear pending IRQ */
  regmap_write(afe->regmap, irq_data->irq_clr_reg,
        1 << irq_data->irq_clr_shift);
  return ret;
 default:
  return -EINVAL;
 }
}

static int mt8186_memif_fs(struct snd_pcm_substream *substream,
      unsigned int rate)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct snd_soc_component *component =
  snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;

 return mt8186_rate_transform(afe->dev, rate, id);
}

static int mt8186_get_dai_fs(struct mtk_base_afe *afe,
        int dai_id, unsigned int rate)
{
 return mt8186_rate_transform(afe->dev, rate, dai_id);
}

static int mt8186_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct snd_soc_component *component =
  snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);

 return mt8186_general_rate_transform(afe->dev, rate);
}

static int mt8186_get_memif_pbuf_size(struct snd_pcm_substream *substream)
{
 struct snd_pcm_runtime *runtime = substream->runtime;

 if ((runtime->period_size * 1000) / runtime->rate > 10)
  return MT8186_MEMIF_PBUF_SIZE_256_BYTES;

 return MT8186_MEMIF_PBUF_SIZE_32_BYTES;
}

static int mt8186_fe_prepare(struct snd_pcm_substream *substream,
        struct snd_soc_dai *dai)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct snd_pcm_runtime * const runtime = substream->runtime;
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 struct mtk_base_afe_memif *memif = &afe->memif[id];
 int irq_id = memif->irq_usage;
 struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
 const struct mtk_base_irq_data *irq_data = irqs->irq_data;
 unsigned int counter = runtime->period_size;
 int fs;
 int ret;

 ret = mtk_afe_fe_prepare(substream, dai);
 if (ret)
  return ret;

 /* set irq counter */
 regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
      irq_data->irq_cnt_maskbit
      << irq_data->irq_cnt_shift,
      counter << irq_data->irq_cnt_shift);

 /* set irq fs */
 fs = afe->irq_fs(substream, runtime->rate);

 if (fs < 0)
  return -EINVAL;

 regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,
      irq_data->irq_fs_maskbit
      << irq_data->irq_fs_shift,
      fs << irq_data->irq_fs_shift);

 return 0;
}

/* FE DAIs */
static const struct snd_soc_dai_ops mt8186_memif_dai_ops = {
 .startup = mt8186_fe_startup,
 .shutdown = mt8186_fe_shutdown,
 .hw_params = mt8186_fe_hw_params,
 .hw_free = mt8186_fe_hw_free,
 .prepare = mt8186_fe_prepare,
 .trigger = mt8186_fe_trigger,
};

#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
         SNDRV_PCM_RATE_88200 |\
         SNDRV_PCM_RATE_96000 |\
         SNDRV_PCM_RATE_176400 |\
         SNDRV_PCM_RATE_192000)

#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\
      SNDRV_PCM_RATE_16000 |\
      SNDRV_PCM_RATE_32000 |\
      SNDRV_PCM_RATE_48000)

#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
    SNDRV_PCM_FMTBIT_S24_LE |\
    SNDRV_PCM_FMTBIT_S32_LE)

static struct snd_soc_dai_driver mt8186_memif_dai_driver[] = {
 /* FE DAIs: memory intefaces to CPU */
 {
  .name = "DL1",
  .id = MT8186_MEMIF_DL1,
  .playback = {
   .stream_name = "DL1",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL12",
  .id = MT8186_MEMIF_DL12,
  .playback = {
   .stream_name = "DL12",
   .channels_min = 1,
   .channels_max = 4,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL2",
  .id = MT8186_MEMIF_DL2,
  .playback = {
   .stream_name = "DL2",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL3",
  .id = MT8186_MEMIF_DL3,
  .playback = {
   .stream_name = "DL3",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL4",
  .id = MT8186_MEMIF_DL4,
  .playback = {
   .stream_name = "DL4",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL5",
  .id = MT8186_MEMIF_DL5,
  .playback = {
   .stream_name = "DL5",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL6",
  .id = MT8186_MEMIF_DL6,
  .playback = {
   .stream_name = "DL6",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL7",
  .id = MT8186_MEMIF_DL7,
  .playback = {
   .stream_name = "DL7",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "DL8",
  .id = MT8186_MEMIF_DL8,
  .playback = {
   .stream_name = "DL8",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL1",
  .id = MT8186_MEMIF_VUL12,
  .capture = {
   .stream_name = "UL1",
   .channels_min = 1,
   .channels_max = 4,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL2",
  .id = MT8186_MEMIF_AWB,
  .capture = {
   .stream_name = "UL2",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL3",
  .id = MT8186_MEMIF_VUL2,
  .capture = {
   .stream_name = "UL3",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL4",
  .id = MT8186_MEMIF_AWB2,
  .capture = {
   .stream_name = "UL4",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL5",
  .id = MT8186_MEMIF_VUL3,
  .capture = {
   .stream_name = "UL5",
   .channels_min = 1,
   .channels_max = 12,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL6",
  .id = MT8186_MEMIF_VUL4,
  .capture = {
   .stream_name = "UL6",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL7",
  .id = MT8186_MEMIF_VUL5,
  .capture = {
   .stream_name = "UL7",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 },
 {
  .name = "UL8",
  .id = MT8186_MEMIF_VUL6,
  .capture = {
   .stream_name = "UL8",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8186_memif_dai_ops,
 }
};

/* kcontrol */
static int mt8186_irq_cnt1_get(struct snd_kcontrol *kcontrol,
          struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;

 ucontrol->value.integer.value[0] =
  afe_priv->irq_cnt[MT8186_PRIMARY_MEMIF];

 return 0;
}

static int mt8186_irq_cnt1_set(struct snd_kcontrol *kcontrol,
          struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;
 int memif_num = MT8186_PRIMARY_MEMIF;
 struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
 int irq_id = memif->irq_usage;
 int irq_cnt = afe_priv->irq_cnt[memif_num];

 dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n",
  __func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]);

 if (irq_cnt == ucontrol->value.integer.value[0])
  return 0;

 irq_cnt = ucontrol->value.integer.value[0];
 afe_priv->irq_cnt[memif_num] = irq_cnt;

 if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) {
  struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
  const struct mtk_base_irq_data *irq_data = irqs->irq_data;

  regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
       irq_data->irq_cnt_maskbit
       << irq_data->irq_cnt_shift,
       irq_cnt << irq_data->irq_cnt_shift);
 } else {
  dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n",
   __func__, irq_id);
 }

 return 1;
}

static int mt8186_irq_cnt2_get(struct snd_kcontrol *kcontrol,
          struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;

 ucontrol->value.integer.value[0] =
  afe_priv->irq_cnt[MT8186_RECORD_MEMIF];

 return 0;
}

static int mt8186_irq_cnt2_set(struct snd_kcontrol *kcontrol,
          struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;
 int memif_num = MT8186_RECORD_MEMIF;
 struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
 int irq_id = memif->irq_usage;
 int irq_cnt = afe_priv->irq_cnt[memif_num];

 dev_dbg(afe->dev, "%s(), irq_id %d, irq_cnt = %d, value = %ld\n",
  __func__, irq_id, irq_cnt, ucontrol->value.integer.value[0]);

 if (irq_cnt == ucontrol->value.integer.value[0])
  return 0;

 irq_cnt = ucontrol->value.integer.value[0];
 afe_priv->irq_cnt[memif_num] = irq_cnt;

 if (!pm_runtime_status_suspended(afe->dev) && irq_id >= 0) {
  struct mtk_base_afe_irq *irqs = &afe->irqs[irq_id];
  const struct mtk_base_irq_data *irq_data = irqs->irq_data;

  regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
       irq_data->irq_cnt_maskbit
       << irq_data->irq_cnt_shift,
       irq_cnt << irq_data->irq_cnt_shift);
 } else {
  dev_dbg(afe->dev, "%s(), suspended || irq_id %d, not set\n",
   __func__, irq_id);
 }

 return 1;
}

static int mt8186_record_xrun_assert_get(struct snd_kcontrol *kcontrol,
      struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;
 int xrun_assert = afe_priv->xrun_assert[MT8186_RECORD_MEMIF];

 ucontrol->value.integer.value[0] = xrun_assert;

 return 0;
}

static int mt8186_record_xrun_assert_set(struct snd_kcontrol *kcontrol,
      struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 struct mt8186_afe_private *afe_priv = afe->platform_priv;
 int xrun_assert = ucontrol->value.integer.value[0];

 dev_dbg(afe->dev, "%s(), xrun_assert %d\n", __func__, xrun_assert);

 if (xrun_assert == afe_priv->xrun_assert[MT8186_RECORD_MEMIF])
  return 0;

 afe_priv->xrun_assert[MT8186_RECORD_MEMIF] = xrun_assert;

 return 1;
}

static const struct snd_kcontrol_new mt8186_pcm_kcontrols[] = {
 SOC_SINGLE_EXT("Audio IRQ1 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0,
         mt8186_irq_cnt1_get, mt8186_irq_cnt1_set),
 SOC_SINGLE_EXT("Audio IRQ2 CNT", SND_SOC_NOPM, 0, 0x3ffff, 0,
         mt8186_irq_cnt2_get, mt8186_irq_cnt2_set),
 SOC_SINGLE_EXT("record_xrun_assert", SND_SOC_NOPM, 0, 0x1, 0,
         mt8186_record_xrun_assert_get,
         mt8186_record_xrun_assert_set),
};

/* dma widget & routes*/
static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN21,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN21,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN21,
        I_ADDA_UL_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN21_1,
        I_TDM_IN_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN22,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN22,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN22,
        I_ADDA_UL_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN22,
        I_ADDA_UL_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN22_1,
        I_TDM_IN_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul1_ch3_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN9,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN9,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN9,
        I_ADDA_UL_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN9_1,
        I_TDM_IN_CH3, 1, 0),
};

static const struct snd_kcontrol_new memif_ul1_ch4_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN10,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN10,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3 Switch", AFE_CONN10,
        I_ADDA_UL_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4 Switch", AFE_CONN10,
        I_ADDA_UL_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN10_1,
        I_TDM_IN_CH4, 1, 0),
};

static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN5,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN5,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN5,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN5,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN5,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN5_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN5_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN5_1,
        I_DL6_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN5,
        I_PCM_1_CAP_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN5,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN5_1,
        I_CONNSYS_I2S_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1 Switch", AFE_CONN5_1,
        I_SRC_1_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN6,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN6,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN6,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN6,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN6,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN6_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN6_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN6_1,
        I_DL6_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN6,
        I_PCM_1_CAP_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN6,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN6_1,
        I_CONNSYS_I2S_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2 Switch", AFE_CONN6_1,
        I_SRC_1_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN32_1,
        I_CONNSYS_I2S_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN32,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN32,
        I_DL2_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN33_1,
        I_CONNSYS_I2S_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN38,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN38,
        I_I2S0_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN39,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN39,
        I_I2S0_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN44,
        I_ADDA_UL_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN45,
        I_ADDA_UL_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN46,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN46,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN46,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1 Switch", AFE_CONN46_1,
        I_DL6_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN46,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN46,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN46_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1 Switch", AFE_CONN46,
        I_PCM_1_CAP_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1 Switch", AFE_CONN46,
        I_GAIN1_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN47,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN47,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN47,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2 Switch", AFE_CONN47_1,
        I_DL6_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN47,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN47,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN47_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2 Switch", AFE_CONN47,
        I_PCM_1_CAP_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2 Switch", AFE_CONN47,
        I_GAIN1_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN48,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH1 Switch", AFE_CONN48,
        I_GAIN2_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1 Switch", AFE_CONN48_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN49,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN2_OUT_CH2 Switch", AFE_CONN49,
        I_GAIN2_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2 Switch", AFE_CONN49_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN50,
        I_ADDA_UL_CH1, 1, 0),
};

static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN51,
        I_ADDA_UL_CH2, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch1_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH1 Switch", AFE_CONN58_1,
        I_TDM_IN_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN58,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN58,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN58,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN58,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN58,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN58,
        I_DL12_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN58,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN58,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN58_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN58_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN58_1,
        I_SRC_1_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN58_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch2_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH2 Switch", AFE_CONN59_1,
        I_TDM_IN_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN59,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN59,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN59,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN59,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN59,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN59,
        I_DL12_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN59,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN59,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN59_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN59_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN59_1,
        I_SRC_1_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN59_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch3_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH3 Switch", AFE_CONN60_1,
        I_TDM_IN_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN60,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN60,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN60,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN60,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN60,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN60,
        I_DL12_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN60,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN60,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN60_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN60_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN60_1,
        I_SRC_1_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN60_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch4_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH4 Switch", AFE_CONN61_1,
        I_TDM_IN_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN61,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN61,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN61,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN61,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN61,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN61,
        I_DL12_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN61,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN61,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN61_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN61_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN61_1,
        I_SRC_1_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN61_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch5_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH5 Switch", AFE_CONN62_1,
        I_TDM_IN_CH5, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN62,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN62,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN62,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN62,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN62,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN62,
        I_DL12_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN62,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN62,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN62_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN62_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN62_1,
        I_SRC_1_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN62_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch6_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH6 Switch", AFE_CONN63_1,
        I_TDM_IN_CH6, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN63,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN63,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN63,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN63,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN63,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN63,
        I_DL12_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN63,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN63,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN63_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN63_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN63_1,
        I_SRC_1_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN63_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch7_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH7 Switch", AFE_CONN64_1,
        I_TDM_IN_CH7, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN64,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN64,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN64,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN64,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1v", AFE_CONN64,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN64,
        I_DL12_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN64,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN64,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN64_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN64_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN64_1,
        I_SRC_1_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN64_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch8_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("TDM_IN_CH8 Switch", AFE_CONN65_1,
        I_TDM_IN_CH8, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN65,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN65,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN65,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN65,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN65,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN65,
        I_DL12_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN65,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN65,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN65_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN65_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN65_1,
        I_SRC_1_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN65_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch9_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN66,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN66,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN66,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN66,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN66,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN66,
        I_DL12_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN66,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN66,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN66_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN66_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN66_1,
        I_SRC_1_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN66_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch10_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN67,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN67,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN67,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN67,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN67,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN67,
        I_DL12_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN67,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN67,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN67_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN67_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN67_1,
        I_SRC_1_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN67_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch11_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1 Switch", AFE_CONN68,
        I_I2S0_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1 Switch", AFE_CONN68,
        I_I2S2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1 Switch", AFE_CONN68,
        I_ADDA_UL_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1 Switch", AFE_CONN68,
        I_DL1_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1 Switch", AFE_CONN68,
        I_DL12_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH3 Switch", AFE_CONN68,
        I_DL12_CH3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1 Switch", AFE_CONN68,
        I_DL2_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1 Switch", AFE_CONN68,
        I_DL3_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1 Switch", AFE_CONN68_1,
        I_DL4_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1 Switch", AFE_CONN68_1,
        I_DL5_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH1 Switch", AFE_CONN68_1,
        I_SRC_1_OUT_CH1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH1 Switch", AFE_CONN68_1,
        I_SRC_2_OUT_CH1, 1, 0),
};

static const struct snd_kcontrol_new hw_cm1_ch12_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2 Switch", AFE_CONN69,
        I_I2S0_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2 Switch", AFE_CONN69,
        I_I2S2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2 Switch", AFE_CONN69,
        I_ADDA_UL_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2 Switch", AFE_CONN69,
        I_DL1_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2 Switch", AFE_CONN69,
        I_DL12_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH4 Switch", AFE_CONN69,
        I_DL12_CH4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2 Switch", AFE_CONN69,
        I_DL2_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2 Switch", AFE_CONN69,
        I_DL3_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2 Switch", AFE_CONN69_1,
        I_DL4_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2 Switch", AFE_CONN69_1,
        I_DL5_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC1_OUT_CH2 Switch", AFE_CONN69_1,
        I_SRC_1_OUT_CH2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC2_OUT_CH2 Switch", AFE_CONN69_1,
        I_SRC_2_OUT_CH2, 1, 0),
};

/* ADDA UL MUX */
enum {
 UL5_IN_MUX_CM1 = 0,
 UL5_IN_MUX_NORMAL,
 UL5_IN_MUX_MASK = 0x1,
};

static const char * const ul5_in_mux_map[] = {
 "UL5_IN_FROM_CM1""UL5_IN_FROM_Normal"
};

static int ul5_in_map_value[] = {
 UL5_IN_MUX_CM1,
 UL5_IN_MUX_NORMAL,
};

static SOC_VALUE_ENUM_SINGLE_DECL(ul5_in_mux_map_enum,
      AFE_CM1_CON,
      VUL3_BYPASS_CM_SFT,
      VUL3_BYPASS_CM_MASK,
      ul5_in_mux_map,
      ul5_in_map_value);

static const struct snd_kcontrol_new ul5_in_mux_control =
 SOC_DAPM_ENUM("UL5_IN_MUX Select", ul5_in_mux_map_enum);

static const struct snd_soc_dapm_widget mt8186_memif_widgets[] = {
 /* inter-connections */
 SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),
 SND_SOC_DAPM_MIXER("UL1_CH3", SND_SOC_NOPM, 0, 0,
      memif_ul1_ch3_mix, ARRAY_SIZE(memif_ul1_ch3_mix)),
 SND_SOC_DAPM_MIXER("UL1_CH4", SND_SOC_NOPM, 0, 0,
      memif_ul1_ch4_mix, ARRAY_SIZE(memif_ul1_ch4_mix)),

 SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0,
      memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)),
 SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0,
      memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)),

 SND_SOC_DAPM_MIXER("UL5_2CH", SND_SOC_NOPM, 0, 0, NULL, 0),

 SND_SOC_DAPM_MIXER("HW_CM1", SND_SOC_NOPM, 0, 0, NULL, 0),

 /* CM1 en*/
 SND_SOC_DAPM_SUPPLY_S("CM1_EN", 0, AFE_CM1_CON,
         CHANNEL_MERGE0_EN_SFT, 0, NULL,
         SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),

 SND_SOC_DAPM_MIXER("HW_CM1_CH1", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch1_mix, ARRAY_SIZE(hw_cm1_ch1_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH2", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch2_mix, ARRAY_SIZE(hw_cm1_ch2_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH3", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch3_mix, ARRAY_SIZE(hw_cm1_ch3_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH4", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch4_mix, ARRAY_SIZE(hw_cm1_ch4_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH5", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch5_mix, ARRAY_SIZE(hw_cm1_ch5_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH6", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch6_mix, ARRAY_SIZE(hw_cm1_ch6_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH7", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch7_mix, ARRAY_SIZE(hw_cm1_ch7_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH8", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch8_mix, ARRAY_SIZE(hw_cm1_ch8_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH9", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch9_mix, ARRAY_SIZE(hw_cm1_ch9_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH10", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch10_mix, ARRAY_SIZE(hw_cm1_ch10_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH11", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch11_mix, ARRAY_SIZE(hw_cm1_ch11_mix)),
 SND_SOC_DAPM_MIXER("HW_CM1_CH12", SND_SOC_NOPM, 0, 0,
      hw_cm1_ch12_mix, ARRAY_SIZE(hw_cm1_ch12_mix)),

 SND_SOC_DAPM_MUX("UL5_IN_MUX", SND_SOC_NOPM, 0, 0,
    &ul5_in_mux_control),

 SND_SOC_DAPM_MIXER("DSP_DL1_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("DSP_DL2_VIRT", SND_SOC_NOPM, 0, 0, NULL, 0),

 SND_SOC_DAPM_INPUT("UL1_VIRTUAL_INPUT"),
 SND_SOC_DAPM_INPUT("UL2_VIRTUAL_INPUT"),
 SND_SOC_DAPM_INPUT("UL3_VIRTUAL_INPUT"),
 SND_SOC_DAPM_INPUT("UL4_VIRTUAL_INPUT"),
 SND_SOC_DAPM_INPUT("UL5_VIRTUAL_INPUT"),
 SND_SOC_DAPM_INPUT("UL6_VIRTUAL_INPUT"),
};

static const struct snd_soc_dapm_route mt8186_memif_routes[] = {
 {"UL1", NULL, "UL1_CH1"},
 {"UL1", NULL, "UL1_CH2"},
 {"UL1", NULL, "UL1_CH3"},
 {"UL1", NULL, "UL1_CH4"},
 {"UL1_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL1_CH1""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL1_CH2""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL1_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL1_CH3""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL1_CH3""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL1_CH4""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL1_CH4""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL1_CH1""TDM_IN_CH1 Switch""TDM IN"},
 {"UL1_CH2""TDM_IN_CH2 Switch""TDM IN"},
 {"UL1_CH3""TDM_IN_CH3 Switch""TDM IN"},
 {"UL1_CH4""TDM_IN_CH4 Switch""TDM IN"},

 {"UL2", NULL, "UL2_CH1"},
 {"UL2", NULL, "UL2_CH2"},

 /* cannot connect FE to FE directly */
 {"UL2_CH1""DL1_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL1_CH2 Switch""Hostless_UL2 UL"},
 {"UL2_CH1""DL12_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL12_CH2 Switch""Hostless_UL2 UL"},
 {"UL2_CH1""DL6_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL6_CH2 Switch""Hostless_UL2 UL"},
 {"UL2_CH1""DL2_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL2_CH2 Switch""Hostless_UL2 UL"},
 {"UL2_CH1""DL3_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL3_CH2 Switch""Hostless_UL2 UL"},
 {"UL2_CH1""DL4_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL4_CH2 Switch""Hostless_UL2 UL"},
 {"UL2_CH1""DL5_CH1 Switch""Hostless_UL2 UL"},
 {"UL2_CH2""DL5_CH2 Switch""Hostless_UL2 UL"},

 {"Hostless_UL2 UL", NULL, "UL2_VIRTUAL_INPUT"},

 {"UL2_CH1""I2S0_CH1 Switch""I2S0"},
 {"UL2_CH2""I2S0_CH2 Switch""I2S0"},
 {"UL2_CH1""I2S2_CH1 Switch""I2S2"},
 {"UL2_CH2""I2S2_CH2 Switch""I2S2"},

 {"UL2_CH1""PCM_1_CAP_CH1 Switch""PCM 1 Capture"},
 {"UL2_CH2""PCM_1_CAP_CH2 Switch""PCM 1 Capture"},

 {"UL2_CH1""CONNSYS_I2S_CH1 Switch""Connsys I2S"},
 {"UL2_CH2""CONNSYS_I2S_CH2 Switch""Connsys I2S"},

 {"UL2_CH1""SRC_1_OUT_CH1 Switch""HW_SRC_1_Out"},
 {"UL2_CH2""SRC_1_OUT_CH2 Switch""HW_SRC_1_Out"},

 {"UL3", NULL, "UL3_CH1"},
 {"UL3", NULL, "UL3_CH2"},
 {"UL3_CH1""CONNSYS_I2S_CH1 Switch""Connsys I2S"},
 {"UL3_CH2""CONNSYS_I2S_CH2 Switch""Connsys I2S"},

 {"UL4", NULL, "UL4_CH1"},
 {"UL4", NULL, "UL4_CH2"},
 {"UL4_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL4_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL4_CH1""I2S0_CH1 Switch""I2S0"},
 {"UL4_CH2""I2S0_CH2 Switch""I2S0"},

 {"UL5", NULL, "UL5_IN_MUX"},
 {"UL5_IN_MUX""UL5_IN_FROM_Normal""UL5_2CH"},
 {"UL5_IN_MUX""UL5_IN_FROM_CM1""HW_CM1"},
 {"UL5_2CH", NULL, "UL5_CH1"},
 {"UL5_2CH", NULL, "UL5_CH2"},
 {"UL5_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL5_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"HW_CM1", NULL, "CM1_EN"},
 {"HW_CM1", NULL, "HW_CM1_CH1"},
 {"HW_CM1", NULL, "HW_CM1_CH2"},
 {"HW_CM1", NULL, "HW_CM1_CH3"},
 {"HW_CM1", NULL, "HW_CM1_CH4"},
 {"HW_CM1", NULL, "HW_CM1_CH5"},
 {"HW_CM1", NULL, "HW_CM1_CH6"},
 {"HW_CM1", NULL, "HW_CM1_CH7"},
 {"HW_CM1", NULL, "HW_CM1_CH8"},
 {"HW_CM1", NULL, "HW_CM1_CH9"},
 {"HW_CM1", NULL, "HW_CM1_CH10"},
 {"HW_CM1", NULL, "HW_CM1_CH11"},
 {"HW_CM1", NULL, "HW_CM1_CH12"},
 {"HW_CM1_CH1""TDM_IN_CH1 Switch""TDM IN"},
 {"HW_CM1_CH2""TDM_IN_CH2 Switch""TDM IN"},
 {"HW_CM1_CH3""TDM_IN_CH3 Switch""TDM IN"},
 {"HW_CM1_CH4""TDM_IN_CH4 Switch""TDM IN"},
 {"HW_CM1_CH5""TDM_IN_CH5 Switch""TDM IN"},
 {"HW_CM1_CH6""TDM_IN_CH6 Switch""TDM IN"},
 {"HW_CM1_CH7""TDM_IN_CH7 Switch""TDM IN"},
 {"HW_CM1_CH8""TDM_IN_CH8 Switch""TDM IN"},
 {"HW_CM1_CH9""DL1_CH1 Switch""Hostless_UL5 UL"},
 {"HW_CM1_CH10""DL1_CH2 Switch""Hostless_UL5 UL"},

 {"HW_CM1_CH3""DL1_CH1 Switch""Hostless_UL5 UL"},
 {"HW_CM1_CH4""DL1_CH2 Switch""Hostless_UL5 UL"},

 {"HW_CM1_CH3""DL3_CH1 Switch""Hostless_UL5 UL"},
 {"HW_CM1_CH4""DL3_CH2 Switch""Hostless_UL5 UL"},

 {"HW_CM1_CH5""HW_SRC1_OUT_CH1 Switch""HW_SRC_1_Out"},
 {"HW_CM1_CH6""HW_SRC1_OUT_CH2 Switch""HW_SRC_1_Out"},

 {"HW_CM1_CH9""DL12_CH1 Switch""Hostless_UL5 UL"},
 {"HW_CM1_CH10""DL12_CH2 Switch""Hostless_UL5 UL"},
 {"HW_CM1_CH11""DL12_CH3 Switch""Hostless_UL5 UL"},
 {"HW_CM1_CH12""DL12_CH4 Switch""Hostless_UL5 UL"},

 {"Hostless_UL5 UL", NULL, "UL5_VIRTUAL_INPUT"},

 {"UL6", NULL, "UL6_CH1"},
 {"UL6", NULL, "UL6_CH2"},

 {"UL6_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL6_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL6_CH1""DL1_CH1 Switch""Hostless_UL6 UL"},
 {"UL6_CH2""DL1_CH2 Switch""Hostless_UL6 UL"},
 {"UL6_CH1""DL2_CH1 Switch""Hostless_UL6 UL"},
 {"UL6_CH2""DL2_CH2 Switch""Hostless_UL6 UL"},
 {"UL6_CH1""DL12_CH1 Switch""Hostless_UL6 UL"},
 {"UL6_CH2""DL12_CH2 Switch""Hostless_UL6 UL"},
 {"UL6_CH1""DL6_CH1 Switch""Hostless_UL6 UL"},
 {"UL6_CH2""DL6_CH2 Switch""Hostless_UL6 UL"},
 {"UL6_CH1""DL3_CH1 Switch""Hostless_UL6 UL"},
 {"UL6_CH2""DL3_CH2 Switch""Hostless_UL6 UL"},
 {"UL6_CH1""DL4_CH1 Switch""Hostless_UL6 UL"},
 {"UL6_CH2""DL4_CH2 Switch""Hostless_UL6 UL"},
 {"Hostless_UL6 UL", NULL, "UL6_VIRTUAL_INPUT"},
 {"UL6_CH1""PCM_1_CAP_CH1 Switch""PCM 1 Capture"},
 {"UL6_CH2""PCM_1_CAP_CH2 Switch""PCM 1 Capture"},
 {"UL6_CH1""GAIN1_OUT_CH1 Switch""HW Gain 1 Out"},
 {"UL6_CH2""GAIN1_OUT_CH2 Switch""HW Gain 1 Out"},

 {"UL7", NULL, "UL7_CH1"},
 {"UL7", NULL, "UL7_CH2"},
 {"UL7_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL7_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
 {"UL7_CH1""HW_GAIN2_OUT_CH1 Switch""HW Gain 2 Out"},
 {"UL7_CH2""HW_GAIN2_OUT_CH2 Switch""HW Gain 2 Out"},
 {"UL7_CH1""HW_SRC_2_OUT_CH1 Switch""HW_SRC_2_Out"},
 {"UL7_CH2""HW_SRC_2_OUT_CH2 Switch""HW_SRC_2_Out"},

 {"UL8", NULL, "UL8_CH1"},
 {"UL8", NULL, "UL8_CH2"},
 {"UL8_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"UL8_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},

 {"HW_GAIN2_IN_CH1""ADDA_UL_CH1 Switch""ADDA_UL_Mux"},
 {"HW_GAIN2_IN_CH2""ADDA_UL_CH2 Switch""ADDA_UL_Mux"},
};

static const struct mtk_base_memif_data memif_data[MT8186_MEMIF_NUM] = {
 [MT8186_MEMIF_DL1] = {
  .name = "DL1",
  .id = MT8186_MEMIF_DL1,
  .reg_ofs_base = AFE_DL1_BASE,
  .reg_ofs_cur = AFE_DL1_CUR,
  .reg_ofs_end = AFE_DL1_END,
  .reg_ofs_base_msb = AFE_DL1_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL1_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL1_END_MSB,
  .fs_reg = AFE_DL1_CON0,
  .fs_shift = DL1_MODE_SFT,
  .fs_maskbit = DL1_MODE_MASK,
  .mono_reg = AFE_DL1_CON0,
  .mono_shift = DL1_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL1_ON_SFT,
  .hd_reg = AFE_DL1_CON0,
  .hd_shift = DL1_HD_MODE_SFT,
  .hd_align_reg = AFE_DL1_CON0,
  .hd_align_mshift = DL1_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL1_CON0,
  .pbuf_mask = DL1_PBUF_SIZE_MASK,
  .pbuf_shift = DL1_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL1_CON0,
  .minlen_mask = DL1_MINLEN_MASK,
  .minlen_shift = DL1_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL12] = {
  .name = "DL12",
  .id = MT8186_MEMIF_DL12,
  .reg_ofs_base = AFE_DL12_BASE,
  .reg_ofs_cur = AFE_DL12_CUR,
  .reg_ofs_end = AFE_DL12_END,
  .reg_ofs_base_msb = AFE_DL12_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL12_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL12_END_MSB,
  .fs_reg = AFE_DL12_CON0,
  .fs_shift = DL12_MODE_SFT,
  .fs_maskbit = DL12_MODE_MASK,
  .mono_reg = AFE_DL12_CON0,
  .mono_shift = DL12_MONO_SFT,
  .quad_ch_reg = AFE_DL12_CON0,
  .quad_ch_mask = DL12_4CH_EN_MASK,
  .quad_ch_shift = DL12_4CH_EN_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL12_ON_SFT,
  .hd_reg = AFE_DL12_CON0,
  .hd_shift = DL12_HD_MODE_SFT,
  .hd_align_reg = AFE_DL12_CON0,
  .hd_align_mshift = DL12_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL12_CON0,
  .pbuf_mask = DL12_PBUF_SIZE_MASK,
  .pbuf_shift = DL12_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL12_CON0,
  .minlen_mask = DL12_MINLEN_MASK,
  .minlen_shift = DL12_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL2] = {
  .name = "DL2",
  .id = MT8186_MEMIF_DL2,
  .reg_ofs_base = AFE_DL2_BASE,
  .reg_ofs_cur = AFE_DL2_CUR,
  .reg_ofs_end = AFE_DL2_END,
  .reg_ofs_base_msb = AFE_DL2_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL2_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL2_END_MSB,
  .fs_reg = AFE_DL2_CON0,
  .fs_shift = DL2_MODE_SFT,
  .fs_maskbit = DL2_MODE_MASK,
  .mono_reg = AFE_DL2_CON0,
  .mono_shift = DL2_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL2_ON_SFT,
  .hd_reg = AFE_DL2_CON0,
  .hd_shift = DL2_HD_MODE_SFT,
  .hd_align_reg = AFE_DL2_CON0,
  .hd_align_mshift = DL2_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL2_CON0,
  .pbuf_mask = DL2_PBUF_SIZE_MASK,
  .pbuf_shift = DL2_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL2_CON0,
  .minlen_mask = DL2_MINLEN_MASK,
  .minlen_shift = DL2_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL3] = {
  .name = "DL3",
  .id = MT8186_MEMIF_DL3,
  .reg_ofs_base = AFE_DL3_BASE,
  .reg_ofs_cur = AFE_DL3_CUR,
  .reg_ofs_end = AFE_DL3_END,
  .reg_ofs_base_msb = AFE_DL3_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL3_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL3_END_MSB,
  .fs_reg = AFE_DL3_CON0,
  .fs_shift = DL3_MODE_SFT,
  .fs_maskbit = DL3_MODE_MASK,
  .mono_reg = AFE_DL3_CON0,
  .mono_shift = DL3_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL3_ON_SFT,
  .hd_reg = AFE_DL3_CON0,
  .hd_shift = DL3_HD_MODE_SFT,
  .hd_align_reg = AFE_DL3_CON0,
  .hd_align_mshift = DL3_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL3_CON0,
  .pbuf_mask = DL3_PBUF_SIZE_MASK,
  .pbuf_shift = DL3_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL3_CON0,
  .minlen_mask = DL3_MINLEN_MASK,
  .minlen_shift = DL3_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL4] = {
  .name = "DL4",
  .id = MT8186_MEMIF_DL4,
  .reg_ofs_base = AFE_DL4_BASE,
  .reg_ofs_cur = AFE_DL4_CUR,
  .reg_ofs_end = AFE_DL4_END,
  .reg_ofs_base_msb = AFE_DL4_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL4_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL4_END_MSB,
  .fs_reg = AFE_DL4_CON0,
  .fs_shift = DL4_MODE_SFT,
  .fs_maskbit = DL4_MODE_MASK,
  .mono_reg = AFE_DL4_CON0,
  .mono_shift = DL4_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL4_ON_SFT,
  .hd_reg = AFE_DL4_CON0,
  .hd_shift = DL4_HD_MODE_SFT,
  .hd_align_reg = AFE_DL4_CON0,
  .hd_align_mshift = DL4_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL4_CON0,
  .pbuf_mask = DL4_PBUF_SIZE_MASK,
  .pbuf_shift = DL4_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL4_CON0,
  .minlen_mask = DL4_MINLEN_MASK,
  .minlen_shift = DL4_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL5] = {
  .name = "DL5",
  .id = MT8186_MEMIF_DL5,
  .reg_ofs_base = AFE_DL5_BASE,
  .reg_ofs_cur = AFE_DL5_CUR,
  .reg_ofs_end = AFE_DL5_END,
  .reg_ofs_base_msb = AFE_DL5_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL5_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL5_END_MSB,
  .fs_reg = AFE_DL5_CON0,
  .fs_shift = DL5_MODE_SFT,
  .fs_maskbit = DL5_MODE_MASK,
  .mono_reg = AFE_DL5_CON0,
  .mono_shift = DL5_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL5_ON_SFT,
  .hd_reg = AFE_DL5_CON0,
  .hd_shift = DL5_HD_MODE_SFT,
  .hd_align_reg = AFE_DL5_CON0,
  .hd_align_mshift = DL5_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL5_CON0,
  .pbuf_mask = DL5_PBUF_SIZE_MASK,
  .pbuf_shift = DL5_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL5_CON0,
  .minlen_mask = DL5_MINLEN_MASK,
  .minlen_shift = DL5_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL6] = {
  .name = "DL6",
  .id = MT8186_MEMIF_DL6,
  .reg_ofs_base = AFE_DL6_BASE,
  .reg_ofs_cur = AFE_DL6_CUR,
  .reg_ofs_end = AFE_DL6_END,
  .reg_ofs_base_msb = AFE_DL6_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL6_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL6_END_MSB,
  .fs_reg = AFE_DL6_CON0,
  .fs_shift = DL6_MODE_SFT,
  .fs_maskbit = DL6_MODE_MASK,
  .mono_reg = AFE_DL6_CON0,
  .mono_shift = DL6_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL6_ON_SFT,
  .hd_reg = AFE_DL6_CON0,
  .hd_shift = DL6_HD_MODE_SFT,
  .hd_align_reg = AFE_DL6_CON0,
  .hd_align_mshift = DL6_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL6_CON0,
  .pbuf_mask = DL6_PBUF_SIZE_MASK,
  .pbuf_shift = DL6_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL6_CON0,
  .minlen_mask = DL6_MINLEN_MASK,
  .minlen_shift = DL6_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL7] = {
  .name = "DL7",
  .id = MT8186_MEMIF_DL7,
  .reg_ofs_base = AFE_DL7_BASE,
  .reg_ofs_cur = AFE_DL7_CUR,
  .reg_ofs_end = AFE_DL7_END,
  .reg_ofs_base_msb = AFE_DL7_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL7_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL7_END_MSB,
  .fs_reg = AFE_DL7_CON0,
  .fs_shift = DL7_MODE_SFT,
  .fs_maskbit = DL7_MODE_MASK,
  .mono_reg = AFE_DL7_CON0,
  .mono_shift = DL7_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL7_ON_SFT,
  .hd_reg = AFE_DL7_CON0,
  .hd_shift = DL7_HD_MODE_SFT,
  .hd_align_reg = AFE_DL7_CON0,
  .hd_align_mshift = DL7_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL7_CON0,
  .pbuf_mask = DL7_PBUF_SIZE_MASK,
  .pbuf_shift = DL7_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL7_CON0,
  .minlen_mask = DL7_MINLEN_MASK,
  .minlen_shift = DL7_MINLEN_SFT,
 },
 [MT8186_MEMIF_DL8] = {
  .name = "DL8",
  .id = MT8186_MEMIF_DL8,
  .reg_ofs_base = AFE_DL8_BASE,
  .reg_ofs_cur = AFE_DL8_CUR,
  .reg_ofs_end = AFE_DL8_END,
  .reg_ofs_base_msb = AFE_DL8_BASE_MSB,
  .reg_ofs_cur_msb = AFE_DL8_CUR_MSB,
  .reg_ofs_end_msb = AFE_DL8_END_MSB,
  .fs_reg = AFE_DL8_CON0,
  .fs_shift = DL8_MODE_SFT,
  .fs_maskbit = DL8_MODE_MASK,
  .mono_reg = AFE_DL8_CON0,
  .mono_shift = DL8_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = DL8_ON_SFT,
  .hd_reg = AFE_DL8_CON0,
  .hd_shift = DL8_HD_MODE_SFT,
  .hd_align_reg = AFE_DL8_CON0,
  .hd_align_mshift = DL8_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
  .pbuf_reg = AFE_DL8_CON0,
  .pbuf_mask = DL8_PBUF_SIZE_MASK,
  .pbuf_shift = DL8_PBUF_SIZE_SFT,
  .minlen_reg = AFE_DL8_CON0,
  .minlen_mask = DL8_MINLEN_MASK,
  .minlen_shift = DL8_MINLEN_SFT,
 },
 [MT8186_MEMIF_VUL12] = {
  .name = "VUL12",
  .id = MT8186_MEMIF_VUL12,
  .reg_ofs_base = AFE_VUL12_BASE,
  .reg_ofs_cur = AFE_VUL12_CUR,
  .reg_ofs_end = AFE_VUL12_END,
  .reg_ofs_base_msb = AFE_VUL12_BASE_MSB,
  .reg_ofs_cur_msb = AFE_VUL12_CUR_MSB,
  .reg_ofs_end_msb = AFE_VUL12_END_MSB,
  .fs_reg = AFE_VUL12_CON0,
  .fs_shift = VUL12_MODE_SFT,
  .fs_maskbit = VUL12_MODE_MASK,
  .mono_reg = AFE_VUL12_CON0,
  .mono_shift = VUL12_MONO_SFT,
  .quad_ch_reg = AFE_VUL12_CON0,
  .quad_ch_mask = VUL12_4CH_EN_MASK,
  .quad_ch_shift = VUL12_4CH_EN_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = VUL12_ON_SFT,
  .hd_reg = AFE_VUL12_CON0,
  .hd_shift = VUL12_HD_MODE_SFT,
  .hd_align_reg = AFE_VUL12_CON0,
  .hd_align_mshift = VUL12_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
 },
 [MT8186_MEMIF_VUL2] = {
  .name = "VUL2",
  .id = MT8186_MEMIF_VUL2,
  .reg_ofs_base = AFE_VUL2_BASE,
  .reg_ofs_cur = AFE_VUL2_CUR,
  .reg_ofs_end = AFE_VUL2_END,
  .reg_ofs_base_msb = AFE_VUL2_BASE_MSB,
  .reg_ofs_cur_msb = AFE_VUL2_CUR_MSB,
  .reg_ofs_end_msb = AFE_VUL2_END_MSB,
  .fs_reg = AFE_VUL2_CON0,
  .fs_shift = VUL2_MODE_SFT,
  .fs_maskbit = VUL2_MODE_MASK,
  .mono_reg = AFE_VUL2_CON0,
  .mono_shift = VUL2_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = VUL2_ON_SFT,
  .hd_reg = AFE_VUL2_CON0,
  .hd_shift = VUL2_HD_MODE_SFT,
  .hd_align_reg = AFE_VUL2_CON0,
  .hd_align_mshift = VUL2_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
 },
 [MT8186_MEMIF_AWB] = {
  .name = "AWB",
  .id = MT8186_MEMIF_AWB,
  .reg_ofs_base = AFE_AWB_BASE,
  .reg_ofs_cur = AFE_AWB_CUR,
  .reg_ofs_end = AFE_AWB_END,
  .reg_ofs_base_msb = AFE_AWB_BASE_MSB,
  .reg_ofs_cur_msb = AFE_AWB_CUR_MSB,
  .reg_ofs_end_msb = AFE_AWB_END_MSB,
  .fs_reg = AFE_AWB_CON0,
  .fs_shift = AWB_MODE_SFT,
  .fs_maskbit = AWB_MODE_MASK,
  .mono_reg = AFE_AWB_CON0,
  .mono_shift = AWB_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = AWB_ON_SFT,
  .hd_reg = AFE_AWB_CON0,
  .hd_shift = AWB_HD_MODE_SFT,
  .hd_align_reg = AFE_AWB_CON0,
  .hd_align_mshift = AWB_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
 },
 [MT8186_MEMIF_AWB2] = {
  .name = "AWB2",
  .id = MT8186_MEMIF_AWB2,
  .reg_ofs_base = AFE_AWB2_BASE,
  .reg_ofs_cur = AFE_AWB2_CUR,
  .reg_ofs_end = AFE_AWB2_END,
  .reg_ofs_base_msb = AFE_AWB2_BASE_MSB,
  .reg_ofs_cur_msb = AFE_AWB2_CUR_MSB,
  .reg_ofs_end_msb = AFE_AWB2_END_MSB,
  .fs_reg = AFE_AWB2_CON0,
  .fs_shift = AWB2_MODE_SFT,
  .fs_maskbit = AWB2_MODE_MASK,
  .mono_reg = AFE_AWB2_CON0,
  .mono_shift = AWB2_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = AWB2_ON_SFT,
  .hd_reg = AFE_AWB2_CON0,
  .hd_shift = AWB2_HD_MODE_SFT,
  .hd_align_reg = AFE_AWB2_CON0,
  .hd_align_mshift = AWB2_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
 },
 [MT8186_MEMIF_VUL3] = {
  .name = "VUL3",
  .id = MT8186_MEMIF_VUL3,
  .reg_ofs_base = AFE_VUL3_BASE,
  .reg_ofs_cur = AFE_VUL3_CUR,
  .reg_ofs_end = AFE_VUL3_END,
  .reg_ofs_base_msb = AFE_VUL3_BASE_MSB,
  .reg_ofs_cur_msb = AFE_VUL3_CUR_MSB,
  .reg_ofs_end_msb = AFE_VUL3_END_MSB,
  .fs_reg = AFE_VUL3_CON0,
  .fs_shift = VUL3_MODE_SFT,
  .fs_maskbit = VUL3_MODE_MASK,
  .mono_reg = AFE_VUL3_CON0,
  .mono_shift = VUL3_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = VUL3_ON_SFT,
  .hd_reg = AFE_VUL3_CON0,
  .hd_shift = VUL3_HD_MODE_SFT,
  .hd_align_reg = AFE_VUL3_CON0,
  .hd_align_mshift = VUL3_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
 },
 [MT8186_MEMIF_VUL4] = {
  .name = "VUL4",
  .id = MT8186_MEMIF_VUL4,
  .reg_ofs_base = AFE_VUL4_BASE,
  .reg_ofs_cur = AFE_VUL4_CUR,
  .reg_ofs_end = AFE_VUL4_END,
  .reg_ofs_base_msb = AFE_VUL4_BASE_MSB,
  .reg_ofs_cur_msb = AFE_VUL4_CUR_MSB,
  .reg_ofs_end_msb = AFE_VUL4_END_MSB,
  .fs_reg = AFE_VUL4_CON0,
  .fs_shift = VUL4_MODE_SFT,
  .fs_maskbit = VUL4_MODE_MASK,
  .mono_reg = AFE_VUL4_CON0,
  .mono_shift = VUL4_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = VUL4_ON_SFT,
  .hd_reg = AFE_VUL4_CON0,
  .hd_shift = VUL4_HD_MODE_SFT,
  .hd_align_reg = AFE_VUL4_CON0,
  .hd_align_mshift = VUL4_HALIGN_SFT,
  .agent_disable_reg = -1,
  .agent_disable_shift = -1,
  .msb_reg = -1,
  .msb_shift = -1,
 },
 [MT8186_MEMIF_VUL5] = {
  .name = "VUL5",
  .id = MT8186_MEMIF_VUL5,
  .reg_ofs_base = AFE_VUL5_BASE,
  .reg_ofs_cur = AFE_VUL5_CUR,
  .reg_ofs_end = AFE_VUL5_END,
  .reg_ofs_base_msb = AFE_VUL5_BASE_MSB,
  .reg_ofs_cur_msb = AFE_VUL5_CUR_MSB,
  .reg_ofs_end_msb = AFE_VUL5_END_MSB,
  .fs_reg = AFE_VUL5_CON0,
  .fs_shift = VUL5_MODE_SFT,
  .fs_maskbit = VUL5_MODE_MASK,
  .mono_reg = AFE_VUL5_CON0,
  .mono_shift = VUL5_MONO_SFT,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = VUL5_ON_SFT,
  .hd_reg = AFE_VUL5_CON0,
  .hd_shift = VUL5_HD_MODE_SFT,
--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=95 H=97 G=95

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.