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

Quelle  mt8195-afe-pcm.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Mediatek ALSA SoC AFE platform driver for 8195
 *
 * Copyright (c) 2021 MediaTek Inc.
 * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
 *         Trevor Wu <trevor.wu@mediatek.com>
 */


#include <linux/delay.h>
#include <linux/dma-mapping.h>
#include <linux/module.h>
#include <linux/mfd/syscon.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/of_reserved_mem.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include "mt8195-afe-common.h"
#include "mt8195-afe-clk.h"
#include "mt8195-reg.h"
#include "../common/mtk-afe-platform-driver.h"
#include "../common/mtk-afe-fe-dai.h"

#define MT8195_MEMIF_BUFFER_BYTES_ALIGN  (0x40)
#define MT8195_MEMIF_DL7_MAX_PERIOD_SIZE (0x3fff)

struct mtk_dai_memif_priv {
 unsigned int asys_timing_sel;
};

static const struct snd_pcm_hardware mt8195_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 = 64,
 .period_bytes_max = 256 * 1024,
 .periods_min = 2,
 .periods_max = 256,
 .buffer_bytes_max = 256 * 2 * 1024,
};

struct mt8195_afe_rate {
 unsigned int rate;
 unsigned int reg_value;
};

static const struct mt8195_afe_rate mt8195_afe_rates[] = {
 { .rate = 8000, .reg_value = 0, },
 { .rate = 12000, .reg_value = 1, },
 { .rate = 16000, .reg_value = 2, },
 { .rate = 24000, .reg_value = 3, },
 { .rate = 32000, .reg_value = 4, },
 { .rate = 48000, .reg_value = 5, },
 { .rate = 96000, .reg_value = 6, },
 { .rate = 192000, .reg_value = 7, },
 { .rate = 384000, .reg_value = 8, },
 { .rate = 7350, .reg_value = 16, },
 { .rate = 11025, .reg_value = 17, },
 { .rate = 14700, .reg_value = 18, },
 { .rate = 22050, .reg_value = 19, },
 { .rate = 29400, .reg_value = 20, },
 { .rate = 44100, .reg_value = 21, },
 { .rate = 88200, .reg_value = 22, },
 { .rate = 176400, .reg_value = 23, },
 { .rate = 352800, .reg_value = 24, },
};

int mt8195_afe_fs_timing(unsigned int rate)
{
 int i;

 for (i = 0; i < ARRAY_SIZE(mt8195_afe_rates); i++)
  if (mt8195_afe_rates[i].rate == rate)
   return mt8195_afe_rates[i].reg_value;

 return -EINVAL;
}

static int mt8195_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;
 struct mtk_base_afe_memif *memif = &afe->memif[id];
 int fs = mt8195_afe_fs_timing(rate);

 switch (memif->data->id) {
 case MT8195_AFE_MEMIF_DL10:
  fs = MT8195_ETDM_OUT3_1X_EN;
  break;
 case MT8195_AFE_MEMIF_UL8:
  fs = MT8195_ETDM_IN1_NX_EN;
  break;
 case MT8195_AFE_MEMIF_UL3:
  fs = MT8195_ETDM_IN2_NX_EN;
  break;
 default:
  break;
 }

 return fs;
}

static int mt8195_irq_fs(struct snd_pcm_substream *substream,
    unsigned int rate)
{
 int fs = mt8195_memif_fs(substream, rate);

 switch (fs) {
 case MT8195_ETDM_IN1_NX_EN:
  fs = MT8195_ETDM_IN1_1X_EN;
  break;
 case MT8195_ETDM_IN2_NX_EN:
  fs = MT8195_ETDM_IN2_1X_EN;
  break;
 default:
  break;
 }

 return fs;
}

enum {
 MT8195_AFE_CM0,
 MT8195_AFE_CM1,
 MT8195_AFE_CM2,
 MT8195_AFE_CM_NUM,
};

struct mt8195_afe_channel_merge {
 int id;
 int reg;
 unsigned int sel_shift;
 unsigned int sel_maskbit;
 unsigned int sel_default;
 unsigned int ch_num_shift;
 unsigned int ch_num_maskbit;
 unsigned int en_shift;
 unsigned int en_maskbit;
 unsigned int update_cnt_shift;
 unsigned int update_cnt_maskbit;
 unsigned int update_cnt_default;
};

static const struct mt8195_afe_channel_merge
 mt8195_afe_cm[MT8195_AFE_CM_NUM] = {
 [MT8195_AFE_CM0] = {
  .id = MT8195_AFE_CM0,
  .reg = AFE_CM0_CON,
  .sel_shift = 30,
  .sel_maskbit = 0x1,
  .sel_default = 1,
  .ch_num_shift = 2,
  .ch_num_maskbit = 0x3f,
  .en_shift = 0,
  .en_maskbit = 0x1,
  .update_cnt_shift = 16,
  .update_cnt_maskbit = 0x1fff,
  .update_cnt_default = 0x3,
 },
 [MT8195_AFE_CM1] = {
  .id = MT8195_AFE_CM1,
  .reg = AFE_CM1_CON,
  .sel_shift = 30,
  .sel_maskbit = 0x1,
  .sel_default = 1,
  .ch_num_shift = 2,
  .ch_num_maskbit = 0x1f,
  .en_shift = 0,
  .en_maskbit = 0x1,
  .update_cnt_shift = 16,
  .update_cnt_maskbit = 0x1fff,
  .update_cnt_default = 0x3,
 },
 [MT8195_AFE_CM2] = {
  .id = MT8195_AFE_CM2,
  .reg = AFE_CM2_CON,
  .sel_shift = 30,
  .sel_maskbit = 0x1,
  .sel_default = 1,
  .ch_num_shift = 2,
  .ch_num_maskbit = 0x1f,
  .en_shift = 0,
  .en_maskbit = 0x1,
  .update_cnt_shift = 16,
  .update_cnt_maskbit = 0x1fff,
  .update_cnt_default = 0x3,
 },
};

static int mt8195_afe_memif_is_ul(int id)
{
 if (id >= MT8195_AFE_MEMIF_UL_START && id < MT8195_AFE_MEMIF_END)
  return 1;
 else
  return 0;
}

static const struct mt8195_afe_channel_merge*
mt8195_afe_found_cm(struct snd_soc_dai *dai)
{
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 int id = -EINVAL;

 if (mt8195_afe_memif_is_ul(dai->id) == 0)
  return NULL;

 switch (dai->id) {
 case MT8195_AFE_MEMIF_UL9:
  id = MT8195_AFE_CM0;
  break;
 case MT8195_AFE_MEMIF_UL2:
  id = MT8195_AFE_CM1;
  break;
 case MT8195_AFE_MEMIF_UL10:
  id = MT8195_AFE_CM2;
  break;
 default:
  break;
 }

 if (id < 0) {
  dev_dbg(afe->dev, "%s, memif %d cannot find CM!\n",
   __func__, dai->id);
  return NULL;
 }

 return &mt8195_afe_cm[id];
}

static int mt8195_afe_config_cm(struct mtk_base_afe *afe,
    const struct mt8195_afe_channel_merge *cm,
    unsigned int channels)
{
 if (!cm)
  return -EINVAL;

 regmap_update_bits(afe->regmap,
      cm->reg,
      cm->sel_maskbit << cm->sel_shift,
      cm->sel_default << cm->sel_shift);

 regmap_update_bits(afe->regmap,
      cm->reg,
      cm->ch_num_maskbit << cm->ch_num_shift,
      (channels - 1) << cm->ch_num_shift);

 regmap_update_bits(afe->regmap,
      cm->reg,
      cm->update_cnt_maskbit << cm->update_cnt_shift,
      cm->update_cnt_default << cm->update_cnt_shift);

 return 0;
}

