cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mt8192-dai-adda.c (43599B)


      1// SPDX-License-Identifier: GPL-2.0
      2//
      3// MediaTek ALSA SoC Audio DAI ADDA Control
      4//
      5// Copyright (c) 2020 MediaTek Inc.
      6// Author: Shane Chien <shane.chien@mediatek.com>
      7//
      8
      9#include <linux/delay.h>
     10#include <linux/regmap.h>
     11
     12#include "mt8192-afe-clk.h"
     13#include "mt8192-afe-common.h"
     14#include "mt8192-afe-gpio.h"
     15#include "mt8192-interconnection.h"
     16
     17enum {
     18	UL_IIR_SW = 0,
     19	UL_IIR_5HZ,
     20	UL_IIR_10HZ,
     21	UL_IIR_25HZ,
     22	UL_IIR_50HZ,
     23	UL_IIR_75HZ,
     24};
     25
     26enum {
     27	AUDIO_SDM_LEVEL_MUTE = 0,
     28	AUDIO_SDM_LEVEL_NORMAL = 0x1d,
     29	/* if you change level normal */
     30	/* you need to change formula of hp impedance and dc trim too */
     31};
     32
     33enum {
     34	AUDIO_SDM_2ND = 0,
     35	AUDIO_SDM_3RD,
     36};
     37
     38enum {
     39	DELAY_DATA_MISO1 = 0,
     40	DELAY_DATA_MISO2,
     41};
     42
     43enum {
     44	MTK_AFE_ADDA_DL_RATE_8K = 0,
     45	MTK_AFE_ADDA_DL_RATE_11K = 1,
     46	MTK_AFE_ADDA_DL_RATE_12K = 2,
     47	MTK_AFE_ADDA_DL_RATE_16K = 3,
     48	MTK_AFE_ADDA_DL_RATE_22K = 4,
     49	MTK_AFE_ADDA_DL_RATE_24K = 5,
     50	MTK_AFE_ADDA_DL_RATE_32K = 6,
     51	MTK_AFE_ADDA_DL_RATE_44K = 7,
     52	MTK_AFE_ADDA_DL_RATE_48K = 8,
     53	MTK_AFE_ADDA_DL_RATE_96K = 9,
     54	MTK_AFE_ADDA_DL_RATE_192K = 10,
     55};
     56
     57enum {
     58	MTK_AFE_ADDA_UL_RATE_8K = 0,
     59	MTK_AFE_ADDA_UL_RATE_16K = 1,
     60	MTK_AFE_ADDA_UL_RATE_32K = 2,
     61	MTK_AFE_ADDA_UL_RATE_48K = 3,
     62	MTK_AFE_ADDA_UL_RATE_96K = 4,
     63	MTK_AFE_ADDA_UL_RATE_192K = 5,
     64	MTK_AFE_ADDA_UL_RATE_48K_HD = 6,
     65};
     66
     67#define SDM_AUTO_RESET_THRESHOLD 0x190000
     68
     69static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
     70					   unsigned int rate)
     71{
     72	switch (rate) {
     73	case 8000:
     74		return MTK_AFE_ADDA_DL_RATE_8K;
     75	case 11025:
     76		return MTK_AFE_ADDA_DL_RATE_11K;
     77	case 12000:
     78		return MTK_AFE_ADDA_DL_RATE_12K;
     79	case 16000:
     80		return MTK_AFE_ADDA_DL_RATE_16K;
     81	case 22050:
     82		return MTK_AFE_ADDA_DL_RATE_22K;
     83	case 24000:
     84		return MTK_AFE_ADDA_DL_RATE_24K;
     85	case 32000:
     86		return MTK_AFE_ADDA_DL_RATE_32K;
     87	case 44100:
     88		return MTK_AFE_ADDA_DL_RATE_44K;
     89	case 48000:
     90		return MTK_AFE_ADDA_DL_RATE_48K;
     91	case 96000:
     92		return MTK_AFE_ADDA_DL_RATE_96K;
     93	case 192000:
     94		return MTK_AFE_ADDA_DL_RATE_192K;
     95	default:
     96		dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
     97			 __func__, rate);
     98		return MTK_AFE_ADDA_DL_RATE_48K;
     99	}
    100}
    101
    102static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
    103					   unsigned int rate)
    104{
    105	switch (rate) {
    106	case 8000:
    107		return MTK_AFE_ADDA_UL_RATE_8K;
    108	case 16000:
    109		return MTK_AFE_ADDA_UL_RATE_16K;
    110	case 32000:
    111		return MTK_AFE_ADDA_UL_RATE_32K;
    112	case 48000:
    113		return MTK_AFE_ADDA_UL_RATE_48K;
    114	case 96000:
    115		return MTK_AFE_ADDA_UL_RATE_96K;
    116	case 192000:
    117		return MTK_AFE_ADDA_UL_RATE_192K;
    118	default:
    119		dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
    120			 __func__, rate);
    121		return MTK_AFE_ADDA_UL_RATE_48K;
    122	}
    123}
    124
    125/* dai component */
    126static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
    127	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
    128	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN3, I_DL12_CH1, 1, 0),
    129	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
    130	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
    131	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN3_1, I_DL4_CH1, 1, 0),
    132	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN3_1, I_DL5_CH1, 1, 0),
    133	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN3_1, I_DL6_CH1, 1, 0),
    134	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN3_1, I_DL8_CH1, 1, 0),
    135	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN3,
    136				    I_ADDA_UL_CH3, 1, 0),
    137	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
    138				    I_ADDA_UL_CH2, 1, 0),
    139	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
    140				    I_ADDA_UL_CH1, 1, 0),
    141	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN3,
    142				    I_GAIN1_OUT_CH1, 1, 0),
    143	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
    144				    I_PCM_1_CAP_CH1, 1, 0),
    145	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
    146				    I_PCM_2_CAP_CH1, 1, 0),
    147	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN3_1,
    148				    I_SRC_1_OUT_CH1, 1, 0),
    149	SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH1", AFE_CONN3_1,
    150				    I_SRC_2_OUT_CH1, 1, 0),
    151};
    152
    153static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
    154	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
    155	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
    156	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN4, I_DL12_CH2, 1, 0),
    157	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
    158	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
    159	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
    160	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
    161	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN4_1, I_DL4_CH2, 1, 0),
    162	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN4_1, I_DL5_CH2, 1, 0),
    163	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN4_1, I_DL6_CH2, 1, 0),
    164	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN4_1, I_DL8_CH2, 1, 0),
    165	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN4,
    166				    I_ADDA_UL_CH3, 1, 0),
    167	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
    168				    I_ADDA_UL_CH2, 1, 0),
    169	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
    170				    I_ADDA_UL_CH1, 1, 0),
    171	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN4,
    172				    I_GAIN1_OUT_CH2, 1, 0),
    173	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
    174				    I_PCM_1_CAP_CH1, 1, 0),
    175	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
    176				    I_PCM_2_CAP_CH1, 1, 0),
    177	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
    178				    I_PCM_1_CAP_CH2, 1, 0),
    179	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
    180				    I_PCM_2_CAP_CH2, 1, 0),
    181	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN4_1,
    182				    I_SRC_1_OUT_CH2, 1, 0),
    183	SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH2", AFE_CONN4_1,
    184				    I_SRC_2_OUT_CH2, 1, 0),
    185};
    186
    187static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {
    188	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN52, I_DL1_CH1, 1, 0),
    189	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN52, I_DL12_CH1, 1, 0),
    190	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN52, I_DL2_CH1, 1, 0),
    191	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN52, I_DL3_CH1, 1, 0),
    192	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN52_1, I_DL4_CH1, 1, 0),
    193	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN52_1, I_DL5_CH1, 1, 0),
    194	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN52_1, I_DL6_CH1, 1, 0),
    195	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN52,
    196				    I_ADDA_UL_CH3, 1, 0),
    197	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN52,
    198				    I_ADDA_UL_CH2, 1, 0),
    199	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN52,
    200				    I_ADDA_UL_CH1, 1, 0),
    201	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN52,
    202				    I_GAIN1_OUT_CH1, 1, 0),
    203	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN52,
    204				    I_PCM_1_CAP_CH1, 1, 0),
    205	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN52,
    206				    I_PCM_2_CAP_CH1, 1, 0),
    207};
    208
    209static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {
    210	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN53, I_DL1_CH1, 1, 0),
    211	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN53, I_DL1_CH2, 1, 0),
    212	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN53, I_DL12_CH2, 1, 0),
    213	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN53, I_DL2_CH1, 1, 0),
    214	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN53, I_DL2_CH2, 1, 0),
    215	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN53, I_DL3_CH1, 1, 0),
    216	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN53, I_DL3_CH2, 1, 0),
    217	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN53_1, I_DL4_CH2, 1, 0),
    218	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN53_1, I_DL5_CH2, 1, 0),
    219	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN53_1, I_DL6_CH1, 1, 0),
    220	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN53,
    221				    I_ADDA_UL_CH3, 1, 0),
    222	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN53,
    223				    I_ADDA_UL_CH2, 1, 0),
    224	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN53,
    225				    I_ADDA_UL_CH1, 1, 0),
    226	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN53,
    227				    I_GAIN1_OUT_CH2, 1, 0),
    228	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN53,
    229				    I_PCM_1_CAP_CH1, 1, 0),
    230	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN53,
    231				    I_PCM_2_CAP_CH1, 1, 0),
    232	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN53,
    233				    I_PCM_1_CAP_CH2, 1, 0),
    234	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN53,
    235				    I_PCM_2_CAP_CH2, 1, 0),
    236};
    237
    238static const struct snd_kcontrol_new mtk_stf_ch1_mix[] = {
    239	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN19,
    240				    I_ADDA_UL_CH1, 1, 0),
    241};
    242
    243static const struct snd_kcontrol_new mtk_stf_ch2_mix[] = {
    244	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN20,
    245				    I_ADDA_UL_CH2, 1, 0),
    246};
    247
    248enum {
    249	SUPPLY_SEQ_ADDA_AFE_ON,
    250	SUPPLY_SEQ_ADDA_DL_ON,
    251	SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
    252	SUPPLY_SEQ_ADDA_MTKAIF_CFG,
    253	SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
    254	SUPPLY_SEQ_ADDA_FIFO,
    255	SUPPLY_SEQ_ADDA_AP_DMIC,
    256	SUPPLY_SEQ_ADDA_UL_ON,
    257};
    258
    259static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
    260{
    261	unsigned int reg;
    262
    263	switch (id) {
    264	case MT8192_DAI_ADDA:
    265	case MT8192_DAI_AP_DMIC:
    266		reg = AFE_ADDA_UL_SRC_CON0;
    267		break;
    268	case MT8192_DAI_ADDA_CH34:
    269	case MT8192_DAI_AP_DMIC_CH34:
    270		reg = AFE_ADDA6_UL_SRC_CON0;
    271		break;
    272	default:
    273		return -EINVAL;
    274	}
    275
    276	/* dmic mode, 3.25M*/
    277	regmap_update_bits(afe->regmap, reg,
    278			   DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
    279			   0x0);
    280	regmap_update_bits(afe->regmap, reg,
    281			   DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
    282			   0x0);
    283
    284	/* turn on dmic, ch1, ch2 */
    285	regmap_update_bits(afe->regmap, reg,
    286			   UL_SDM_3_LEVEL_CTL_MASK_SFT,
    287			   0x1 << UL_SDM_3_LEVEL_CTL_SFT);
    288	regmap_update_bits(afe->regmap, reg,
    289			   UL_MODE_3P25M_CH1_CTL_MASK_SFT,
    290			   0x1 << UL_MODE_3P25M_CH1_CTL_SFT);
    291	regmap_update_bits(afe->regmap, reg,
    292			   UL_MODE_3P25M_CH2_CTL_MASK_SFT,
    293			   0x1 << UL_MODE_3P25M_CH2_CTL_SFT);
    294	return 0;
    295}
    296
    297static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
    298			     struct snd_kcontrol *kcontrol,
    299			     int event)
    300{
    301	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    302	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    303	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    304	int mtkaif_dmic = afe_priv->mtkaif_dmic;
    305
    306	dev_info(afe->dev, "%s(), name %s, event 0x%x, mtkaif_dmic %d\n",
    307		 __func__, w->name, event, mtkaif_dmic);
    308
    309	switch (event) {
    310	case SND_SOC_DAPM_PRE_PMU:
    311		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
    312
    313		/* update setting to dmic */
    314		if (mtkaif_dmic) {
    315			/* mtkaif_rxif_data_mode = 1, dmic */
    316			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
    317					   0x1, 0x1);
    318
    319			/* dmic mode, 3.25M*/
    320			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
    321					   MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
    322					   0x0);
    323			mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
    324		}
    325		break;
    326	case SND_SOC_DAPM_POST_PMD:
    327		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
    328		usleep_range(125, 135);
    329		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
    330		break;
    331	default:
    332		break;
    333	}
    334
    335	return 0;
    336}
    337
    338static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
    339				  struct snd_kcontrol *kcontrol,
    340				  int event)
    341{
    342	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    343	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    344	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    345	int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
    346	int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
    347
    348	dev_info(afe->dev,
    349		 "%s(), name %s, event 0x%x, mtkaif_dmic %d, mtkaif_adda6_only %d\n",
    350		 __func__, w->name, event, mtkaif_dmic, mtkaif_adda6_only);
    351
    352	switch (event) {
    353	case SND_SOC_DAPM_PRE_PMU:
    354		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
    355					1);
    356
    357		/* update setting to dmic */
    358		if (mtkaif_dmic) {
    359			/* mtkaif_rxif_data_mode = 1, dmic */
    360			regmap_update_bits(afe->regmap,
    361					   AFE_ADDA6_MTKAIF_RX_CFG0,
    362					   0x1, 0x1);
    363
    364			/* dmic mode, 3.25M*/
    365			regmap_update_bits(afe->regmap,
    366					   AFE_ADDA6_MTKAIF_RX_CFG0,
    367					   MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
    368					   0x0);
    369			mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
    370		}
    371
    372		/* when using adda6 without adda enabled,
    373		 * RG_ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE_SFT need to be set or
    374		 * data cannot be received.
    375		 */
    376		if (mtkaif_adda6_only) {
    377			regmap_update_bits(afe->regmap,
    378					   AFE_ADDA_MTKAIF_SYNCWORD_CFG,
    379					   0x1 << 23, 0x1 << 23);
    380		}
    381		break;
    382	case SND_SOC_DAPM_POST_PMD:
    383		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
    384		usleep_range(125, 135);
    385		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
    386					1);
    387
    388		/* reset dmic */
    389		afe_priv->mtkaif_dmic_ch34 = 0;
    390
    391		if (mtkaif_adda6_only) {
    392			regmap_update_bits(afe->regmap,
    393					   AFE_ADDA_MTKAIF_SYNCWORD_CFG,
    394					   0x1 << 23, 0x0 << 23);
    395		}
    396		break;
    397	default:
    398		break;
    399	}
    400
    401	return 0;
    402}
    403
    404static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
    405				  struct snd_kcontrol *kcontrol,
    406				  int event)
    407{
    408	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    409	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    410	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    411
    412	switch (event) {
    413	case SND_SOC_DAPM_PRE_PMU:
    414		if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
    415			regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
    416		else
    417			regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
    418		break;
    419	default:
    420		break;
    421	}
    422
    423	return 0;
    424}
    425
    426static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
    427				     struct snd_kcontrol *kcontrol,
    428				     int event)
    429{
    430	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    431	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    432	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    433	int delay_data;
    434	int delay_cycle;
    435
    436	switch (event) {
    437	case SND_SOC_DAPM_PRE_PMU:
    438		if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
    439			/* set protocol 2 */
    440			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
    441				     0x00010000);
    442			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
    443				     0x00010000);
    444
    445			if (strcmp(w->name, "ADDA_MTKAIF_CFG") == 0 &&
    446			    (afe_priv->mtkaif_chosen_phase[0] < 0 ||
    447			     afe_priv->mtkaif_chosen_phase[1] < 0)) {
    448				dev_warn(afe->dev,
    449					 "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
    450					 __func__,
    451					 afe_priv->mtkaif_chosen_phase[0],
    452					 afe_priv->mtkaif_chosen_phase[1]);
    453				break;
    454			} else if (strcmp(w->name, "ADDA6_MTKAIF_CFG") == 0 &&
    455				   afe_priv->mtkaif_chosen_phase[2] < 0) {
    456				dev_warn(afe->dev,
    457					 "%s(), mtkaif_chosen_phase[2]:%d\n",
    458					 __func__,
    459					 afe_priv->mtkaif_chosen_phase[2]);
    460				break;
    461			}
    462
    463			/* mtkaif_rxif_clkinv_adc inverse for calibration */
    464			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
    465					   MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
    466					   0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
    467			regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
    468					   MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
    469					   0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
    470
    471			/* set delay for ch12 */
    472			if (afe_priv->mtkaif_phase_cycle[0] >=
    473			    afe_priv->mtkaif_phase_cycle[1]) {
    474				delay_data = DELAY_DATA_MISO1;
    475				delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
    476					      afe_priv->mtkaif_phase_cycle[1];
    477			} else {
    478				delay_data = DELAY_DATA_MISO2;
    479				delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
    480					      afe_priv->mtkaif_phase_cycle[0];
    481			}
    482
    483			regmap_update_bits(afe->regmap,
    484					   AFE_ADDA_MTKAIF_RX_CFG2,
    485					   MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
    486					   delay_data <<
    487					   MTKAIF_RXIF_DELAY_DATA_SFT);
    488
    489			regmap_update_bits(afe->regmap,
    490					   AFE_ADDA_MTKAIF_RX_CFG2,
    491					   MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
    492					   delay_cycle <<
    493					   MTKAIF_RXIF_DELAY_CYCLE_SFT);
    494
    495			/* set delay between ch3 and ch2 */
    496			if (afe_priv->mtkaif_phase_cycle[2] >=
    497			    afe_priv->mtkaif_phase_cycle[1]) {
    498				delay_data = DELAY_DATA_MISO1;	/* ch3 */
    499				delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
    500					      afe_priv->mtkaif_phase_cycle[1];
    501			} else {
    502				delay_data = DELAY_DATA_MISO2;	/* ch2 */
    503				delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
    504					      afe_priv->mtkaif_phase_cycle[2];
    505			}
    506
    507			regmap_update_bits(afe->regmap,
    508					   AFE_ADDA6_MTKAIF_RX_CFG2,
    509					   MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
    510					   delay_data <<
    511					   MTKAIF_RXIF_DELAY_DATA_SFT);
    512			regmap_update_bits(afe->regmap,
    513					   AFE_ADDA6_MTKAIF_RX_CFG2,
    514					   MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
    515					   delay_cycle <<
    516					   MTKAIF_RXIF_DELAY_CYCLE_SFT);
    517		} else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
    518			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
    519				     0x00010000);
    520			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
    521				     0x00010000);
    522		} else {
    523			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
    524			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
    525		}
    526		break;
    527	default:
    528		break;
    529	}
    530
    531	return 0;
    532}
    533
    534static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
    535			     struct snd_kcontrol *kcontrol,
    536			     int event)
    537{
    538	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    539	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    540
    541	dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
    542		 __func__, w->name, event);
    543
    544	switch (event) {
    545	case SND_SOC_DAPM_PRE_PMU:
    546		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
    547		break;
    548	case SND_SOC_DAPM_POST_PMD:
    549		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
    550		usleep_range(125, 135);
    551		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
    552		break;
    553	default:
    554		break;
    555	}
    556
    557	return 0;
    558}
    559
    560static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
    561				  struct snd_kcontrol *kcontrol,
    562				  int event)
    563{
    564	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    565	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    566
    567	dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
    568		 __func__, w->name, event);
    569
    570	switch (event) {
    571	case SND_SOC_DAPM_PRE_PMU:
    572		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
    573					0);
    574		break;
    575	case SND_SOC_DAPM_POST_PMD:
    576		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
    577		usleep_range(125, 135);
    578		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
    579					0);
    580		break;
    581	default:
    582		break;
    583	}
    584
    585	return 0;
    586}
    587
    588/* stf */
    589static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
    590				 struct snd_ctl_elem_value *ucontrol)
    591{
    592	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
    593	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    594	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    595
    596	ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
    597	return 0;
    598}
    599
    600static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
    601				 struct snd_ctl_elem_value *ucontrol)
    602{
    603	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
    604	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    605	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    606	int gain_db = ucontrol->value.integer.value[0];
    607
    608	afe_priv->stf_positive_gain_db = gain_db;
    609
    610	if (gain_db >= 0 && gain_db <= 24) {
    611		regmap_update_bits(afe->regmap,
    612				   AFE_SIDETONE_GAIN,
    613				   POSITIVE_GAIN_MASK_SFT,
    614				   (gain_db / 6) << POSITIVE_GAIN_SFT);
    615	} else {
    616		dev_warn(afe->dev, "%s(), gain_db %d invalid\n",
    617			 __func__, gain_db);
    618	}
    619	return 0;
    620}
    621
    622static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
    623				struct snd_ctl_elem_value *ucontrol)
    624{
    625	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
    626	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    627	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    628
    629	ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
    630	return 0;
    631}
    632
    633static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
    634				struct snd_ctl_elem_value *ucontrol)
    635{
    636	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
    637	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    638	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    639	int dmic_on;
    640
    641	dmic_on = ucontrol->value.integer.value[0];
    642
    643	dev_info(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",
    644		 __func__, kcontrol->id.name, dmic_on);
    645
    646	afe_priv->mtkaif_dmic = dmic_on;
    647	afe_priv->mtkaif_dmic_ch34 = dmic_on;
    648	return 0;
    649}
    650
    651static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
    652				 struct snd_ctl_elem_value *ucontrol)
    653{
    654	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
    655	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    656	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    657
    658	ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
    659	return 0;
    660}
    661
    662static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
    663				 struct snd_ctl_elem_value *ucontrol)
    664{
    665	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
    666	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    667	struct mt8192_afe_private *afe_priv = afe->platform_priv;
    668	int mtkaif_adda6_only;
    669
    670	mtkaif_adda6_only = ucontrol->value.integer.value[0];
    671
    672	dev_info(afe->dev, "%s(), kcontrol name %s, mtkaif_adda6_only %d\n",
    673		 __func__, kcontrol->id.name, mtkaif_adda6_only);
    674
    675	afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
    676	return 0;
    677}
    678
    679static const struct snd_kcontrol_new mtk_adda_controls[] = {
    680	SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
    681		   SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
    682	SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 100, 0,
    683		       stf_positive_gain_get, stf_positive_gain_set),
    684	SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
    685		   DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
    686	SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
    687			    mt8192_adda_dmic_get, mt8192_adda_dmic_set),
    688	SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
    689			    mt8192_adda6_only_get, mt8192_adda6_only_set),
    690};
    691
    692static const struct snd_kcontrol_new stf_ctl =
    693	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
    694
    695static const u16 stf_coeff_table_16k[] = {
    696	0x049C, 0x09E8, 0x09E0, 0x089C,
    697	0xFF54, 0xF488, 0xEAFC, 0xEBAC,
    698	0xfA40, 0x17AC, 0x3D1C, 0x6028,
    699	0x7538
    700};
    701
    702static const u16 stf_coeff_table_32k[] = {
    703	0xFE52, 0x0042, 0x00C5, 0x0194,
    704	0x029A, 0x03B7, 0x04BF, 0x057D,
    705	0x05BE, 0x0555, 0x0426, 0x0230,
    706	0xFF92, 0xFC89, 0xF973, 0xF6C6,
    707	0xF500, 0xF49D, 0xF603, 0xF970,
    708	0xFEF3, 0x065F, 0x0F4F, 0x1928,
    709	0x2329, 0x2C80, 0x345E, 0x3A0D,
    710	0x3D08
    711};
    712
    713static const u16 stf_coeff_table_48k[] = {
    714	0x0401, 0xFFB0, 0xFF5A, 0xFECE,
    715	0xFE10, 0xFD28, 0xFC21, 0xFB08,
    716	0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
    717	0xF724, 0xF746, 0xF7E6, 0xF90F,
    718	0xFACC, 0xFD1E, 0xFFFF, 0x0364,
    719	0x0737, 0x0B62, 0x0FC1, 0x1431,
    720	0x188A, 0x1CA4, 0x2056, 0x237D,
    721	0x25F9, 0x27B0, 0x2890
    722};
    723
    724static int mtk_stf_event(struct snd_soc_dapm_widget *w,
    725			 struct snd_kcontrol *kcontrol,
    726			 int event)
    727{
    728	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
    729	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
    730
    731	size_t half_tap_num;
    732	const u16 *stf_coeff_table;
    733	unsigned int ul_rate, reg_value;
    734	size_t coef_addr;
    735
    736	regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
    737	ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
    738	ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
    739
    740	if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
    741		half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
    742		stf_coeff_table = stf_coeff_table_48k;
    743	} else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
    744		half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
    745		stf_coeff_table = stf_coeff_table_32k;
    746	} else {
    747		half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
    748		stf_coeff_table = stf_coeff_table_16k;
    749	}
    750
    751	regmap_read(afe->regmap, AFE_SIDETONE_CON1, &reg_value);
    752
    753	dev_info(afe->dev, "%s(), name %s, event 0x%x, ul_rate 0x%x, AFE_SIDETONE_CON1 0x%x\n",
    754		 __func__, w->name, event, ul_rate, reg_value);
    755
    756	switch (event) {
    757	case SND_SOC_DAPM_PRE_PMU:
    758		/* set side tone gain = 0 */
    759		regmap_update_bits(afe->regmap,
    760				   AFE_SIDETONE_GAIN,
    761				   SIDE_TONE_GAIN_MASK_SFT,
    762				   0);
    763		regmap_update_bits(afe->regmap,
    764				   AFE_SIDETONE_GAIN,
    765				   POSITIVE_GAIN_MASK_SFT,
    766				   0);
    767		/* don't bypass stf */
    768		regmap_update_bits(afe->regmap,
    769				   AFE_SIDETONE_CON1,
    770				   0x1f << 27,
    771				   0x0);
    772		/* set stf half tap num */
    773		regmap_update_bits(afe->regmap,
    774				   AFE_SIDETONE_CON1,
    775				   SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
    776				   half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
    777
    778		/* set side tone coefficient */
    779		regmap_read(afe->regmap, AFE_SIDETONE_CON0, &reg_value);
    780		for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
    781			bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
    782			bool new_w_ready = 0;
    783			int try_cnt = 0;
    784
    785			regmap_update_bits(afe->regmap,
    786					   AFE_SIDETONE_CON0,
    787					   0x39FFFFF,
    788					   (1 << R_W_EN_SFT) |
    789					   (1 << R_W_SEL_SFT) |
    790					   (0 << SEL_CH2_SFT) |
    791					   (coef_addr <<
    792					   SIDE_TONE_COEFFICIENT_ADDR_SFT) |
    793					   stf_coeff_table[coef_addr]);
    794
    795			/* wait until flag write_ready changed */
    796			for (try_cnt = 0; try_cnt < 10; try_cnt++) {
    797				regmap_read(afe->regmap,
    798					    AFE_SIDETONE_CON0, &reg_value);
    799				new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
    800
    801				/* flip => ok */
    802				if (new_w_ready == old_w_ready) {
    803					udelay(3);
    804					if (try_cnt == 9) {
    805						dev_warn(afe->dev,
    806							 "%s(), write coeff not ready",
    807							 __func__);
    808					}
    809				} else {
    810					break;
    811				}
    812			}
    813			/* need write -> read -> write to write next coeff */
    814			regmap_update_bits(afe->regmap,
    815					   AFE_SIDETONE_CON0,
    816					   R_W_SEL_MASK_SFT,
    817					   0x0);
    818		}
    819		break;
    820	case SND_SOC_DAPM_POST_PMD:
    821		/* bypass stf */
    822		regmap_update_bits(afe->regmap,
    823				   AFE_SIDETONE_CON1,
    824				   0x1f << 27,
    825				   0x1f << 27);
    826
    827		/* set side tone gain = 0 */
    828		regmap_update_bits(afe->regmap,
    829				   AFE_SIDETONE_GAIN,
    830				   SIDE_TONE_GAIN_MASK_SFT,
    831				   0);
    832		regmap_update_bits(afe->regmap,
    833				   AFE_SIDETONE_GAIN,
    834				   POSITIVE_GAIN_MASK_SFT,
    835				   0);
    836		break;
    837	default:
    838		break;
    839	}
    840
    841	return 0;
    842}
    843
    844/* stf mux */
    845enum {
    846	STF_SRC_ADDA_ADDA6 = 0,
    847	STF_SRC_O19O20,
    848};
    849
    850static const char *const stf_o19o20_mux_map[] = {
    851	"ADDA_ADDA6",
    852	"O19O20",
    853};
    854
    855static int stf_o19o20_mux_map_value[] = {
    856	STF_SRC_ADDA_ADDA6,
    857	STF_SRC_O19O20,
    858};
    859
    860static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
    861				  AFE_SIDETONE_CON1,
    862				  STF_SOURCE_FROM_O19O20_SFT,
    863				  STF_SOURCE_FROM_O19O20_MASK,
    864				  stf_o19o20_mux_map,
    865				  stf_o19o20_mux_map_value);
    866
    867static const struct snd_kcontrol_new stf_o19O20_mux_control =
    868	SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
    869
    870enum {
    871	STF_SRC_ADDA = 0,
    872	STF_SRC_ADDA6,
    873};
    874
    875static const char *const stf_adda_mux_map[] = {
    876	"ADDA",
    877	"ADDA6",
    878};
    879
    880static int stf_adda_mux_map_value[] = {
    881	STF_SRC_ADDA,
    882	STF_SRC_ADDA6,
    883};
    884
    885static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
    886				  AFE_SIDETONE_CON1,
    887				  STF_O19O20_OUT_EN_SEL_SFT,
    888				  STF_O19O20_OUT_EN_SEL_MASK,
    889				  stf_adda_mux_map,
    890				  stf_adda_mux_map_value);
    891
    892static const struct snd_kcontrol_new stf_adda_mux_control =
    893	SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
    894
    895/* ADDA UL MUX */
    896enum {
    897	ADDA_UL_MUX_MTKAIF = 0,
    898	ADDA_UL_MUX_AP_DMIC,
    899	ADDA_UL_MUX_MASK = 0x1,
    900};
    901
    902static const char * const adda_ul_mux_map[] = {
    903	"MTKAIF", "AP_DMIC"
    904};
    905
    906static int adda_ul_map_value[] = {
    907	ADDA_UL_MUX_MTKAIF,
    908	ADDA_UL_MUX_AP_DMIC,
    909};
    910
    911static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
    912				  SND_SOC_NOPM,
    913				  0,
    914				  ADDA_UL_MUX_MASK,
    915				  adda_ul_mux_map,
    916				  adda_ul_map_value);
    917
    918static const struct snd_kcontrol_new adda_ul_mux_control =
    919	SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
    920
    921static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
    922	SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
    923
    924static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
    925	/* inter-connections */
    926	SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
    927			   mtk_adda_dl_ch1_mix,
    928			   ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
    929	SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
    930			   mtk_adda_dl_ch2_mix,
    931			   ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
    932
    933	SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
    934			   mtk_adda_dl_ch3_mix,
    935			   ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
    936	SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
    937			   mtk_adda_dl_ch4_mix,
    938			   ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
    939
    940	SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
    941			      AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
    942			      NULL, 0),
    943
    944	SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
    945			      AFE_ADDA_DL_SRC2_CON0,
    946			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
    947			      mtk_adda_dl_event,
    948			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    949	SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
    950			      SUPPLY_SEQ_ADDA_DL_ON,
    951			      AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
    952			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
    953			      mtk_adda_ch34_dl_event,
    954			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    955
    956	SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
    957			      AFE_ADDA_UL_SRC_CON0,
    958			      UL_SRC_ON_TMP_CTL_SFT, 0,
    959			      mtk_adda_ul_event,
    960			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    961	SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
    962			      AFE_ADDA6_UL_SRC_CON0,
    963			      UL_SRC_ON_TMP_CTL_SFT, 0,
    964			      mtk_adda_ch34_ul_event,
    965			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    966
    967	SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
    968			      AFE_AUD_PAD_TOP,
    969			      RG_RX_FIFO_ON_SFT, 0,
    970			      mtk_adda_pad_top_event,
    971			      SND_SOC_DAPM_PRE_PMU),
    972	SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
    973			      SND_SOC_NOPM, 0, 0,
    974			      mtk_adda_mtkaif_cfg_event,
    975			      SND_SOC_DAPM_PRE_PMU),
    976	SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
    977			      SND_SOC_NOPM, 0, 0,
    978			      mtk_adda_mtkaif_cfg_event,
    979			      SND_SOC_DAPM_PRE_PMU),
    980
    981	SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
    982			      AFE_ADDA_UL_SRC_CON0,
    983			      UL_AP_DMIC_ON_SFT, 0,
    984			      NULL, 0),
    985	SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
    986			      AFE_ADDA6_UL_SRC_CON0,
    987			      UL_AP_DMIC_ON_SFT, 0,
    988			      NULL, 0),
    989
    990	SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
    991			      AFE_ADDA_UL_DL_CON0,
    992			      AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
    993			      NULL, 0),
    994	SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
    995			      AFE_ADDA_UL_DL_CON0,
    996			      AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
    997			      NULL, 0),
    998
    999	SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,
   1000			 &adda_ul_mux_control),
   1001	SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,
   1002			 &adda_ch34_ul_mux_control),
   1003
   1004	SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
   1005	SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
   1006
   1007	/* stf */
   1008	SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
   1009			      AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
   1010			      &stf_ctl,
   1011			      mtk_stf_event,
   1012			      SND_SOC_DAPM_PRE_PMU |
   1013			      SND_SOC_DAPM_POST_PMD),
   1014	SND_SOC_DAPM_MUX("STF_O19O20_MUX", SND_SOC_NOPM, 0, 0,
   1015			 &stf_o19O20_mux_control),
   1016	SND_SOC_DAPM_MUX("STF_ADDA_MUX", SND_SOC_NOPM, 0, 0,
   1017			 &stf_adda_mux_control),
   1018	SND_SOC_DAPM_MIXER("STF_CH1", SND_SOC_NOPM, 0, 0,
   1019			   mtk_stf_ch1_mix,
   1020			   ARRAY_SIZE(mtk_stf_ch1_mix)),
   1021	SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
   1022			   mtk_stf_ch2_mix,
   1023			   ARRAY_SIZE(mtk_stf_ch2_mix)),
   1024	SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
   1025
   1026	/* clock */
   1027	SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
   1028
   1029	SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_clk"),
   1030	SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_predis_clk"),
   1031	SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_clk"),
   1032	SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_predis_clk"),
   1033
   1034	SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
   1035	SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
   1036};
   1037
   1038static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
   1039	/* playback */
   1040	{"ADDA_DL_CH1", "DL1_CH1", "DL1"},
   1041	{"ADDA_DL_CH2", "DL1_CH1", "DL1"},
   1042	{"ADDA_DL_CH2", "DL1_CH2", "DL1"},
   1043
   1044	{"ADDA_DL_CH1", "DL12_CH1", "DL12"},
   1045	{"ADDA_DL_CH2", "DL12_CH2", "DL12"},
   1046
   1047	{"ADDA_DL_CH1", "DL6_CH1", "DL6"},
   1048	{"ADDA_DL_CH2", "DL6_CH2", "DL6"},
   1049
   1050	{"ADDA_DL_CH1", "DL8_CH1", "DL8"},
   1051	{"ADDA_DL_CH2", "DL8_CH2", "DL8"},
   1052
   1053	{"ADDA_DL_CH1", "DL2_CH1", "DL2"},
   1054	{"ADDA_DL_CH2", "DL2_CH1", "DL2"},
   1055	{"ADDA_DL_CH2", "DL2_CH2", "DL2"},
   1056
   1057	{"ADDA_DL_CH1", "DL3_CH1", "DL3"},
   1058	{"ADDA_DL_CH2", "DL3_CH1", "DL3"},
   1059	{"ADDA_DL_CH2", "DL3_CH2", "DL3"},
   1060
   1061	{"ADDA_DL_CH1", "DL4_CH1", "DL4"},
   1062	{"ADDA_DL_CH2", "DL4_CH2", "DL4"},
   1063
   1064	{"ADDA_DL_CH1", "DL5_CH1", "DL5"},
   1065	{"ADDA_DL_CH2", "DL5_CH2", "DL5"},
   1066
   1067	{"ADDA Playback", NULL, "ADDA_DL_CH1"},
   1068	{"ADDA Playback", NULL, "ADDA_DL_CH2"},
   1069
   1070	{"ADDA Playback", NULL, "ADDA Enable"},
   1071	{"ADDA Playback", NULL, "ADDA Playback Enable"},
   1072
   1073	{"ADDA_DL_CH3", "DL1_CH1", "DL1"},
   1074	{"ADDA_DL_CH4", "DL1_CH1", "DL1"},
   1075	{"ADDA_DL_CH4", "DL1_CH2", "DL1"},
   1076
   1077	{"ADDA_DL_CH3", "DL12_CH1", "DL12"},
   1078	{"ADDA_DL_CH4", "DL12_CH2", "DL12"},
   1079
   1080	{"ADDA_DL_CH3", "DL6_CH1", "DL6"},
   1081	{"ADDA_DL_CH4", "DL6_CH2", "DL6"},
   1082
   1083	{"ADDA_DL_CH3", "DL2_CH1", "DL2"},
   1084	{"ADDA_DL_CH4", "DL2_CH1", "DL2"},
   1085	{"ADDA_DL_CH4", "DL2_CH2", "DL2"},
   1086
   1087	{"ADDA_DL_CH3", "DL3_CH1", "DL3"},
   1088	{"ADDA_DL_CH4", "DL3_CH1", "DL3"},
   1089	{"ADDA_DL_CH4", "DL3_CH2", "DL3"},
   1090
   1091	{"ADDA_DL_CH3", "DL4_CH1", "DL4"},
   1092	{"ADDA_DL_CH4", "DL4_CH2", "DL4"},
   1093
   1094	{"ADDA_DL_CH3", "DL5_CH1", "DL5"},
   1095	{"ADDA_DL_CH4", "DL5_CH2", "DL5"},
   1096
   1097	{"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
   1098	{"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
   1099
   1100	{"ADDA CH34 Playback", NULL, "ADDA Enable"},
   1101	{"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
   1102
   1103	/* capture */
   1104	{"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
   1105	{"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
   1106
   1107	{"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
   1108	{"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
   1109
   1110	{"ADDA Capture", NULL, "ADDA Enable"},
   1111	{"ADDA Capture", NULL, "ADDA Capture Enable"},
   1112	{"ADDA Capture", NULL, "AUD_PAD_TOP"},
   1113	{"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
   1114
   1115	{"AP DMIC Capture", NULL, "ADDA Enable"},
   1116	{"AP DMIC Capture", NULL, "ADDA Capture Enable"},
   1117	{"AP DMIC Capture", NULL, "ADDA_FIFO"},
   1118	{"AP DMIC Capture", NULL, "AP_DMIC_EN"},
   1119
   1120	{"ADDA CH34 Capture", NULL, "ADDA Enable"},
   1121	{"ADDA CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
   1122	{"ADDA CH34 Capture", NULL, "AUD_PAD_TOP"},
   1123	{"ADDA CH34 Capture", NULL, "ADDA6_MTKAIF_CFG"},
   1124
   1125	{"AP DMIC CH34 Capture", NULL, "ADDA Enable"},
   1126	{"AP DMIC CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
   1127	{"AP DMIC CH34 Capture", NULL, "ADDA_CH34_FIFO"},
   1128	{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},
   1129
   1130	{"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
   1131	{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
   1132
   1133	/* sidetone filter */
   1134	{"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
   1135	{"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
   1136
   1137	{"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
   1138	{"STF_O19O20_MUX", "O19O20", "STF_CH1"},
   1139	{"STF_O19O20_MUX", "O19O20", "STF_CH2"},
   1140
   1141	{"Sidetone Filter", "Switch", "STF_O19O20_MUX"},
   1142	{"STF_OUTPUT", NULL, "Sidetone Filter"},
   1143	{"ADDA Playback", NULL, "Sidetone Filter"},
   1144	{"ADDA CH34 Playback", NULL, "Sidetone Filter"},
   1145
   1146	/* clk */
   1147	{"ADDA Playback", NULL, "aud_dac_clk"},
   1148	{"ADDA Playback", NULL, "aud_dac_predis_clk"},
   1149
   1150	{"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
   1151	{"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
   1152
   1153	{"ADDA Capture Enable", NULL, "aud_adc_clk"},
   1154	{"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
   1155};
   1156
   1157/* dai ops */
   1158static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
   1159				  struct snd_pcm_hw_params *params,
   1160				  struct snd_soc_dai *dai)
   1161{
   1162	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
   1163	unsigned int rate = params_rate(params);
   1164	int id = dai->id;
   1165
   1166	dev_info(afe->dev, "%s(), id %d, stream %d, rate %d\n",
   1167		 __func__,
   1168		 id,
   1169		 substream->stream,
   1170		 rate);
   1171
   1172	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
   1173		unsigned int dl_src2_con0 = 0;
   1174		unsigned int dl_src2_con1 = 0;
   1175
   1176		/* set sampling rate */
   1177		dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
   1178			       DL_2_INPUT_MODE_CTL_SFT;
   1179
   1180		/* set output mode, UP_SAMPLING_RATE_X8 */
   1181		dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
   1182
   1183		/* turn off mute function */
   1184		dl_src2_con0 |= (0x01 << DL_2_MUTE_CH2_OFF_CTL_PRE_SFT);
   1185		dl_src2_con0 |= (0x01 << DL_2_MUTE_CH1_OFF_CTL_PRE_SFT);
   1186
   1187		/* set voice input data if input sample rate is 8k or 16k */
   1188		if (rate == 8000 || rate == 16000)
   1189			dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
   1190
   1191		/* SA suggest apply -0.3db to audio/speech path */
   1192		dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
   1193			       DL_2_GAIN_CTL_PRE_SFT;
   1194
   1195		/* turn on down-link gain */
   1196		dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
   1197
   1198		if (id == MT8192_DAI_ADDA) {
   1199			/* clean predistortion */
   1200			regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
   1201			regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
   1202
   1203			regmap_write(afe->regmap,
   1204				     AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
   1205			regmap_write(afe->regmap,
   1206				     AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
   1207
   1208			/* set sdm gain */
   1209			regmap_update_bits(afe->regmap,
   1210					   AFE_ADDA_DL_SDM_DCCOMP_CON,
   1211					   ATTGAIN_CTL_MASK_SFT,
   1212					   AUDIO_SDM_LEVEL_NORMAL <<
   1213					   ATTGAIN_CTL_SFT);
   1214
   1215			/* 2nd sdm */
   1216			regmap_update_bits(afe->regmap,
   1217					   AFE_ADDA_DL_SDM_DCCOMP_CON,
   1218					   USE_3RD_SDM_MASK_SFT,
   1219					   AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
   1220
   1221			/* sdm auto reset */
   1222			regmap_write(afe->regmap,
   1223				     AFE_ADDA_DL_SDM_AUTO_RESET_CON,
   1224				     SDM_AUTO_RESET_THRESHOLD);
   1225			regmap_update_bits(afe->regmap,
   1226					   AFE_ADDA_DL_SDM_AUTO_RESET_CON,
   1227					   ADDA_SDM_AUTO_RESET_ONOFF_MASK_SFT,
   1228					   0x1 << ADDA_SDM_AUTO_RESET_ONOFF_SFT);
   1229		} else {
   1230			/* clean predistortion */
   1231			regmap_write(afe->regmap,
   1232				     AFE_ADDA_3RD_DAC_PREDIS_CON0, 0);
   1233			regmap_write(afe->regmap,
   1234				     AFE_ADDA_3RD_DAC_PREDIS_CON1, 0);
   1235
   1236			regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
   1237				     dl_src2_con0);
   1238			regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
   1239				     dl_src2_con1);
   1240
   1241			/* set sdm gain */
   1242			regmap_update_bits(afe->regmap,
   1243					   AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
   1244					   ATTGAIN_CTL_MASK_SFT,
   1245					   AUDIO_SDM_LEVEL_NORMAL <<
   1246					   ATTGAIN_CTL_SFT);
   1247
   1248			/* 2nd sdm */
   1249			regmap_update_bits(afe->regmap,
   1250					   AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
   1251					   USE_3RD_SDM_MASK_SFT,
   1252					   AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
   1253
   1254			/* sdm auto reset */
   1255			regmap_write(afe->regmap,
   1256				     AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
   1257				     SDM_AUTO_RESET_THRESHOLD);
   1258			regmap_update_bits(afe->regmap,
   1259					   AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
   1260					   ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_MASK_SFT,
   1261					   0x1 << ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_SFT);
   1262		}
   1263	} else {
   1264		unsigned int voice_mode = 0;
   1265		unsigned int ul_src_con0 = 0;	/* default value */
   1266
   1267		voice_mode = adda_ul_rate_transform(afe, rate);
   1268
   1269		ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
   1270
   1271		/* enable iir */
   1272		ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &
   1273			       UL_IIR_ON_TMP_CTL_MASK_SFT;
   1274		ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &
   1275			       UL_IIRMODE_CTL_MASK_SFT;
   1276
   1277		switch (id) {
   1278		case MT8192_DAI_ADDA:
   1279		case MT8192_DAI_AP_DMIC:
   1280			/* 35Hz @ 48k */
   1281			regmap_write(afe->regmap,
   1282				     AFE_ADDA_IIR_COEF_02_01, 0x00000000);
   1283			regmap_write(afe->regmap,
   1284				     AFE_ADDA_IIR_COEF_04_03, 0x00003FB8);
   1285			regmap_write(afe->regmap,
   1286				     AFE_ADDA_IIR_COEF_06_05, 0x3FB80000);
   1287			regmap_write(afe->regmap,
   1288				     AFE_ADDA_IIR_COEF_08_07, 0x3FB80000);
   1289			regmap_write(afe->regmap,
   1290				     AFE_ADDA_IIR_COEF_10_09, 0x0000C048);
   1291
   1292			regmap_write(afe->regmap,
   1293				     AFE_ADDA_UL_SRC_CON0, ul_src_con0);
   1294
   1295			/* Using Internal ADC */
   1296			regmap_update_bits(afe->regmap,
   1297					   AFE_ADDA_TOP_CON0,
   1298					   0x1 << 0,
   1299					   0x0 << 0);
   1300
   1301			/* mtkaif_rxif_data_mode = 0, amic */
   1302			regmap_update_bits(afe->regmap,
   1303					   AFE_ADDA_MTKAIF_RX_CFG0,
   1304					   0x1 << 0,
   1305					   0x0 << 0);
   1306			break;
   1307		case MT8192_DAI_ADDA_CH34:
   1308		case MT8192_DAI_AP_DMIC_CH34:
   1309			/* 35Hz @ 48k */
   1310			regmap_write(afe->regmap,
   1311				     AFE_ADDA6_IIR_COEF_02_01, 0x00000000);
   1312			regmap_write(afe->regmap,
   1313				     AFE_ADDA6_IIR_COEF_04_03, 0x00003FB8);
   1314			regmap_write(afe->regmap,
   1315				     AFE_ADDA6_IIR_COEF_06_05, 0x3FB80000);
   1316			regmap_write(afe->regmap,
   1317				     AFE_ADDA6_IIR_COEF_08_07, 0x3FB80000);
   1318			regmap_write(afe->regmap,
   1319				     AFE_ADDA6_IIR_COEF_10_09, 0x0000C048);
   1320
   1321			regmap_write(afe->regmap,
   1322				     AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
   1323
   1324			/* Using Internal ADC */
   1325			regmap_update_bits(afe->regmap,
   1326					   AFE_ADDA6_TOP_CON0,
   1327					   0x1 << 0,
   1328					   0x0 << 0);
   1329
   1330			/* mtkaif_rxif_data_mode = 0, amic */
   1331			regmap_update_bits(afe->regmap,
   1332					   AFE_ADDA6_MTKAIF_RX_CFG0,
   1333					   0x1 << 0,
   1334					   0x0 << 0);
   1335			break;
   1336		default:
   1337			break;
   1338		}
   1339
   1340		/* ap dmic */
   1341		switch (id) {
   1342		case MT8192_DAI_AP_DMIC:
   1343		case MT8192_DAI_AP_DMIC_CH34:
   1344			mtk_adda_ul_src_dmic(afe, id);
   1345			break;
   1346		default:
   1347			break;
   1348		}
   1349	}
   1350
   1351	return 0;
   1352}
   1353
   1354static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
   1355	.hw_params = mtk_dai_adda_hw_params,
   1356};
   1357
   1358/* dai driver */
   1359#define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
   1360				 SNDRV_PCM_RATE_96000 |\
   1361				 SNDRV_PCM_RATE_192000)
   1362
   1363#define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
   1364				SNDRV_PCM_RATE_16000 |\
   1365				SNDRV_PCM_RATE_32000 |\
   1366				SNDRV_PCM_RATE_48000 |\
   1367				SNDRV_PCM_RATE_96000 |\
   1368				SNDRV_PCM_RATE_192000)
   1369
   1370#define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
   1371			  SNDRV_PCM_FMTBIT_S24_LE |\
   1372			  SNDRV_PCM_FMTBIT_S32_LE)
   1373
   1374static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
   1375	{
   1376		.name = "ADDA",
   1377		.id = MT8192_DAI_ADDA,
   1378		.playback = {
   1379			.stream_name = "ADDA Playback",
   1380			.channels_min = 1,
   1381			.channels_max = 2,
   1382			.rates = MTK_ADDA_PLAYBACK_RATES,
   1383			.formats = MTK_ADDA_FORMATS,
   1384		},
   1385		.capture = {
   1386			.stream_name = "ADDA Capture",
   1387			.channels_min = 1,
   1388			.channels_max = 2,
   1389			.rates = MTK_ADDA_CAPTURE_RATES,
   1390			.formats = MTK_ADDA_FORMATS,
   1391		},
   1392		.ops = &mtk_dai_adda_ops,
   1393	},
   1394	{
   1395		.name = "ADDA_CH34",
   1396		.id = MT8192_DAI_ADDA_CH34,
   1397		.playback = {
   1398			.stream_name = "ADDA CH34 Playback",
   1399			.channels_min = 1,
   1400			.channels_max = 2,
   1401			.rates = MTK_ADDA_PLAYBACK_RATES,
   1402			.formats = MTK_ADDA_FORMATS,
   1403		},
   1404		.capture = {
   1405			.stream_name = "ADDA CH34 Capture",
   1406			.channels_min = 1,
   1407			.channels_max = 2,
   1408			.rates = MTK_ADDA_CAPTURE_RATES,
   1409			.formats = MTK_ADDA_FORMATS,
   1410		},
   1411		.ops = &mtk_dai_adda_ops,
   1412	},
   1413	{
   1414		.name = "AP_DMIC",
   1415		.id = MT8192_DAI_AP_DMIC,
   1416		.capture = {
   1417			.stream_name = "AP DMIC Capture",
   1418			.channels_min = 1,
   1419			.channels_max = 2,
   1420			.rates = MTK_ADDA_CAPTURE_RATES,
   1421			.formats = MTK_ADDA_FORMATS,
   1422		},
   1423		.ops = &mtk_dai_adda_ops,
   1424	},
   1425	{
   1426		.name = "AP_DMIC_CH34",
   1427		.id = MT8192_DAI_AP_DMIC_CH34,
   1428		.capture = {
   1429			.stream_name = "AP DMIC CH34 Capture",
   1430			.channels_min = 1,
   1431			.channels_max = 2,
   1432			.rates = MTK_ADDA_CAPTURE_RATES,
   1433			.formats = MTK_ADDA_FORMATS,
   1434		},
   1435		.ops = &mtk_dai_adda_ops,
   1436	},
   1437};
   1438
   1439int mt8192_dai_adda_register(struct mtk_base_afe *afe)
   1440{
   1441	struct mtk_base_afe_dai *dai;
   1442	struct mt8192_afe_private *afe_priv = afe->platform_priv;
   1443
   1444	dev_info(afe->dev, "%s()\n", __func__);
   1445
   1446	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
   1447	if (!dai)
   1448		return -ENOMEM;
   1449
   1450	list_add(&dai->list, &afe->sub_dais);
   1451
   1452	dai->dai_drivers = mtk_dai_adda_driver;
   1453	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
   1454
   1455	dai->controls = mtk_adda_controls;
   1456	dai->num_controls = ARRAY_SIZE(mtk_adda_controls);
   1457	dai->dapm_widgets = mtk_dai_adda_widgets;
   1458	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
   1459	dai->dapm_routes = mtk_dai_adda_routes;
   1460	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
   1461
   1462	/* ap dmic priv share with adda */
   1463	afe_priv->dai_priv[MT8192_DAI_AP_DMIC] =
   1464		afe_priv->dai_priv[MT8192_DAI_ADDA];
   1465	afe_priv->dai_priv[MT8192_DAI_AP_DMIC_CH34] =
   1466		afe_priv->dai_priv[MT8192_DAI_ADDA_CH34];
   1467
   1468	return 0;
   1469}