0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/moduleparam.h>
0013 #include <linux/init.h>
0014 #include <linux/delay.h>
0015 #include <linux/pm.h>
0016 #include <linux/i2c.h>
0017 #include <linux/regmap.h>
0018 #include <sound/core.h>
0019 #include <sound/pcm.h>
0020 #include <sound/pcm_params.h>
0021 #include <sound/soc.h>
0022 #include <sound/soc-dapm.h>
0023 #include <sound/initval.h>
0024 #include <sound/tlv.h>
0025
0026 #include "rt5631.h"
0027
0028 struct rt5631_priv {
0029 struct regmap *regmap;
0030 int codec_version;
0031 int master;
0032 int sysclk;
0033 int rx_rate;
0034 int bclk_rate;
0035 int dmic_used_flag;
0036 };
0037
0038 static const struct reg_default rt5631_reg[] = {
0039 { RT5631_SPK_OUT_VOL, 0x8888 },
0040 { RT5631_HP_OUT_VOL, 0x8080 },
0041 { RT5631_MONO_AXO_1_2_VOL, 0xa080 },
0042 { RT5631_AUX_IN_VOL, 0x0808 },
0043 { RT5631_ADC_REC_MIXER, 0xf0f0 },
0044 { RT5631_VDAC_DIG_VOL, 0x0010 },
0045 { RT5631_OUTMIXER_L_CTRL, 0xffc0 },
0046 { RT5631_OUTMIXER_R_CTRL, 0xffc0 },
0047 { RT5631_AXO1MIXER_CTRL, 0x88c0 },
0048 { RT5631_AXO2MIXER_CTRL, 0x88c0 },
0049 { RT5631_DIG_MIC_CTRL, 0x3000 },
0050 { RT5631_MONO_INPUT_VOL, 0x8808 },
0051 { RT5631_SPK_MIXER_CTRL, 0xf8f8 },
0052 { RT5631_SPK_MONO_OUT_CTRL, 0xfc00 },
0053 { RT5631_SPK_MONO_HP_OUT_CTRL, 0x4440 },
0054 { RT5631_SDP_CTRL, 0x8000 },
0055 { RT5631_MONO_SDP_CTRL, 0x8000 },
0056 { RT5631_STEREO_AD_DA_CLK_CTRL, 0x2010 },
0057 { RT5631_GEN_PUR_CTRL_REG, 0x0e00 },
0058 { RT5631_INT_ST_IRQ_CTRL_2, 0x071a },
0059 { RT5631_MISC_CTRL, 0x2040 },
0060 { RT5631_DEPOP_FUN_CTRL_2, 0x8000 },
0061 { RT5631_SOFT_VOL_CTRL, 0x07e0 },
0062 { RT5631_ALC_CTRL_1, 0x0206 },
0063 { RT5631_ALC_CTRL_3, 0x2000 },
0064 { RT5631_PSEUDO_SPATL_CTRL, 0x0553 },
0065 };
0066
0067
0068
0069
0070 static void rt5631_write_index(struct snd_soc_component *component,
0071 unsigned int reg, unsigned int value)
0072 {
0073 snd_soc_component_write(component, RT5631_INDEX_ADD, reg);
0074 snd_soc_component_write(component, RT5631_INDEX_DATA, value);
0075 }
0076
0077
0078
0079
0080 static unsigned int rt5631_read_index(struct snd_soc_component *component,
0081 unsigned int reg)
0082 {
0083 unsigned int value;
0084
0085 snd_soc_component_write(component, RT5631_INDEX_ADD, reg);
0086 value = snd_soc_component_read(component, RT5631_INDEX_DATA);
0087
0088 return value;
0089 }
0090
0091 static int rt5631_reset(struct snd_soc_component *component)
0092 {
0093 return snd_soc_component_write(component, RT5631_RESET, 0);
0094 }
0095
0096 static bool rt5631_volatile_register(struct device *dev, unsigned int reg)
0097 {
0098 switch (reg) {
0099 case RT5631_RESET:
0100 case RT5631_INT_ST_IRQ_CTRL_2:
0101 case RT5631_INDEX_ADD:
0102 case RT5631_INDEX_DATA:
0103 case RT5631_EQ_CTRL:
0104 return true;
0105 default:
0106 return false;
0107 }
0108 }
0109
0110 static bool rt5631_readable_register(struct device *dev, unsigned int reg)
0111 {
0112 switch (reg) {
0113 case RT5631_RESET:
0114 case RT5631_SPK_OUT_VOL:
0115 case RT5631_HP_OUT_VOL:
0116 case RT5631_MONO_AXO_1_2_VOL:
0117 case RT5631_AUX_IN_VOL:
0118 case RT5631_STEREO_DAC_VOL_1:
0119 case RT5631_MIC_CTRL_1:
0120 case RT5631_STEREO_DAC_VOL_2:
0121 case RT5631_ADC_CTRL_1:
0122 case RT5631_ADC_REC_MIXER:
0123 case RT5631_ADC_CTRL_2:
0124 case RT5631_VDAC_DIG_VOL:
0125 case RT5631_OUTMIXER_L_CTRL:
0126 case RT5631_OUTMIXER_R_CTRL:
0127 case RT5631_AXO1MIXER_CTRL:
0128 case RT5631_AXO2MIXER_CTRL:
0129 case RT5631_MIC_CTRL_2:
0130 case RT5631_DIG_MIC_CTRL:
0131 case RT5631_MONO_INPUT_VOL:
0132 case RT5631_SPK_MIXER_CTRL:
0133 case RT5631_SPK_MONO_OUT_CTRL:
0134 case RT5631_SPK_MONO_HP_OUT_CTRL:
0135 case RT5631_SDP_CTRL:
0136 case RT5631_MONO_SDP_CTRL:
0137 case RT5631_STEREO_AD_DA_CLK_CTRL:
0138 case RT5631_PWR_MANAG_ADD1:
0139 case RT5631_PWR_MANAG_ADD2:
0140 case RT5631_PWR_MANAG_ADD3:
0141 case RT5631_PWR_MANAG_ADD4:
0142 case RT5631_GEN_PUR_CTRL_REG:
0143 case RT5631_GLOBAL_CLK_CTRL:
0144 case RT5631_PLL_CTRL:
0145 case RT5631_INT_ST_IRQ_CTRL_1:
0146 case RT5631_INT_ST_IRQ_CTRL_2:
0147 case RT5631_GPIO_CTRL:
0148 case RT5631_MISC_CTRL:
0149 case RT5631_DEPOP_FUN_CTRL_1:
0150 case RT5631_DEPOP_FUN_CTRL_2:
0151 case RT5631_JACK_DET_CTRL:
0152 case RT5631_SOFT_VOL_CTRL:
0153 case RT5631_ALC_CTRL_1:
0154 case RT5631_ALC_CTRL_2:
0155 case RT5631_ALC_CTRL_3:
0156 case RT5631_PSEUDO_SPATL_CTRL:
0157 case RT5631_INDEX_ADD:
0158 case RT5631_INDEX_DATA:
0159 case RT5631_EQ_CTRL:
0160 case RT5631_VENDOR_ID:
0161 case RT5631_VENDOR_ID1:
0162 case RT5631_VENDOR_ID2:
0163 return true;
0164 default:
0165 return false;
0166 }
0167 }
0168
0169 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
0170 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -95625, 375, 0);
0171 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
0172
0173 static const DECLARE_TLV_DB_RANGE(mic_bst_tlv,
0174 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
0175 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
0176 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
0177 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
0178 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
0179 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
0180 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
0181 );
0182
0183 static int rt5631_dmic_get(struct snd_kcontrol *kcontrol,
0184 struct snd_ctl_elem_value *ucontrol)
0185 {
0186 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
0187 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
0188
0189 ucontrol->value.integer.value[0] = rt5631->dmic_used_flag;
0190
0191 return 0;
0192 }
0193
0194 static int rt5631_dmic_put(struct snd_kcontrol *kcontrol,
0195 struct snd_ctl_elem_value *ucontrol)
0196 {
0197 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
0198 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
0199
0200 rt5631->dmic_used_flag = ucontrol->value.integer.value[0];
0201 return 0;
0202 }
0203
0204
0205 static const char *rt5631_input_mode[] = {
0206 "Single ended", "Differential"};
0207
0208 static SOC_ENUM_SINGLE_DECL(rt5631_mic1_mode_enum, RT5631_MIC_CTRL_1,
0209 RT5631_MIC1_DIFF_INPUT_SHIFT, rt5631_input_mode);
0210
0211 static SOC_ENUM_SINGLE_DECL(rt5631_mic2_mode_enum, RT5631_MIC_CTRL_1,
0212 RT5631_MIC2_DIFF_INPUT_SHIFT, rt5631_input_mode);
0213
0214
0215 static SOC_ENUM_SINGLE_DECL(rt5631_monoin_mode_enum, RT5631_MONO_INPUT_VOL,
0216 RT5631_MONO_DIFF_INPUT_SHIFT, rt5631_input_mode);
0217
0218
0219 static const char *rt5631_spk_ratio[] = {"1.00x", "1.09x", "1.27x", "1.44x",
0220 "1.56x", "1.68x", "1.99x", "2.34x"};
0221
0222 static SOC_ENUM_SINGLE_DECL(rt5631_spk_ratio_enum, RT5631_GEN_PUR_CTRL_REG,
0223 RT5631_SPK_AMP_RATIO_CTRL_SHIFT, rt5631_spk_ratio);
0224
0225 static const struct snd_kcontrol_new rt5631_snd_controls[] = {
0226
0227 SOC_ENUM("MIC1 Mode Control", rt5631_mic1_mode_enum),
0228 SOC_SINGLE_TLV("MIC1 Boost Volume", RT5631_MIC_CTRL_2,
0229 RT5631_MIC1_BOOST_SHIFT, 8, 0, mic_bst_tlv),
0230 SOC_ENUM("MIC2 Mode Control", rt5631_mic2_mode_enum),
0231 SOC_SINGLE_TLV("MIC2 Boost Volume", RT5631_MIC_CTRL_2,
0232 RT5631_MIC2_BOOST_SHIFT, 8, 0, mic_bst_tlv),
0233
0234 SOC_ENUM("MONOIN Mode Control", rt5631_monoin_mode_enum),
0235 SOC_DOUBLE_TLV("MONOIN_RX Capture Volume", RT5631_MONO_INPUT_VOL,
0236 RT5631_L_VOL_SHIFT, RT5631_R_VOL_SHIFT,
0237 RT5631_VOL_MASK, 1, in_vol_tlv),
0238
0239 SOC_DOUBLE_TLV("AXI Capture Volume", RT5631_AUX_IN_VOL,
0240 RT5631_L_VOL_SHIFT, RT5631_R_VOL_SHIFT,
0241 RT5631_VOL_MASK, 1, in_vol_tlv),
0242
0243 SOC_DOUBLE_TLV("PCM Playback Volume", RT5631_STEREO_DAC_VOL_2,
0244 RT5631_L_VOL_SHIFT, RT5631_R_VOL_SHIFT,
0245 RT5631_DAC_VOL_MASK, 1, dac_vol_tlv),
0246 SOC_DOUBLE("PCM Playback Switch", RT5631_STEREO_DAC_VOL_1,
0247 RT5631_L_MUTE_SHIFT, RT5631_R_MUTE_SHIFT, 1, 1),
0248
0249 SOC_SINGLE("AXO1 Playback Switch", RT5631_MONO_AXO_1_2_VOL,
0250 RT5631_L_MUTE_SHIFT, 1, 1),
0251 SOC_SINGLE("AXO2 Playback Switch", RT5631_MONO_AXO_1_2_VOL,
0252 RT5631_R_VOL_SHIFT, 1, 1),
0253
0254 SOC_DOUBLE("OUTVOL Channel Switch", RT5631_SPK_OUT_VOL,
0255 RT5631_L_EN_SHIFT, RT5631_R_EN_SHIFT, 1, 0),
0256
0257
0258 SOC_DOUBLE("Speaker Playback Switch", RT5631_SPK_OUT_VOL,
0259 RT5631_L_MUTE_SHIFT, RT5631_R_MUTE_SHIFT, 1, 1),
0260 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5631_SPK_OUT_VOL,
0261 RT5631_L_VOL_SHIFT, RT5631_R_VOL_SHIFT, 39, 1, out_vol_tlv),
0262
0263 SOC_SINGLE("MONO Playback Switch", RT5631_MONO_AXO_1_2_VOL,
0264 RT5631_MUTE_MONO_SHIFT, 1, 1),
0265
0266 SOC_DOUBLE("HP Playback Switch", RT5631_HP_OUT_VOL,
0267 RT5631_L_MUTE_SHIFT, RT5631_R_MUTE_SHIFT, 1, 1),
0268 SOC_DOUBLE_TLV("HP Playback Volume", RT5631_HP_OUT_VOL,
0269 RT5631_L_VOL_SHIFT, RT5631_R_VOL_SHIFT,
0270 RT5631_VOL_MASK, 1, out_vol_tlv),
0271
0272 SOC_SINGLE_EXT("DMIC Switch", 0, 0, 1, 0,
0273 rt5631_dmic_get, rt5631_dmic_put),
0274 SOC_DOUBLE("DMIC Capture Switch", RT5631_DIG_MIC_CTRL,
0275 RT5631_DMIC_L_CH_MUTE_SHIFT,
0276 RT5631_DMIC_R_CH_MUTE_SHIFT, 1, 1),
0277
0278
0279 SOC_ENUM("SPK Ratio Control", rt5631_spk_ratio_enum),
0280 };
0281
0282 static int check_sysclk1_source(struct snd_soc_dapm_widget *source,
0283 struct snd_soc_dapm_widget *sink)
0284 {
0285 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0286 unsigned int reg;
0287
0288 reg = snd_soc_component_read(component, RT5631_GLOBAL_CLK_CTRL);
0289 return reg & RT5631_SYSCLK_SOUR_SEL_PLL;
0290 }
0291
0292 static int check_dmic_used(struct snd_soc_dapm_widget *source,
0293 struct snd_soc_dapm_widget *sink)
0294 {
0295 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0296 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
0297 return rt5631->dmic_used_flag;
0298 }
0299
0300 static int check_dacl_to_outmixl(struct snd_soc_dapm_widget *source,
0301 struct snd_soc_dapm_widget *sink)
0302 {
0303 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0304 unsigned int reg;
0305
0306 reg = snd_soc_component_read(component, RT5631_OUTMIXER_L_CTRL);
0307 return !(reg & RT5631_M_DAC_L_TO_OUTMIXER_L);
0308 }
0309
0310 static int check_dacr_to_outmixr(struct snd_soc_dapm_widget *source,
0311 struct snd_soc_dapm_widget *sink)
0312 {
0313 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0314 unsigned int reg;
0315
0316 reg = snd_soc_component_read(component, RT5631_OUTMIXER_R_CTRL);
0317 return !(reg & RT5631_M_DAC_R_TO_OUTMIXER_R);
0318 }
0319
0320 static int check_dacl_to_spkmixl(struct snd_soc_dapm_widget *source,
0321 struct snd_soc_dapm_widget *sink)
0322 {
0323 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0324 unsigned int reg;
0325
0326 reg = snd_soc_component_read(component, RT5631_SPK_MIXER_CTRL);
0327 return !(reg & RT5631_M_DAC_L_TO_SPKMIXER_L);
0328 }
0329
0330 static int check_dacr_to_spkmixr(struct snd_soc_dapm_widget *source,
0331 struct snd_soc_dapm_widget *sink)
0332 {
0333 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0334 unsigned int reg;
0335
0336 reg = snd_soc_component_read(component, RT5631_SPK_MIXER_CTRL);
0337 return !(reg & RT5631_M_DAC_R_TO_SPKMIXER_R);
0338 }
0339
0340 static int check_adcl_select(struct snd_soc_dapm_widget *source,
0341 struct snd_soc_dapm_widget *sink)
0342 {
0343 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0344 unsigned int reg;
0345
0346 reg = snd_soc_component_read(component, RT5631_ADC_REC_MIXER);
0347 return !(reg & RT5631_M_MIC1_TO_RECMIXER_L);
0348 }
0349
0350 static int check_adcr_select(struct snd_soc_dapm_widget *source,
0351 struct snd_soc_dapm_widget *sink)
0352 {
0353 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0354 unsigned int reg;
0355
0356 reg = snd_soc_component_read(component, RT5631_ADC_REC_MIXER);
0357 return !(reg & RT5631_M_MIC2_TO_RECMIXER_R);
0358 }
0359
0360
0361
0362
0363
0364
0365
0366
0367 static void onebit_depop_power_stage(struct snd_soc_component *component, int enable)
0368 {
0369 unsigned int soft_vol, hp_zc;
0370
0371
0372 snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2,
0373 RT5631_EN_ONE_BIT_DEPOP, 0);
0374
0375
0376 soft_vol = snd_soc_component_read(component, RT5631_SOFT_VOL_CTRL);
0377 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0);
0378 hp_zc = snd_soc_component_read(component, RT5631_INT_ST_IRQ_CTRL_2);
0379 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff);
0380 if (enable) {
0381
0382 rt5631_write_index(component, RT5631_TEST_MODE_CTRL, 0x84c0);
0383 rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x309f);
0384 rt5631_write_index(component, RT5631_CP_INTL_REG2, 0x6530);
0385
0386 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_2,
0387 RT5631_EN_CAP_FREE_DEPOP);
0388 } else {
0389
0390 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_2, 0);
0391 msleep(100);
0392 }
0393
0394
0395 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol);
0396 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc);
0397 }
0398
0399
0400
0401
0402
0403
0404
0405
0406 static void onebit_depop_mute_stage(struct snd_soc_component *component, int enable)
0407 {
0408 unsigned int soft_vol, hp_zc;
0409
0410
0411 snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2,
0412 RT5631_EN_ONE_BIT_DEPOP, 0);
0413
0414
0415 soft_vol = snd_soc_component_read(component, RT5631_SOFT_VOL_CTRL);
0416 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0);
0417 hp_zc = snd_soc_component_read(component, RT5631_INT_ST_IRQ_CTRL_2);
0418 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff);
0419 if (enable) {
0420 schedule_timeout_uninterruptible(msecs_to_jiffies(10));
0421
0422 rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x307f);
0423 snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL,
0424 RT5631_L_MUTE | RT5631_R_MUTE, 0);
0425 msleep(300);
0426 } else {
0427 snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL,
0428 RT5631_L_MUTE | RT5631_R_MUTE,
0429 RT5631_L_MUTE | RT5631_R_MUTE);
0430 msleep(100);
0431 }
0432
0433
0434 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol);
0435 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc);
0436 }
0437
0438
0439
0440
0441
0442
0443
0444
0445 static void depop_seq_power_stage(struct snd_soc_component *component, int enable)
0446 {
0447 unsigned int soft_vol, hp_zc;
0448
0449
0450 snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2,
0451 RT5631_EN_ONE_BIT_DEPOP, RT5631_EN_ONE_BIT_DEPOP);
0452
0453
0454 soft_vol = snd_soc_component_read(component, RT5631_SOFT_VOL_CTRL);
0455 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0);
0456 hp_zc = snd_soc_component_read(component, RT5631_INT_ST_IRQ_CTRL_2);
0457 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff);
0458 if (enable) {
0459
0460 rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x303e);
0461
0462
0463 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
0464 RT5631_PWR_CHARGE_PUMP | RT5631_PWR_HP_L_AMP |
0465 RT5631_PWR_HP_R_AMP,
0466 RT5631_PWR_CHARGE_PUMP | RT5631_PWR_HP_L_AMP |
0467 RT5631_PWR_HP_R_AMP);
0468
0469
0470 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0471 RT5631_POW_ON_SOFT_GEN | RT5631_EN_DEPOP2_FOR_HP);
0472 msleep(100);
0473
0474
0475 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
0476 RT5631_PWR_HP_DEPOP_DIS, RT5631_PWR_HP_DEPOP_DIS);
0477 } else {
0478
0479 rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x303F);
0480 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0481 RT5631_POW_ON_SOFT_GEN | RT5631_EN_MUTE_UNMUTE_DEPOP |
0482 RT5631_PD_HPAMP_L_ST_UP | RT5631_PD_HPAMP_R_ST_UP);
0483 msleep(75);
0484 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0485 RT5631_POW_ON_SOFT_GEN | RT5631_PD_HPAMP_L_ST_UP |
0486 RT5631_PD_HPAMP_R_ST_UP);
0487
0488
0489 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
0490 RT5631_PWR_HP_DEPOP_DIS, 0);
0491
0492
0493 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0494 RT5631_POW_ON_SOFT_GEN | RT5631_EN_DEPOP2_FOR_HP |
0495 RT5631_PD_HPAMP_L_ST_UP | RT5631_PD_HPAMP_R_ST_UP);
0496 msleep(80);
0497 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0498 RT5631_POW_ON_SOFT_GEN);
0499
0500
0501 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
0502 RT5631_PWR_CHARGE_PUMP | RT5631_PWR_HP_L_AMP |
0503 RT5631_PWR_HP_R_AMP, 0);
0504 }
0505
0506
0507 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol);
0508 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc);
0509 }
0510
0511
0512
0513
0514
0515
0516
0517
0518 static void depop_seq_mute_stage(struct snd_soc_component *component, int enable)
0519 {
0520 unsigned int soft_vol, hp_zc;
0521
0522
0523 snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2,
0524 RT5631_EN_ONE_BIT_DEPOP, RT5631_EN_ONE_BIT_DEPOP);
0525
0526
0527 soft_vol = snd_soc_component_read(component, RT5631_SOFT_VOL_CTRL);
0528 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0);
0529 hp_zc = snd_soc_component_read(component, RT5631_INT_ST_IRQ_CTRL_2);
0530 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff);
0531 if (enable) {
0532 schedule_timeout_uninterruptible(msecs_to_jiffies(10));
0533
0534
0535 rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x302f);
0536 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0537 RT5631_POW_ON_SOFT_GEN | RT5631_EN_MUTE_UNMUTE_DEPOP |
0538 RT5631_EN_HP_R_M_UN_MUTE_DEPOP |
0539 RT5631_EN_HP_L_M_UN_MUTE_DEPOP);
0540
0541 snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL,
0542 RT5631_L_MUTE | RT5631_R_MUTE, 0);
0543 msleep(160);
0544 } else {
0545
0546 rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x302f);
0547 snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1,
0548 RT5631_POW_ON_SOFT_GEN | RT5631_EN_MUTE_UNMUTE_DEPOP |
0549 RT5631_EN_HP_R_M_UN_MUTE_DEPOP |
0550 RT5631_EN_HP_L_M_UN_MUTE_DEPOP);
0551
0552 snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL,
0553 RT5631_L_MUTE | RT5631_R_MUTE,
0554 RT5631_L_MUTE | RT5631_R_MUTE);
0555 msleep(150);
0556 }
0557
0558
0559 snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol);
0560 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc);
0561 }
0562
0563 static int hp_event(struct snd_soc_dapm_widget *w,
0564 struct snd_kcontrol *kcontrol, int event)
0565 {
0566 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
0567 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
0568
0569 switch (event) {
0570 case SND_SOC_DAPM_PRE_PMD:
0571 if (rt5631->codec_version) {
0572 onebit_depop_mute_stage(component, 0);
0573 onebit_depop_power_stage(component, 0);
0574 } else {
0575 depop_seq_mute_stage(component, 0);
0576 depop_seq_power_stage(component, 0);
0577 }
0578 break;
0579
0580 case SND_SOC_DAPM_POST_PMU:
0581 if (rt5631->codec_version) {
0582 onebit_depop_power_stage(component, 1);
0583 onebit_depop_mute_stage(component, 1);
0584 } else {
0585 depop_seq_power_stage(component, 1);
0586 depop_seq_mute_stage(component, 1);
0587 }
0588 break;
0589
0590 default:
0591 break;
0592 }
0593
0594 return 0;
0595 }
0596
0597 static int set_dmic_params(struct snd_soc_dapm_widget *w,
0598 struct snd_kcontrol *kcontrol, int event)
0599 {
0600 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
0601 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
0602
0603 switch (rt5631->rx_rate) {
0604 case 44100:
0605 case 48000:
0606 snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL,
0607 RT5631_DMIC_CLK_CTRL_MASK,
0608 RT5631_DMIC_CLK_CTRL_TO_32FS);
0609 break;
0610
0611 case 32000:
0612 case 22050:
0613 snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL,
0614 RT5631_DMIC_CLK_CTRL_MASK,
0615 RT5631_DMIC_CLK_CTRL_TO_64FS);
0616 break;
0617
0618 case 16000:
0619 case 11025:
0620 case 8000:
0621 snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL,
0622 RT5631_DMIC_CLK_CTRL_MASK,
0623 RT5631_DMIC_CLK_CTRL_TO_128FS);
0624 break;
0625
0626 default:
0627 return -EINVAL;
0628 }
0629
0630 return 0;
0631 }
0632
0633 static const struct snd_kcontrol_new rt5631_recmixl_mixer_controls[] = {
0634 SOC_DAPM_SINGLE("OUTMIXL Capture Switch", RT5631_ADC_REC_MIXER,
0635 RT5631_M_OUTMIXL_RECMIXL_BIT, 1, 1),
0636 SOC_DAPM_SINGLE("MIC1_BST1 Capture Switch", RT5631_ADC_REC_MIXER,
0637 RT5631_M_MIC1_RECMIXL_BIT, 1, 1),
0638 SOC_DAPM_SINGLE("AXILVOL Capture Switch", RT5631_ADC_REC_MIXER,
0639 RT5631_M_AXIL_RECMIXL_BIT, 1, 1),
0640 SOC_DAPM_SINGLE("MONOIN_RX Capture Switch", RT5631_ADC_REC_MIXER,
0641 RT5631_M_MONO_IN_RECMIXL_BIT, 1, 1),
0642 };
0643
0644 static const struct snd_kcontrol_new rt5631_recmixr_mixer_controls[] = {
0645 SOC_DAPM_SINGLE("MONOIN_RX Capture Switch", RT5631_ADC_REC_MIXER,
0646 RT5631_M_MONO_IN_RECMIXR_BIT, 1, 1),
0647 SOC_DAPM_SINGLE("AXIRVOL Capture Switch", RT5631_ADC_REC_MIXER,
0648 RT5631_M_AXIR_RECMIXR_BIT, 1, 1),
0649 SOC_DAPM_SINGLE("MIC2_BST2 Capture Switch", RT5631_ADC_REC_MIXER,
0650 RT5631_M_MIC2_RECMIXR_BIT, 1, 1),
0651 SOC_DAPM_SINGLE("OUTMIXR Capture Switch", RT5631_ADC_REC_MIXER,
0652 RT5631_M_OUTMIXR_RECMIXR_BIT, 1, 1),
0653 };
0654
0655 static const struct snd_kcontrol_new rt5631_spkmixl_mixer_controls[] = {
0656 SOC_DAPM_SINGLE("RECMIXL Playback Switch", RT5631_SPK_MIXER_CTRL,
0657 RT5631_M_RECMIXL_SPKMIXL_BIT, 1, 1),
0658 SOC_DAPM_SINGLE("MIC1_P Playback Switch", RT5631_SPK_MIXER_CTRL,
0659 RT5631_M_MIC1P_SPKMIXL_BIT, 1, 1),
0660 SOC_DAPM_SINGLE("DACL Playback Switch", RT5631_SPK_MIXER_CTRL,
0661 RT5631_M_DACL_SPKMIXL_BIT, 1, 1),
0662 SOC_DAPM_SINGLE("OUTMIXL Playback Switch", RT5631_SPK_MIXER_CTRL,
0663 RT5631_M_OUTMIXL_SPKMIXL_BIT, 1, 1),
0664 };
0665
0666 static const struct snd_kcontrol_new rt5631_spkmixr_mixer_controls[] = {
0667 SOC_DAPM_SINGLE("OUTMIXR Playback Switch", RT5631_SPK_MIXER_CTRL,
0668 RT5631_M_OUTMIXR_SPKMIXR_BIT, 1, 1),
0669 SOC_DAPM_SINGLE("DACR Playback Switch", RT5631_SPK_MIXER_CTRL,
0670 RT5631_M_DACR_SPKMIXR_BIT, 1, 1),
0671 SOC_DAPM_SINGLE("MIC2_P Playback Switch", RT5631_SPK_MIXER_CTRL,
0672 RT5631_M_MIC2P_SPKMIXR_BIT, 1, 1),
0673 SOC_DAPM_SINGLE("RECMIXR Playback Switch", RT5631_SPK_MIXER_CTRL,
0674 RT5631_M_RECMIXR_SPKMIXR_BIT, 1, 1),
0675 };
0676
0677 static const struct snd_kcontrol_new rt5631_outmixl_mixer_controls[] = {
0678 SOC_DAPM_SINGLE("RECMIXL Playback Switch", RT5631_OUTMIXER_L_CTRL,
0679 RT5631_M_RECMIXL_OUTMIXL_BIT, 1, 1),
0680 SOC_DAPM_SINGLE("RECMIXR Playback Switch", RT5631_OUTMIXER_L_CTRL,
0681 RT5631_M_RECMIXR_OUTMIXL_BIT, 1, 1),
0682 SOC_DAPM_SINGLE("DACL Playback Switch", RT5631_OUTMIXER_L_CTRL,
0683 RT5631_M_DACL_OUTMIXL_BIT, 1, 1),
0684 SOC_DAPM_SINGLE("MIC1_BST1 Playback Switch", RT5631_OUTMIXER_L_CTRL,
0685 RT5631_M_MIC1_OUTMIXL_BIT, 1, 1),
0686 SOC_DAPM_SINGLE("MIC2_BST2 Playback Switch", RT5631_OUTMIXER_L_CTRL,
0687 RT5631_M_MIC2_OUTMIXL_BIT, 1, 1),
0688 SOC_DAPM_SINGLE("MONOIN_RXP Playback Switch", RT5631_OUTMIXER_L_CTRL,
0689 RT5631_M_MONO_INP_OUTMIXL_BIT, 1, 1),
0690 SOC_DAPM_SINGLE("AXILVOL Playback Switch", RT5631_OUTMIXER_L_CTRL,
0691 RT5631_M_AXIL_OUTMIXL_BIT, 1, 1),
0692 SOC_DAPM_SINGLE("AXIRVOL Playback Switch", RT5631_OUTMIXER_L_CTRL,
0693 RT5631_M_AXIR_OUTMIXL_BIT, 1, 1),
0694 SOC_DAPM_SINGLE("VDAC Playback Switch", RT5631_OUTMIXER_L_CTRL,
0695 RT5631_M_VDAC_OUTMIXL_BIT, 1, 1),
0696 };
0697
0698 static const struct snd_kcontrol_new rt5631_outmixr_mixer_controls[] = {
0699 SOC_DAPM_SINGLE("VDAC Playback Switch", RT5631_OUTMIXER_R_CTRL,
0700 RT5631_M_VDAC_OUTMIXR_BIT, 1, 1),
0701 SOC_DAPM_SINGLE("AXIRVOL Playback Switch", RT5631_OUTMIXER_R_CTRL,
0702 RT5631_M_AXIR_OUTMIXR_BIT, 1, 1),
0703 SOC_DAPM_SINGLE("AXILVOL Playback Switch", RT5631_OUTMIXER_R_CTRL,
0704 RT5631_M_AXIL_OUTMIXR_BIT, 1, 1),
0705 SOC_DAPM_SINGLE("MONOIN_RXN Playback Switch", RT5631_OUTMIXER_R_CTRL,
0706 RT5631_M_MONO_INN_OUTMIXR_BIT, 1, 1),
0707 SOC_DAPM_SINGLE("MIC2_BST2 Playback Switch", RT5631_OUTMIXER_R_CTRL,
0708 RT5631_M_MIC2_OUTMIXR_BIT, 1, 1),
0709 SOC_DAPM_SINGLE("MIC1_BST1 Playback Switch", RT5631_OUTMIXER_R_CTRL,
0710 RT5631_M_MIC1_OUTMIXR_BIT, 1, 1),
0711 SOC_DAPM_SINGLE("DACR Playback Switch", RT5631_OUTMIXER_R_CTRL,
0712 RT5631_M_DACR_OUTMIXR_BIT, 1, 1),
0713 SOC_DAPM_SINGLE("RECMIXR Playback Switch", RT5631_OUTMIXER_R_CTRL,
0714 RT5631_M_RECMIXR_OUTMIXR_BIT, 1, 1),
0715 SOC_DAPM_SINGLE("RECMIXL Playback Switch", RT5631_OUTMIXER_R_CTRL,
0716 RT5631_M_RECMIXL_OUTMIXR_BIT, 1, 1),
0717 };
0718
0719 static const struct snd_kcontrol_new rt5631_AXO1MIX_mixer_controls[] = {
0720 SOC_DAPM_SINGLE("MIC1_BST1 Playback Switch", RT5631_AXO1MIXER_CTRL,
0721 RT5631_M_MIC1_AXO1MIX_BIT , 1, 1),
0722 SOC_DAPM_SINGLE("MIC2_BST2 Playback Switch", RT5631_AXO1MIXER_CTRL,
0723 RT5631_M_MIC2_AXO1MIX_BIT, 1, 1),
0724 SOC_DAPM_SINGLE("OUTVOLL Playback Switch", RT5631_AXO1MIXER_CTRL,
0725 RT5631_M_OUTMIXL_AXO1MIX_BIT , 1 , 1),
0726 SOC_DAPM_SINGLE("OUTVOLR Playback Switch", RT5631_AXO1MIXER_CTRL,
0727 RT5631_M_OUTMIXR_AXO1MIX_BIT, 1, 1),
0728 };
0729
0730 static const struct snd_kcontrol_new rt5631_AXO2MIX_mixer_controls[] = {
0731 SOC_DAPM_SINGLE("MIC1_BST1 Playback Switch", RT5631_AXO2MIXER_CTRL,
0732 RT5631_M_MIC1_AXO2MIX_BIT, 1, 1),
0733 SOC_DAPM_SINGLE("MIC2_BST2 Playback Switch", RT5631_AXO2MIXER_CTRL,
0734 RT5631_M_MIC2_AXO2MIX_BIT, 1, 1),
0735 SOC_DAPM_SINGLE("OUTVOLL Playback Switch", RT5631_AXO2MIXER_CTRL,
0736 RT5631_M_OUTMIXL_AXO2MIX_BIT, 1, 1),
0737 SOC_DAPM_SINGLE("OUTVOLR Playback Switch", RT5631_AXO2MIXER_CTRL,
0738 RT5631_M_OUTMIXR_AXO2MIX_BIT, 1 , 1),
0739 };
0740
0741 static const struct snd_kcontrol_new rt5631_spolmix_mixer_controls[] = {
0742 SOC_DAPM_SINGLE("SPKVOLL Playback Switch", RT5631_SPK_MONO_OUT_CTRL,
0743 RT5631_M_SPKVOLL_SPOLMIX_BIT, 1, 1),
0744 SOC_DAPM_SINGLE("SPKVOLR Playback Switch", RT5631_SPK_MONO_OUT_CTRL,
0745 RT5631_M_SPKVOLR_SPOLMIX_BIT, 1, 1),
0746 };
0747
0748 static const struct snd_kcontrol_new rt5631_spormix_mixer_controls[] = {
0749 SOC_DAPM_SINGLE("SPKVOLL Playback Switch", RT5631_SPK_MONO_OUT_CTRL,
0750 RT5631_M_SPKVOLL_SPORMIX_BIT, 1, 1),
0751 SOC_DAPM_SINGLE("SPKVOLR Playback Switch", RT5631_SPK_MONO_OUT_CTRL,
0752 RT5631_M_SPKVOLR_SPORMIX_BIT, 1, 1),
0753 };
0754
0755 static const struct snd_kcontrol_new rt5631_monomix_mixer_controls[] = {
0756 SOC_DAPM_SINGLE("OUTVOLL Playback Switch", RT5631_SPK_MONO_OUT_CTRL,
0757 RT5631_M_OUTVOLL_MONOMIX_BIT, 1, 1),
0758 SOC_DAPM_SINGLE("OUTVOLR Playback Switch", RT5631_SPK_MONO_OUT_CTRL,
0759 RT5631_M_OUTVOLR_MONOMIX_BIT, 1, 1),
0760 };
0761
0762
0763 static const char *rt5631_spkvoll_sel[] = {"Vmid", "SPKMIXL"};
0764
0765 static SOC_ENUM_SINGLE_DECL(rt5631_spkvoll_enum, RT5631_SPK_OUT_VOL,
0766 RT5631_L_EN_SHIFT, rt5631_spkvoll_sel);
0767
0768 static const struct snd_kcontrol_new rt5631_spkvoll_mux_control =
0769 SOC_DAPM_ENUM("Left SPKVOL SRC", rt5631_spkvoll_enum);
0770
0771
0772 static const char *rt5631_hpvoll_sel[] = {"Vmid", "OUTMIXL"};
0773
0774 static SOC_ENUM_SINGLE_DECL(rt5631_hpvoll_enum, RT5631_HP_OUT_VOL,
0775 RT5631_L_EN_SHIFT, rt5631_hpvoll_sel);
0776
0777 static const struct snd_kcontrol_new rt5631_hpvoll_mux_control =
0778 SOC_DAPM_ENUM("Left HPVOL SRC", rt5631_hpvoll_enum);
0779
0780
0781 static const char *rt5631_outvoll_sel[] = {"Vmid", "OUTMIXL"};
0782
0783 static SOC_ENUM_SINGLE_DECL(rt5631_outvoll_enum, RT5631_MONO_AXO_1_2_VOL,
0784 RT5631_L_EN_SHIFT, rt5631_outvoll_sel);
0785
0786 static const struct snd_kcontrol_new rt5631_outvoll_mux_control =
0787 SOC_DAPM_ENUM("Left OUTVOL SRC", rt5631_outvoll_enum);
0788
0789
0790 static const char *rt5631_outvolr_sel[] = {"Vmid", "OUTMIXR"};
0791
0792 static SOC_ENUM_SINGLE_DECL(rt5631_outvolr_enum, RT5631_MONO_AXO_1_2_VOL,
0793 RT5631_R_EN_SHIFT, rt5631_outvolr_sel);
0794
0795 static const struct snd_kcontrol_new rt5631_outvolr_mux_control =
0796 SOC_DAPM_ENUM("Right OUTVOL SRC", rt5631_outvolr_enum);
0797
0798
0799 static const char *rt5631_hpvolr_sel[] = {"Vmid", "OUTMIXR"};
0800
0801 static SOC_ENUM_SINGLE_DECL(rt5631_hpvolr_enum, RT5631_HP_OUT_VOL,
0802 RT5631_R_EN_SHIFT, rt5631_hpvolr_sel);
0803
0804 static const struct snd_kcontrol_new rt5631_hpvolr_mux_control =
0805 SOC_DAPM_ENUM("Right HPVOL SRC", rt5631_hpvolr_enum);
0806
0807
0808 static const char *rt5631_spkvolr_sel[] = {"Vmid", "SPKMIXR"};
0809
0810 static SOC_ENUM_SINGLE_DECL(rt5631_spkvolr_enum, RT5631_SPK_OUT_VOL,
0811 RT5631_R_EN_SHIFT, rt5631_spkvolr_sel);
0812
0813 static const struct snd_kcontrol_new rt5631_spkvolr_mux_control =
0814 SOC_DAPM_ENUM("Right SPKVOL SRC", rt5631_spkvolr_enum);
0815
0816
0817 static const char *rt5631_spol_src_sel[] = {
0818 "SPOLMIX", "MONOIN_RX", "VDAC", "DACL"};
0819
0820 static SOC_ENUM_SINGLE_DECL(rt5631_spol_src_enum, RT5631_SPK_MONO_HP_OUT_CTRL,
0821 RT5631_SPK_L_MUX_SEL_SHIFT, rt5631_spol_src_sel);
0822
0823 static const struct snd_kcontrol_new rt5631_spol_mux_control =
0824 SOC_DAPM_ENUM("SPOL SRC", rt5631_spol_src_enum);
0825
0826
0827 static const char *rt5631_spor_src_sel[] = {
0828 "SPORMIX", "MONOIN_RX", "VDAC", "DACR"};
0829
0830 static SOC_ENUM_SINGLE_DECL(rt5631_spor_src_enum, RT5631_SPK_MONO_HP_OUT_CTRL,
0831 RT5631_SPK_R_MUX_SEL_SHIFT, rt5631_spor_src_sel);
0832
0833 static const struct snd_kcontrol_new rt5631_spor_mux_control =
0834 SOC_DAPM_ENUM("SPOR SRC", rt5631_spor_src_enum);
0835
0836
0837 static const char *rt5631_mono_src_sel[] = {"MONOMIX", "MONOIN_RX", "VDAC"};
0838
0839 static SOC_ENUM_SINGLE_DECL(rt5631_mono_src_enum, RT5631_SPK_MONO_HP_OUT_CTRL,
0840 RT5631_MONO_MUX_SEL_SHIFT, rt5631_mono_src_sel);
0841
0842 static const struct snd_kcontrol_new rt5631_mono_mux_control =
0843 SOC_DAPM_ENUM("MONO SRC", rt5631_mono_src_enum);
0844
0845
0846 static const char *rt5631_hpl_src_sel[] = {"Left HPVOL", "Left DAC"};
0847
0848 static SOC_ENUM_SINGLE_DECL(rt5631_hpl_src_enum, RT5631_SPK_MONO_HP_OUT_CTRL,
0849 RT5631_HP_L_MUX_SEL_SHIFT, rt5631_hpl_src_sel);
0850
0851 static const struct snd_kcontrol_new rt5631_hpl_mux_control =
0852 SOC_DAPM_ENUM("HPL SRC", rt5631_hpl_src_enum);
0853
0854
0855 static const char *rt5631_hpr_src_sel[] = {"Right HPVOL", "Right DAC"};
0856
0857 static SOC_ENUM_SINGLE_DECL(rt5631_hpr_src_enum, RT5631_SPK_MONO_HP_OUT_CTRL,
0858 RT5631_HP_R_MUX_SEL_SHIFT, rt5631_hpr_src_sel);
0859
0860 static const struct snd_kcontrol_new rt5631_hpr_mux_control =
0861 SOC_DAPM_ENUM("HPR SRC", rt5631_hpr_src_enum);
0862
0863 static const struct snd_soc_dapm_widget rt5631_dapm_widgets[] = {
0864
0865 SND_SOC_DAPM_VMID("Vmid"),
0866
0867 SND_SOC_DAPM_SUPPLY("PLL1", RT5631_PWR_MANAG_ADD2,
0868 RT5631_PWR_PLL1_BIT, 0, NULL, 0),
0869
0870
0871
0872 SND_SOC_DAPM_INPUT("MIC1"),
0873 SND_SOC_DAPM_INPUT("MIC2"),
0874 SND_SOC_DAPM_INPUT("AXIL"),
0875 SND_SOC_DAPM_INPUT("AXIR"),
0876 SND_SOC_DAPM_INPUT("MONOIN_RXN"),
0877 SND_SOC_DAPM_INPUT("MONOIN_RXP"),
0878 SND_SOC_DAPM_INPUT("DMIC"),
0879
0880
0881 SND_SOC_DAPM_MICBIAS("MIC Bias1", RT5631_PWR_MANAG_ADD2,
0882 RT5631_PWR_MICBIAS1_VOL_BIT, 0),
0883 SND_SOC_DAPM_MICBIAS("MIC Bias2", RT5631_PWR_MANAG_ADD2,
0884 RT5631_PWR_MICBIAS2_VOL_BIT, 0),
0885
0886
0887 SND_SOC_DAPM_PGA("MIC1 Boost", RT5631_PWR_MANAG_ADD2,
0888 RT5631_PWR_MIC1_BOOT_GAIN_BIT, 0, NULL, 0),
0889 SND_SOC_DAPM_PGA("MIC2 Boost", RT5631_PWR_MANAG_ADD2,
0890 RT5631_PWR_MIC2_BOOT_GAIN_BIT, 0, NULL, 0),
0891 SND_SOC_DAPM_PGA("MONOIN_RXP Boost", RT5631_PWR_MANAG_ADD4,
0892 RT5631_PWR_MONO_IN_P_VOL_BIT, 0, NULL, 0),
0893 SND_SOC_DAPM_PGA("MONOIN_RXN Boost", RT5631_PWR_MANAG_ADD4,
0894 RT5631_PWR_MONO_IN_N_VOL_BIT, 0, NULL, 0),
0895 SND_SOC_DAPM_PGA("AXIL Boost", RT5631_PWR_MANAG_ADD4,
0896 RT5631_PWR_AXIL_IN_VOL_BIT, 0, NULL, 0),
0897 SND_SOC_DAPM_PGA("AXIR Boost", RT5631_PWR_MANAG_ADD4,
0898 RT5631_PWR_AXIR_IN_VOL_BIT, 0, NULL, 0),
0899
0900
0901 SND_SOC_DAPM_MIXER("MONO_IN", SND_SOC_NOPM, 0, 0, NULL, 0),
0902
0903
0904 SND_SOC_DAPM_MIXER("RECMIXL Mixer", RT5631_PWR_MANAG_ADD2,
0905 RT5631_PWR_RECMIXER_L_BIT, 0,
0906 &rt5631_recmixl_mixer_controls[0],
0907 ARRAY_SIZE(rt5631_recmixl_mixer_controls)),
0908 SND_SOC_DAPM_MIXER("RECMIXR Mixer", RT5631_PWR_MANAG_ADD2,
0909 RT5631_PWR_RECMIXER_R_BIT, 0,
0910 &rt5631_recmixr_mixer_controls[0],
0911 ARRAY_SIZE(rt5631_recmixr_mixer_controls)),
0912
0913
0914 SND_SOC_DAPM_MIXER("ADC Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
0915
0916
0917 SND_SOC_DAPM_SUPPLY("DMIC Supply", RT5631_DIG_MIC_CTRL,
0918 RT5631_DMIC_ENA_SHIFT, 0,
0919 set_dmic_params, SND_SOC_DAPM_PRE_PMU),
0920
0921 SND_SOC_DAPM_SUPPLY("Left ADC Select", RT5631_INT_ST_IRQ_CTRL_2,
0922 RT5631_ADC_DATA_SEL_MIC1_SHIFT, 0, NULL, 0),
0923 SND_SOC_DAPM_SUPPLY("Right ADC Select", RT5631_INT_ST_IRQ_CTRL_2,
0924 RT5631_ADC_DATA_SEL_MIC2_SHIFT, 0, NULL, 0),
0925
0926
0927 SND_SOC_DAPM_ADC("Left ADC", "HIFI Capture",
0928 RT5631_PWR_MANAG_ADD1, RT5631_PWR_ADC_L_CLK_BIT, 0),
0929 SND_SOC_DAPM_ADC("Right ADC", "HIFI Capture",
0930 RT5631_PWR_MANAG_ADD1, RT5631_PWR_ADC_R_CLK_BIT, 0),
0931
0932
0933 SND_SOC_DAPM_SUPPLY("I2S", RT5631_PWR_MANAG_ADD1,
0934 RT5631_PWR_MAIN_I2S_BIT, 0, NULL, 0),
0935 SND_SOC_DAPM_SUPPLY("DAC REF", RT5631_PWR_MANAG_ADD1,
0936 RT5631_PWR_DAC_REF_BIT, 0, NULL, 0),
0937
0938
0939
0940 SND_SOC_DAPM_DAC("Left DAC", "HIFI Playback",
0941 RT5631_PWR_MANAG_ADD1, RT5631_PWR_DAC_L_CLK_BIT, 0),
0942 SND_SOC_DAPM_DAC("Right DAC", "HIFI Playback",
0943 RT5631_PWR_MANAG_ADD1, RT5631_PWR_DAC_R_CLK_BIT, 0),
0944 SND_SOC_DAPM_DAC("Voice DAC", "Voice DAC Mono Playback",
0945 SND_SOC_NOPM, 0, 0),
0946 SND_SOC_DAPM_PGA("Voice DAC Boost", SND_SOC_NOPM, 0, 0, NULL, 0),
0947
0948 SND_SOC_DAPM_SUPPLY("Left DAC To Mixer", RT5631_PWR_MANAG_ADD1,
0949 RT5631_PWR_DAC_L_TO_MIXER_BIT, 0, NULL, 0),
0950 SND_SOC_DAPM_SUPPLY("Right DAC To Mixer", RT5631_PWR_MANAG_ADD1,
0951 RT5631_PWR_DAC_R_TO_MIXER_BIT, 0, NULL, 0),
0952
0953
0954 SND_SOC_DAPM_MIXER("SPKMIXL Mixer", RT5631_PWR_MANAG_ADD2,
0955 RT5631_PWR_SPKMIXER_L_BIT, 0,
0956 &rt5631_spkmixl_mixer_controls[0],
0957 ARRAY_SIZE(rt5631_spkmixl_mixer_controls)),
0958
0959 SND_SOC_DAPM_MIXER("OUTMIXL Mixer", RT5631_PWR_MANAG_ADD2,
0960 RT5631_PWR_OUTMIXER_L_BIT, 0,
0961 &rt5631_outmixl_mixer_controls[0],
0962 ARRAY_SIZE(rt5631_outmixl_mixer_controls)),
0963
0964 SND_SOC_DAPM_MIXER("OUTMIXR Mixer", RT5631_PWR_MANAG_ADD2,
0965 RT5631_PWR_OUTMIXER_R_BIT, 0,
0966 &rt5631_outmixr_mixer_controls[0],
0967 ARRAY_SIZE(rt5631_outmixr_mixer_controls)),
0968
0969 SND_SOC_DAPM_MIXER("SPKMIXR Mixer", RT5631_PWR_MANAG_ADD2,
0970 RT5631_PWR_SPKMIXER_R_BIT, 0,
0971 &rt5631_spkmixr_mixer_controls[0],
0972 ARRAY_SIZE(rt5631_spkmixr_mixer_controls)),
0973
0974
0975 SND_SOC_DAPM_MUX("Left SPKVOL Mux", RT5631_PWR_MANAG_ADD4,
0976 RT5631_PWR_SPK_L_VOL_BIT, 0,
0977 &rt5631_spkvoll_mux_control),
0978 SND_SOC_DAPM_MUX("Left HPVOL Mux", RT5631_PWR_MANAG_ADD4,
0979 RT5631_PWR_HP_L_OUT_VOL_BIT, 0,
0980 &rt5631_hpvoll_mux_control),
0981 SND_SOC_DAPM_MUX("Left OUTVOL Mux", RT5631_PWR_MANAG_ADD4,
0982 RT5631_PWR_LOUT_VOL_BIT, 0,
0983 &rt5631_outvoll_mux_control),
0984 SND_SOC_DAPM_MUX("Right OUTVOL Mux", RT5631_PWR_MANAG_ADD4,
0985 RT5631_PWR_ROUT_VOL_BIT, 0,
0986 &rt5631_outvolr_mux_control),
0987 SND_SOC_DAPM_MUX("Right HPVOL Mux", RT5631_PWR_MANAG_ADD4,
0988 RT5631_PWR_HP_R_OUT_VOL_BIT, 0,
0989 &rt5631_hpvolr_mux_control),
0990 SND_SOC_DAPM_MUX("Right SPKVOL Mux", RT5631_PWR_MANAG_ADD4,
0991 RT5631_PWR_SPK_R_VOL_BIT, 0,
0992 &rt5631_spkvolr_mux_control),
0993
0994
0995 SND_SOC_DAPM_PGA_S("Left DAC_HP", 0, SND_SOC_NOPM, 0, 0, NULL, 0),
0996 SND_SOC_DAPM_PGA_S("Right DAC_HP", 0, SND_SOC_NOPM, 0, 0, NULL, 0),
0997
0998
0999 SND_SOC_DAPM_PGA_S("HP Depop", 1, SND_SOC_NOPM, 0, 0,
1000 hp_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1001
1002
1003 SND_SOC_DAPM_MIXER("AXO1MIX Mixer", RT5631_PWR_MANAG_ADD3,
1004 RT5631_PWR_AXO1MIXER_BIT, 0,
1005 &rt5631_AXO1MIX_mixer_controls[0],
1006 ARRAY_SIZE(rt5631_AXO1MIX_mixer_controls)),
1007
1008 SND_SOC_DAPM_MIXER("SPOLMIX Mixer", SND_SOC_NOPM, 0, 0,
1009 &rt5631_spolmix_mixer_controls[0],
1010 ARRAY_SIZE(rt5631_spolmix_mixer_controls)),
1011
1012 SND_SOC_DAPM_MIXER("MONOMIX Mixer", RT5631_PWR_MANAG_ADD3,
1013 RT5631_PWR_MONOMIXER_BIT, 0,
1014 &rt5631_monomix_mixer_controls[0],
1015 ARRAY_SIZE(rt5631_monomix_mixer_controls)),
1016
1017 SND_SOC_DAPM_MIXER("SPORMIX Mixer", SND_SOC_NOPM, 0, 0,
1018 &rt5631_spormix_mixer_controls[0],
1019 ARRAY_SIZE(rt5631_spormix_mixer_controls)),
1020
1021 SND_SOC_DAPM_MIXER("AXO2MIX Mixer", RT5631_PWR_MANAG_ADD3,
1022 RT5631_PWR_AXO2MIXER_BIT, 0,
1023 &rt5631_AXO2MIX_mixer_controls[0],
1024 ARRAY_SIZE(rt5631_AXO2MIX_mixer_controls)),
1025
1026
1027 SND_SOC_DAPM_MUX("SPOL Mux", SND_SOC_NOPM, 0, 0,
1028 &rt5631_spol_mux_control),
1029 SND_SOC_DAPM_MUX("SPOR Mux", SND_SOC_NOPM, 0, 0,
1030 &rt5631_spor_mux_control),
1031 SND_SOC_DAPM_MUX("MONO Mux", SND_SOC_NOPM, 0, 0,
1032 &rt5631_mono_mux_control),
1033 SND_SOC_DAPM_MUX("HPL Mux", SND_SOC_NOPM, 0, 0,
1034 &rt5631_hpl_mux_control),
1035 SND_SOC_DAPM_MUX("HPR Mux", SND_SOC_NOPM, 0, 0,
1036 &rt5631_hpr_mux_control),
1037
1038
1039 SND_SOC_DAPM_SUPPLY("MONO Depop", RT5631_PWR_MANAG_ADD3,
1040 RT5631_PWR_MONO_DEPOP_DIS_BIT, 0, NULL, 0),
1041 SND_SOC_DAPM_SUPPLY("Class D", RT5631_PWR_MANAG_ADD1,
1042 RT5631_PWR_CLASS_D_BIT, 0, NULL, 0),
1043
1044
1045 SND_SOC_DAPM_OUTPUT("AUXO1"),
1046 SND_SOC_DAPM_OUTPUT("AUXO2"),
1047 SND_SOC_DAPM_OUTPUT("SPOL"),
1048 SND_SOC_DAPM_OUTPUT("SPOR"),
1049 SND_SOC_DAPM_OUTPUT("HPOL"),
1050 SND_SOC_DAPM_OUTPUT("HPOR"),
1051 SND_SOC_DAPM_OUTPUT("MONO"),
1052 };
1053
1054 static const struct snd_soc_dapm_route rt5631_dapm_routes[] = {
1055 {"MIC1 Boost", NULL, "MIC1"},
1056 {"MIC2 Boost", NULL, "MIC2"},
1057 {"MONOIN_RXP Boost", NULL, "MONOIN_RXP"},
1058 {"MONOIN_RXN Boost", NULL, "MONOIN_RXN"},
1059 {"AXIL Boost", NULL, "AXIL"},
1060 {"AXIR Boost", NULL, "AXIR"},
1061
1062 {"MONO_IN", NULL, "MONOIN_RXP Boost"},
1063 {"MONO_IN", NULL, "MONOIN_RXN Boost"},
1064
1065 {"RECMIXL Mixer", "OUTMIXL Capture Switch", "OUTMIXL Mixer"},
1066 {"RECMIXL Mixer", "MIC1_BST1 Capture Switch", "MIC1 Boost"},
1067 {"RECMIXL Mixer", "AXILVOL Capture Switch", "AXIL Boost"},
1068 {"RECMIXL Mixer", "MONOIN_RX Capture Switch", "MONO_IN"},
1069
1070 {"RECMIXR Mixer", "OUTMIXR Capture Switch", "OUTMIXR Mixer"},
1071 {"RECMIXR Mixer", "MIC2_BST2 Capture Switch", "MIC2 Boost"},
1072 {"RECMIXR Mixer", "AXIRVOL Capture Switch", "AXIR Boost"},
1073 {"RECMIXR Mixer", "MONOIN_RX Capture Switch", "MONO_IN"},
1074
1075 {"ADC Mixer", NULL, "RECMIXL Mixer"},
1076 {"ADC Mixer", NULL, "RECMIXR Mixer"},
1077
1078 {"Left ADC", NULL, "ADC Mixer"},
1079 {"Left ADC", NULL, "Left ADC Select", check_adcl_select},
1080 {"Left ADC", NULL, "PLL1", check_sysclk1_source},
1081 {"Left ADC", NULL, "I2S"},
1082 {"Left ADC", NULL, "DAC REF"},
1083
1084 {"Right ADC", NULL, "ADC Mixer"},
1085 {"Right ADC", NULL, "Right ADC Select", check_adcr_select},
1086 {"Right ADC", NULL, "PLL1", check_sysclk1_source},
1087 {"Right ADC", NULL, "I2S"},
1088 {"Right ADC", NULL, "DAC REF"},
1089
1090 {"DMIC", NULL, "DMIC Supply", check_dmic_used},
1091 {"Left ADC", NULL, "DMIC"},
1092 {"Right ADC", NULL, "DMIC"},
1093
1094 {"Left DAC", NULL, "PLL1", check_sysclk1_source},
1095 {"Left DAC", NULL, "I2S"},
1096 {"Left DAC", NULL, "DAC REF"},
1097 {"Right DAC", NULL, "PLL1", check_sysclk1_source},
1098 {"Right DAC", NULL, "I2S"},
1099 {"Right DAC", NULL, "DAC REF"},
1100
1101 {"Voice DAC Boost", NULL, "Voice DAC"},
1102
1103 {"SPKMIXL Mixer", NULL, "Left DAC To Mixer", check_dacl_to_spkmixl},
1104 {"SPKMIXL Mixer", "RECMIXL Playback Switch", "RECMIXL Mixer"},
1105 {"SPKMIXL Mixer", "MIC1_P Playback Switch", "MIC1"},
1106 {"SPKMIXL Mixer", "DACL Playback Switch", "Left DAC"},
1107 {"SPKMIXL Mixer", "OUTMIXL Playback Switch", "OUTMIXL Mixer"},
1108
1109 {"SPKMIXR Mixer", NULL, "Right DAC To Mixer", check_dacr_to_spkmixr},
1110 {"SPKMIXR Mixer", "OUTMIXR Playback Switch", "OUTMIXR Mixer"},
1111 {"SPKMIXR Mixer", "DACR Playback Switch", "Right DAC"},
1112 {"SPKMIXR Mixer", "MIC2_P Playback Switch", "MIC2"},
1113 {"SPKMIXR Mixer", "RECMIXR Playback Switch", "RECMIXR Mixer"},
1114
1115 {"OUTMIXL Mixer", NULL, "Left DAC To Mixer", check_dacl_to_outmixl},
1116 {"OUTMIXL Mixer", "RECMIXL Playback Switch", "RECMIXL Mixer"},
1117 {"OUTMIXL Mixer", "RECMIXR Playback Switch", "RECMIXR Mixer"},
1118 {"OUTMIXL Mixer", "DACL Playback Switch", "Left DAC"},
1119 {"OUTMIXL Mixer", "MIC1_BST1 Playback Switch", "MIC1 Boost"},
1120 {"OUTMIXL Mixer", "MIC2_BST2 Playback Switch", "MIC2 Boost"},
1121 {"OUTMIXL Mixer", "MONOIN_RXP Playback Switch", "MONOIN_RXP Boost"},
1122 {"OUTMIXL Mixer", "AXILVOL Playback Switch", "AXIL Boost"},
1123 {"OUTMIXL Mixer", "AXIRVOL Playback Switch", "AXIR Boost"},
1124 {"OUTMIXL Mixer", "VDAC Playback Switch", "Voice DAC Boost"},
1125
1126 {"OUTMIXR Mixer", NULL, "Right DAC To Mixer", check_dacr_to_outmixr},
1127 {"OUTMIXR Mixer", "RECMIXL Playback Switch", "RECMIXL Mixer"},
1128 {"OUTMIXR Mixer", "RECMIXR Playback Switch", "RECMIXR Mixer"},
1129 {"OUTMIXR Mixer", "DACR Playback Switch", "Right DAC"},
1130 {"OUTMIXR Mixer", "MIC1_BST1 Playback Switch", "MIC1 Boost"},
1131 {"OUTMIXR Mixer", "MIC2_BST2 Playback Switch", "MIC2 Boost"},
1132 {"OUTMIXR Mixer", "MONOIN_RXN Playback Switch", "MONOIN_RXN Boost"},
1133 {"OUTMIXR Mixer", "AXILVOL Playback Switch", "AXIL Boost"},
1134 {"OUTMIXR Mixer", "AXIRVOL Playback Switch", "AXIR Boost"},
1135 {"OUTMIXR Mixer", "VDAC Playback Switch", "Voice DAC Boost"},
1136
1137 {"Left SPKVOL Mux", "SPKMIXL", "SPKMIXL Mixer"},
1138 {"Left SPKVOL Mux", "Vmid", "Vmid"},
1139 {"Left HPVOL Mux", "OUTMIXL", "OUTMIXL Mixer"},
1140 {"Left HPVOL Mux", "Vmid", "Vmid"},
1141 {"Left OUTVOL Mux", "OUTMIXL", "OUTMIXL Mixer"},
1142 {"Left OUTVOL Mux", "Vmid", "Vmid"},
1143 {"Right OUTVOL Mux", "OUTMIXR", "OUTMIXR Mixer"},
1144 {"Right OUTVOL Mux", "Vmid", "Vmid"},
1145 {"Right HPVOL Mux", "OUTMIXR", "OUTMIXR Mixer"},
1146 {"Right HPVOL Mux", "Vmid", "Vmid"},
1147 {"Right SPKVOL Mux", "SPKMIXR", "SPKMIXR Mixer"},
1148 {"Right SPKVOL Mux", "Vmid", "Vmid"},
1149
1150 {"AXO1MIX Mixer", "MIC1_BST1 Playback Switch", "MIC1 Boost"},
1151 {"AXO1MIX Mixer", "OUTVOLL Playback Switch", "Left OUTVOL Mux"},
1152 {"AXO1MIX Mixer", "OUTVOLR Playback Switch", "Right OUTVOL Mux"},
1153 {"AXO1MIX Mixer", "MIC2_BST2 Playback Switch", "MIC2 Boost"},
1154
1155 {"AXO2MIX Mixer", "MIC1_BST1 Playback Switch", "MIC1 Boost"},
1156 {"AXO2MIX Mixer", "OUTVOLL Playback Switch", "Left OUTVOL Mux"},
1157 {"AXO2MIX Mixer", "OUTVOLR Playback Switch", "Right OUTVOL Mux"},
1158 {"AXO2MIX Mixer", "MIC2_BST2 Playback Switch", "MIC2 Boost"},
1159
1160 {"SPOLMIX Mixer", "SPKVOLL Playback Switch", "Left SPKVOL Mux"},
1161 {"SPOLMIX Mixer", "SPKVOLR Playback Switch", "Right SPKVOL Mux"},
1162
1163 {"SPORMIX Mixer", "SPKVOLL Playback Switch", "Left SPKVOL Mux"},
1164 {"SPORMIX Mixer", "SPKVOLR Playback Switch", "Right SPKVOL Mux"},
1165
1166 {"MONOMIX Mixer", "OUTVOLL Playback Switch", "Left OUTVOL Mux"},
1167 {"MONOMIX Mixer", "OUTVOLR Playback Switch", "Right OUTVOL Mux"},
1168
1169 {"SPOL Mux", "SPOLMIX", "SPOLMIX Mixer"},
1170 {"SPOL Mux", "MONOIN_RX", "MONO_IN"},
1171 {"SPOL Mux", "VDAC", "Voice DAC Boost"},
1172 {"SPOL Mux", "DACL", "Left DAC"},
1173
1174 {"SPOR Mux", "SPORMIX", "SPORMIX Mixer"},
1175 {"SPOR Mux", "MONOIN_RX", "MONO_IN"},
1176 {"SPOR Mux", "VDAC", "Voice DAC Boost"},
1177 {"SPOR Mux", "DACR", "Right DAC"},
1178
1179 {"MONO Mux", "MONOMIX", "MONOMIX Mixer"},
1180 {"MONO Mux", "MONOIN_RX", "MONO_IN"},
1181 {"MONO Mux", "VDAC", "Voice DAC Boost"},
1182
1183 {"Right DAC_HP", NULL, "Right DAC"},
1184 {"Left DAC_HP", NULL, "Left DAC"},
1185
1186 {"HPL Mux", "Left HPVOL", "Left HPVOL Mux"},
1187 {"HPL Mux", "Left DAC", "Left DAC_HP"},
1188 {"HPR Mux", "Right HPVOL", "Right HPVOL Mux"},
1189 {"HPR Mux", "Right DAC", "Right DAC_HP"},
1190
1191 {"HP Depop", NULL, "HPL Mux"},
1192 {"HP Depop", NULL, "HPR Mux"},
1193
1194 {"AUXO1", NULL, "AXO1MIX Mixer"},
1195 {"AUXO2", NULL, "AXO2MIX Mixer"},
1196
1197 {"SPOL", NULL, "Class D"},
1198 {"SPOL", NULL, "SPOL Mux"},
1199 {"SPOR", NULL, "Class D"},
1200 {"SPOR", NULL, "SPOR Mux"},
1201
1202 {"HPOL", NULL, "HP Depop"},
1203 {"HPOR", NULL, "HP Depop"},
1204
1205 {"MONO", NULL, "MONO Depop"},
1206 {"MONO", NULL, "MONO Mux"},
1207 };
1208
1209 struct coeff_clk_div {
1210 u32 mclk;
1211 u32 bclk;
1212 u32 rate;
1213 u16 reg_val;
1214 };
1215
1216
1217 struct pll_div {
1218 u32 pll_in;
1219 u32 pll_out;
1220 u16 reg_val;
1221 };
1222
1223 static const struct pll_div codec_master_pll_div[] = {
1224 {2048000, 8192000, 0x0ea0},
1225 {3686400, 8192000, 0x4e27},
1226 {12000000, 8192000, 0x456b},
1227 {13000000, 8192000, 0x495f},
1228 {13100000, 8192000, 0x0320},
1229 {2048000, 11289600, 0xf637},
1230 {3686400, 11289600, 0x2f22},
1231 {12000000, 11289600, 0x3e2f},
1232 {13000000, 11289600, 0x4d5b},
1233 {13100000, 11289600, 0x363b},
1234 {2048000, 16384000, 0x1ea0},
1235 {3686400, 16384000, 0x9e27},
1236 {12000000, 16384000, 0x452b},
1237 {13000000, 16384000, 0x542f},
1238 {13100000, 16384000, 0x03a0},
1239 {2048000, 16934400, 0xe625},
1240 {3686400, 16934400, 0x9126},
1241 {12000000, 16934400, 0x4d2c},
1242 {13000000, 16934400, 0x742f},
1243 {13100000, 16934400, 0x3c27},
1244 {2048000, 22579200, 0x2aa0},
1245 {3686400, 22579200, 0x2f20},
1246 {12000000, 22579200, 0x7e2f},
1247 {13000000, 22579200, 0x742f},
1248 {13100000, 22579200, 0x3c27},
1249 {2048000, 24576000, 0x2ea0},
1250 {3686400, 24576000, 0xee27},
1251 {12000000, 24576000, 0x2915},
1252 {13000000, 24576000, 0x772e},
1253 {13100000, 24576000, 0x0d20},
1254 {26000000, 24576000, 0x2027},
1255 {26000000, 22579200, 0x392f},
1256 {24576000, 22579200, 0x0921},
1257 {24576000, 24576000, 0x02a0},
1258 };
1259
1260 static const struct pll_div codec_slave_pll_div[] = {
1261 {256000, 2048000, 0x46f0},
1262 {256000, 4096000, 0x3ea0},
1263 {352800, 5644800, 0x3ea0},
1264 {512000, 8192000, 0x3ea0},
1265 {1024000, 8192000, 0x46f0},
1266 {705600, 11289600, 0x3ea0},
1267 {1024000, 16384000, 0x3ea0},
1268 {1411200, 22579200, 0x3ea0},
1269 {1536000, 24576000, 0x3ea0},
1270 {2048000, 16384000, 0x1ea0},
1271 {2822400, 22579200, 0x1ea0},
1272 {2822400, 45158400, 0x5ec0},
1273 {5644800, 45158400, 0x46f0},
1274 {3072000, 24576000, 0x1ea0},
1275 {3072000, 49152000, 0x5ec0},
1276 {6144000, 49152000, 0x46f0},
1277 {705600, 11289600, 0x3ea0},
1278 {705600, 8467200, 0x3ab0},
1279 {24576000, 24576000, 0x02a0},
1280 {1411200, 11289600, 0x1690},
1281 {2822400, 11289600, 0x0a90},
1282 {1536000, 12288000, 0x1690},
1283 {3072000, 12288000, 0x0a90},
1284 };
1285
1286 static const struct coeff_clk_div coeff_div[] = {
1287
1288 {2048000, 8000 * 32, 8000, 0x1000},
1289 {2048000, 8000 * 64, 8000, 0x0000},
1290 {2822400, 11025 * 32, 11025, 0x1000},
1291 {2822400, 11025 * 64, 11025, 0x0000},
1292 {4096000, 16000 * 32, 16000, 0x1000},
1293 {4096000, 16000 * 64, 16000, 0x0000},
1294 {5644800, 22050 * 32, 22050, 0x1000},
1295 {5644800, 22050 * 64, 22050, 0x0000},
1296 {8192000, 32000 * 32, 32000, 0x1000},
1297 {8192000, 32000 * 64, 32000, 0x0000},
1298 {11289600, 44100 * 32, 44100, 0x1000},
1299 {11289600, 44100 * 64, 44100, 0x0000},
1300 {12288000, 48000 * 32, 48000, 0x1000},
1301 {12288000, 48000 * 64, 48000, 0x0000},
1302 {22579200, 88200 * 32, 88200, 0x1000},
1303 {22579200, 88200 * 64, 88200, 0x0000},
1304 {24576000, 96000 * 32, 96000, 0x1000},
1305 {24576000, 96000 * 64, 96000, 0x0000},
1306
1307 {4096000, 8000 * 32, 8000, 0x3000},
1308 {4096000, 8000 * 64, 8000, 0x2000},
1309 {5644800, 11025 * 32, 11025, 0x3000},
1310 {5644800, 11025 * 64, 11025, 0x2000},
1311 {8192000, 16000 * 32, 16000, 0x3000},
1312 {8192000, 16000 * 64, 16000, 0x2000},
1313 {11289600, 22050 * 32, 22050, 0x3000},
1314 {11289600, 22050 * 64, 22050, 0x2000},
1315 {16384000, 32000 * 32, 32000, 0x3000},
1316 {16384000, 32000 * 64, 32000, 0x2000},
1317 {22579200, 44100 * 32, 44100, 0x3000},
1318 {22579200, 44100 * 64, 44100, 0x2000},
1319 {24576000, 48000 * 32, 48000, 0x3000},
1320 {24576000, 48000 * 64, 48000, 0x2000},
1321 {45158400, 88200 * 32, 88200, 0x3000},
1322 {45158400, 88200 * 64, 88200, 0x2000},
1323 {49152000, 96000 * 32, 96000, 0x3000},
1324 {49152000, 96000 * 64, 96000, 0x2000},
1325
1326 {24576000, 8000 * 32, 8000, 0x7080},
1327 {24576000, 8000 * 64, 8000, 0x6080},
1328 {24576000, 16000 * 32, 16000, 0x5080},
1329 {24576000, 16000 * 64, 16000, 0x4080},
1330 {24576000, 24000 * 32, 24000, 0x5000},
1331 {24576000, 24000 * 64, 24000, 0x4000},
1332 {24576000, 32000 * 32, 32000, 0x3080},
1333 {24576000, 32000 * 64, 32000, 0x2080},
1334 {22579200, 11025 * 32, 11025, 0x7000},
1335 {22579200, 11025 * 64, 11025, 0x6000},
1336 {22579200, 22050 * 32, 22050, 0x5000},
1337 {22579200, 22050 * 64, 22050, 0x4000},
1338 };
1339
1340 static int get_coeff(int mclk, int rate, int timesofbclk)
1341 {
1342 int i;
1343
1344 for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
1345 if (coeff_div[i].mclk == mclk && coeff_div[i].rate == rate &&
1346 (coeff_div[i].bclk / coeff_div[i].rate) == timesofbclk)
1347 return i;
1348 }
1349 return -EINVAL;
1350 }
1351
1352 static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream,
1353 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
1354 {
1355 struct snd_soc_component *component = dai->component;
1356 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
1357 int timesofbclk = 32, coeff;
1358 unsigned int iface = 0;
1359
1360 dev_dbg(component->dev, "enter %s\n", __func__);
1361
1362 rt5631->bclk_rate = snd_soc_params_to_bclk(params);
1363 if (rt5631->bclk_rate < 0) {
1364 dev_err(component->dev, "Fail to get BCLK rate\n");
1365 return rt5631->bclk_rate;
1366 }
1367 rt5631->rx_rate = params_rate(params);
1368
1369 if (rt5631->master)
1370 coeff = get_coeff(rt5631->sysclk, rt5631->rx_rate,
1371 rt5631->bclk_rate / rt5631->rx_rate);
1372 else
1373 coeff = get_coeff(rt5631->sysclk, rt5631->rx_rate,
1374 timesofbclk);
1375 if (coeff < 0) {
1376 dev_err(component->dev, "Fail to get coeff\n");
1377 return coeff;
1378 }
1379
1380 switch (params_width(params)) {
1381 case 16:
1382 break;
1383 case 20:
1384 iface |= RT5631_SDP_I2S_DL_20;
1385 break;
1386 case 24:
1387 iface |= RT5631_SDP_I2S_DL_24;
1388 break;
1389 case 8:
1390 iface |= RT5631_SDP_I2S_DL_8;
1391 break;
1392 default:
1393 return -EINVAL;
1394 }
1395
1396 snd_soc_component_update_bits(component, RT5631_SDP_CTRL,
1397 RT5631_SDP_I2S_DL_MASK, iface);
1398 snd_soc_component_write(component, RT5631_STEREO_AD_DA_CLK_CTRL,
1399 coeff_div[coeff].reg_val);
1400
1401 return 0;
1402 }
1403
1404 static int rt5631_hifi_codec_set_dai_fmt(struct snd_soc_dai *codec_dai,
1405 unsigned int fmt)
1406 {
1407 struct snd_soc_component *component = codec_dai->component;
1408 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
1409 unsigned int iface = 0;
1410
1411 dev_dbg(component->dev, "enter %s\n", __func__);
1412
1413 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1414 case SND_SOC_DAIFMT_CBM_CFM:
1415 rt5631->master = 1;
1416 break;
1417 case SND_SOC_DAIFMT_CBS_CFS:
1418 iface |= RT5631_SDP_MODE_SEL_SLAVE;
1419 rt5631->master = 0;
1420 break;
1421 default:
1422 return -EINVAL;
1423 }
1424
1425 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1426 case SND_SOC_DAIFMT_I2S:
1427 break;
1428 case SND_SOC_DAIFMT_LEFT_J:
1429 iface |= RT5631_SDP_I2S_DF_LEFT;
1430 break;
1431 case SND_SOC_DAIFMT_DSP_A:
1432 iface |= RT5631_SDP_I2S_DF_PCM_A;
1433 break;
1434 case SND_SOC_DAIFMT_DSP_B:
1435 iface |= RT5631_SDP_I2S_DF_PCM_B;
1436 break;
1437 default:
1438 return -EINVAL;
1439 }
1440
1441 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1442 case SND_SOC_DAIFMT_NB_NF:
1443 break;
1444 case SND_SOC_DAIFMT_IB_NF:
1445 iface |= RT5631_SDP_I2S_BCLK_POL_CTRL;
1446 break;
1447 default:
1448 return -EINVAL;
1449 }
1450
1451 snd_soc_component_write(component, RT5631_SDP_CTRL, iface);
1452
1453 return 0;
1454 }
1455
1456 static int rt5631_hifi_codec_set_dai_sysclk(struct snd_soc_dai *codec_dai,
1457 int clk_id, unsigned int freq, int dir)
1458 {
1459 struct snd_soc_component *component = codec_dai->component;
1460 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
1461
1462 dev_dbg(component->dev, "enter %s, syclk=%d\n", __func__, freq);
1463
1464 if ((freq >= (256 * 8000)) && (freq <= (512 * 96000))) {
1465 rt5631->sysclk = freq;
1466 return 0;
1467 }
1468
1469 return -EINVAL;
1470 }
1471
1472 static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
1473 int source, unsigned int freq_in, unsigned int freq_out)
1474 {
1475 struct snd_soc_component *component = codec_dai->component;
1476 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
1477 int i, ret = -EINVAL;
1478
1479 dev_dbg(component->dev, "enter %s\n", __func__);
1480
1481 if (!freq_in || !freq_out) {
1482 dev_dbg(component->dev, "PLL disabled\n");
1483
1484 snd_soc_component_update_bits(component, RT5631_GLOBAL_CLK_CTRL,
1485 RT5631_SYSCLK_SOUR_SEL_MASK,
1486 RT5631_SYSCLK_SOUR_SEL_MCLK);
1487
1488 return 0;
1489 }
1490
1491 if (rt5631->master) {
1492 for (i = 0; i < ARRAY_SIZE(codec_master_pll_div); i++)
1493 if (freq_in == codec_master_pll_div[i].pll_in &&
1494 freq_out == codec_master_pll_div[i].pll_out) {
1495 dev_info(component->dev,
1496 "change PLL in master mode\n");
1497 snd_soc_component_write(component, RT5631_PLL_CTRL,
1498 codec_master_pll_div[i].reg_val);
1499 schedule_timeout_uninterruptible(
1500 msecs_to_jiffies(20));
1501 snd_soc_component_update_bits(component,
1502 RT5631_GLOBAL_CLK_CTRL,
1503 RT5631_SYSCLK_SOUR_SEL_MASK |
1504 RT5631_PLLCLK_SOUR_SEL_MASK,
1505 RT5631_SYSCLK_SOUR_SEL_PLL |
1506 RT5631_PLLCLK_SOUR_SEL_MCLK);
1507 ret = 0;
1508 break;
1509 }
1510 } else {
1511 for (i = 0; i < ARRAY_SIZE(codec_slave_pll_div); i++)
1512 if (freq_in == codec_slave_pll_div[i].pll_in &&
1513 freq_out == codec_slave_pll_div[i].pll_out) {
1514 dev_info(component->dev,
1515 "change PLL in slave mode\n");
1516 snd_soc_component_write(component, RT5631_PLL_CTRL,
1517 codec_slave_pll_div[i].reg_val);
1518 schedule_timeout_uninterruptible(
1519 msecs_to_jiffies(20));
1520 snd_soc_component_update_bits(component,
1521 RT5631_GLOBAL_CLK_CTRL,
1522 RT5631_SYSCLK_SOUR_SEL_MASK |
1523 RT5631_PLLCLK_SOUR_SEL_MASK,
1524 RT5631_SYSCLK_SOUR_SEL_PLL |
1525 RT5631_PLLCLK_SOUR_SEL_BCLK);
1526 ret = 0;
1527 break;
1528 }
1529 }
1530
1531 return ret;
1532 }
1533
1534 static int rt5631_set_bias_level(struct snd_soc_component *component,
1535 enum snd_soc_bias_level level)
1536 {
1537 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
1538
1539 switch (level) {
1540 case SND_SOC_BIAS_ON:
1541 case SND_SOC_BIAS_PREPARE:
1542 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD2,
1543 RT5631_PWR_MICBIAS1_VOL | RT5631_PWR_MICBIAS2_VOL,
1544 RT5631_PWR_MICBIAS1_VOL | RT5631_PWR_MICBIAS2_VOL);
1545 break;
1546
1547 case SND_SOC_BIAS_STANDBY:
1548 if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
1549 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
1550 RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS,
1551 RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS);
1552 msleep(80);
1553 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
1554 RT5631_PWR_FAST_VREF_CTRL,
1555 RT5631_PWR_FAST_VREF_CTRL);
1556 regcache_cache_only(rt5631->regmap, false);
1557 regcache_sync(rt5631->regmap);
1558 }
1559 break;
1560
1561 case SND_SOC_BIAS_OFF:
1562 snd_soc_component_write(component, RT5631_PWR_MANAG_ADD1, 0x0000);
1563 snd_soc_component_write(component, RT5631_PWR_MANAG_ADD2, 0x0000);
1564 snd_soc_component_write(component, RT5631_PWR_MANAG_ADD3, 0x0000);
1565 snd_soc_component_write(component, RT5631_PWR_MANAG_ADD4, 0x0000);
1566 break;
1567
1568 default:
1569 break;
1570 }
1571
1572 return 0;
1573 }
1574
1575 static int rt5631_probe(struct snd_soc_component *component)
1576 {
1577 struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component);
1578 unsigned int val;
1579
1580 val = rt5631_read_index(component, RT5631_ADDA_MIXER_INTL_REG3);
1581 if (val & 0x0002)
1582 rt5631->codec_version = 1;
1583 else
1584 rt5631->codec_version = 0;
1585
1586 rt5631_reset(component);
1587 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
1588 RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS,
1589 RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS);
1590 msleep(80);
1591 snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3,
1592 RT5631_PWR_FAST_VREF_CTRL, RT5631_PWR_FAST_VREF_CTRL);
1593
1594 snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, 0x0f18);
1595
1596 if (rt5631->codec_version)
1597 snd_soc_component_update_bits(component, RT5631_INT_ST_IRQ_CTRL_2,
1598 0x2000, 0x2000);
1599 else
1600 snd_soc_component_update_bits(component, RT5631_INT_ST_IRQ_CTRL_2,
1601 0x2000, 0);
1602
1603 if (rt5631->dmic_used_flag) {
1604 snd_soc_component_update_bits(component, RT5631_GPIO_CTRL,
1605 RT5631_GPIO_PIN_FUN_SEL_MASK |
1606 RT5631_GPIO_DMIC_FUN_SEL_MASK,
1607 RT5631_GPIO_PIN_FUN_SEL_GPIO_DIMC |
1608 RT5631_GPIO_DMIC_FUN_SEL_DIMC);
1609 snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL,
1610 RT5631_DMIC_L_CH_LATCH_MASK |
1611 RT5631_DMIC_R_CH_LATCH_MASK,
1612 RT5631_DMIC_L_CH_LATCH_FALLING |
1613 RT5631_DMIC_R_CH_LATCH_RISING);
1614 }
1615
1616 snd_soc_component_init_bias_level(component, SND_SOC_BIAS_STANDBY);
1617
1618 return 0;
1619 }
1620
1621 #define RT5631_STEREO_RATES SNDRV_PCM_RATE_8000_96000
1622 #define RT5631_FORMAT (SNDRV_PCM_FMTBIT_S16_LE | \
1623 SNDRV_PCM_FMTBIT_S20_3LE | \
1624 SNDRV_PCM_FMTBIT_S24_LE | \
1625 SNDRV_PCM_FMTBIT_S8)
1626
1627 static const struct snd_soc_dai_ops rt5631_ops = {
1628 .hw_params = rt5631_hifi_pcm_params,
1629 .set_fmt = rt5631_hifi_codec_set_dai_fmt,
1630 .set_sysclk = rt5631_hifi_codec_set_dai_sysclk,
1631 .set_pll = rt5631_codec_set_dai_pll,
1632 };
1633
1634 static struct snd_soc_dai_driver rt5631_dai[] = {
1635 {
1636 .name = "rt5631-hifi",
1637 .id = 1,
1638 .playback = {
1639 .stream_name = "HIFI Playback",
1640 .channels_min = 1,
1641 .channels_max = 2,
1642 .rates = RT5631_STEREO_RATES,
1643 .formats = RT5631_FORMAT,
1644 },
1645 .capture = {
1646 .stream_name = "HIFI Capture",
1647 .channels_min = 1,
1648 .channels_max = 2,
1649 .rates = RT5631_STEREO_RATES,
1650 .formats = RT5631_FORMAT,
1651 },
1652 .ops = &rt5631_ops,
1653 },
1654 };
1655
1656 static const struct snd_soc_component_driver soc_component_dev_rt5631 = {
1657 .probe = rt5631_probe,
1658 .set_bias_level = rt5631_set_bias_level,
1659 .controls = rt5631_snd_controls,
1660 .num_controls = ARRAY_SIZE(rt5631_snd_controls),
1661 .dapm_widgets = rt5631_dapm_widgets,
1662 .num_dapm_widgets = ARRAY_SIZE(rt5631_dapm_widgets),
1663 .dapm_routes = rt5631_dapm_routes,
1664 .num_dapm_routes = ARRAY_SIZE(rt5631_dapm_routes),
1665 .suspend_bias_off = 1,
1666 .idle_bias_on = 1,
1667 .use_pmdown_time = 1,
1668 .endianness = 1,
1669 };
1670
1671 static const struct i2c_device_id rt5631_i2c_id[] = {
1672 { "rt5631", 0 },
1673 { "alc5631", 0 },
1674 { }
1675 };
1676 MODULE_DEVICE_TABLE(i2c, rt5631_i2c_id);
1677
1678 #ifdef CONFIG_OF
1679 static const struct of_device_id rt5631_i2c_dt_ids[] = {
1680 { .compatible = "realtek,rt5631"},
1681 { .compatible = "realtek,alc5631"},
1682 { }
1683 };
1684 MODULE_DEVICE_TABLE(of, rt5631_i2c_dt_ids);
1685 #endif
1686
1687 static const struct regmap_config rt5631_regmap_config = {
1688 .reg_bits = 8,
1689 .val_bits = 16,
1690
1691 .readable_reg = rt5631_readable_register,
1692 .volatile_reg = rt5631_volatile_register,
1693 .max_register = RT5631_VENDOR_ID2,
1694 .reg_defaults = rt5631_reg,
1695 .num_reg_defaults = ARRAY_SIZE(rt5631_reg),
1696 .cache_type = REGCACHE_RBTREE,
1697 .use_single_read = true,
1698 .use_single_write = true,
1699 };
1700
1701 static int rt5631_i2c_probe(struct i2c_client *i2c)
1702 {
1703 struct rt5631_priv *rt5631;
1704 int ret;
1705
1706 rt5631 = devm_kzalloc(&i2c->dev, sizeof(struct rt5631_priv),
1707 GFP_KERNEL);
1708 if (NULL == rt5631)
1709 return -ENOMEM;
1710
1711 i2c_set_clientdata(i2c, rt5631);
1712
1713 rt5631->regmap = devm_regmap_init_i2c(i2c, &rt5631_regmap_config);
1714 if (IS_ERR(rt5631->regmap))
1715 return PTR_ERR(rt5631->regmap);
1716
1717 ret = devm_snd_soc_register_component(&i2c->dev,
1718 &soc_component_dev_rt5631,
1719 rt5631_dai, ARRAY_SIZE(rt5631_dai));
1720 return ret;
1721 }
1722
1723 static int rt5631_i2c_remove(struct i2c_client *client)
1724 {
1725 return 0;
1726 }
1727
1728 static struct i2c_driver rt5631_i2c_driver = {
1729 .driver = {
1730 .name = "rt5631",
1731 .of_match_table = of_match_ptr(rt5631_i2c_dt_ids),
1732 },
1733 .probe_new = rt5631_i2c_probe,
1734 .remove = rt5631_i2c_remove,
1735 .id_table = rt5631_i2c_id,
1736 };
1737
1738 module_i2c_driver(rt5631_i2c_driver);
1739
1740 MODULE_DESCRIPTION("ASoC RT5631 driver");
1741 MODULE_AUTHOR("flove <flove@realtek.com>");
1742 MODULE_LICENSE("GPL");