static int mt8195_afe_enable_cm(struct mtk_base_afe *afe,
    const struct mt8195_afe_channel_merge *cm,
    bool enable)
{
 if (!cm)
  return -EINVAL;

 regmap_update_bits(afe->regmap,
      cm->reg,
      cm->en_maskbit << cm->en_shift,
      enable << cm->en_shift);

 return 0;
}

static int
mt8195_afe_paired_memif_clk_prepare(struct snd_pcm_substream *substream,
        struct snd_soc_dai *dai,
        int enable)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 struct mt8195_afe_private *afe_priv = afe->platform_priv;
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 int clk_id;

 if (id != MT8195_AFE_MEMIF_DL8 && id != MT8195_AFE_MEMIF_DL10)
  return 0;

 if (enable) {
  clk_id = MT8195_CLK_AUD_MEMIF_DL10;
  mt8195_afe_prepare_clk(afe, afe_priv->clk[clk_id]);
  clk_id = MT8195_CLK_AUD_MEMIF_DL8;
  mt8195_afe_prepare_clk(afe, afe_priv->clk[clk_id]);
 } else {
  clk_id = MT8195_CLK_AUD_MEMIF_DL8;
  mt8195_afe_unprepare_clk(afe, afe_priv->clk[clk_id]);
  clk_id = MT8195_CLK_AUD_MEMIF_DL10;
  mt8195_afe_unprepare_clk(afe, afe_priv->clk[clk_id]);
 }

 return 0;
}

static int
mt8195_afe_paired_memif_clk_enable(struct snd_pcm_substream *substream,
       struct snd_soc_dai *dai,
       int enable)
{
 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 struct mt8195_afe_private *afe_priv = afe->platform_priv;
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 int clk_id;

 if (id != MT8195_AFE_MEMIF_DL8 && id != MT8195_AFE_MEMIF_DL10)
  return 0;

 if (enable) {
  /* DL8_DL10_MEM */
  clk_id = MT8195_CLK_AUD_MEMIF_DL10;
  mt8195_afe_enable_clk_atomic(afe, afe_priv->clk[clk_id]);
  udelay(1);
  /* DL8_DL10_AGENT */
  clk_id = MT8195_CLK_AUD_MEMIF_DL8;
  mt8195_afe_enable_clk_atomic(afe, afe_priv->clk[clk_id]);
 } else {
  /* DL8_DL10_AGENT */
  clk_id = MT8195_CLK_AUD_MEMIF_DL8;
  mt8195_afe_disable_clk_atomic(afe, afe_priv->clk[clk_id]);
  /* DL8_DL10_MEM */
  clk_id = MT8195_CLK_AUD_MEMIF_DL10;
  mt8195_afe_disable_clk_atomic(afe, afe_priv->clk[clk_id]);
 }

 return 0;
}

static int mt8195_afe_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 snd_pcm_runtime *runtime = substream->runtime;
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
 int ret = 0;

 mt8195_afe_paired_memif_clk_prepare(substream, dai, 1);

 ret = mtk_afe_fe_startup(substream, dai);

 snd_pcm_hw_constraint_step(runtime, 0,
       SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
       MT8195_MEMIF_BUFFER_BYTES_ALIGN);

 if (id != MT8195_AFE_MEMIF_DL7)
  goto out;

 ret = snd_pcm_hw_constraint_minmax(runtime,
        SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
        1,
        MT8195_MEMIF_DL7_MAX_PERIOD_SIZE);
 if (ret < 0)
  dev_dbg(afe->dev, "hw_constraint_minmax failed\n");
out:
 return ret;
}

static void mt8195_afe_fe_shutdown(struct snd_pcm_substream *substream,
       struct snd_soc_dai *dai)
{
 mtk_afe_fe_shutdown(substream, dai);
 mt8195_afe_paired_memif_clk_prepare(substream, dai, 0);
}

static int mt8195_afe_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;
 struct mtk_base_afe_memif *memif = &afe->memif[id];
 const struct mtk_base_memif_data *data = memif->data;
 const struct mt8195_afe_channel_merge *cm = mt8195_afe_found_cm(dai);
 unsigned int ch_num = params_channels(params);

 mt8195_afe_config_cm(afe, cm, params_channels(params));

 if (data->ch_num_reg >= 0) {
  regmap_update_bits(afe->regmap, data->ch_num_reg,
       data->ch_num_maskbit << data->ch_num_shift,
       ch_num << data->ch_num_shift);
 }

 return mtk_afe_fe_hw_params(substream, params, dai);
}

static int mt8195_afe_fe_hw_free(struct snd_pcm_substream *substream,
     struct snd_soc_dai *dai)
{
 return mtk_afe_fe_hw_free(substream, dai);
}

static int mt8195_afe_fe_prepare(struct snd_pcm_substream *substream,
     struct snd_soc_dai *dai)
{
 return mtk_afe_fe_prepare(substream, dai);
}

static int mt8195_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
     struct snd_soc_dai *dai)
{
 int ret = 0;
 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 const struct mt8195_afe_channel_merge *cm = mt8195_afe_found_cm(dai);

 switch (cmd) {
 case SNDRV_PCM_TRIGGER_START:
 case SNDRV_PCM_TRIGGER_RESUME:
  mt8195_afe_enable_cm(afe, cm, true);
  break;
 case SNDRV_PCM_TRIGGER_STOP:
 case SNDRV_PCM_TRIGGER_SUSPEND:
  mt8195_afe_enable_cm(afe, cm, false);
  break;
 default:
  break;
 }

 ret = mtk_afe_fe_trigger(substream, cmd, dai);

 switch (cmd) {
 case SNDRV_PCM_TRIGGER_START:
 case SNDRV_PCM_TRIGGER_RESUME:
  mt8195_afe_paired_memif_clk_enable(substream, dai, 1);
  break;
 case SNDRV_PCM_TRIGGER_STOP:
 case SNDRV_PCM_TRIGGER_SUSPEND:
  mt8195_afe_paired_memif_clk_enable(substream, dai, 0);
  break;
 default:
  break;
 }

 return ret;
}

static int mt8195_afe_fe_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
 return 0;
}

static const struct snd_soc_dai_ops mt8195_afe_fe_dai_ops = {
 .startup = mt8195_afe_fe_startup,
 .shutdown = mt8195_afe_fe_shutdown,
 .hw_params = mt8195_afe_fe_hw_params,
 .hw_free = mt8195_afe_fe_hw_free,
 .prepare = mt8195_afe_fe_prepare,
 .trigger = mt8195_afe_fe_trigger,
 .set_fmt = mt8195_afe_fe_set_fmt,
};

#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 |\
         SNDRV_PCM_RATE_352800 |\
         SNDRV_PCM_RATE_384000)

