0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/delay.h>
0010 #include <linux/regmap.h>
0011
0012 #include "mt8192-afe-clk.h"
0013 #include "mt8192-afe-common.h"
0014 #include "mt8192-afe-gpio.h"
0015 #include "mt8192-interconnection.h"
0016
0017 enum {
0018 UL_IIR_SW = 0,
0019 UL_IIR_5HZ,
0020 UL_IIR_10HZ,
0021 UL_IIR_25HZ,
0022 UL_IIR_50HZ,
0023 UL_IIR_75HZ,
0024 };
0025
0026 enum {
0027 AUDIO_SDM_LEVEL_MUTE = 0,
0028 AUDIO_SDM_LEVEL_NORMAL = 0x1d,
0029
0030
0031 };
0032
0033 enum {
0034 AUDIO_SDM_2ND = 0,
0035 AUDIO_SDM_3RD,
0036 };
0037
0038 enum {
0039 DELAY_DATA_MISO1 = 0,
0040 DELAY_DATA_MISO2,
0041 };
0042
0043 enum {
0044 MTK_AFE_ADDA_DL_RATE_8K = 0,
0045 MTK_AFE_ADDA_DL_RATE_11K = 1,
0046 MTK_AFE_ADDA_DL_RATE_12K = 2,
0047 MTK_AFE_ADDA_DL_RATE_16K = 3,
0048 MTK_AFE_ADDA_DL_RATE_22K = 4,
0049 MTK_AFE_ADDA_DL_RATE_24K = 5,
0050 MTK_AFE_ADDA_DL_RATE_32K = 6,
0051 MTK_AFE_ADDA_DL_RATE_44K = 7,
0052 MTK_AFE_ADDA_DL_RATE_48K = 8,
0053 MTK_AFE_ADDA_DL_RATE_96K = 9,
0054 MTK_AFE_ADDA_DL_RATE_192K = 10,
0055 };
0056
0057 enum {
0058 MTK_AFE_ADDA_UL_RATE_8K = 0,
0059 MTK_AFE_ADDA_UL_RATE_16K = 1,
0060 MTK_AFE_ADDA_UL_RATE_32K = 2,
0061 MTK_AFE_ADDA_UL_RATE_48K = 3,
0062 MTK_AFE_ADDA_UL_RATE_96K = 4,
0063 MTK_AFE_ADDA_UL_RATE_192K = 5,
0064 MTK_AFE_ADDA_UL_RATE_48K_HD = 6,
0065 };
0066
0067 #define SDM_AUTO_RESET_THRESHOLD 0x190000
0068
0069 static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
0070 unsigned int rate)
0071 {
0072 switch (rate) {
0073 case 8000:
0074 return MTK_AFE_ADDA_DL_RATE_8K;
0075 case 11025:
0076 return MTK_AFE_ADDA_DL_RATE_11K;
0077 case 12000:
0078 return MTK_AFE_ADDA_DL_RATE_12K;
0079 case 16000:
0080 return MTK_AFE_ADDA_DL_RATE_16K;
0081 case 22050:
0082 return MTK_AFE_ADDA_DL_RATE_22K;
0083 case 24000:
0084 return MTK_AFE_ADDA_DL_RATE_24K;
0085 case 32000:
0086 return MTK_AFE_ADDA_DL_RATE_32K;
0087 case 44100:
0088 return MTK_AFE_ADDA_DL_RATE_44K;
0089 case 48000:
0090 return MTK_AFE_ADDA_DL_RATE_48K;
0091 case 96000:
0092 return MTK_AFE_ADDA_DL_RATE_96K;
0093 case 192000:
0094 return MTK_AFE_ADDA_DL_RATE_192K;
0095 default:
0096 dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
0097 __func__, rate);
0098 return MTK_AFE_ADDA_DL_RATE_48K;
0099 }
0100 }
0101
0102 static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
0103 unsigned int rate)
0104 {
0105 switch (rate) {
0106 case 8000:
0107 return MTK_AFE_ADDA_UL_RATE_8K;
0108 case 16000:
0109 return MTK_AFE_ADDA_UL_RATE_16K;
0110 case 32000:
0111 return MTK_AFE_ADDA_UL_RATE_32K;
0112 case 48000:
0113 return MTK_AFE_ADDA_UL_RATE_48K;
0114 case 96000:
0115 return MTK_AFE_ADDA_UL_RATE_96K;
0116 case 192000:
0117 return MTK_AFE_ADDA_UL_RATE_192K;
0118 default:
0119 dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
0120 __func__, rate);
0121 return MTK_AFE_ADDA_UL_RATE_48K;
0122 }
0123 }
0124
0125
0126 static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
0127 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
0128 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN3, I_DL12_CH1, 1, 0),
0129 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
0130 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
0131 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN3_1, I_DL4_CH1, 1, 0),
0132 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN3_1, I_DL5_CH1, 1, 0),
0133 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN3_1, I_DL6_CH1, 1, 0),
0134 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN3_1, I_DL8_CH1, 1, 0),
0135 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN3,
0136 I_ADDA_UL_CH3, 1, 0),
0137 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
0138 I_ADDA_UL_CH2, 1, 0),
0139 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
0140 I_ADDA_UL_CH1, 1, 0),
0141 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN3,
0142 I_GAIN1_OUT_CH1, 1, 0),
0143 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
0144 I_PCM_1_CAP_CH1, 1, 0),
0145 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
0146 I_PCM_2_CAP_CH1, 1, 0),
0147 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN3_1,
0148 I_SRC_1_OUT_CH1, 1, 0),
0149 SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH1", AFE_CONN3_1,
0150 I_SRC_2_OUT_CH1, 1, 0),
0151 };
0152
0153 static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
0154 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
0155 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
0156 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN4, I_DL12_CH2, 1, 0),
0157 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
0158 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
0159 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
0160 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
0161 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN4_1, I_DL4_CH2, 1, 0),
0162 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN4_1, I_DL5_CH2, 1, 0),
0163 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN4_1, I_DL6_CH2, 1, 0),
0164 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN4_1, I_DL8_CH2, 1, 0),
0165 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN4,
0166 I_ADDA_UL_CH3, 1, 0),
0167 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
0168 I_ADDA_UL_CH2, 1, 0),
0169 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
0170 I_ADDA_UL_CH1, 1, 0),
0171 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN4,
0172 I_GAIN1_OUT_CH2, 1, 0),
0173 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
0174 I_PCM_1_CAP_CH1, 1, 0),
0175 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
0176 I_PCM_2_CAP_CH1, 1, 0),
0177 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
0178 I_PCM_1_CAP_CH2, 1, 0),
0179 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
0180 I_PCM_2_CAP_CH2, 1, 0),
0181 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN4_1,
0182 I_SRC_1_OUT_CH2, 1, 0),
0183 SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH2", AFE_CONN4_1,
0184 I_SRC_2_OUT_CH2, 1, 0),
0185 };
0186
0187 static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {
0188 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN52, I_DL1_CH1, 1, 0),
0189 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN52, I_DL12_CH1, 1, 0),
0190 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN52, I_DL2_CH1, 1, 0),
0191 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN52, I_DL3_CH1, 1, 0),
0192 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN52_1, I_DL4_CH1, 1, 0),
0193 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN52_1, I_DL5_CH1, 1, 0),
0194 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN52_1, I_DL6_CH1, 1, 0),
0195 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN52,
0196 I_ADDA_UL_CH3, 1, 0),
0197 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN52,
0198 I_ADDA_UL_CH2, 1, 0),
0199 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN52,
0200 I_ADDA_UL_CH1, 1, 0),
0201 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN52,
0202 I_GAIN1_OUT_CH1, 1, 0),
0203 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN52,
0204 I_PCM_1_CAP_CH1, 1, 0),
0205 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN52,
0206 I_PCM_2_CAP_CH1, 1, 0),
0207 };
0208
0209 static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {
0210 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN53, I_DL1_CH1, 1, 0),
0211 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN53, I_DL1_CH2, 1, 0),
0212 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN53, I_DL12_CH2, 1, 0),
0213 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN53, I_DL2_CH1, 1, 0),
0214 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN53, I_DL2_CH2, 1, 0),
0215 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN53, I_DL3_CH1, 1, 0),
0216 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN53, I_DL3_CH2, 1, 0),
0217 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN53_1, I_DL4_CH2, 1, 0),
0218 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN53_1, I_DL5_CH2, 1, 0),
0219 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN53_1, I_DL6_CH1, 1, 0),
0220 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN53,
0221 I_ADDA_UL_CH3, 1, 0),
0222 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN53,
0223 I_ADDA_UL_CH2, 1, 0),
0224 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN53,
0225 I_ADDA_UL_CH1, 1, 0),
0226 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN53,
0227 I_GAIN1_OUT_CH2, 1, 0),
0228 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN53,
0229 I_PCM_1_CAP_CH1, 1, 0),
0230 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN53,
0231 I_PCM_2_CAP_CH1, 1, 0),
0232 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN53,
0233 I_PCM_1_CAP_CH2, 1, 0),
0234 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN53,
0235 I_PCM_2_CAP_CH2, 1, 0),
0236 };
0237
0238 static const struct snd_kcontrol_new mtk_stf_ch1_mix[] = {
0239 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN19,
0240 I_ADDA_UL_CH1, 1, 0),
0241 };
0242
0243 static const struct snd_kcontrol_new mtk_stf_ch2_mix[] = {
0244 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN20,
0245 I_ADDA_UL_CH2, 1, 0),
0246 };
0247
0248 enum {
0249 SUPPLY_SEQ_ADDA_AFE_ON,
0250 SUPPLY_SEQ_ADDA_DL_ON,
0251 SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
0252 SUPPLY_SEQ_ADDA_MTKAIF_CFG,
0253 SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
0254 SUPPLY_SEQ_ADDA_FIFO,
0255 SUPPLY_SEQ_ADDA_AP_DMIC,
0256 SUPPLY_SEQ_ADDA_UL_ON,
0257 };
0258
0259 static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
0260 {
0261 unsigned int reg;
0262
0263 switch (id) {
0264 case MT8192_DAI_ADDA:
0265 case MT8192_DAI_AP_DMIC:
0266 reg = AFE_ADDA_UL_SRC_CON0;
0267 break;
0268 case MT8192_DAI_ADDA_CH34:
0269 case MT8192_DAI_AP_DMIC_CH34:
0270 reg = AFE_ADDA6_UL_SRC_CON0;
0271 break;
0272 default:
0273 return -EINVAL;
0274 }
0275
0276
0277 regmap_update_bits(afe->regmap, reg,
0278 DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
0279 0x0);
0280 regmap_update_bits(afe->regmap, reg,
0281 DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
0282 0x0);
0283
0284
0285 regmap_update_bits(afe->regmap, reg,
0286 UL_SDM_3_LEVEL_CTL_MASK_SFT,
0287 0x1 << UL_SDM_3_LEVEL_CTL_SFT);
0288 regmap_update_bits(afe->regmap, reg,
0289 UL_MODE_3P25M_CH1_CTL_MASK_SFT,
0290 0x1 << UL_MODE_3P25M_CH1_CTL_SFT);
0291 regmap_update_bits(afe->regmap, reg,
0292 UL_MODE_3P25M_CH2_CTL_MASK_SFT,
0293 0x1 << UL_MODE_3P25M_CH2_CTL_SFT);
0294 return 0;
0295 }
0296
0297 static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
0298 struct snd_kcontrol *kcontrol,
0299 int event)
0300 {
0301 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0302 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0303 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0304 int mtkaif_dmic = afe_priv->mtkaif_dmic;
0305
0306 dev_info(afe->dev, "%s(), name %s, event 0x%x, mtkaif_dmic %d\n",
0307 __func__, w->name, event, mtkaif_dmic);
0308
0309 switch (event) {
0310 case SND_SOC_DAPM_PRE_PMU:
0311 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
0312
0313
0314 if (mtkaif_dmic) {
0315
0316 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
0317 0x1, 0x1);
0318
0319
0320 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
0321 MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
0322 0x0);
0323 mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
0324 }
0325 break;
0326 case SND_SOC_DAPM_POST_PMD:
0327
0328 usleep_range(125, 135);
0329 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
0330 break;
0331 default:
0332 break;
0333 }
0334
0335 return 0;
0336 }
0337
0338 static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
0339 struct snd_kcontrol *kcontrol,
0340 int event)
0341 {
0342 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0343 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0344 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0345 int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
0346 int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
0347
0348 dev_info(afe->dev,
0349 "%s(), name %s, event 0x%x, mtkaif_dmic %d, mtkaif_adda6_only %d\n",
0350 __func__, w->name, event, mtkaif_dmic, mtkaif_adda6_only);
0351
0352 switch (event) {
0353 case SND_SOC_DAPM_PRE_PMU:
0354 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
0355 1);
0356
0357
0358 if (mtkaif_dmic) {
0359
0360 regmap_update_bits(afe->regmap,
0361 AFE_ADDA6_MTKAIF_RX_CFG0,
0362 0x1, 0x1);
0363
0364
0365 regmap_update_bits(afe->regmap,
0366 AFE_ADDA6_MTKAIF_RX_CFG0,
0367 MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
0368 0x0);
0369 mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
0370 }
0371
0372
0373
0374
0375
0376 if (mtkaif_adda6_only) {
0377 regmap_update_bits(afe->regmap,
0378 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
0379 0x1 << 23, 0x1 << 23);
0380 }
0381 break;
0382 case SND_SOC_DAPM_POST_PMD:
0383
0384 usleep_range(125, 135);
0385 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
0386 1);
0387
0388
0389 afe_priv->mtkaif_dmic_ch34 = 0;
0390
0391 if (mtkaif_adda6_only) {
0392 regmap_update_bits(afe->regmap,
0393 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
0394 0x1 << 23, 0x0 << 23);
0395 }
0396 break;
0397 default:
0398 break;
0399 }
0400
0401 return 0;
0402 }
0403
0404 static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
0405 struct snd_kcontrol *kcontrol,
0406 int event)
0407 {
0408 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0409 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0410 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0411
0412 switch (event) {
0413 case SND_SOC_DAPM_PRE_PMU:
0414 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
0415 regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
0416 else
0417 regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
0418 break;
0419 default:
0420 break;
0421 }
0422
0423 return 0;
0424 }
0425
0426 static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
0427 struct snd_kcontrol *kcontrol,
0428 int event)
0429 {
0430 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0431 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0432 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0433 int delay_data;
0434 int delay_cycle;
0435
0436 switch (event) {
0437 case SND_SOC_DAPM_PRE_PMU:
0438 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
0439
0440 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
0441 0x00010000);
0442 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
0443 0x00010000);
0444
0445 if (strcmp(w->name, "ADDA_MTKAIF_CFG") == 0 &&
0446 (afe_priv->mtkaif_chosen_phase[0] < 0 ||
0447 afe_priv->mtkaif_chosen_phase[1] < 0)) {
0448 dev_warn(afe->dev,
0449 "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
0450 __func__,
0451 afe_priv->mtkaif_chosen_phase[0],
0452 afe_priv->mtkaif_chosen_phase[1]);
0453 break;
0454 } else if (strcmp(w->name, "ADDA6_MTKAIF_CFG") == 0 &&
0455 afe_priv->mtkaif_chosen_phase[2] < 0) {
0456 dev_warn(afe->dev,
0457 "%s(), mtkaif_chosen_phase[2]:%d\n",
0458 __func__,
0459 afe_priv->mtkaif_chosen_phase[2]);
0460 break;
0461 }
0462
0463
0464 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
0465 MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
0466 0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
0467 regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
0468 MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
0469 0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
0470
0471
0472 if (afe_priv->mtkaif_phase_cycle[0] >=
0473 afe_priv->mtkaif_phase_cycle[1]) {
0474 delay_data = DELAY_DATA_MISO1;
0475 delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
0476 afe_priv->mtkaif_phase_cycle[1];
0477 } else {
0478 delay_data = DELAY_DATA_MISO2;
0479 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
0480 afe_priv->mtkaif_phase_cycle[0];
0481 }
0482
0483 regmap_update_bits(afe->regmap,
0484 AFE_ADDA_MTKAIF_RX_CFG2,
0485 MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
0486 delay_data <<
0487 MTKAIF_RXIF_DELAY_DATA_SFT);
0488
0489 regmap_update_bits(afe->regmap,
0490 AFE_ADDA_MTKAIF_RX_CFG2,
0491 MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
0492 delay_cycle <<
0493 MTKAIF_RXIF_DELAY_CYCLE_SFT);
0494
0495
0496 if (afe_priv->mtkaif_phase_cycle[2] >=
0497 afe_priv->mtkaif_phase_cycle[1]) {
0498 delay_data = DELAY_DATA_MISO1;
0499 delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
0500 afe_priv->mtkaif_phase_cycle[1];
0501 } else {
0502 delay_data = DELAY_DATA_MISO2;
0503 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
0504 afe_priv->mtkaif_phase_cycle[2];
0505 }
0506
0507 regmap_update_bits(afe->regmap,
0508 AFE_ADDA6_MTKAIF_RX_CFG2,
0509 MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
0510 delay_data <<
0511 MTKAIF_RXIF_DELAY_DATA_SFT);
0512 regmap_update_bits(afe->regmap,
0513 AFE_ADDA6_MTKAIF_RX_CFG2,
0514 MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
0515 delay_cycle <<
0516 MTKAIF_RXIF_DELAY_CYCLE_SFT);
0517 } else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
0518 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
0519 0x00010000);
0520 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
0521 0x00010000);
0522 } else {
0523 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
0524 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
0525 }
0526 break;
0527 default:
0528 break;
0529 }
0530
0531 return 0;
0532 }
0533
0534 static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
0535 struct snd_kcontrol *kcontrol,
0536 int event)
0537 {
0538 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0539 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0540
0541 dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
0542 __func__, w->name, event);
0543
0544 switch (event) {
0545 case SND_SOC_DAPM_PRE_PMU:
0546 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
0547 break;
0548 case SND_SOC_DAPM_POST_PMD:
0549
0550 usleep_range(125, 135);
0551 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
0552 break;
0553 default:
0554 break;
0555 }
0556
0557 return 0;
0558 }
0559
0560 static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
0561 struct snd_kcontrol *kcontrol,
0562 int event)
0563 {
0564 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0565 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0566
0567 dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
0568 __func__, w->name, event);
0569
0570 switch (event) {
0571 case SND_SOC_DAPM_PRE_PMU:
0572 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
0573 0);
0574 break;
0575 case SND_SOC_DAPM_POST_PMD:
0576
0577 usleep_range(125, 135);
0578 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
0579 0);
0580 break;
0581 default:
0582 break;
0583 }
0584
0585 return 0;
0586 }
0587
0588
0589 static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
0590 struct snd_ctl_elem_value *ucontrol)
0591 {
0592 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0593 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0594 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0595
0596 ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
0597 return 0;
0598 }
0599
0600 static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
0601 struct snd_ctl_elem_value *ucontrol)
0602 {
0603 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0604 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0605 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0606 int gain_db = ucontrol->value.integer.value[0];
0607
0608 afe_priv->stf_positive_gain_db = gain_db;
0609
0610 if (gain_db >= 0 && gain_db <= 24) {
0611 regmap_update_bits(afe->regmap,
0612 AFE_SIDETONE_GAIN,
0613 POSITIVE_GAIN_MASK_SFT,
0614 (gain_db / 6) << POSITIVE_GAIN_SFT);
0615 } else {
0616 dev_warn(afe->dev, "%s(), gain_db %d invalid\n",
0617 __func__, gain_db);
0618 }
0619 return 0;
0620 }
0621
0622 static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
0623 struct snd_ctl_elem_value *ucontrol)
0624 {
0625 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0626 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0627 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0628
0629 ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
0630 return 0;
0631 }
0632
0633 static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
0634 struct snd_ctl_elem_value *ucontrol)
0635 {
0636 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0637 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0638 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0639 int dmic_on;
0640
0641 dmic_on = ucontrol->value.integer.value[0];
0642
0643 dev_info(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",
0644 __func__, kcontrol->id.name, dmic_on);
0645
0646 afe_priv->mtkaif_dmic = dmic_on;
0647 afe_priv->mtkaif_dmic_ch34 = dmic_on;
0648 return 0;
0649 }
0650
0651 static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
0652 struct snd_ctl_elem_value *ucontrol)
0653 {
0654 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0655 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0656 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0657
0658 ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
0659 return 0;
0660 }
0661
0662 static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
0663 struct snd_ctl_elem_value *ucontrol)
0664 {
0665 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
0666 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0667 struct mt8192_afe_private *afe_priv = afe->platform_priv;
0668 int mtkaif_adda6_only;
0669
0670 mtkaif_adda6_only = ucontrol->value.integer.value[0];
0671
0672 dev_info(afe->dev, "%s(), kcontrol name %s, mtkaif_adda6_only %d\n",
0673 __func__, kcontrol->id.name, mtkaif_adda6_only);
0674
0675 afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
0676 return 0;
0677 }
0678
0679 static const struct snd_kcontrol_new mtk_adda_controls[] = {
0680 SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
0681 SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
0682 SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 100, 0,
0683 stf_positive_gain_get, stf_positive_gain_set),
0684 SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
0685 DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
0686 SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
0687 mt8192_adda_dmic_get, mt8192_adda_dmic_set),
0688 SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
0689 mt8192_adda6_only_get, mt8192_adda6_only_set),
0690 };
0691
0692 static const struct snd_kcontrol_new stf_ctl =
0693 SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
0694
0695 static const u16 stf_coeff_table_16k[] = {
0696 0x049C, 0x09E8, 0x09E0, 0x089C,
0697 0xFF54, 0xF488, 0xEAFC, 0xEBAC,
0698 0xfA40, 0x17AC, 0x3D1C, 0x6028,
0699 0x7538
0700 };
0701
0702 static const u16 stf_coeff_table_32k[] = {
0703 0xFE52, 0x0042, 0x00C5, 0x0194,
0704 0x029A, 0x03B7, 0x04BF, 0x057D,
0705 0x05BE, 0x0555, 0x0426, 0x0230,
0706 0xFF92, 0xFC89, 0xF973, 0xF6C6,
0707 0xF500, 0xF49D, 0xF603, 0xF970,
0708 0xFEF3, 0x065F, 0x0F4F, 0x1928,
0709 0x2329, 0x2C80, 0x345E, 0x3A0D,
0710 0x3D08
0711 };
0712
0713 static const u16 stf_coeff_table_48k[] = {
0714 0x0401, 0xFFB0, 0xFF5A, 0xFECE,
0715 0xFE10, 0xFD28, 0xFC21, 0xFB08,
0716 0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
0717 0xF724, 0xF746, 0xF7E6, 0xF90F,
0718 0xFACC, 0xFD1E, 0xFFFF, 0x0364,
0719 0x0737, 0x0B62, 0x0FC1, 0x1431,
0720 0x188A, 0x1CA4, 0x2056, 0x237D,
0721 0x25F9, 0x27B0, 0x2890
0722 };
0723
0724 static int mtk_stf_event(struct snd_soc_dapm_widget *w,
0725 struct snd_kcontrol *kcontrol,
0726 int event)
0727 {
0728 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
0729 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
0730
0731 size_t half_tap_num;
0732 const u16 *stf_coeff_table;
0733 unsigned int ul_rate, reg_value;
0734 size_t coef_addr;
0735
0736 regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
0737 ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
0738 ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
0739
0740 if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
0741 half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
0742 stf_coeff_table = stf_coeff_table_48k;
0743 } else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
0744 half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
0745 stf_coeff_table = stf_coeff_table_32k;
0746 } else {
0747 half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
0748 stf_coeff_table = stf_coeff_table_16k;
0749 }
0750
0751 regmap_read(afe->regmap, AFE_SIDETONE_CON1, ®_value);
0752
0753 dev_info(afe->dev, "%s(), name %s, event 0x%x, ul_rate 0x%x, AFE_SIDETONE_CON1 0x%x\n",
0754 __func__, w->name, event, ul_rate, reg_value);
0755
0756 switch (event) {
0757 case SND_SOC_DAPM_PRE_PMU:
0758
0759 regmap_update_bits(afe->regmap,
0760 AFE_SIDETONE_GAIN,
0761 SIDE_TONE_GAIN_MASK_SFT,
0762 0);
0763 regmap_update_bits(afe->regmap,
0764 AFE_SIDETONE_GAIN,
0765 POSITIVE_GAIN_MASK_SFT,
0766 0);
0767
0768 regmap_update_bits(afe->regmap,
0769 AFE_SIDETONE_CON1,
0770 0x1f << 27,
0771 0x0);
0772
0773 regmap_update_bits(afe->regmap,
0774 AFE_SIDETONE_CON1,
0775 SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
0776 half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
0777
0778
0779 regmap_read(afe->regmap, AFE_SIDETONE_CON0, ®_value);
0780 for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
0781 bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
0782 bool new_w_ready = 0;
0783 int try_cnt = 0;
0784
0785 regmap_update_bits(afe->regmap,
0786 AFE_SIDETONE_CON0,
0787 0x39FFFFF,
0788 (1 << R_W_EN_SFT) |
0789 (1 << R_W_SEL_SFT) |
0790 (0 << SEL_CH2_SFT) |
0791 (coef_addr <<
0792 SIDE_TONE_COEFFICIENT_ADDR_SFT) |
0793 stf_coeff_table[coef_addr]);
0794
0795
0796 for (try_cnt = 0; try_cnt < 10; try_cnt++) {
0797 regmap_read(afe->regmap,
0798 AFE_SIDETONE_CON0, ®_value);
0799 new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
0800
0801
0802 if (new_w_ready == old_w_ready) {
0803 udelay(3);
0804 if (try_cnt == 9) {
0805 dev_warn(afe->dev,
0806 "%s(), write coeff not ready",
0807 __func__);
0808 }
0809 } else {
0810 break;
0811 }
0812 }
0813
0814 regmap_update_bits(afe->regmap,
0815 AFE_SIDETONE_CON0,
0816 R_W_SEL_MASK_SFT,
0817 0x0);
0818 }
0819 break;
0820 case SND_SOC_DAPM_POST_PMD:
0821
0822 regmap_update_bits(afe->regmap,
0823 AFE_SIDETONE_CON1,
0824 0x1f << 27,
0825 0x1f << 27);
0826
0827
0828 regmap_update_bits(afe->regmap,
0829 AFE_SIDETONE_GAIN,
0830 SIDE_TONE_GAIN_MASK_SFT,
0831 0);
0832 regmap_update_bits(afe->regmap,
0833 AFE_SIDETONE_GAIN,
0834 POSITIVE_GAIN_MASK_SFT,
0835 0);
0836 break;
0837 default:
0838 break;
0839 }
0840
0841 return 0;
0842 }
0843
0844
0845 enum {
0846 STF_SRC_ADDA_ADDA6 = 0,
0847 STF_SRC_O19O20,
0848 };
0849
0850 static const char *const stf_o19o20_mux_map[] = {
0851 "ADDA_ADDA6",
0852 "O19O20",
0853 };
0854
0855 static int stf_o19o20_mux_map_value[] = {
0856 STF_SRC_ADDA_ADDA6,
0857 STF_SRC_O19O20,
0858 };
0859
0860 static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
0861 AFE_SIDETONE_CON1,
0862 STF_SOURCE_FROM_O19O20_SFT,
0863 STF_SOURCE_FROM_O19O20_MASK,
0864 stf_o19o20_mux_map,
0865 stf_o19o20_mux_map_value);
0866
0867 static const struct snd_kcontrol_new stf_o19O20_mux_control =
0868 SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
0869
0870 enum {
0871 STF_SRC_ADDA = 0,
0872 STF_SRC_ADDA6,
0873 };
0874
0875 static const char *const stf_adda_mux_map[] = {
0876 "ADDA",
0877 "ADDA6",
0878 };
0879
0880 static int stf_adda_mux_map_value[] = {
0881 STF_SRC_ADDA,
0882 STF_SRC_ADDA6,
0883 };
0884
0885 static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
0886 AFE_SIDETONE_CON1,
0887 STF_O19O20_OUT_EN_SEL_SFT,
0888 STF_O19O20_OUT_EN_SEL_MASK,
0889 stf_adda_mux_map,
0890 stf_adda_mux_map_value);
0891
0892 static const struct snd_kcontrol_new stf_adda_mux_control =
0893 SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
0894
0895
0896 enum {
0897 ADDA_UL_MUX_MTKAIF = 0,
0898 ADDA_UL_MUX_AP_DMIC,
0899 ADDA_UL_MUX_MASK = 0x1,
0900 };
0901
0902 static const char * const adda_ul_mux_map[] = {
0903 "MTKAIF", "AP_DMIC"
0904 };
0905
0906 static int adda_ul_map_value[] = {
0907 ADDA_UL_MUX_MTKAIF,
0908 ADDA_UL_MUX_AP_DMIC,
0909 };
0910
0911 static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
0912 SND_SOC_NOPM,
0913 0,
0914 ADDA_UL_MUX_MASK,
0915 adda_ul_mux_map,
0916 adda_ul_map_value);
0917
0918 static const struct snd_kcontrol_new adda_ul_mux_control =
0919 SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
0920
0921 static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
0922 SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
0923
0924 static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
0925
0926 SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
0927 mtk_adda_dl_ch1_mix,
0928 ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
0929 SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
0930 mtk_adda_dl_ch2_mix,
0931 ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
0932
0933 SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
0934 mtk_adda_dl_ch3_mix,
0935 ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
0936 SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
0937 mtk_adda_dl_ch4_mix,
0938 ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
0939
0940 SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
0941 AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
0942 NULL, 0),
0943
0944 SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
0945 AFE_ADDA_DL_SRC2_CON0,
0946 DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
0947 mtk_adda_dl_event,
0948 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0949 SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
0950 SUPPLY_SEQ_ADDA_DL_ON,
0951 AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
0952 DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
0953 mtk_adda_ch34_dl_event,
0954 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0955
0956 SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
0957 AFE_ADDA_UL_SRC_CON0,
0958 UL_SRC_ON_TMP_CTL_SFT, 0,
0959 mtk_adda_ul_event,
0960 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0961 SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
0962 AFE_ADDA6_UL_SRC_CON0,
0963 UL_SRC_ON_TMP_CTL_SFT, 0,
0964 mtk_adda_ch34_ul_event,
0965 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
0966
0967 SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
0968 AFE_AUD_PAD_TOP,
0969 RG_RX_FIFO_ON_SFT, 0,
0970 mtk_adda_pad_top_event,
0971 SND_SOC_DAPM_PRE_PMU),
0972 SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
0973 SND_SOC_NOPM, 0, 0,
0974 mtk_adda_mtkaif_cfg_event,
0975 SND_SOC_DAPM_PRE_PMU),
0976 SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
0977 SND_SOC_NOPM, 0, 0,
0978 mtk_adda_mtkaif_cfg_event,
0979 SND_SOC_DAPM_PRE_PMU),
0980
0981 SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
0982 AFE_ADDA_UL_SRC_CON0,
0983 UL_AP_DMIC_ON_SFT, 0,
0984 NULL, 0),
0985 SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
0986 AFE_ADDA6_UL_SRC_CON0,
0987 UL_AP_DMIC_ON_SFT, 0,
0988 NULL, 0),
0989
0990 SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
0991 AFE_ADDA_UL_DL_CON0,
0992 AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
0993 NULL, 0),
0994 SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
0995 AFE_ADDA_UL_DL_CON0,
0996 AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
0997 NULL, 0),
0998
0999 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
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
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
1038 static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
1039
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
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
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
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
1158 static 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
1177 dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
1178 DL_2_INPUT_MODE_CTL_SFT;
1179
1180
1181 dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1182
1183
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
1188 if (rate == 8000 || rate == 16000)
1189 dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
1190
1191
1192 dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
1193 DL_2_GAIN_CTL_PRE_SFT;
1194
1195
1196 dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1197
1198 if (id == MT8192_DAI_ADDA) {
1199
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
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
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
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
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
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
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
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;
1266
1267 voice_mode = adda_ul_rate_transform(afe, rate);
1268
1269 ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1270
1271
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
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
1296 regmap_update_bits(afe->regmap,
1297 AFE_ADDA_TOP_CON0,
1298 0x1 << 0,
1299 0x0 << 0);
1300
1301
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
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
1325 regmap_update_bits(afe->regmap,
1326 AFE_ADDA6_TOP_CON0,
1327 0x1 << 0,
1328 0x0 << 0);
1329
1330
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
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
1354 static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1355 .hw_params = mtk_dai_adda_hw_params,
1356 };
1357
1358
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
1374 static 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
1439 int 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
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 }