Path: blob/master/sound/soc/mediatek/mt8189/mt8189-dai-adda.c
38245 views
// SPDX-License-Identifier: GPL-2.01/*2* MediaTek ALSA SoC Audio DAI ADDA Control3*4* Copyright (c) 2025 MediaTek Inc.5* Author: Darren Ye <[email protected]>6*/78#include <linux/regmap.h>9#include <linux/delay.h>1011#include "mt8189-afe-clk.h"12#include "mt8189-afe-common.h"13#include "mt8189-interconnection.h"1415/* mt6363 vs1 voter */16#define VS1_MT6338_MASK_SFT 0x117#define RG_BUCK_VS1_VOTER_EN_LO 0x189a18#define RG_BUCK_VS1_VOTER_EN_LO_SET 0x189b19#define RG_BUCK_VS1_VOTER_EN_LO_CLR 0x189c2021#define AUDIO_SDM_LEVEL_NORMAL 0x1d22#define MTK_AFE_ADDA_DL_GAIN_NORMAL 0xf74f23#define SDM_AUTO_RESET_THRESHOLD 0x1900002425enum {26SUPPLY_SEQ_ADDA_AFE_ON,27SUPPLY_SEQ_ADDA_DL_ON,28SUPPLY_SEQ_ADDA_AUD_PAD_TOP,29SUPPLY_SEQ_ADDA_MTKAIF_CFG,30SUPPLY_SEQ_ADDA6_MTKAIF_CFG,31SUPPLY_SEQ_ADDA_FIFO,32SUPPLY_SEQ_ADDA_AP_DMIC,33SUPPLY_SEQ_ADDA_UL_ON,34};3536enum {37UL_IIR_SW,38UL_IIR_5HZ,39UL_IIR_10HZ,40UL_IIR_25HZ,41UL_IIR_50HZ,42UL_IIR_75HZ,43};4445enum {46AUDIO_SDM_2ND,47AUDIO_SDM_3RD,48};4950enum {51DELAY_DATA_MISO1,52DELAY_DATA_MISO2,53};5455enum {56MTK_AFE_ADDA_DL_RATE_8K,57MTK_AFE_ADDA_DL_RATE_11K,58MTK_AFE_ADDA_DL_RATE_12K,59MTK_AFE_ADDA_DL_RATE_16K = 4,60MTK_AFE_ADDA_DL_RATE_22K,61MTK_AFE_ADDA_DL_RATE_24K,62MTK_AFE_ADDA_DL_RATE_32K = 8,63MTK_AFE_ADDA_DL_RATE_44K,64MTK_AFE_ADDA_DL_RATE_48K,65MTK_AFE_ADDA_DL_RATE_88K = 13,66MTK_AFE_ADDA_DL_RATE_96K,67MTK_AFE_ADDA_DL_RATE_176K = 17,68MTK_AFE_ADDA_DL_RATE_192K,69MTK_AFE_ADDA_DL_RATE_352K = 21,70MTK_AFE_ADDA_DL_RATE_384K,71};7273enum {74MTK_AFE_ADDA_UL_RATE_8K,75MTK_AFE_ADDA_UL_RATE_16K,76MTK_AFE_ADDA_UL_RATE_32K,77MTK_AFE_ADDA_UL_RATE_48K,78MTK_AFE_ADDA_UL_RATE_96K,79MTK_AFE_ADDA_UL_RATE_192K,80MTK_AFE_ADDA_UL_RATE_48K_HD,81};8283struct mtk_afe_adda_priv {84int dl_rate;85int ul_rate;86};8788static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,89unsigned int rate)90{91switch (rate) {92case 8000:93return MTK_AFE_ADDA_DL_RATE_8K;94case 11025:95return MTK_AFE_ADDA_DL_RATE_11K;96case 12000:97return MTK_AFE_ADDA_DL_RATE_12K;98case 16000:99return MTK_AFE_ADDA_DL_RATE_16K;100case 22050:101return MTK_AFE_ADDA_DL_RATE_22K;102case 24000:103return MTK_AFE_ADDA_DL_RATE_24K;104case 32000:105return MTK_AFE_ADDA_DL_RATE_32K;106case 44100:107return MTK_AFE_ADDA_DL_RATE_44K;108case 48000:109return MTK_AFE_ADDA_DL_RATE_48K;110case 96000:111return MTK_AFE_ADDA_DL_RATE_96K;112case 192000:113return MTK_AFE_ADDA_DL_RATE_192K;114default:115dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",116__func__, rate);117return MTK_AFE_ADDA_DL_RATE_48K;118}119}120121static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,122unsigned int rate)123{124switch (rate) {125case 8000:126return MTK_AFE_ADDA_UL_RATE_8K;127case 16000:128return MTK_AFE_ADDA_UL_RATE_16K;129case 32000:130return MTK_AFE_ADDA_UL_RATE_32K;131case 48000:132return MTK_AFE_ADDA_UL_RATE_48K;133case 96000:134return MTK_AFE_ADDA_UL_RATE_96K;135case 192000:136return MTK_AFE_ADDA_UL_RATE_192K;137default:138dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",139__func__, rate);140return MTK_AFE_ADDA_UL_RATE_48K;141}142}143144/* dai component */145static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {146SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN014_1, I_DL0_CH1, 1, 0),147SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN014_1, I_DL1_CH1, 1, 0),148SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN014_1, I_DL2_CH1, 1, 0),149SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN014_1, I_DL3_CH1, 1, 0),150SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN014_1, I_DL4_CH1, 1, 0),151SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN014_1, I_DL5_CH1, 1, 0),152SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN014_1, I_DL6_CH1, 1, 0),153SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH1", AFE_CONN014_1, I_DL7_CH1, 1, 0),154SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN014_1, I_DL8_CH1, 1, 0),155SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN014_1, I_DL_24CH_CH1, 1, 0),156SOC_DAPM_SINGLE_AUTODISABLE("DL24_CH1", AFE_CONN014_2, I_DL24_CH1, 1, 0),157SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN014_0,158I_ADDA_UL_CH3, 1, 0),159SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN014_0,160I_ADDA_UL_CH2, 1, 0),161SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN014_0,162I_ADDA_UL_CH1, 1, 0),163SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN0_OUT_CH1", AFE_CONN014_0,164I_GAIN0_OUT_CH1, 1, 0),165SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN014_4,166I_PCM_0_CAP_CH1, 1, 0),167SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH1", AFE_CONN014_6,168I_SRC_0_OUT_CH1, 1, 0),169SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH1", AFE_CONN014_6,170I_SRC_1_OUT_CH1, 1, 0),171SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1", AFE_CONN014_6,172I_SRC_2_OUT_CH1, 1, 0),173};174175static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {176SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN015_1, I_DL0_CH2, 1, 0),177SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN015_1, I_DL0_CH1, 1, 0),178SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN015_1, I_DL1_CH2, 1, 0),179SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN015_1, I_DL2_CH2, 1, 0),180SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN015_1, I_DL3_CH2, 1, 0),181SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN015_1, I_DL4_CH2, 1, 0),182SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN015_1, I_DL5_CH2, 1, 0),183SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN015_1, I_DL6_CH2, 1, 0),184SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH2", AFE_CONN015_1, I_DL7_CH2, 1, 0),185SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN015_1, I_DL8_CH2, 1, 0),186SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN015_1, I_DL_24CH_CH2, 1, 0),187SOC_DAPM_SINGLE_AUTODISABLE("DL24_CH2", AFE_CONN015_2, I_DL24_CH2, 1, 0),188SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN015_0,189I_ADDA_UL_CH3, 1, 0),190SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN015_0,191I_ADDA_UL_CH2, 1, 0),192SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN015_0,193I_ADDA_UL_CH1, 1, 0),194SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN0_OUT_CH2", AFE_CONN015_0,195I_GAIN0_OUT_CH2, 1, 0),196SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN015_4,197I_PCM_0_CAP_CH1, 1, 0),198SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN015_4,199I_PCM_0_CAP_CH2, 1, 0),200SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH2", AFE_CONN015_6,201I_SRC_0_OUT_CH2, 1, 0),202SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH2", AFE_CONN015_6,203I_SRC_1_OUT_CH2, 1, 0),204SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2", AFE_CONN015_6,205I_SRC_2_OUT_CH2, 1, 0),206};207208static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {209SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH1", AFE_CONN016_1, I_DL0_CH1, 1, 0),210SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN016_1, I_DL1_CH1, 1, 0),211SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN016_1, I_DL2_CH1, 1, 0),212SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN016_1, I_DL3_CH1, 1, 0),213SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN016_1, I_DL4_CH1, 1, 0),214SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN016_1, I_DL5_CH1, 1, 0),215SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN016_1, I_DL6_CH1, 1, 0),216SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH1", AFE_CONN016_1, I_DL7_CH1, 1, 0),217SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN016_1, I_DL8_CH1, 1, 0),218SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH1", AFE_CONN016_1, I_DL_24CH_CH1, 1, 0),219SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH3", AFE_CONN016_1, I_DL_24CH_CH3, 1, 0),220SOC_DAPM_SINGLE_AUTODISABLE("DL24_CH1", AFE_CONN016_2, I_DL24_CH1, 1, 0),221SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN016_0,222I_ADDA_UL_CH3, 1, 0),223SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN016_0,224I_ADDA_UL_CH2, 1, 0),225SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN016_0,226I_ADDA_UL_CH1, 1, 0),227SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN0_OUT_CH1", AFE_CONN016_0,228I_GAIN0_OUT_CH1, 1, 0),229SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN016_4,230I_PCM_0_CAP_CH1, 1, 0),231SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH1", AFE_CONN016_6,232I_SRC_0_OUT_CH1, 1, 0),233SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH1", AFE_CONN016_6,234I_SRC_1_OUT_CH1, 1, 0),235SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH1", AFE_CONN016_6,236I_SRC_2_OUT_CH1, 1, 0),237};238239static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {240SOC_DAPM_SINGLE_AUTODISABLE("DL0_CH2", AFE_CONN017_1, I_DL0_CH2, 1, 0),241SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN017_1, I_DL1_CH2, 1, 0),242SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN017_1, I_DL2_CH2, 1, 0),243SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN017_1, I_DL3_CH2, 1, 0),244SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN017_1, I_DL4_CH2, 1, 0),245SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN017_1, I_DL5_CH2, 1, 0),246SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN017_1, I_DL6_CH1, 1, 0),247SOC_DAPM_SINGLE_AUTODISABLE("DL7_CH2", AFE_CONN017_1, I_DL7_CH2, 1, 0),248SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN017_1, I_DL8_CH1, 1, 0),249SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH2", AFE_CONN017_1, I_DL_24CH_CH2, 1, 0),250SOC_DAPM_SINGLE_AUTODISABLE("DL_24CH_CH4", AFE_CONN017_1, I_DL_24CH_CH4, 1, 0),251SOC_DAPM_SINGLE_AUTODISABLE("DL24_CH2", AFE_CONN017_2, I_DL24_CH2, 1, 0),252SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN017_0,253I_ADDA_UL_CH3, 1, 0),254SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN017_0,255I_ADDA_UL_CH2, 1, 0),256SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN017_0,257I_ADDA_UL_CH1, 1, 0),258SOC_DAPM_SINGLE_AUTODISABLE("HW_GAIN0_OUT_CH2", AFE_CONN017_0,259I_GAIN0_OUT_CH2, 1, 0),260SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN017_4,261I_PCM_0_CAP_CH1, 1, 0),262SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN017_4,263I_PCM_0_CAP_CH2, 1, 0),264SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_0_OUT_CH2", AFE_CONN017_6,265I_SRC_0_OUT_CH2, 1, 0),266SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_1_OUT_CH2", AFE_CONN017_6,267I_SRC_1_OUT_CH2, 1, 0),268SOC_DAPM_SINGLE_AUTODISABLE("HW_SRC_2_OUT_CH2", AFE_CONN017_6,269I_SRC_2_OUT_CH2, 1, 0),270};271272static int mtk_adda_ul_src_enable_dmic(struct mtk_base_afe *afe, int id)273{274unsigned int reg, reg1;275276switch (id) {277case MT8189_DAI_ADDA:278reg = AFE_ADDA_UL0_SRC_CON0;279reg1 = AFE_ADDA_UL0_SRC_CON1;280break;281case MT8189_DAI_AP_DMIC:282reg = AFE_ADDA_DMIC0_SRC_CON0;283reg1 = AFE_ADDA_DMIC0_SRC_CON1;284break;285case MT8189_DAI_AP_DMIC_CH34:286reg = AFE_ADDA_DMIC1_SRC_CON0;287reg1 = AFE_ADDA_DMIC1_SRC_CON1;288break;289default:290return -EINVAL;291}292/* choose Phase */293regmap_update_bits(afe->regmap, reg,294UL_DMIC_PHASE_SEL_CH1_MASK_SFT,2950x0 << UL_DMIC_PHASE_SEL_CH1_SFT);296regmap_update_bits(afe->regmap, reg,297UL_DMIC_PHASE_SEL_CH2_MASK_SFT,2980x4 << UL_DMIC_PHASE_SEL_CH2_SFT);299300/* dmic mode, 3.25M*/301regmap_update_bits(afe->regmap, reg,302DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,3030x0);304regmap_update_bits(afe->regmap, reg,305DMIC_LOW_POWER_MODE_CTL_MASK_SFT,3060x0);307308/* turn on dmic, ch1, ch2 */309regmap_update_bits(afe->regmap, reg,310UL_SDM_3_LEVEL_CTL_MASK_SFT,3110x1 << UL_SDM_3_LEVEL_CTL_SFT);312regmap_update_bits(afe->regmap, reg,313UL_MODE_3P25M_CH1_CTL_MASK_SFT,3140x1 << UL_MODE_3P25M_CH1_CTL_SFT);315regmap_update_bits(afe->regmap, reg,316UL_MODE_3P25M_CH2_CTL_MASK_SFT,3170x1 << UL_MODE_3P25M_CH2_CTL_SFT);318319/* ul gain: gain = 0x7fff/positive_gain = 0x0/gain_mode = 0x10 */320regmap_update_bits(afe->regmap, reg1,321ADDA_UL_GAIN_VALUE_MASK_SFT,3220x7fff << ADDA_UL_GAIN_VALUE_SFT);323regmap_update_bits(afe->regmap, reg1,324ADDA_UL_POSTIVEGAIN_MASK_SFT,3250x0 << ADDA_UL_POSTIVEGAIN_SFT);326/* gain_mode = 0x02: Add 0.5 gain at CIC output */327regmap_update_bits(afe->regmap, reg1,328GAIN_MODE_MASK_SFT,3290x02 << GAIN_MODE_SFT);330331return 0;332}333334static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,335struct snd_kcontrol *kcontrol,336int event)337{338struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);339struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);340struct mt8189_afe_private *afe_priv = afe->platform_priv;341int mtkaif_dmic = afe_priv->mtkaif_dmic;342343dev_dbg(afe->dev, "%s(), name %s, event 0x%x, mtkaif_dmic %d\n",344__func__, w->name, event, mtkaif_dmic);345346switch (event) {347case SND_SOC_DAPM_PRE_PMU:348/* update setting to dmic */349if (mtkaif_dmic) {350/* mtkaif_rxif_data_mode = 1, dmic */351regmap_update_bits(afe->regmap, AFE_MTKAIF0_RX_CFG0,352RG_MTKAIF0_RXIF_DATA_MODE_MASK_SFT,3530x1);354355/* dmic mode, 3.25M*/356regmap_update_bits(afe->regmap, AFE_MTKAIF0_RX_CFG0,357RG_MTKAIF0_RXIF_VOICE_MODE_MASK_SFT,3580x0);359mtk_adda_ul_src_enable_dmic(afe, MT8189_DAI_ADDA);360}361break;362case SND_SOC_DAPM_POST_PMD:363/* should delayed 1/fs(smallest is 8k) = 125us before afe off */364usleep_range(120, 130);365366/* reset dmic */367afe_priv->mtkaif_dmic = 0;368break;369default:370break;371}372373return 0;374}375376static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,377struct snd_kcontrol *kcontrol,378int event)379{380struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);381struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);382struct mt8189_afe_private *afe_priv = afe->platform_priv;383384if (event == SND_SOC_DAPM_PRE_PMU) {385if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)386regmap_write(afe->regmap, AFE_AUD_PAD_TOP_CFG0, 0xB8);387else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2)388regmap_write(afe->regmap, AFE_AUD_PAD_TOP_CFG0, 0xB0);389else390regmap_write(afe->regmap, AFE_AUD_PAD_TOP_CFG0, 0xB0);391}392393return 0;394}395396static bool is_adda_mtkaif_need_phase_delay(struct mt8189_afe_private *afe_priv)397{398return afe_priv->mtkaif_chosen_phase[0] >= 0 &&399afe_priv->mtkaif_chosen_phase[1] >= 0;400}401402static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,403struct snd_kcontrol *kcontrol,404int event)405{406struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);407struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);408struct mt8189_afe_private *afe_priv = afe->platform_priv;409int delay_data;410int delay_cycle;411412switch (event) {413case SND_SOC_DAPM_PRE_PMU:414if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {415/* set protocol 2 */416regmap_write(afe->regmap, AFE_MTKAIF0_CFG0,4170x00010000);418regmap_write(afe->regmap, AFE_MTKAIF1_CFG0,4190x00010000);420421/* mtkaif_rxif_clkinv_adc inverse for calibration */422regmap_update_bits(afe->regmap, AFE_MTKAIF0_CFG0,423RG_MTKAIF0_RXIF_CLKINV_MASK_SFT,4240x1 << RG_MTKAIF0_RXIF_CLKINV_SFT);425regmap_update_bits(afe->regmap, AFE_MTKAIF1_CFG0,426RG_MTKAIF1_RXIF_CLKINV_ADC_MASK_SFT,4270x1 << RG_MTKAIF1_RXIF_CLKINV_ADC_SFT);428429/* This event align the phase of every miso pin */430/* If only 1 miso is used, there is no need to do phase delay. */431if (strcmp(w->name, "ADDA_MTKAIF_CFG") == 0 &&432!is_adda_mtkaif_need_phase_delay(afe_priv)) {433dev_dbg(afe->dev,434"%s(), check adda mtkaif_chosen_phase[0/1]:%d/%d\n",435__func__,436afe_priv->mtkaif_chosen_phase[0],437afe_priv->mtkaif_chosen_phase[1]);438break;439} else if (strcmp(w->name, "ADDA6_MTKAIF_CFG") == 0 &&440afe_priv->mtkaif_chosen_phase[2] < 0) {441dev_dbg(afe->dev,442"%s(), check adda6 mtkaif_chosen_phase[2]:%d\n",443__func__,444afe_priv->mtkaif_chosen_phase[2]);445break;446}447448/* set delay for ch12 to align phase of miso0 and miso1 */449if (afe_priv->mtkaif_phase_cycle[0] >=450afe_priv->mtkaif_phase_cycle[1]) {451delay_data = DELAY_DATA_MISO1;452delay_cycle = afe_priv->mtkaif_phase_cycle[0] -453afe_priv->mtkaif_phase_cycle[1];454} else {455delay_data = DELAY_DATA_MISO2;456delay_cycle = afe_priv->mtkaif_phase_cycle[1] -457afe_priv->mtkaif_phase_cycle[0];458}459460regmap_update_bits(afe->regmap,461AFE_MTKAIF0_RX_CFG2,462RG_MTKAIF0_RXIF_DELAY_DATA_MASK_SFT,463delay_data <<464RG_MTKAIF0_RXIF_DELAY_DATA_SFT);465466regmap_update_bits(afe->regmap,467AFE_MTKAIF0_RX_CFG2,468RG_MTKAIF0_RXIF_DELAY_CYCLE_MASK_SFT,469delay_cycle <<470RG_MTKAIF0_RXIF_DELAY_CYCLE_SFT);471472/* set delay between ch3 and ch2 */473if (afe_priv->mtkaif_phase_cycle[2] >=474afe_priv->mtkaif_phase_cycle[1]) {475delay_data = DELAY_DATA_MISO1; /* ch3 */476delay_cycle = afe_priv->mtkaif_phase_cycle[2] -477afe_priv->mtkaif_phase_cycle[1];478} else {479delay_data = DELAY_DATA_MISO2; /* ch2 */480delay_cycle = afe_priv->mtkaif_phase_cycle[1] -481afe_priv->mtkaif_phase_cycle[2];482}483484regmap_update_bits(afe->regmap,485AFE_MTKAIF1_RX_CFG2,486RG_MTKAIF1_RXIF_DELAY_DATA_MASK_SFT,487delay_data <<488RG_MTKAIF1_RXIF_DELAY_DATA_SFT);489regmap_update_bits(afe->regmap,490AFE_MTKAIF1_RX_CFG2,491RG_MTKAIF1_RXIF_DELAY_CYCLE_MASK_SFT,492delay_cycle <<493RG_MTKAIF1_RXIF_DELAY_CYCLE_SFT);494} else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {495regmap_write(afe->regmap, AFE_MTKAIF0_CFG0,4960x00010000);497regmap_write(afe->regmap, AFE_MTKAIF1_CFG0,4980x00010000);499} else {500regmap_write(afe->regmap, AFE_MTKAIF0_CFG0, 0x0);501regmap_write(afe->regmap, AFE_MTKAIF1_CFG0, 0x0);502}503break;504default:505break;506}507508return 0;509}510511static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,512struct snd_kcontrol *kcontrol,513int event)514{515struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);516struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);517518dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",519__func__, w->name, event);520521/* should delayed 1/fs(smallest is 8k) = 125us before afe off */522if (event == SND_SOC_DAPM_POST_PMD)523usleep_range(120, 130);524525return 0;526}527528static void mt6363_vs1_vote(struct mtk_base_afe *afe)529{530struct mt8189_afe_private *afe_priv = afe->platform_priv;531bool pre_enable = afe_priv->is_mt6363_vote;532bool enable;533534if (!afe_priv->pmic_regmap)535return;536537enable = (afe_priv->is_adda_dl_on && afe_priv->is_adda_dl_max_vol) ||538(afe_priv->is_adda_ul_on);539if (enable == pre_enable) {540dev_dbg(afe->dev, "%s() enable == pre_enable = %d\n",541__func__, enable);542return;543}544545afe_priv->is_mt6363_vote = enable;546dev_dbg(afe->dev, "%s() enable = %d\n", __func__, enable);547548if (enable)549regmap_update_bits(afe_priv->pmic_regmap, RG_BUCK_VS1_VOTER_EN_LO_SET,550VS1_MT6338_MASK_SFT, 0x1);551else552regmap_update_bits(afe_priv->pmic_regmap, RG_BUCK_VS1_VOTER_EN_LO_CLR,553VS1_MT6338_MASK_SFT, 0x1);554}555556static int mt_vs1_voter_dl_event(struct snd_soc_dapm_widget *w,557struct snd_kcontrol *kcontrol,558int event)559{560struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);561struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);562struct mt8189_afe_private *afe_priv = afe->platform_priv;563564dev_dbg(afe->dev, "%s(), event = 0x%x\n", __func__, event);565566switch (event) {567case SND_SOC_DAPM_PRE_PMU:568afe_priv->is_adda_dl_on = true;569mt6363_vs1_vote(afe);570break;571case SND_SOC_DAPM_POST_PMD:572afe_priv->is_adda_dl_on = false;573mt6363_vs1_vote(afe);574break;575default:576break;577}578579return 0;580}581582static int mt_vs1_voter_ul_event(struct snd_soc_dapm_widget *w,583struct snd_kcontrol *kcontrol,584int event)585{586struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);587struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);588struct mt8189_afe_private *afe_priv = afe->platform_priv;589590dev_dbg(afe->dev, "%s(), event = 0x%x\n", __func__, event);591592switch (event) {593case SND_SOC_DAPM_PRE_PMU:594afe_priv->is_adda_ul_on = true;595mt6363_vs1_vote(afe);596break;597case SND_SOC_DAPM_POST_PMD:598afe_priv->is_adda_ul_on = false;599mt6363_vs1_vote(afe);600break;601default:602break;603}604605return 0;606}607608static int mt8189_adda_dmic_get(struct snd_kcontrol *kcontrol,609struct snd_ctl_elem_value *ucontrol)610{611struct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);612struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);613struct mt8189_afe_private *afe_priv = afe->platform_priv;614615ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;616617return 0;618}619620static int mt8189_adda_dmic_set(struct snd_kcontrol *kcontrol,621struct snd_ctl_elem_value *ucontrol)622{623struct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);624struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);625struct mt8189_afe_private *afe_priv = afe->platform_priv;626int dmic_on;627628dmic_on = !!ucontrol->value.integer.value[0];629630dev_dbg(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",631__func__, kcontrol->id.name, dmic_on);632633afe_priv->mtkaif_dmic = dmic_on;634afe_priv->mtkaif_dmic_ch34 = dmic_on;635636return 0;637}638639static int mt8189_adda_dl_max_vol_get(struct snd_kcontrol *kcontrol,640struct snd_ctl_elem_value *ucontrol)641{642struct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);643struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);644struct mt8189_afe_private *afe_priv = afe->platform_priv;645646ucontrol->value.integer.value[0] = afe_priv->is_adda_dl_max_vol;647648return 0;649}650651static int mt8189_adda_dl_max_vol_set(struct snd_kcontrol *kcontrol,652struct snd_ctl_elem_value *ucontrol)653{654struct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);655struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);656struct mt8189_afe_private *afe_priv = afe->platform_priv;657bool is_adda_dl_max_vol = ucontrol->value.integer.value[0];658659afe_priv->is_adda_dl_max_vol = is_adda_dl_max_vol;660mt6363_vs1_vote(afe);661662return 0;663}664665static const struct snd_kcontrol_new mtk_adda_controls[] = {666SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC_CON1,667AFE_DL_GAIN1_CTL_PRE_SFT, AFE_DL_GAIN1_CTL_PRE_MASK, 0),668SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,669mt8189_adda_dmic_get, mt8189_adda_dmic_set),670SOC_SINGLE_BOOL_EXT("ADDA_DL_MAX_VOL Switch", 0,671mt8189_adda_dl_max_vol_get,672mt8189_adda_dl_max_vol_set),673};674675static const char *const adda_ul_mux_texts[] = {676"MTKAIF", "AP_DMIC", "AP_DMIC_MULTI_CH",677};678679static SOC_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,680SND_SOC_NOPM,6810,682adda_ul_mux_texts);683684static const struct snd_kcontrol_new adda_ul_mux_control =685SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);686687static const struct snd_kcontrol_new adda_ch34_ul_mux_control =688SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);689690static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {691/* inter-connections */692SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,693mtk_adda_dl_ch1_mix,694ARRAY_SIZE(mtk_adda_dl_ch1_mix)),695SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,696mtk_adda_dl_ch2_mix,697ARRAY_SIZE(mtk_adda_dl_ch2_mix)),698699SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,700mtk_adda_dl_ch3_mix,701ARRAY_SIZE(mtk_adda_dl_ch3_mix)),702SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,703mtk_adda_dl_ch4_mix,704ARRAY_SIZE(mtk_adda_dl_ch4_mix)),705706SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,707AUDIO_ENGEN_CON0, AUDIO_F3P25M_EN_ON_SFT, 0,708NULL, 0),709SND_SOC_DAPM_SUPPLY_S("ADDA_DL0_CG", SUPPLY_SEQ_ADDA_DL_ON,710AUDIO_TOP_CON0,711PDN_DL0_DAC_SFT, 1,712NULL, 0),713SND_SOC_DAPM_SUPPLY_S("ADDA_UL0_CG", SUPPLY_SEQ_ADDA_UL_ON,714AUDIO_TOP_CON1,715PDN_UL0_ADC_SFT, 1,716NULL, 0),717718SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,719AFE_ADDA_DL_SRC_CON0,720AFE_DL_SRC_ON_TMP_CTL_PRE_SFT, 0,721mtk_adda_dl_event,722SND_SOC_DAPM_POST_PMD),723724SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,725AFE_ADDA_UL0_SRC_CON0,726UL_SRC_ON_TMP_CTL_SFT, 0,727mtk_adda_ul_event,728SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),729730SND_SOC_DAPM_SUPPLY_S("AP DMIC Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,731AFE_ADDA_DMIC0_SRC_CON0,732UL_SRC_ON_TMP_CTL_SFT, 0,733NULL, 0),734735SND_SOC_DAPM_SUPPLY_S("AP DMIC CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,736AFE_ADDA_DMIC1_SRC_CON0,737UL_SRC_ON_TMP_CTL_SFT, 0,738NULL, 0),739740SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,741AFE_AUD_PAD_TOP_CFG0,742RG_RX_FIFO_ON_SFT, 0,743mtk_adda_pad_top_event,744SND_SOC_DAPM_PRE_PMU),745SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,746SND_SOC_NOPM, 0, 0,747mtk_adda_mtkaif_cfg_event,748SND_SOC_DAPM_PRE_PMU),749SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,750SND_SOC_NOPM, 0, 0,751mtk_adda_mtkaif_cfg_event,752SND_SOC_DAPM_PRE_PMU),753SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,754AFE_ADDA_DMIC0_SRC_CON0,755UL_AP_DMIC_ON_SFT, 0,756NULL, 0),757SND_SOC_DAPM_SUPPLY_S("AP_DMIC0_CG", SUPPLY_SEQ_ADDA_AP_DMIC,758AUDIO_TOP_CON1,759PDN_DMIC0_ADC_SFT, 1,760NULL, 0),761SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,762AFE_ADDA_DMIC1_SRC_CON0,763UL_AP_DMIC_ON_SFT, 0,764NULL, 0),765SND_SOC_DAPM_SUPPLY_S("AP_DMIC1_CG", SUPPLY_SEQ_ADDA_AP_DMIC,766AUDIO_TOP_CON1,767PDN_DMIC1_ADC_SFT, 1,768NULL, 0),769SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,770AFE_ADDA_UL0_SRC_CON1,771FIFO_SOFT_RST_SFT, 1,772NULL, 0),773SND_SOC_DAPM_SUPPLY_S("AP_DMIC_FIFO", SUPPLY_SEQ_ADDA_FIFO,774AFE_ADDA_DMIC0_SRC_CON1,775FIFO_SOFT_RST_SFT, 1,776NULL, 0),777SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,778AFE_ADDA_DMIC1_SRC_CON1,779FIFO_SOFT_RST_SFT, 1,780NULL, 0),781SND_SOC_DAPM_SUPPLY_S("VS1_VOTER_DL", SUPPLY_SEQ_ADDA_AFE_ON,782SND_SOC_NOPM, 0, 0,783mt_vs1_voter_dl_event,784SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),785786SND_SOC_DAPM_SUPPLY_S("VS1_VOTER_UL", SUPPLY_SEQ_ADDA_AFE_ON,787SND_SOC_NOPM, 0, 0,788mt_vs1_voter_ul_event,789SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),790791SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,792&adda_ul_mux_control),793SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,794&adda_ch34_ul_mux_control),795796SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),797};798799static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {800/* playback */801{"ADDA_DL_CH1", "DL0_CH1", "DL0"},802{"ADDA_DL_CH2", "DL0_CH1", "DL0"},803{"ADDA_DL_CH2", "DL0_CH2", "DL0"},804805{"ADDA_DL_CH1", "DL1_CH1", "DL1"},806{"ADDA_DL_CH2", "DL1_CH2", "DL1"},807808{"ADDA_DL_CH1", "DL2_CH1", "DL2"},809{"ADDA_DL_CH2", "DL2_CH2", "DL2"},810811{"ADDA_DL_CH1", "DL3_CH1", "DL3"},812{"ADDA_DL_CH2", "DL3_CH2", "DL3"},813814{"ADDA_DL_CH1", "DL4_CH1", "DL4"},815{"ADDA_DL_CH2", "DL4_CH2", "DL4"},816817{"ADDA_DL_CH1", "DL5_CH1", "DL5"},818{"ADDA_DL_CH2", "DL5_CH2", "DL5"},819820{"ADDA_DL_CH1", "DL6_CH1", "DL6"},821{"ADDA_DL_CH2", "DL6_CH2", "DL6"},822823{"ADDA_DL_CH1", "DL7_CH1", "DL7"},824{"ADDA_DL_CH2", "DL7_CH2", "DL7"},825826{"ADDA_DL_CH1", "DL8_CH1", "DL8"},827{"ADDA_DL_CH2", "DL8_CH2", "DL8"},828829{"ADDA_DL_CH1", "DL_24CH_CH1", "DL_24CH"},830{"ADDA_DL_CH2", "DL_24CH_CH2", "DL_24CH"},831832{"ADDA_DL_CH1", "DL24_CH1", "DL24"},833{"ADDA_DL_CH2", "DL24_CH2", "DL24"},834835{"ADDA Playback", NULL, "ADDA_DL_CH1"},836{"ADDA Playback", NULL, "ADDA_DL_CH2"},837838{"ADDA Playback", NULL, "ADDA Enable"},839{"ADDA Playback", NULL, "ADDA Playback Enable"},840{"ADDA Playback", NULL, "AUD_PAD_TOP"},841{"ADDA Playback", NULL, "VS1_VOTER_DL"},842{"ADDA Playback", NULL, "ADDA_DL0_CG"},843844{"ADDA_DL_CH3", "DL0_CH1", "DL0"},845{"ADDA_DL_CH4", "DL0_CH2", "DL0"},846847{"ADDA_DL_CH3", "DL1_CH1", "DL1"},848{"ADDA_DL_CH4", "DL1_CH2", "DL1"},849850{"ADDA_DL_CH3", "DL2_CH1", "DL2"},851{"ADDA_DL_CH4", "DL2_CH2", "DL2"},852853{"ADDA_DL_CH3", "DL3_CH1", "DL3"},854{"ADDA_DL_CH4", "DL3_CH2", "DL3"},855856{"ADDA_DL_CH3", "DL4_CH1", "DL4"},857{"ADDA_DL_CH4", "DL4_CH2", "DL4"},858859{"ADDA_DL_CH3", "DL5_CH1", "DL5"},860{"ADDA_DL_CH4", "DL5_CH2", "DL5"},861862{"ADDA_DL_CH3", "DL6_CH1", "DL6"},863{"ADDA_DL_CH4", "DL6_CH2", "DL6"},864865{"ADDA_DL_CH3", "DL7_CH1", "DL7"},866{"ADDA_DL_CH4", "DL7_CH2", "DL7"},867868{"ADDA_DL_CH3", "DL8_CH1", "DL8"},869{"ADDA_DL_CH4", "DL8_CH2", "DL8"},870871{"ADDA_DL_CH3", "DL_24CH_CH1", "DL_24CH"},872{"ADDA_DL_CH4", "DL_24CH_CH2", "DL_24CH"},873{"ADDA_DL_CH3", "DL_24CH_CH3", "DL_24CH"},874{"ADDA_DL_CH4", "DL_24CH_CH4", "DL_24CH"},875876{"ADDA_DL_CH3", "DL24_CH1", "DL24"},877{"ADDA_DL_CH4", "DL24_CH2", "DL24"},878879{"ADDA Capture", NULL, "ADDA Enable"},880{"ADDA Capture", NULL, "ADDA Capture Enable"},881{"ADDA Capture", NULL, "AUD_PAD_TOP"},882{"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},883{"ADDA Capture", NULL, "VS1_VOTER_UL"},884{"ADDA Capture", NULL, "ADDA_UL0_CG"},885886/* capture */887{"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},888{"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},889{"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},890891{"AP DMIC Capture", NULL, "ADDA Enable"},892{"AP DMIC Capture", NULL, "AP DMIC Capture Enable"},893{"AP DMIC Capture", NULL, "AP_DMIC_FIFO"},894{"AP DMIC Capture", NULL, "AP_DMIC_EN"},895{"AP DMIC Capture", NULL, "AP_DMIC0_CG"},896897{"AP DMIC CH34 Capture", NULL, "ADDA Enable"},898{"AP DMIC CH34 Capture", NULL, "AP DMIC CH34 Capture Enable"},899{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_FIFO"},900{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},901{"AP DMIC CH34 Capture", NULL, "AP_DMIC1_CG"},902903{"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},904{"AP DMIC CH34 Capture", NULL, "AP_DMIC_INPUT"},905};906907/* dai ops */908static int set_playback_hw_params(struct snd_pcm_hw_params *params,909struct snd_soc_dai *dai)910{911struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);912struct mt8189_afe_private *afe_priv = afe->platform_priv;913unsigned int rate = params_rate(params);914struct mtk_afe_adda_priv *adda_priv;915unsigned int dl_src_con0;916unsigned int dl_src_con1;917int id = dai->id;918919adda_priv = afe_priv->dai_priv[id];920if (!adda_priv)921return -EINVAL;922923adda_priv->dl_rate = rate;924925/* set sampling rate */926dl_src_con0 = adda_dl_rate_transform(afe, rate) <<927AFE_DL_INPUT_MODE_CTL_SFT;928929/* set output mode, UP_SAMPLING_RATE_X8 */930dl_src_con0 |= (0x3 << AFE_DL_OUTPUT_SEL_CTL_SFT);931932/* turn off mute function */933dl_src_con0 |= (0x01 << AFE_DL_MUTE_CH2_OFF_CTL_PRE_SFT);934dl_src_con0 |= (0x01 << AFE_DL_MUTE_CH1_OFF_CTL_PRE_SFT);935936/* set voice input data if input sample rate is 8k or 16k */937if (rate == 8000 || rate == 16000)938dl_src_con0 |= 0x01 << AFE_DL_VOICE_MODE_CTL_PRE_SFT;939940/* SA suggest apply -0.3db to audio/speech path */941dl_src_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<942AFE_DL_GAIN1_CTL_PRE_SFT;943dl_src_con1 |= MTK_AFE_ADDA_DL_GAIN_NORMAL <<944AFE_DL_GAIN2_CTL_PRE_SFT;945946/* turn on down-link gain */947dl_src_con0 |= (0x01 << AFE_DL_GAIN_ON_CTL_PRE_SFT);948949if (id == MT8189_DAI_ADDA) {950/* clean predistortion */951regmap_write(afe->regmap, AFE_ADDA_DL_PREDIS_CON0, 0);952regmap_write(afe->regmap, AFE_ADDA_DL_PREDIS_CON1, 0);953954regmap_write(afe->regmap,955AFE_ADDA_DL_SRC_CON0, dl_src_con0);956regmap_write(afe->regmap,957AFE_ADDA_DL_SRC_CON1, dl_src_con1);958959/* set sdm gain */960regmap_update_bits(afe->regmap,961AFE_ADDA_DL_SDM_DCCOMP_CON,962AFE_DL_ATTGAIN_CTL_MASK_SFT,963AUDIO_SDM_LEVEL_NORMAL <<964AFE_DL_ATTGAIN_CTL_SFT);965966/* 2nd sdm */967regmap_update_bits(afe->regmap,968AFE_ADDA_DL_SDM_DCCOMP_CON,969AFE_DL_USE_3RD_SDM_MASK_SFT,970AUDIO_SDM_2ND << AFE_DL_USE_3RD_SDM_SFT);971972/* sdm auto reset */973regmap_write(afe->regmap,974AFE_ADDA_DL_SDM_AUTO_RESET_CON,975SDM_AUTO_RESET_THRESHOLD);976regmap_update_bits(afe->regmap,977AFE_ADDA_DL_SDM_AUTO_RESET_CON,978AFE_DL_SDM_AUTO_RESET_TEST_ON_SFT,9790x1 << AFE_DL_SDM_AUTO_RESET_TEST_ON_SFT);980}981982return 0;983}984985static int set_capture_hw_params(struct snd_pcm_hw_params *params,986struct snd_soc_dai *dai)987{988struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);989struct mt8189_afe_private *afe_priv = afe->platform_priv;990unsigned int rate = params_rate(params);991struct mtk_afe_adda_priv *adda_priv;992unsigned int voice_mode;993unsigned int ul_src_con0;994int id = dai->id;995996adda_priv = afe_priv->dai_priv[id];997if (!adda_priv)998return -EINVAL;9991000adda_priv->ul_rate = rate;10011002voice_mode = adda_ul_rate_transform(afe, rate);10031004ul_src_con0 = (voice_mode << UL_VOICE_MODE_CH1_CH2_CTL_SFT) &1005UL_VOICE_MODE_CH1_CH2_CTL_MASK_SFT;10061007/* enable iir */1008ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &1009UL_IIR_ON_TMP_CTL_MASK_SFT;1010ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &1011UL_IIRMODE_CTL_MASK_SFT;10121013switch (id) {1014case MT8189_DAI_ADDA:1015/* 35Hz @ 48k */1016regmap_write(afe->regmap,1017AFE_ADDA_UL0_IIR_COEF_02_01, 0x00000000);1018regmap_write(afe->regmap,1019AFE_ADDA_UL0_IIR_COEF_04_03, 0x00003FB8);1020regmap_write(afe->regmap,1021AFE_ADDA_UL0_IIR_COEF_06_05, 0x3FB80000);1022regmap_write(afe->regmap,1023AFE_ADDA_UL0_IIR_COEF_08_07, 0x3FB80000);1024regmap_write(afe->regmap,1025AFE_ADDA_UL0_IIR_COEF_10_09, 0x0000C048);10261027regmap_write(afe->regmap,1028AFE_ADDA_UL0_SRC_CON0, ul_src_con0);10291030/* mtkaif_rxif_data_mode = 0, amic */1031regmap_update_bits(afe->regmap,1032AFE_MTKAIF0_RX_CFG0,1033RG_MTKAIF0_RXIF_DATA_MODE_MASK_SFT,10340x0 << RG_MTKAIF0_RXIF_DATA_MODE_SFT);1035break;1036case MT8189_DAI_AP_DMIC:1037/* 35Hz @ 48k */1038regmap_write(afe->regmap,1039AFE_ADDA_DMIC0_IIR_COEF_02_01, 0x00000000);1040regmap_write(afe->regmap,1041AFE_ADDA_DMIC0_IIR_COEF_04_03, 0x00003FB8);1042regmap_write(afe->regmap,1043AFE_ADDA_DMIC0_IIR_COEF_06_05, 0x3FB80000);1044regmap_write(afe->regmap,1045AFE_ADDA_DMIC0_IIR_COEF_08_07, 0x3FB80000);1046regmap_write(afe->regmap,1047AFE_ADDA_DMIC0_IIR_COEF_10_09, 0x0000C048);10481049regmap_write(afe->regmap,1050AFE_ADDA_DMIC0_SRC_CON0, ul_src_con0);1051break;1052case MT8189_DAI_AP_DMIC_CH34:1053/* 35Hz @ 48k */1054regmap_write(afe->regmap,1055AFE_ADDA_DMIC1_IIR_COEF_02_01, 0x00000000);1056regmap_write(afe->regmap,1057AFE_ADDA_DMIC1_IIR_COEF_04_03, 0x00003FB8);1058regmap_write(afe->regmap,1059AFE_ADDA_DMIC1_IIR_COEF_06_05, 0x3FB80000);1060regmap_write(afe->regmap,1061AFE_ADDA_DMIC1_IIR_COEF_08_07, 0x3FB80000);1062regmap_write(afe->regmap,1063AFE_ADDA_DMIC1_IIR_COEF_10_09, 0x0000C048);10641065regmap_write(afe->regmap,1066AFE_ADDA_DMIC1_SRC_CON0, ul_src_con0);1067break;1068default:1069break;1070}10711072/* ap dmic */1073if (id == MT8189_DAI_AP_DMIC || id == MT8189_DAI_AP_DMIC_CH34)1074mtk_adda_ul_src_enable_dmic(afe, id);10751076return 0;1077}10781079static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,1080struct snd_pcm_hw_params *params,1081struct snd_soc_dai *dai)1082{1083struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1084int id = dai->id;10851086if (id >= MT8189_DAI_NUM || id < 0)1087return -EINVAL;10881089dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",1090__func__, id, substream->stream, params_rate(params));10911092if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)1093return set_playback_hw_params(params, dai);1094else1095return set_capture_hw_params(params, dai);10961097return 0;1098}10991100static const struct snd_soc_dai_ops mtk_dai_adda_ops = {1101.hw_params = mtk_dai_adda_hw_params,1102};11031104/* dai driver */1105#define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000)11061107#define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\1108SNDRV_PCM_RATE_16000 |\1109SNDRV_PCM_RATE_32000 |\1110SNDRV_PCM_RATE_48000)11111112#define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\1113SNDRV_PCM_FMTBIT_S24_LE |\1114SNDRV_PCM_FMTBIT_S32_LE)11151116static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {1117{1118.name = "ADDA",1119.id = MT8189_DAI_ADDA,1120.playback = {1121.stream_name = "ADDA Playback",1122.channels_min = 1,1123.channels_max = 2,1124.rates = MTK_ADDA_PLAYBACK_RATES,1125.formats = MTK_ADDA_FORMATS,1126},1127.capture = {1128.stream_name = "ADDA Capture",1129.channels_min = 1,1130.channels_max = 2,1131.rates = MTK_ADDA_CAPTURE_RATES,1132.formats = MTK_ADDA_FORMATS,1133},1134.ops = &mtk_dai_adda_ops,1135},1136{1137.name = "ADDA_CH34",1138.id = MT8189_DAI_ADDA_CH34,1139.playback = {1140.stream_name = "ADDA CH34 Playback",1141.channels_min = 1,1142.channels_max = 2,1143.rates = MTK_ADDA_PLAYBACK_RATES,1144.formats = MTK_ADDA_FORMATS,1145},1146.ops = &mtk_dai_adda_ops,1147},1148{1149.name = "AP_DMIC",1150.id = MT8189_DAI_AP_DMIC,1151.capture = {1152.stream_name = "AP DMIC Capture",1153.channels_min = 1,1154.channels_max = 2,1155.rates = MTK_ADDA_CAPTURE_RATES,1156.formats = MTK_ADDA_FORMATS,1157},1158.ops = &mtk_dai_adda_ops,1159},1160{1161.name = "AP_DMIC_CH34",1162.id = MT8189_DAI_AP_DMIC_CH34,1163.capture = {1164.stream_name = "AP DMIC CH34 Capture",1165.channels_min = 1,1166.channels_max = 2,1167.rates = MTK_ADDA_CAPTURE_RATES,1168.formats = MTK_ADDA_FORMATS,1169},1170.ops = &mtk_dai_adda_ops,1171},1172};11731174static int init_adda_priv_data(struct mtk_base_afe *afe)1175{1176struct mt8189_afe_private *afe_priv = afe->platform_priv;1177struct mtk_afe_adda_priv *adda_priv;1178static const int adda_dai_list[] = {1179MT8189_DAI_ADDA,1180MT8189_DAI_ADDA_CH34,1181};11821183for (int i = 0; i < ARRAY_SIZE(adda_dai_list); i++) {1184adda_priv = devm_kzalloc(afe->dev,1185sizeof(struct mtk_afe_adda_priv),1186GFP_KERNEL);1187if (!adda_priv)1188return -ENOMEM;11891190afe_priv->dai_priv[adda_dai_list[i]] = adda_priv;1191}11921193/* ap dmic priv share with adda */1194afe_priv->dai_priv[MT8189_DAI_AP_DMIC] =1195afe_priv->dai_priv[MT8189_DAI_ADDA];1196afe_priv->dai_priv[MT8189_DAI_AP_DMIC_CH34] =1197afe_priv->dai_priv[MT8189_DAI_ADDA_CH34];11981199return 0;1200}12011202int mt8189_dai_adda_register(struct mtk_base_afe *afe)1203{1204struct mtk_base_afe_dai *dai;1205int ret;12061207dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);1208if (!dai)1209return -ENOMEM;12101211dai->dai_drivers = mtk_dai_adda_driver;1212dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);1213dai->controls = mtk_adda_controls;1214dai->num_controls = ARRAY_SIZE(mtk_adda_controls);1215dai->dapm_widgets = mtk_dai_adda_widgets;1216dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);1217dai->dapm_routes = mtk_dai_adda_routes;1218dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);12191220ret = init_adda_priv_data(afe);1221if (ret)1222return ret;12231224list_add(&dai->list, &afe->sub_dais);12251226return 0;1227}122812291230