#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 mt8195_memif_dai_driver[] = {
 /* FE DAIs: memory intefaces to CPU */
 {
  .name = "DL2",
  .id = MT8195_AFE_MEMIF_DL2,
  .playback = {
   .stream_name = "DL2",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "DL3",
  .id = MT8195_AFE_MEMIF_DL3,
  .playback = {
   .stream_name = "DL3",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "DL6",
  .id = MT8195_AFE_MEMIF_DL6,
  .playback = {
   .stream_name = "DL6",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "DL7",
  .id = MT8195_AFE_MEMIF_DL7,
  .playback = {
   .stream_name = "DL7",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "DL8",
  .id = MT8195_AFE_MEMIF_DL8,
  .playback = {
   .stream_name = "DL8",
   .channels_min = 1,
   .channels_max = 24,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "DL10",
  .id = MT8195_AFE_MEMIF_DL10,
  .playback = {
   .stream_name = "DL10",
   .channels_min = 1,
   .channels_max = 8,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "DL11",
  .id = MT8195_AFE_MEMIF_DL11,
  .playback = {
   .stream_name = "DL11",
   .channels_min = 1,
   .channels_max = 48,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL1",
  .id = MT8195_AFE_MEMIF_UL1,
  .capture = {
   .stream_name = "UL1",
   .channels_min = 1,
   .channels_max = 8,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL2",
  .id = MT8195_AFE_MEMIF_UL2,
  .capture = {
   .stream_name = "UL2",
   .channels_min = 1,
   .channels_max = 8,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL3",
  .id = MT8195_AFE_MEMIF_UL3,
  .capture = {
   .stream_name = "UL3",
   .channels_min = 1,
   .channels_max = 16,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL4",
  .id = MT8195_AFE_MEMIF_UL4,
  .capture = {
   .stream_name = "UL4",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL5",
  .id = MT8195_AFE_MEMIF_UL5,
  .capture = {
   .stream_name = "UL5",
   .channels_min = 1,
   .channels_max = 2,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL6",
  .id = MT8195_AFE_MEMIF_UL6,
  .capture = {
   .stream_name = "UL6",
   .channels_min = 1,
   .channels_max = 8,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL8",
  .id = MT8195_AFE_MEMIF_UL8,
  .capture = {
   .stream_name = "UL8",
   .channels_min = 1,
   .channels_max = 24,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL9",
  .id = MT8195_AFE_MEMIF_UL9,
  .capture = {
   .stream_name = "UL9",
   .channels_min = 1,
   .channels_max = 32,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
 {
  .name = "UL10",
  .id = MT8195_AFE_MEMIF_UL10,
  .capture = {
   .stream_name = "UL10",
   .channels_min = 1,
   .channels_max = 4,
   .rates = MTK_PCM_RATES,
   .formats = MTK_PCM_FORMATS,
  },
  .ops = &mt8195_afe_fe_dai_ops,
 },
};

static const struct snd_kcontrol_new o002_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN2, 0, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN2, 12, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN2, 20, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN2, 22, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN2_2, 6, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN2_2, 8, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN2_5, 8, 1, 0),
};

static const struct snd_kcontrol_new o003_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN3, 1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN3, 13, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN3, 21, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN3, 23, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN3_2, 7, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN3_2, 9, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN3_5, 9, 1, 0),
};

static const struct snd_kcontrol_new o004_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN4, 0, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I014 Switch", AFE_CONN4, 14, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN4, 24, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I074 Switch", AFE_CONN4_2, 10, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I170 Switch", AFE_CONN4_5, 10, 1, 0),
};

static const struct snd_kcontrol_new o005_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN5, 1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I015 Switch", AFE_CONN5, 15, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN5, 25, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I075 Switch", AFE_CONN5_2, 11, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I171 Switch", AFE_CONN5_5, 11, 1, 0),
};

static const struct snd_kcontrol_new o006_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN6, 0, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I016 Switch", AFE_CONN6, 16, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN6, 26, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I076 Switch", AFE_CONN6_2, 12, 1, 0),
};

static const struct snd_kcontrol_new o007_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN7, 1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I017 Switch", AFE_CONN7, 17, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN7, 27, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I077 Switch", AFE_CONN7_2, 13, 1, 0),
};

static const struct snd_kcontrol_new o008_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I018 Switch", AFE_CONN8, 18, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN8, 28, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I078 Switch", AFE_CONN8_2, 14, 1, 0),
};

static const struct snd_kcontrol_new o009_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I019 Switch", AFE_CONN9, 19, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN9, 29, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I079 Switch", AFE_CONN9_2, 15, 1, 0),
};

static const struct snd_kcontrol_new o010_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN10, 22, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN10, 30, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN10_1, 14, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN10_2, 8, 1, 0),
};

static const struct snd_kcontrol_new o011_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN11, 23, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN11, 31, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN11_1, 15, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN11_2, 9, 1, 0),
};

static const struct snd_kcontrol_new o012_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN12, 24, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN12_1, 0, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN12_1, 16, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I074 Switch", AFE_CONN12_2, 10, 1, 0),
};

static const struct snd_kcontrol_new o013_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN13, 25, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN13_1, 1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN13_1, 17, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I075 Switch", AFE_CONN13_2, 11, 1, 0),
};

static const struct snd_kcontrol_new o014_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN14, 26, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN14_1, 2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN14_1, 18, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I076 Switch", AFE_CONN14_2, 12, 1, 0),
};

static const struct snd_kcontrol_new o015_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN15, 27, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN15_1, 3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN15_1, 19, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I077 Switch", AFE_CONN15_2, 13, 1, 0),
};

static const struct snd_kcontrol_new o016_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN16, 28, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN16_1, 4, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN16_1, 20, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I078 Switch", AFE_CONN16_2, 14, 1, 0),
};

static const struct snd_kcontrol_new o017_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN17, 29, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN17_1, 5, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN17_1, 21, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I079 Switch", AFE_CONN17_2, 15, 1, 0),
};

static const struct snd_kcontrol_new o018_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN18_1, 6, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I080 Switch", AFE_CONN18_2, 16, 1, 0),
};

static const struct snd_kcontrol_new o019_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN19_1, 7, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I081 Switch", AFE_CONN19_2, 17, 1, 0),
};

static const struct snd_kcontrol_new o020_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN20_1, 8, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I082 Switch", AFE_CONN20_2, 18, 1, 0),
};

static const struct snd_kcontrol_new o021_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN21_1, 9, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I083 Switch", AFE_CONN21_2, 19, 1, 0),
};

static const struct snd_kcontrol_new o022_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN22_1, 10, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I084 Switch", AFE_CONN22_2, 20, 1, 0),
};

static const struct snd_kcontrol_new o023_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN23_1, 11, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I085 Switch", AFE_CONN23_2, 21, 1, 0),
};

static const struct snd_kcontrol_new o024_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN24_1, 12, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I086 Switch", AFE_CONN24_2, 22, 1, 0),
};

static const struct snd_kcontrol_new o025_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN25_1, 13, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I087 Switch", AFE_CONN25_2, 23, 1, 0),
};

static const struct snd_kcontrol_new o026_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN26_1, 14, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I088 Switch", AFE_CONN26_2, 24, 1, 0),
};

static const struct snd_kcontrol_new o027_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN27_1, 15, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I089 Switch", AFE_CONN27_2, 25, 1, 0),
};

static const struct snd_kcontrol_new o028_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN28_1, 16, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I090 Switch", AFE_CONN28_2, 26, 1, 0),
};

static const struct snd_kcontrol_new o029_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN29_1, 17, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I091 Switch", AFE_CONN29_2, 27, 1, 0),
};

static const struct snd_kcontrol_new o030_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN30_1, 18, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I092 Switch", AFE_CONN30_2, 28, 1, 0),
};

static const struct snd_kcontrol_new o031_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN31_1, 19, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I093 Switch", AFE_CONN31_2, 29, 1, 0),
};

static const struct snd_kcontrol_new o032_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN32_1, 20, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I094 Switch", AFE_CONN32_2, 30, 1, 0),
};

static const struct snd_kcontrol_new o033_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN33_1, 21, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I095 Switch", AFE_CONN33_2, 31, 1, 0),
};

static const struct snd_kcontrol_new o034_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN34, 0, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN34, 2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN34, 12, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN34, 20, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN34_2, 6, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN34_2, 8, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN34_5, 8, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I170 Switch", AFE_CONN34_5, 10, 1, 0),
};

static const struct snd_kcontrol_new o035_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN35, 1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN35, 3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN35, 13, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN35, 21, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN35_2, 7, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN35_2, 9, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I137 Switch", AFE_CONN35_4, 9, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I139 Switch", AFE_CONN35_4, 11, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN35_5, 8, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN35_5, 9, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I170 Switch", AFE_CONN35_5, 10, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I171 Switch", AFE_CONN35_5, 11, 1, 0),
};

static const struct snd_kcontrol_new o036_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN36, 0, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN36, 12, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN36, 20, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN36_2, 6, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN36_5, 8, 1, 0),
};

static const struct snd_kcontrol_new o037_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN37, 1, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN37, 13, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN37, 21, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN37_2, 7, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN37_5, 9, 1, 0),
};

static const struct snd_kcontrol_new o038_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN38, 22, 1, 0),
};

static const struct snd_kcontrol_new o039_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN39, 23, 1, 0),
};

static const struct snd_kcontrol_new o040_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN40, 2, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN40, 12, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN40, 22, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN40_5, 8, 1, 0),
};

static const struct snd_kcontrol_new o041_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN41, 3, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN41, 13, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN41, 23, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN41_5, 9, 1, 0),
};

static const struct snd_kcontrol_new o042_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I014 Switch", AFE_CONN42, 14, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN42, 24, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I170 Switch", AFE_CONN42_5, 10, 1, 0),
};

static const struct snd_kcontrol_new o043_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I015 Switch", AFE_CONN43, 15, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN43, 25, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I171 Switch", AFE_CONN43_5, 11, 1, 0),
};

static const struct snd_kcontrol_new o044_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I016 Switch", AFE_CONN44, 16, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN44, 26, 1, 0),
};

static const struct snd_kcontrol_new o045_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I017 Switch", AFE_CONN45, 17, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN45, 27, 1, 0),
};

static const struct snd_kcontrol_new o046_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I018 Switch", AFE_CONN46, 18, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN46, 28, 1, 0),
};

static const struct snd_kcontrol_new o047_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I019 Switch", AFE_CONN47, 19, 1, 0),
 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN47, 29, 1, 0),
};

static const struct snd_kcontrol_new o182_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN182, 24, 1, 0),
};

static const struct snd_kcontrol_new o183_mix[] = {
 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN183, 25, 1, 0),
};

static const char * const dl8_dl11_data_sel_mux_text[] = {
 "dl8""dl11",
};

static SOC_ENUM_SINGLE_DECL(dl8_dl11_data_sel_mux_enum,
 AFE_DAC_CON2, 0, dl8_dl11_data_sel_mux_text);

static const struct snd_kcontrol_new dl8_dl11_data_sel_mux =
 SOC_DAPM_ENUM("DL8_DL11 Sink", dl8_dl11_data_sel_mux_enum);

static const struct snd_soc_dapm_widget mt8195_memif_widgets[] = {
 /* DL6 */
 SND_SOC_DAPM_MIXER("I000", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I001", SND_SOC_NOPM, 0, 0, NULL, 0),

 /* DL3 */
 SND_SOC_DAPM_MIXER("I020", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I021", SND_SOC_NOPM, 0, 0, NULL, 0),

 /* DL11 */
 SND_SOC_DAPM_MIXER("I022", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I023", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I024", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I025", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I026", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I027", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I028", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I029", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I030", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I031", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I032", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I033", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I034", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I035", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I036", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I037", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I038", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I039", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I040", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I041", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I042", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I043", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I044", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I045", SND_SOC_NOPM, 0, 0, NULL, 0),

 /* DL11/DL8 */
 SND_SOC_DAPM_MIXER("I046", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I047", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I048", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I049", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I050", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I051", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I052", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I053", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I054", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I055", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I056", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I057", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I058", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I059", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I060", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I061", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I062", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I063", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I064", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I065", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I066", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I067", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I068", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I069", SND_SOC_NOPM, 0, 0, NULL, 0),

 /* DL2 */
 SND_SOC_DAPM_MIXER("I070", SND_SOC_NOPM, 0, 0, NULL, 0),
 SND_SOC_DAPM_MIXER("I071", SND_SOC_NOPM, 0, 0, NULL, 0),

 SND_SOC_DAPM_MUX("DL8_DL11 Mux",
    SND_SOC_NOPM, 0, 0, &dl8_dl11_data_sel_mux),

 /* UL9 */
 SND_SOC_DAPM_MIXER("O002", SND_SOC_NOPM, 0, 0,
      o002_mix, ARRAY_SIZE(o002_mix)),
 SND_SOC_DAPM_MIXER("O003", SND_SOC_NOPM, 0, 0,
      o003_mix, ARRAY_SIZE(o003_mix)),
 SND_SOC_DAPM_MIXER("O004", SND_SOC_NOPM, 0, 0,
      o004_mix, ARRAY_SIZE(o004_mix)),
 SND_SOC_DAPM_MIXER("O005", SND_SOC_NOPM, 0, 0,
      o005_mix, ARRAY_SIZE(o005_mix)),
 SND_SOC_DAPM_MIXER("O006", SND_SOC_NOPM, 0, 0,
      o006_mix, ARRAY_SIZE(o006_mix)),
 SND_SOC_DAPM_MIXER("O007", SND_SOC_NOPM, 0, 0,
      o007_mix, ARRAY_SIZE(o007_mix)),
 SND_SOC_DAPM_MIXER("O008", SND_SOC_NOPM, 0, 0,
      o008_mix, ARRAY_SIZE(o008_mix)),
 SND_SOC_DAPM_MIXER("O009", SND_SOC_NOPM, 0, 0,
      o009_mix, ARRAY_SIZE(o009_mix)),
 SND_SOC_DAPM_MIXER("O010", SND_SOC_NOPM, 0, 0,
      o010_mix, ARRAY_SIZE(o010_mix)),
 SND_SOC_DAPM_MIXER("O011", SND_SOC_NOPM, 0, 0,
      o011_mix, ARRAY_SIZE(o011_mix)),
 SND_SOC_DAPM_MIXER("O012", SND_SOC_NOPM, 0, 0,
      o012_mix, ARRAY_SIZE(o012_mix)),
 SND_SOC_DAPM_MIXER("O013", SND_SOC_NOPM, 0, 0,
      o013_mix, ARRAY_SIZE(o013_mix)),
 SND_SOC_DAPM_MIXER("O014", SND_SOC_NOPM, 0, 0,
      o014_mix, ARRAY_SIZE(o014_mix)),
 SND_SOC_DAPM_MIXER("O015", SND_SOC_NOPM, 0, 0,
      o015_mix, ARRAY_SIZE(o015_mix)),
 SND_SOC_DAPM_MIXER("O016", SND_SOC_NOPM, 0, 0,
      o016_mix, ARRAY_SIZE(o016_mix)),
 SND_SOC_DAPM_MIXER("O017", SND_SOC_NOPM, 0, 0,
      o017_mix, ARRAY_SIZE(o017_mix)),
 SND_SOC_DAPM_MIXER("O018", SND_SOC_NOPM, 0, 0,
      o018_mix, ARRAY_SIZE(o018_mix)),
 SND_SOC_DAPM_MIXER("O019", SND_SOC_NOPM, 0, 0,
      o019_mix, ARRAY_SIZE(o019_mix)),
 SND_SOC_DAPM_MIXER("O020", SND_SOC_NOPM, 0, 0,
      o020_mix, ARRAY_SIZE(o020_mix)),
 SND_SOC_DAPM_MIXER("O021", SND_SOC_NOPM, 0, 0,
      o021_mix, ARRAY_SIZE(o021_mix)),
 SND_SOC_DAPM_MIXER("O022", SND_SOC_NOPM, 0, 0,
      o022_mix, ARRAY_SIZE(o022_mix)),
 SND_SOC_DAPM_MIXER("O023", SND_SOC_NOPM, 0, 0,
      o023_mix, ARRAY_SIZE(o023_mix)),
 SND_SOC_DAPM_MIXER("O024", SND_SOC_NOPM, 0, 0,
      o024_mix, ARRAY_SIZE(o024_mix)),
 SND_SOC_DAPM_MIXER("O025", SND_SOC_NOPM, 0, 0,
      o025_mix, ARRAY_SIZE(o025_mix)),
 SND_SOC_DAPM_MIXER("O026", SND_SOC_NOPM, 0, 0,
      o026_mix, ARRAY_SIZE(o026_mix)),
 SND_SOC_DAPM_MIXER("O027", SND_SOC_NOPM, 0, 0,
      o027_mix, ARRAY_SIZE(o027_mix)),
 SND_SOC_DAPM_MIXER("O028", SND_SOC_NOPM, 0, 0,
      o028_mix, ARRAY_SIZE(o028_mix)),
 SND_SOC_DAPM_MIXER("O029", SND_SOC_NOPM, 0, 0,
      o029_mix, ARRAY_SIZE(o029_mix)),
 SND_SOC_DAPM_MIXER("O030", SND_SOC_NOPM, 0, 0,
      o030_mix, ARRAY_SIZE(o030_mix)),
 SND_SOC_DAPM_MIXER("O031", SND_SOC_NOPM, 0, 0,
      o031_mix, ARRAY_SIZE(o031_mix)),
 SND_SOC_DAPM_MIXER("O032", SND_SOC_NOPM, 0, 0,
      o032_mix, ARRAY_SIZE(o032_mix)),
 SND_SOC_DAPM_MIXER("O033", SND_SOC_NOPM, 0, 0,
      o033_mix, ARRAY_SIZE(o033_mix)),

 /* UL4 */
 SND_SOC_DAPM_MIXER("O034", SND_SOC_NOPM, 0, 0,
      o034_mix, ARRAY_SIZE(o034_mix)),
 SND_SOC_DAPM_MIXER("O035", SND_SOC_NOPM, 0, 0,
      o035_mix, ARRAY_SIZE(o035_mix)),

 /* UL5 */
 SND_SOC_DAPM_MIXER("O036", SND_SOC_NOPM, 0, 0,
      o036_mix, ARRAY_SIZE(o036_mix)),
 SND_SOC_DAPM_MIXER("O037", SND_SOC_NOPM, 0, 0,
      o037_mix, ARRAY_SIZE(o037_mix)),

 /* UL10 */
 SND_SOC_DAPM_MIXER("O038", SND_SOC_NOPM, 0, 0,
      o038_mix, ARRAY_SIZE(o038_mix)),
 SND_SOC_DAPM_MIXER("O039", SND_SOC_NOPM, 0, 0,
      o039_mix, ARRAY_SIZE(o039_mix)),
 SND_SOC_DAPM_MIXER("O182", SND_SOC_NOPM, 0, 0,
      o182_mix, ARRAY_SIZE(o182_mix)),
 SND_SOC_DAPM_MIXER("O183", SND_SOC_NOPM, 0, 0,
      o183_mix, ARRAY_SIZE(o183_mix)),

 /* UL2 */
 SND_SOC_DAPM_MIXER("O040", SND_SOC_NOPM, 0, 0,
      o040_mix, ARRAY_SIZE(o040_mix)),
 SND_SOC_DAPM_MIXER("O041", SND_SOC_NOPM, 0, 0,
      o041_mix, ARRAY_SIZE(o041_mix)),
 SND_SOC_DAPM_MIXER("O042", SND_SOC_NOPM, 0, 0,
      o042_mix, ARRAY_SIZE(o042_mix)),
 SND_SOC_DAPM_MIXER("O043", SND_SOC_NOPM, 0, 0,
      o043_mix, ARRAY_SIZE(o043_mix)),
 SND_SOC_DAPM_MIXER("O044", SND_SOC_NOPM, 0, 0,
      o044_mix, ARRAY_SIZE(o044_mix)),
 SND_SOC_DAPM_MIXER("O045", SND_SOC_NOPM, 0, 0,
      o045_mix, ARRAY_SIZE(o045_mix)),
 SND_SOC_DAPM_MIXER("O046", SND_SOC_NOPM, 0, 0,
      o046_mix, ARRAY_SIZE(o046_mix)),
 SND_SOC_DAPM_MIXER("O047", SND_SOC_NOPM, 0, 0,
      o047_mix, ARRAY_SIZE(o047_mix)),
};

static const struct snd_soc_dapm_route mt8195_memif_routes[] = {
 {"I000", NULL, "DL6"},
 {"I001", NULL, "DL6"},

 {"I020", NULL, "DL3"},
 {"I021", NULL, "DL3"},

 {"I022", NULL, "DL11"},
 {"I023", NULL, "DL11"},
 {"I024", NULL, "DL11"},
 {"I025", NULL, "DL11"},
 {"I026", NULL, "DL11"},
 {"I027", NULL, "DL11"},
 {"I028", NULL, "DL11"},
 {"I029", NULL, "DL11"},
 {"I030", NULL, "DL11"},
 {"I031", NULL, "DL11"},
 {"I032", NULL, "DL11"},
 {"I033", NULL, "DL11"},
 {"I034", NULL, "DL11"},
 {"I035", NULL, "DL11"},
 {"I036", NULL, "DL11"},
 {"I037", NULL, "DL11"},
 {"I038", NULL, "DL11"},
 {"I039", NULL, "DL11"},
 {"I040", NULL, "DL11"},
 {"I041", NULL, "DL11"},
 {"I042", NULL, "DL11"},
 {"I043", NULL, "DL11"},
 {"I044", NULL, "DL11"},
 {"I045", NULL, "DL11"},

 {"DL8_DL11 Mux""dl8""DL8"},
 {"DL8_DL11 Mux""dl11""DL11"},

 {"I046", NULL, "DL8_DL11 Mux"},
 {"I047", NULL, "DL8_DL11 Mux"},
 {"I048", NULL, "DL8_DL11 Mux"},
 {"I049", NULL, "DL8_DL11 Mux"},
 {"I050", NULL, "DL8_DL11 Mux"},
 {"I051", NULL, "DL8_DL11 Mux"},
 {"I052", NULL, "DL8_DL11 Mux"},
 {"I053", NULL, "DL8_DL11 Mux"},
 {"I054", NULL, "DL8_DL11 Mux"},
 {"I055", NULL, "DL8_DL11 Mux"},
 {"I056", NULL, "DL8_DL11 Mux"},
 {"I057", NULL, "DL8_DL11 Mux"},
 {"I058", NULL, "DL8_DL11 Mux"},
 {"I059", NULL, "DL8_DL11 Mux"},
 {"I060", NULL, "DL8_DL11 Mux"},
 {"I061", NULL, "DL8_DL11 Mux"},
 {"I062", NULL, "DL8_DL11 Mux"},
 {"I063", NULL, "DL8_DL11 Mux"},
 {"I064", NULL, "DL8_DL11 Mux"},
 {"I065", NULL, "DL8_DL11 Mux"},
 {"I066", NULL, "DL8_DL11 Mux"},
 {"I067", NULL, "DL8_DL11 Mux"},
 {"I068", NULL, "DL8_DL11 Mux"},
 {"I069", NULL, "DL8_DL11 Mux"},

 {"I070", NULL, "DL2"},
 {"I071", NULL, "DL2"},

 {"UL9", NULL, "O002"},
 {"UL9", NULL, "O003"},
 {"UL9", NULL, "O004"},
 {"UL9", NULL, "O005"},
 {"UL9", NULL, "O006"},
 {"UL9", NULL, "O007"},
 {"UL9", NULL, "O008"},
 {"UL9", NULL, "O009"},
 {"UL9", NULL, "O010"},
 {"UL9", NULL, "O011"},
 {"UL9", NULL, "O012"},
 {"UL9", NULL, "O013"},
 {"UL9", NULL, "O014"},
 {"UL9", NULL, "O015"},
 {"UL9", NULL, "O016"},
 {"UL9", NULL, "O017"},
 {"UL9", NULL, "O018"},
 {"UL9", NULL, "O019"},
 {"UL9", NULL, "O020"},
 {"UL9", NULL, "O021"},
 {"UL9", NULL, "O022"},
 {"UL9", NULL, "O023"},
 {"UL9", NULL, "O024"},
 {"UL9", NULL, "O025"},
 {"UL9", NULL, "O026"},
 {"UL9", NULL, "O027"},
 {"UL9", NULL, "O028"},
 {"UL9", NULL, "O029"},
 {"UL9", NULL, "O030"},
 {"UL9", NULL, "O031"},
 {"UL9", NULL, "O032"},
 {"UL9", NULL, "O033"},

 {"UL4", NULL, "O034"},
 {"UL4", NULL, "O035"},

 {"UL5", NULL, "O036"},
 {"UL5", NULL, "O037"},

 {"UL10", NULL, "O038"},
 {"UL10", NULL, "O039"},
 {"UL10", NULL, "O182"},
 {"UL10", NULL, "O183"},

 {"UL2", NULL, "O040"},
 {"UL2", NULL, "O041"},
 {"UL2", NULL, "O042"},
 {"UL2", NULL, "O043"},
 {"UL2", NULL, "O044"},
 {"UL2", NULL, "O045"},
 {"UL2", NULL, "O046"},
 {"UL2", NULL, "O047"},

 {"O004""I000 Switch""I000"},
 {"O005""I001 Switch""I001"},

 {"O006""I000 Switch""I000"},
 {"O007""I001 Switch""I001"},

 {"O010""I022 Switch""I022"},
 {"O011""I023 Switch""I023"},
 {"O012""I024 Switch""I024"},
 {"O013""I025 Switch""I025"},
 {"O014""I026 Switch""I026"},
 {"O015""I027 Switch""I027"},
 {"O016""I028 Switch""I028"},
 {"O017""I029 Switch""I029"},

 {"O010""I046 Switch""I046"},
 {"O011""I047 Switch""I047"},
 {"O012""I048 Switch""I048"},
 {"O013""I049 Switch""I049"},
 {"O014""I050 Switch""I050"},
 {"O015""I051 Switch""I051"},
 {"O016""I052 Switch""I052"},
 {"O017""I053 Switch""I053"},
 {"O002""I022 Switch""I022"},
 {"O003""I023 Switch""I023"},
 {"O004""I024 Switch""I024"},
 {"O005""I025 Switch""I025"},
 {"O006""I026 Switch""I026"},
 {"O007""I027 Switch""I027"},
 {"O008""I028 Switch""I028"},
 {"O009""I029 Switch""I029"},
 {"O010""I030 Switch""I030"},
 {"O011""I031 Switch""I031"},
 {"O012""I032 Switch""I032"},
 {"O013""I033 Switch""I033"},
 {"O014""I034 Switch""I034"},
 {"O015""I035 Switch""I035"},
 {"O016""I036 Switch""I036"},
 {"O017""I037 Switch""I037"},
 {"O018""I038 Switch""I038"},
 {"O019""I039 Switch""I039"},
 {"O020""I040 Switch""I040"},
 {"O021""I041 Switch""I041"},
 {"O022""I042 Switch""I042"},
 {"O023""I043 Switch""I043"},
 {"O024""I044 Switch""I044"},
 {"O025""I045 Switch""I045"},
 {"O026""I046 Switch""I046"},
 {"O027""I047 Switch""I047"},
 {"O028""I048 Switch""I048"},
 {"O029""I049 Switch""I049"},
 {"O030""I050 Switch""I050"},
 {"O031""I051 Switch""I051"},
 {"O032""I052 Switch""I052"},
 {"O033""I053 Switch""I053"},

 {"O002""I000 Switch""I000"},
 {"O003""I001 Switch""I001"},
 {"O002""I020 Switch""I020"},
 {"O003""I021 Switch""I021"},
 {"O002""I070 Switch""I070"},
 {"O003""I071 Switch""I071"},

 {"O034""I000 Switch""I000"},
 {"O035""I001 Switch""I001"},
 {"O034""I002 Switch""I002"},
 {"O035""I003 Switch""I003"},
 {"O034""I012 Switch""I012"},
 {"O035""I013 Switch""I013"},
 {"O034""I020 Switch""I020"},
 {"O035""I021 Switch""I021"},
 {"O034""I070 Switch""I070"},
 {"O035""I071 Switch""I071"},
 {"O034""I072 Switch""I072"},
 {"O035""I073 Switch""I073"},

 {"O036""I000 Switch""I000"},
 {"O037""I001 Switch""I001"},
 {"O036""I012 Switch""I012"},
 {"O037""I013 Switch""I013"},
 {"O036""I020 Switch""I020"},
 {"O037""I021 Switch""I021"},
 {"O036""I070 Switch""I070"},
 {"O037""I071 Switch""I071"},
 {"O036""I168 Switch""I168"},
 {"O037""I169 Switch""I169"},

 {"O038""I022 Switch""I022"},
 {"O039""I023 Switch""I023"},
 {"O182""I024 Switch""I024"},
 {"O183""I025 Switch""I025"},

 {"O040""I022 Switch""I022"},
 {"O041""I023 Switch""I023"},
 {"O042""I024 Switch""I024"},
 {"O043""I025 Switch""I025"},
 {"O044""I026 Switch""I026"},
 {"O045""I027 Switch""I027"},
 {"O046""I028 Switch""I028"},
 {"O047""I029 Switch""I029"},

 {"O040""I002 Switch""I002"},
 {"O041""I003 Switch""I003"},
 {"O002""I012 Switch""I012"},
 {"O003""I013 Switch""I013"},
 {"O004""I014 Switch""I014"},
 {"O005""I015 Switch""I015"},
 {"O006""I016 Switch""I016"},
 {"O007""I017 Switch""I017"},
 {"O008""I018 Switch""I018"},
 {"O009""I019 Switch""I019"},

 {"O040""I012 Switch""I012"},
 {"O041""I013 Switch""I013"},
 {"O042""I014 Switch""I014"},
 {"O043""I015 Switch""I015"},
 {"O044""I016 Switch""I016"},
 {"O045""I017 Switch""I017"},
 {"O046""I018 Switch""I018"},
 {"O047""I019 Switch""I019"},

 {"O002""I072 Switch""I072"},
 {"O003""I073 Switch""I073"},
 {"O004""I074 Switch""I074"},
 {"O005""I075 Switch""I075"},
 {"O006""I076 Switch""I076"},
 {"O007""I077 Switch""I077"},
 {"O008""I078 Switch""I078"},
 {"O009""I079 Switch""I079"},

 {"O010""I072 Switch""I072"},
 {"O011""I073 Switch""I073"},
 {"O012""I074 Switch""I074"},
 {"O013""I075 Switch""I075"},
 {"O014""I076 Switch""I076"},
 {"O015""I077 Switch""I077"},
 {"O016""I078 Switch""I078"},
 {"O017""I079 Switch""I079"},
 {"O018""I080 Switch""I080"},
 {"O019""I081 Switch""I081"},
 {"O020""I082 Switch""I082"},
 {"O021""I083 Switch""I083"},
 {"O022""I084 Switch""I084"},
 {"O023""I085 Switch""I085"},
 {"O024""I086 Switch""I086"},
 {"O025""I087 Switch""I087"},
 {"O026""I088 Switch""I088"},
 {"O027""I089 Switch""I089"},
 {"O028""I090 Switch""I090"},
 {"O029""I091 Switch""I091"},
 {"O030""I092 Switch""I092"},
 {"O031""I093 Switch""I093"},
 {"O032""I094 Switch""I094"},
 {"O033""I095 Switch""I095"},

 {"O002""I168 Switch""I168"},
 {"O003""I169 Switch""I169"},
 {"O004""I170 Switch""I170"},
 {"O005""I171 Switch""I171"},

 {"O034""I168 Switch""I168"},
 {"O035""I168 Switch""I168"},
 {"O035""I169 Switch""I169"},

 {"O034""I170 Switch""I170"},
 {"O035""I170 Switch""I170"},
 {"O035""I171 Switch""I171"},

 {"O040""I168 Switch""I168"},
 {"O041""I169 Switch""I169"},
 {"O042""I170 Switch""I170"},
 {"O043""I171 Switch""I171"},
};

static const char * const mt8195_afe_1x_en_sel_text[] = {
 "a1sys_a2sys""a3sys""a4sys",
};

static const unsigned int mt8195_afe_1x_en_sel_values[] = {
 0, 1, 2,
};

static int mt8195_memif_1x_en_sel_put(struct snd_kcontrol *kcontrol,
          struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *component =
  snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
 struct mt8195_afe_private *afe_priv = afe->platform_priv;
 struct mtk_dai_memif_priv *memif_priv;
 unsigned int dai_id = kcontrol->id.device;
 long val = ucontrol->value.integer.value[0];
 int ret = 0;

 memif_priv = afe_priv->dai_priv[dai_id];

 if (val == memif_priv->asys_timing_sel)
  return 0;

 ret = snd_soc_put_enum_double(kcontrol, ucontrol);

 memif_priv->asys_timing_sel = val;

 return ret;
}

static int mt8195_asys_irq_1x_en_sel_put(struct snd_kcontrol *kcontrol,
      struct snd_ctl_elem_value *ucontrol)
{
 struct snd_soc_component *component =
  snd_soc_kcontrol_component(kcontrol);
 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
 struct mt8195_afe_private *afe_priv = afe->platform_priv;
 unsigned int id = kcontrol->id.device;
 long val = ucontrol->value.integer.value[0];
 int ret = 0;

 if (val == afe_priv->irq_priv[id].asys_timing_sel)
  return 0;

 ret = snd_soc_put_enum_double(kcontrol, ucontrol);

 afe_priv->irq_priv[id].asys_timing_sel = val;

 return ret;
}

static SOC_VALUE_ENUM_SINGLE_DECL(dl2_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 18, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(dl3_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 20, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(dl6_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 22, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(dl7_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 24, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(dl8_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 26, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(dl10_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 28, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(dl11_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 30, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul1_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 0, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul2_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 2, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul3_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 4, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul4_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 6, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul5_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 8, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul6_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 10, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul8_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 12, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul9_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 14, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(ul10_1x_en_sel_enum,
   A3_A4_TIMING_SEL1, 16, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);

static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq1_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 0, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq2_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 2, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq3_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 4, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq4_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 6, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq5_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 8, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq6_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 10, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq7_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 12, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq8_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 14, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq9_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 16, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq10_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 18, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq11_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 20, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq12_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 22, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq13_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 24, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq14_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 26, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq15_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 28, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);
static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq16_1x_en_sel_enum,
   A3_A4_TIMING_SEL6, 30, 0x3,
   mt8195_afe_1x_en_sel_text,
   mt8195_afe_1x_en_sel_values);

static const struct snd_kcontrol_new mt8195_memif_controls[] = {
 MT8195_SOC_ENUM_EXT("dl2_1x_en_sel",
       dl2_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL2),
 MT8195_SOC_ENUM_EXT("dl3_1x_en_sel",
       dl3_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL3),
 MT8195_SOC_ENUM_EXT("dl6_1x_en_sel",
       dl6_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL6),
 MT8195_SOC_ENUM_EXT("dl7_1x_en_sel",
       dl7_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL7),
 MT8195_SOC_ENUM_EXT("dl8_1x_en_sel",
       dl8_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL8),
 MT8195_SOC_ENUM_EXT("dl10_1x_en_sel",
       dl10_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL10),
 MT8195_SOC_ENUM_EXT("dl11_1x_en_sel",
       dl11_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_DL11),
 MT8195_SOC_ENUM_EXT("ul1_1x_en_sel",
       ul1_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL1),
 MT8195_SOC_ENUM_EXT("ul2_1x_en_sel",
       ul2_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL2),
 MT8195_SOC_ENUM_EXT("ul3_1x_en_sel",
       ul3_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL3),
 MT8195_SOC_ENUM_EXT("ul4_1x_en_sel",
       ul4_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL4),
 MT8195_SOC_ENUM_EXT("ul5_1x_en_sel",
       ul5_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL5),
 MT8195_SOC_ENUM_EXT("ul6_1x_en_sel",
       ul6_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL6),
 MT8195_SOC_ENUM_EXT("ul8_1x_en_sel",
       ul8_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL8),
 MT8195_SOC_ENUM_EXT("ul9_1x_en_sel",
       ul9_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL9),
 MT8195_SOC_ENUM_EXT("ul10_1x_en_sel",
       ul10_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_memif_1x_en_sel_put,
       MT8195_AFE_MEMIF_UL10),
 MT8195_SOC_ENUM_EXT("asys_irq1_1x_en_sel",
       asys_irq1_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_13),
 MT8195_SOC_ENUM_EXT("asys_irq2_1x_en_sel",
       asys_irq2_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_14),
 MT8195_SOC_ENUM_EXT("asys_irq3_1x_en_sel",
       asys_irq3_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_15),
 MT8195_SOC_ENUM_EXT("asys_irq4_1x_en_sel",
       asys_irq4_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_16),
 MT8195_SOC_ENUM_EXT("asys_irq5_1x_en_sel",
       asys_irq5_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_17),
 MT8195_SOC_ENUM_EXT("asys_irq6_1x_en_sel",
       asys_irq6_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_18),
 MT8195_SOC_ENUM_EXT("asys_irq7_1x_en_sel",
       asys_irq7_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_19),
 MT8195_SOC_ENUM_EXT("asys_irq8_1x_en_sel",
       asys_irq8_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_20),
 MT8195_SOC_ENUM_EXT("asys_irq9_1x_en_sel",
       asys_irq9_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_21),
 MT8195_SOC_ENUM_EXT("asys_irq10_1x_en_sel",
       asys_irq10_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_22),
 MT8195_SOC_ENUM_EXT("asys_irq11_1x_en_sel",
       asys_irq11_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_23),
 MT8195_SOC_ENUM_EXT("asys_irq12_1x_en_sel",
       asys_irq12_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_24),
 MT8195_SOC_ENUM_EXT("asys_irq13_1x_en_sel",
       asys_irq13_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_25),
 MT8195_SOC_ENUM_EXT("asys_irq14_1x_en_sel",
       asys_irq14_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_26),
 MT8195_SOC_ENUM_EXT("asys_irq15_1x_en_sel",
       asys_irq15_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_27),
 MT8195_SOC_ENUM_EXT("asys_irq16_1x_en_sel",
       asys_irq16_1x_en_sel_enum,
       snd_soc_get_enum_double,
       mt8195_asys_irq_1x_en_sel_put,
       MT8195_AFE_IRQ_28),
};

static const struct mtk_base_memif_data memif_data[MT8195_AFE_MEMIF_NUM] = {
 [MT8195_AFE_MEMIF_DL2] = {
  .name = "DL2",
  .id = MT8195_AFE_MEMIF_DL2,
  .reg_ofs_base = AFE_DL2_BASE,
  .reg_ofs_cur = AFE_DL2_CUR,
  .reg_ofs_end = AFE_DL2_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON0,
  .fs_shift = 10,
  .fs_maskbit = 0x1f,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 18,
  .hd_reg = AFE_DL2_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 18,
  .ch_num_reg = AFE_DL2_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x1f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 18,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 18,
 },
 [MT8195_AFE_MEMIF_DL3] = {
  .name = "DL3",
  .id = MT8195_AFE_MEMIF_DL3,
  .reg_ofs_base = AFE_DL3_BASE,
  .reg_ofs_cur = AFE_DL3_CUR,
  .reg_ofs_end = AFE_DL3_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON0,
  .fs_shift = 15,
  .fs_maskbit = 0x1f,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 19,
  .hd_reg = AFE_DL3_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 19,
  .ch_num_reg = AFE_DL3_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x1f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 19,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 19,
 },
 [MT8195_AFE_MEMIF_DL6] = {
  .name = "DL6",
  .id = MT8195_AFE_MEMIF_DL6,
  .reg_ofs_base = AFE_DL6_BASE,
  .reg_ofs_cur = AFE_DL6_CUR,
  .reg_ofs_end = AFE_DL6_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  .fs_shift = 0,
  .fs_maskbit = 0x1f,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 22,
  .hd_reg = AFE_DL6_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 22,
  .ch_num_reg = AFE_DL6_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x1f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 22,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 22,
 },
 [MT8195_AFE_MEMIF_DL7] = {
  .name = "DL7",
  .id = MT8195_AFE_MEMIF_DL7,
  .reg_ofs_base = AFE_DL7_BASE,
  .reg_ofs_cur = AFE_DL7_CUR,
  .reg_ofs_end = AFE_DL7_END,
  .fs_reg = -1,
  .fs_shift = 0,
  .fs_maskbit = 0,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 23,
  .hd_reg = AFE_DL7_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 23,
  .ch_num_reg = AFE_DL7_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x1f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 23,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 23,
 },
 [MT8195_AFE_MEMIF_DL8] = {
  .name = "DL8",
  .id = MT8195_AFE_MEMIF_DL8,
  .reg_ofs_base = AFE_DL8_BASE,
  .reg_ofs_cur = AFE_DL8_CUR,
  .reg_ofs_end = AFE_DL8_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  .fs_shift = 10,
  .fs_maskbit = 0x1f,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 24,
  .hd_reg = AFE_DL8_CON0,
  .hd_shift = 6,
  .agent_disable_reg = -1,
  .agent_disable_shift = 0,
  .ch_num_reg = AFE_DL8_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x3f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 24,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 24,
 },
 [MT8195_AFE_MEMIF_DL10] = {
  .name = "DL10",
  .id = MT8195_AFE_MEMIF_DL10,
  .reg_ofs_base = AFE_DL10_BASE,
  .reg_ofs_cur = AFE_DL10_CUR,
  .reg_ofs_end = AFE_DL10_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  .fs_shift = 20,
  .fs_maskbit = 0x1f,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 26,
  .hd_reg = AFE_DL10_CON0,
  .hd_shift = 5,
  .agent_disable_reg = -1,
  .agent_disable_shift = 0,
  .ch_num_reg = AFE_DL10_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x1f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 26,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 26,
 },
 [MT8195_AFE_MEMIF_DL11] = {
  .name = "DL11",
  .id = MT8195_AFE_MEMIF_DL11,
  .reg_ofs_base = AFE_DL11_BASE,
  .reg_ofs_cur = AFE_DL11_CUR,
  .reg_ofs_end = AFE_DL11_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  .fs_shift = 25,
  .fs_maskbit = 0x1f,
  .mono_reg = -1,
  .mono_shift = 0,
  .int_odd_flag_reg = -1,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 27,
  .hd_reg = AFE_DL11_CON0,
  .hd_shift = 7,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 27,
  .ch_num_reg = AFE_DL11_CON0,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0x7f,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 27,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 27,
 },
 [MT8195_AFE_MEMIF_UL1] = {
  .name = "UL1",
  .id = MT8195_AFE_MEMIF_UL1,
  .reg_ofs_base = AFE_UL1_BASE,
  .reg_ofs_cur = AFE_UL1_CUR,
  .reg_ofs_end = AFE_UL1_END,
  .fs_reg = -1,
  .fs_shift = 0,
  .fs_maskbit = 0,
  .mono_reg = AFE_UL1_CON0,
  .mono_shift = 1,
  .int_odd_flag_reg = AFE_UL1_CON0,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 1,
  .hd_reg = AFE_UL1_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 0,
  .ch_num_reg = -1,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 0,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 0,
 },
 [MT8195_AFE_MEMIF_UL2] = {
  .name = "UL2",
  .id = MT8195_AFE_MEMIF_UL2,
  .reg_ofs_base = AFE_UL2_BASE,
  .reg_ofs_cur = AFE_UL2_CUR,
  .reg_ofs_end = AFE_UL2_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  .fs_shift = 5,
  .fs_maskbit = 0x1f,
  .mono_reg = AFE_UL2_CON0,
  .mono_shift = 1,
  .int_odd_flag_reg = AFE_UL2_CON0,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 2,
  .hd_reg = AFE_UL2_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 1,
  .ch_num_reg = -1,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 1,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 1,
 },
 [MT8195_AFE_MEMIF_UL3] = {
  .name = "UL3",
  .id = MT8195_AFE_MEMIF_UL3,
  .reg_ofs_base = AFE_UL3_BASE,
  .reg_ofs_cur = AFE_UL3_CUR,
  .reg_ofs_end = AFE_UL3_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  .fs_shift = 10,
  .fs_maskbit = 0x1f,
  .mono_reg = AFE_UL3_CON0,
  .mono_shift = 1,
  .int_odd_flag_reg = AFE_UL3_CON0,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 3,
  .hd_reg = AFE_UL3_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 2,
  .ch_num_reg = -1,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 2,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 2,
 },
 [MT8195_AFE_MEMIF_UL4] = {
  .name = "UL4",
  .id = MT8195_AFE_MEMIF_UL4,
  .reg_ofs_base = AFE_UL4_BASE,
  .reg_ofs_cur = AFE_UL4_CUR,
  .reg_ofs_end = AFE_UL4_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  .fs_shift = 15,
  .fs_maskbit = 0x1f,
  .mono_reg = AFE_UL4_CON0,
  .mono_shift = 1,
  .int_odd_flag_reg = AFE_UL4_CON0,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 4,
  .hd_reg = AFE_UL4_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 3,
  .ch_num_reg = -1,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 3,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 3,
 },
 [MT8195_AFE_MEMIF_UL5] = {
  .name = "UL5",
  .id = MT8195_AFE_MEMIF_UL5,
  .reg_ofs_base = AFE_UL5_BASE,
  .reg_ofs_cur = AFE_UL5_CUR,
  .reg_ofs_end = AFE_UL5_END,
  .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  .fs_shift = 20,
  .fs_maskbit = 0x1f,
  .mono_reg = AFE_UL5_CON0,
  .mono_shift = 1,
  .int_odd_flag_reg = AFE_UL5_CON0,
  .int_odd_flag_shift = 0,
  .enable_reg = AFE_DAC_CON0,
  .enable_shift = 5,
  .hd_reg = AFE_UL5_CON0,
  .hd_shift = 5,
  .agent_disable_reg = AUDIO_TOP_CON5,
  .agent_disable_shift = 4,
  .ch_num_reg = -1,
  .ch_num_shift = 0,
  .ch_num_maskbit = 0,
  .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  .msb_shift = 4,
  .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  .msb_end_shift = 4,
 },
--> --------------------

--> maximum size reached

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

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

¤ Dauer der Verarbeitung: 0.20 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.