aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOder Chiou <oder_chiou@realtek.com>2014-04-08 07:40:00 -0400
committerMark Brown <broonie@linaro.org>2014-04-14 12:27:42 -0400
commit022d21f004c14db2151d08143a544b292324d099 (patch)
tree086d1e80f956bef74c7b376e7da88049e92b1345
parent09caf300540c4a610dbe6e46afdab18f365be7e7 (diff)
ASoC: rt5640: add rt5639 support
This patch adds the rt5639 support Signed-off-by: Oder Chiou <oder_chiou@realtek.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/codecs/rt5640.c286
-rw-r--r--sound/soc/codecs/rt5640.h3
2 files changed, 213 insertions, 76 deletions
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c
index a7db7ef38cfc..a20781eda719 100644
--- a/sound/soc/codecs/rt5640.c
+++ b/sound/soc/codecs/rt5640.c
@@ -398,18 +398,13 @@ static const struct snd_kcontrol_new rt5640_snd_controls[] = {
398 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1), 398 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
399 SOC_DOUBLE_TLV("OUT Playback Volume", RT5640_OUTPUT, 399 SOC_DOUBLE_TLV("OUT Playback Volume", RT5640_OUTPUT,
400 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv), 400 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
401 /* MONO Output Control */ 401
402 SOC_SINGLE("Mono Playback Switch", RT5640_MONO_OUT,
403 RT5640_L_MUTE_SFT, 1, 1),
404 /* DAC Digital Volume */ 402 /* DAC Digital Volume */
405 SOC_DOUBLE("DAC2 Playback Switch", RT5640_DAC2_CTRL, 403 SOC_DOUBLE("DAC2 Playback Switch", RT5640_DAC2_CTRL,
406 RT5640_M_DAC_L2_VOL_SFT, RT5640_M_DAC_R2_VOL_SFT, 1, 1), 404 RT5640_M_DAC_L2_VOL_SFT, RT5640_M_DAC_R2_VOL_SFT, 1, 1),
407 SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5640_DAC1_DIG_VOL, 405 SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5640_DAC1_DIG_VOL,
408 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 406 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
409 175, 0, dac_vol_tlv), 407 175, 0, dac_vol_tlv),
410 SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5640_DAC2_DIG_VOL,
411 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
412 175, 0, dac_vol_tlv),
413 /* IN1/IN2 Control */ 408 /* IN1/IN2 Control */
414 SOC_SINGLE_TLV("IN1 Boost", RT5640_IN1_IN2, 409 SOC_SINGLE_TLV("IN1 Boost", RT5640_IN1_IN2,
415 RT5640_BST_SFT1, 8, 0, bst_tlv), 410 RT5640_BST_SFT1, 8, 0, bst_tlv),
@@ -441,6 +436,15 @@ static const struct snd_kcontrol_new rt5640_snd_controls[] = {
441 SOC_ENUM("DAC IF2 Data Switch", rt5640_if2_dac_enum), 436 SOC_ENUM("DAC IF2 Data Switch", rt5640_if2_dac_enum),
442}; 437};
443 438
439static const struct snd_kcontrol_new rt5640_specific_snd_controls[] = {
440 /* MONO Output Control */
441 SOC_SINGLE("Mono Playback Switch", RT5640_MONO_OUT, RT5640_L_MUTE_SFT,
442 1, 1),
443
444 SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5640_DAC2_DIG_VOL,
445 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 175, 0, dac_vol_tlv),
446};
447
444/** 448/**
445 * set_dmic_clk - Set parameter of dmic. 449 * set_dmic_clk - Set parameter of dmic.
446 * 450 *
@@ -554,6 +558,20 @@ static const struct snd_kcontrol_new rt5640_sto_dac_r_mix[] = {
554 RT5640_M_ANC_DAC_R_SFT, 1, 1), 558 RT5640_M_ANC_DAC_R_SFT, 1, 1),
555}; 559};
556 560
561static const struct snd_kcontrol_new rt5639_sto_dac_l_mix[] = {
562 SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_STO_DAC_MIXER,
563 RT5640_M_DAC_L1_SFT, 1, 1),
564 SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_STO_DAC_MIXER,
565 RT5640_M_DAC_L2_SFT, 1, 1),
566};
567
568static const struct snd_kcontrol_new rt5639_sto_dac_r_mix[] = {
569 SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_STO_DAC_MIXER,
570 RT5640_M_DAC_R1_SFT, 1, 1),
571 SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_STO_DAC_MIXER,
572 RT5640_M_DAC_R2_SFT, 1, 1),
573};
574
557static const struct snd_kcontrol_new rt5640_mono_dac_l_mix[] = { 575static const struct snd_kcontrol_new rt5640_mono_dac_l_mix[] = {
558 SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_MONO_DAC_MIXER, 576 SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_MONO_DAC_MIXER,
559 RT5640_M_DAC_L1_MONO_L_SFT, 1, 1), 577 RT5640_M_DAC_L1_MONO_L_SFT, 1, 1),
@@ -676,6 +694,30 @@ static const struct snd_kcontrol_new rt5640_out_r_mix[] = {
676 RT5640_M_DAC_R1_OM_R_SFT, 1, 1), 694 RT5640_M_DAC_R1_OM_R_SFT, 1, 1),
677}; 695};
678 696
697static const struct snd_kcontrol_new rt5639_out_l_mix[] = {
698 SOC_DAPM_SINGLE("BST1 Switch", RT5640_OUT_L3_MIXER,
699 RT5640_M_BST1_OM_L_SFT, 1, 1),
700 SOC_DAPM_SINGLE("INL Switch", RT5640_OUT_L3_MIXER,
701 RT5640_M_IN_L_OM_L_SFT, 1, 1),
702 SOC_DAPM_SINGLE("REC MIXL Switch", RT5640_OUT_L3_MIXER,
703 RT5640_M_RM_L_OM_L_SFT, 1, 1),
704 SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_OUT_L3_MIXER,
705 RT5640_M_DAC_L1_OM_L_SFT, 1, 1),
706};
707
708static const struct snd_kcontrol_new rt5639_out_r_mix[] = {
709 SOC_DAPM_SINGLE("BST2 Switch", RT5640_OUT_R3_MIXER,
710 RT5640_M_BST4_OM_R_SFT, 1, 1),
711 SOC_DAPM_SINGLE("BST1 Switch", RT5640_OUT_R3_MIXER,
712 RT5640_M_BST1_OM_R_SFT, 1, 1),
713 SOC_DAPM_SINGLE("INR Switch", RT5640_OUT_R3_MIXER,
714 RT5640_M_IN_R_OM_R_SFT, 1, 1),
715 SOC_DAPM_SINGLE("REC MIXR Switch", RT5640_OUT_R3_MIXER,
716 RT5640_M_RM_R_OM_R_SFT, 1, 1),
717 SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_OUT_R3_MIXER,
718 RT5640_M_DAC_R1_OM_R_SFT, 1, 1),
719};
720
679static const struct snd_kcontrol_new rt5640_spo_l_mix[] = { 721static const struct snd_kcontrol_new rt5640_spo_l_mix[] = {
680 SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_SPO_L_MIXER, 722 SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_SPO_L_MIXER,
681 RT5640_M_DAC_R1_SPM_L_SFT, 1, 1), 723 RT5640_M_DAC_R1_SPM_L_SFT, 1, 1),
@@ -707,6 +749,13 @@ static const struct snd_kcontrol_new rt5640_hpo_mix[] = {
707 RT5640_M_HPVOL_HM_SFT, 1, 1), 749 RT5640_M_HPVOL_HM_SFT, 1, 1),
708}; 750};
709 751
752static const struct snd_kcontrol_new rt5639_hpo_mix[] = {
753 SOC_DAPM_SINGLE("HPO MIX DAC1 Switch", RT5640_HPO_MIXER,
754 RT5640_M_DAC1_HM_SFT, 1, 1),
755 SOC_DAPM_SINGLE("HPO MIX HPVOL Switch", RT5640_HPO_MIXER,
756 RT5640_M_HPVOL_HM_SFT, 1, 1),
757};
758
710static const struct snd_kcontrol_new rt5640_lout_mix[] = { 759static const struct snd_kcontrol_new rt5640_lout_mix[] = {
711 SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_LOUT_MIXER, 760 SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_LOUT_MIXER,
712 RT5640_M_DAC_L1_LM_SFT, 1, 1), 761 RT5640_M_DAC_L1_LM_SFT, 1, 1),
@@ -1096,26 +1145,15 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1096 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), 1145 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
1097 SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), 1146 SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
1098 SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0), 1147 SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
1099 /* Audio DSP */ 1148
1100 SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
1101 /* ANC */
1102 SND_SOC_DAPM_PGA("ANC", SND_SOC_NOPM, 0, 0, NULL, 0),
1103 /* Output Side */ 1149 /* Output Side */
1104 /* DAC mixer before sound effect */ 1150 /* DAC mixer before sound effect */
1105 SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0, 1151 SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0,
1106 rt5640_dac_l_mix, ARRAY_SIZE(rt5640_dac_l_mix)), 1152 rt5640_dac_l_mix, ARRAY_SIZE(rt5640_dac_l_mix)),
1107 SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0, 1153 SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0,
1108 rt5640_dac_r_mix, ARRAY_SIZE(rt5640_dac_r_mix)), 1154 rt5640_dac_r_mix, ARRAY_SIZE(rt5640_dac_r_mix)),
1109 /* DAC2 channel Mux */ 1155
1110 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0,
1111 &rt5640_dac_l2_mux),
1112 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0,
1113 &rt5640_dac_r2_mux),
1114 /* DAC Mixer */ 1156 /* DAC Mixer */
1115 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
1116 rt5640_sto_dac_l_mix, ARRAY_SIZE(rt5640_sto_dac_l_mix)),
1117 SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
1118 rt5640_sto_dac_r_mix, ARRAY_SIZE(rt5640_sto_dac_r_mix)),
1119 SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0, 1157 SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
1120 rt5640_mono_dac_l_mix, ARRAY_SIZE(rt5640_mono_dac_l_mix)), 1158 rt5640_mono_dac_l_mix, ARRAY_SIZE(rt5640_mono_dac_l_mix)),
1121 SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0, 1159 SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
@@ -1127,21 +1165,14 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1127 /* DACs */ 1165 /* DACs */
1128 SND_SOC_DAPM_DAC("DAC L1", NULL, RT5640_PWR_DIG1, 1166 SND_SOC_DAPM_DAC("DAC L1", NULL, RT5640_PWR_DIG1,
1129 RT5640_PWR_DAC_L1_BIT, 0), 1167 RT5640_PWR_DAC_L1_BIT, 0),
1130 SND_SOC_DAPM_DAC("DAC L2", NULL, RT5640_PWR_DIG1,
1131 RT5640_PWR_DAC_L2_BIT, 0),
1132 SND_SOC_DAPM_DAC("DAC R1", NULL, RT5640_PWR_DIG1, 1168 SND_SOC_DAPM_DAC("DAC R1", NULL, RT5640_PWR_DIG1,
1133 RT5640_PWR_DAC_R1_BIT, 0), 1169 RT5640_PWR_DAC_R1_BIT, 0),
1134 SND_SOC_DAPM_DAC("DAC R2", NULL, RT5640_PWR_DIG1, 1170
1135 RT5640_PWR_DAC_R2_BIT, 0),
1136 /* SPK/OUT Mixer */ 1171 /* SPK/OUT Mixer */
1137 SND_SOC_DAPM_MIXER("SPK MIXL", RT5640_PWR_MIXER, RT5640_PWR_SM_L_BIT, 1172 SND_SOC_DAPM_MIXER("SPK MIXL", RT5640_PWR_MIXER, RT5640_PWR_SM_L_BIT,
1138 0, rt5640_spk_l_mix, ARRAY_SIZE(rt5640_spk_l_mix)), 1173 0, rt5640_spk_l_mix, ARRAY_SIZE(rt5640_spk_l_mix)),
1139 SND_SOC_DAPM_MIXER("SPK MIXR", RT5640_PWR_MIXER, RT5640_PWR_SM_R_BIT, 1174 SND_SOC_DAPM_MIXER("SPK MIXR", RT5640_PWR_MIXER, RT5640_PWR_SM_R_BIT,
1140 0, rt5640_spk_r_mix, ARRAY_SIZE(rt5640_spk_r_mix)), 1175 0, rt5640_spk_r_mix, ARRAY_SIZE(rt5640_spk_r_mix)),
1141 SND_SOC_DAPM_MIXER("OUT MIXL", RT5640_PWR_MIXER, RT5640_PWR_OM_L_BIT,
1142 0, rt5640_out_l_mix, ARRAY_SIZE(rt5640_out_l_mix)),
1143 SND_SOC_DAPM_MIXER("OUT MIXR", RT5640_PWR_MIXER, RT5640_PWR_OM_R_BIT,
1144 0, rt5640_out_r_mix, ARRAY_SIZE(rt5640_out_r_mix)),
1145 /* Ouput Volume */ 1176 /* Ouput Volume */
1146 SND_SOC_DAPM_PGA("SPKVOL L", RT5640_PWR_VOL, 1177 SND_SOC_DAPM_PGA("SPKVOL L", RT5640_PWR_VOL,
1147 RT5640_PWR_SV_L_BIT, 0, NULL, 0), 1178 RT5640_PWR_SV_L_BIT, 0, NULL, 0),
@@ -1160,16 +1191,8 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1160 0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)), 1191 0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)),
1161 SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0, 1192 SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0,
1162 0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)), 1193 0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)),
1163 SND_SOC_DAPM_MIXER("HPO MIX L", SND_SOC_NOPM, 0, 0,
1164 rt5640_hpo_mix, ARRAY_SIZE(rt5640_hpo_mix)),
1165 SND_SOC_DAPM_MIXER("HPO MIX R", SND_SOC_NOPM, 0, 0,
1166 rt5640_hpo_mix, ARRAY_SIZE(rt5640_hpo_mix)),
1167 SND_SOC_DAPM_MIXER("LOUT MIX", RT5640_PWR_ANLG1, RT5640_PWR_LM_BIT, 0, 1194 SND_SOC_DAPM_MIXER("LOUT MIX", RT5640_PWR_ANLG1, RT5640_PWR_LM_BIT, 0,
1168 rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)), 1195 rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)),
1169 SND_SOC_DAPM_MIXER("Mono MIX", RT5640_PWR_ANLG1, RT5640_PWR_MM_BIT, 0,
1170 rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)),
1171 SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1,
1172 RT5640_PWR_MA_BIT, 0, NULL, 0),
1173 SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM, 1196 SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
1174 0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU), 1197 0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
1175 SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, 1198 SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
@@ -1201,10 +1224,69 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1201 SND_SOC_DAPM_OUTPUT("HPOR"), 1224 SND_SOC_DAPM_OUTPUT("HPOR"),
1202 SND_SOC_DAPM_OUTPUT("LOUTL"), 1225 SND_SOC_DAPM_OUTPUT("LOUTL"),
1203 SND_SOC_DAPM_OUTPUT("LOUTR"), 1226 SND_SOC_DAPM_OUTPUT("LOUTR"),
1227};
1228
1229static const struct snd_soc_dapm_widget rt5640_specific_dapm_widgets[] = {
1230 /* Audio DSP */
1231 SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
1232 /* ANC */
1233 SND_SOC_DAPM_PGA("ANC", SND_SOC_NOPM, 0, 0, NULL, 0),
1234
1235 /* DAC2 channel Mux */
1236 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dac_l2_mux),
1237 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dac_r2_mux),
1238
1239 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
1240 rt5640_sto_dac_l_mix, ARRAY_SIZE(rt5640_sto_dac_l_mix)),
1241 SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
1242 rt5640_sto_dac_r_mix, ARRAY_SIZE(rt5640_sto_dac_r_mix)),
1243
1244 SND_SOC_DAPM_DAC("DAC R2", NULL, RT5640_PWR_DIG1, RT5640_PWR_DAC_R2_BIT,
1245 0),
1246 SND_SOC_DAPM_DAC("DAC L2", NULL, RT5640_PWR_DIG1, RT5640_PWR_DAC_L2_BIT,
1247 0),
1248
1249 SND_SOC_DAPM_MIXER("OUT MIXL", RT5640_PWR_MIXER, RT5640_PWR_OM_L_BIT,
1250 0, rt5640_out_l_mix, ARRAY_SIZE(rt5640_out_l_mix)),
1251 SND_SOC_DAPM_MIXER("OUT MIXR", RT5640_PWR_MIXER, RT5640_PWR_OM_R_BIT,
1252 0, rt5640_out_r_mix, ARRAY_SIZE(rt5640_out_r_mix)),
1253
1254 SND_SOC_DAPM_MIXER("HPO MIX L", SND_SOC_NOPM, 0, 0,
1255 rt5640_hpo_mix, ARRAY_SIZE(rt5640_hpo_mix)),
1256 SND_SOC_DAPM_MIXER("HPO MIX R", SND_SOC_NOPM, 0, 0,
1257 rt5640_hpo_mix, ARRAY_SIZE(rt5640_hpo_mix)),
1258
1259 SND_SOC_DAPM_MIXER("Mono MIX", RT5640_PWR_ANLG1, RT5640_PWR_MM_BIT, 0,
1260 rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)),
1261 SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1,
1262 RT5640_PWR_MA_BIT, 0, NULL, 0),
1263
1204 SND_SOC_DAPM_OUTPUT("MONOP"), 1264 SND_SOC_DAPM_OUTPUT("MONOP"),
1205 SND_SOC_DAPM_OUTPUT("MONON"), 1265 SND_SOC_DAPM_OUTPUT("MONON"),
1206}; 1266};
1207 1267
1268static const struct snd_soc_dapm_widget rt5639_specific_dapm_widgets[] = {
1269 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
1270 rt5639_sto_dac_l_mix, ARRAY_SIZE(rt5639_sto_dac_l_mix)),
1271 SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
1272 rt5639_sto_dac_r_mix, ARRAY_SIZE(rt5639_sto_dac_r_mix)),
1273
1274 SND_SOC_DAPM_SUPPLY("DAC L2 Filter", RT5640_PWR_DIG1,
1275 RT5640_PWR_DAC_L2_BIT, 0, NULL, 0),
1276 SND_SOC_DAPM_SUPPLY("DAC R2 Filter", RT5640_PWR_DIG1,
1277 RT5640_PWR_DAC_R2_BIT, 0, NULL, 0),
1278
1279 SND_SOC_DAPM_MIXER("OUT MIXL", RT5640_PWR_MIXER, RT5640_PWR_OM_L_BIT,
1280 0, rt5639_out_l_mix, ARRAY_SIZE(rt5639_out_l_mix)),
1281 SND_SOC_DAPM_MIXER("OUT MIXR", RT5640_PWR_MIXER, RT5640_PWR_OM_R_BIT,
1282 0, rt5639_out_r_mix, ARRAY_SIZE(rt5639_out_r_mix)),
1283
1284 SND_SOC_DAPM_MIXER("HPO MIX L", SND_SOC_NOPM, 0, 0,
1285 rt5639_hpo_mix, ARRAY_SIZE(rt5639_hpo_mix)),
1286 SND_SOC_DAPM_MIXER("HPO MIX R", SND_SOC_NOPM, 0, 0,
1287 rt5639_hpo_mix, ARRAY_SIZE(rt5639_hpo_mix)),
1288};
1289
1208static const struct snd_soc_dapm_route rt5640_dapm_routes[] = { 1290static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1209 {"IN1P", NULL, "LDO2"}, 1291 {"IN1P", NULL, "LDO2"},
1210 {"IN2P", NULL, "LDO2"}, 1292 {"IN2P", NULL, "LDO2"},
@@ -1346,71 +1428,38 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1346 {"DAC MIXR", "Stereo ADC Switch", "Stereo ADC MIXR"}, 1428 {"DAC MIXR", "Stereo ADC Switch", "Stereo ADC MIXR"},
1347 {"DAC MIXR", "INF1 Switch", "IF1 DAC R"}, 1429 {"DAC MIXR", "INF1 Switch", "IF1 DAC R"},
1348 1430
1349 {"ANC", NULL, "Stereo ADC MIXL"},
1350 {"ANC", NULL, "Stereo ADC MIXR"},
1351
1352 {"Audio DSP", NULL, "DAC MIXL"},
1353 {"Audio DSP", NULL, "DAC MIXR"},
1354
1355 {"DAC L2 Mux", "IF2", "IF2 DAC L"},
1356 {"DAC L2 Mux", "Base L/R", "Audio DSP"},
1357
1358 {"DAC R2 Mux", "IF2", "IF2 DAC R"},
1359
1360 {"Stereo DAC MIXL", "DAC L1 Switch", "DAC MIXL"}, 1431 {"Stereo DAC MIXL", "DAC L1 Switch", "DAC MIXL"},
1361 {"Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1362 {"Stereo DAC MIXL", "ANC Switch", "ANC"},
1363 {"Stereo DAC MIXR", "DAC R1 Switch", "DAC MIXR"}, 1432 {"Stereo DAC MIXR", "DAC R1 Switch", "DAC MIXR"},
1364 {"Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1365 {"Stereo DAC MIXR", "ANC Switch", "ANC"},
1366 1433
1367 {"Mono DAC MIXL", "DAC L1 Switch", "DAC MIXL"}, 1434 {"Mono DAC MIXL", "DAC L1 Switch", "DAC MIXL"},
1368 {"Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1369 {"Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
1370 {"Mono DAC MIXR", "DAC R1 Switch", "DAC MIXR"}, 1435 {"Mono DAC MIXR", "DAC R1 Switch", "DAC MIXR"},
1371 {"Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1372 {"Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
1373 1436
1374 {"DIG MIXL", "DAC L1 Switch", "DAC MIXL"}, 1437 {"DIG MIXL", "DAC L1 Switch", "DAC MIXL"},
1375 {"DIG MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1376 {"DIG MIXR", "DAC R1 Switch", "DAC MIXR"}, 1438 {"DIG MIXR", "DAC R1 Switch", "DAC MIXR"},
1377 {"DIG MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1378 1439
1379 {"DAC L1", NULL, "Stereo DAC MIXL"}, 1440 {"DAC L1", NULL, "Stereo DAC MIXL"},
1380 {"DAC L1", NULL, "PLL1", is_sys_clk_from_pll}, 1441 {"DAC L1", NULL, "PLL1", is_sys_clk_from_pll},
1381 {"DAC R1", NULL, "Stereo DAC MIXR"}, 1442 {"DAC R1", NULL, "Stereo DAC MIXR"},
1382 {"DAC R1", NULL, "PLL1", is_sys_clk_from_pll}, 1443 {"DAC R1", NULL, "PLL1", is_sys_clk_from_pll},
1383 {"DAC L2", NULL, "Mono DAC MIXL"},
1384 {"DAC L2", NULL, "PLL1", is_sys_clk_from_pll},
1385 {"DAC R2", NULL, "Mono DAC MIXR"},
1386 {"DAC R2", NULL, "PLL1", is_sys_clk_from_pll},
1387 1444
1388 {"SPK MIXL", "REC MIXL Switch", "RECMIXL"}, 1445 {"SPK MIXL", "REC MIXL Switch", "RECMIXL"},
1389 {"SPK MIXL", "INL Switch", "INL VOL"}, 1446 {"SPK MIXL", "INL Switch", "INL VOL"},
1390 {"SPK MIXL", "DAC L1 Switch", "DAC L1"}, 1447 {"SPK MIXL", "DAC L1 Switch", "DAC L1"},
1391 {"SPK MIXL", "DAC L2 Switch", "DAC L2"},
1392 {"SPK MIXL", "OUT MIXL Switch", "OUT MIXL"}, 1448 {"SPK MIXL", "OUT MIXL Switch", "OUT MIXL"},
1393 {"SPK MIXR", "REC MIXR Switch", "RECMIXR"}, 1449 {"SPK MIXR", "REC MIXR Switch", "RECMIXR"},
1394 {"SPK MIXR", "INR Switch", "INR VOL"}, 1450 {"SPK MIXR", "INR Switch", "INR VOL"},
1395 {"SPK MIXR", "DAC R1 Switch", "DAC R1"}, 1451 {"SPK MIXR", "DAC R1 Switch", "DAC R1"},
1396 {"SPK MIXR", "DAC R2 Switch", "DAC R2"},
1397 {"SPK MIXR", "OUT MIXR Switch", "OUT MIXR"}, 1452 {"SPK MIXR", "OUT MIXR Switch", "OUT MIXR"},
1398 1453
1399 {"OUT MIXL", "SPK MIXL Switch", "SPK MIXL"},
1400 {"OUT MIXL", "BST1 Switch", "BST1"}, 1454 {"OUT MIXL", "BST1 Switch", "BST1"},
1401 {"OUT MIXL", "INL Switch", "INL VOL"}, 1455 {"OUT MIXL", "INL Switch", "INL VOL"},
1402 {"OUT MIXL", "REC MIXL Switch", "RECMIXL"}, 1456 {"OUT MIXL", "REC MIXL Switch", "RECMIXL"},
1403 {"OUT MIXL", "DAC R2 Switch", "DAC R2"},
1404 {"OUT MIXL", "DAC L2 Switch", "DAC L2"},
1405 {"OUT MIXL", "DAC L1 Switch", "DAC L1"}, 1457 {"OUT MIXL", "DAC L1 Switch", "DAC L1"},
1406 1458
1407 {"OUT MIXR", "SPK MIXR Switch", "SPK MIXR"},
1408 {"OUT MIXR", "BST2 Switch", "BST2"}, 1459 {"OUT MIXR", "BST2 Switch", "BST2"},
1409 {"OUT MIXR", "BST1 Switch", "BST1"}, 1460 {"OUT MIXR", "BST1 Switch", "BST1"},
1410 {"OUT MIXR", "INR Switch", "INR VOL"}, 1461 {"OUT MIXR", "INR Switch", "INR VOL"},
1411 {"OUT MIXR", "REC MIXR Switch", "RECMIXR"}, 1462 {"OUT MIXR", "REC MIXR Switch", "RECMIXR"},
1412 {"OUT MIXR", "DAC L2 Switch", "DAC L2"},
1413 {"OUT MIXR", "DAC R2 Switch", "DAC R2"},
1414 {"OUT MIXR", "DAC R1 Switch", "DAC R1"}, 1463 {"OUT MIXR", "DAC R1 Switch", "DAC R1"},
1415 1464
1416 {"SPKVOL L", NULL, "SPK MIXL"}, 1465 {"SPKVOL L", NULL, "SPK MIXL"},
@@ -1429,11 +1478,9 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1429 {"SPOR MIX", "SPKVOL R Switch", "SPKVOL R"}, 1478 {"SPOR MIX", "SPKVOL R Switch", "SPKVOL R"},
1430 {"SPOR MIX", "BST1 Switch", "BST1"}, 1479 {"SPOR MIX", "BST1 Switch", "BST1"},
1431 1480
1432 {"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"},
1433 {"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"}, 1481 {"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"},
1434 {"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"}, 1482 {"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"},
1435 {"HPO MIX L", NULL, "HP L Amp"}, 1483 {"HPO MIX L", NULL, "HP L Amp"},
1436 {"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"},
1437 {"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"}, 1484 {"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"},
1438 {"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"}, 1485 {"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"},
1439 {"HPO MIX R", NULL, "HP R Amp"}, 1486 {"HPO MIX R", NULL, "HP R Amp"},
@@ -1443,12 +1490,6 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1443 {"LOUT MIX", "OUTVOL L Switch", "OUTVOL L"}, 1490 {"LOUT MIX", "OUTVOL L Switch", "OUTVOL L"},
1444 {"LOUT MIX", "OUTVOL R Switch", "OUTVOL R"}, 1491 {"LOUT MIX", "OUTVOL R Switch", "OUTVOL R"},
1445 1492
1446 {"Mono MIX", "DAC R2 Switch", "DAC R2"},
1447 {"Mono MIX", "DAC L2 Switch", "DAC L2"},
1448 {"Mono MIX", "OUTVOL R Switch", "OUTVOL R"},
1449 {"Mono MIX", "OUTVOL L Switch", "OUTVOL L"},
1450 {"Mono MIX", "BST1 Switch", "BST1"},
1451
1452 {"HP Amp", NULL, "HPO MIX L"}, 1493 {"HP Amp", NULL, "HPO MIX L"},
1453 {"HP Amp", NULL, "HPO MIX R"}, 1494 {"HP Amp", NULL, "HPO MIX R"},
1454 1495
@@ -1473,11 +1514,82 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1473 {"HPOR", NULL, "HP R Playback"}, 1514 {"HPOR", NULL, "HP R Playback"},
1474 {"LOUTL", NULL, "LOUT MIX"}, 1515 {"LOUTL", NULL, "LOUT MIX"},
1475 {"LOUTR", NULL, "LOUT MIX"}, 1516 {"LOUTR", NULL, "LOUT MIX"},
1517};
1518
1519static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = {
1520 {"ANC", NULL, "Stereo ADC MIXL"},
1521 {"ANC", NULL, "Stereo ADC MIXR"},
1522
1523 {"Audio DSP", NULL, "DAC MIXL"},
1524 {"Audio DSP", NULL, "DAC MIXR"},
1525
1526 {"DAC L2 Mux", "IF2", "IF2 DAC L"},
1527 {"DAC L2 Mux", "Base L/R", "Audio DSP"},
1528
1529 {"DAC R2 Mux", "IF2", "IF2 DAC R"},
1530
1531 {"Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1532 {"Stereo DAC MIXL", "ANC Switch", "ANC"},
1533 {"Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1534 {"Stereo DAC MIXR", "ANC Switch", "ANC"},
1535
1536 {"Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1537 {"Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
1538
1539 {"Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1540 {"Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
1541
1542 {"DIG MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1543 {"DIG MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1544
1545 {"DAC L2", NULL, "Mono DAC MIXL"},
1546 {"DAC L2", NULL, "PLL1", is_sys_clk_from_pll},
1547 {"DAC R2", NULL, "Mono DAC MIXR"},
1548 {"DAC R2", NULL, "PLL1", is_sys_clk_from_pll},
1549
1550 {"SPK MIXL", "DAC L2 Switch", "DAC L2"},
1551 {"SPK MIXR", "DAC R2 Switch", "DAC R2"},
1552
1553 {"OUT MIXL", "SPK MIXL Switch", "SPK MIXL"},
1554 {"OUT MIXR", "SPK MIXR Switch", "SPK MIXR"},
1555
1556 {"OUT MIXL", "DAC R2 Switch", "DAC R2"},
1557 {"OUT MIXL", "DAC L2 Switch", "DAC L2"},
1558
1559 {"OUT MIXR", "DAC L2 Switch", "DAC L2"},
1560 {"OUT MIXR", "DAC R2 Switch", "DAC R2"},
1561
1562 {"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"},
1563 {"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"},
1564
1565 {"Mono MIX", "DAC R2 Switch", "DAC R2"},
1566 {"Mono MIX", "DAC L2 Switch", "DAC L2"},
1567 {"Mono MIX", "OUTVOL R Switch", "OUTVOL R"},
1568 {"Mono MIX", "OUTVOL L Switch", "OUTVOL L"},
1569 {"Mono MIX", "BST1 Switch", "BST1"},
1570
1476 {"MONOP", NULL, "Mono MIX"}, 1571 {"MONOP", NULL, "Mono MIX"},
1477 {"MONON", NULL, "Mono MIX"}, 1572 {"MONON", NULL, "Mono MIX"},
1478 {"MONOP", NULL, "Improve MONO Amp Drv"}, 1573 {"MONOP", NULL, "Improve MONO Amp Drv"},
1479}; 1574};
1480 1575
1576static const struct snd_soc_dapm_route rt5639_specific_dapm_routes[] = {
1577 {"Stereo DAC MIXL", "DAC L2 Switch", "IF2 DAC L"},
1578 {"Stereo DAC MIXR", "DAC R2 Switch", "IF2 DAC R"},
1579
1580 {"Mono DAC MIXL", "DAC L2 Switch", "IF2 DAC L"},
1581 {"Mono DAC MIXL", "DAC R2 Switch", "IF2 DAC R"},
1582
1583 {"Mono DAC MIXR", "DAC R2 Switch", "IF2 DAC R"},
1584 {"Mono DAC MIXR", "DAC L2 Switch", "IF2 DAC L"},
1585
1586 {"DIG MIXL", "DAC L2 Switch", "IF2 DAC L"},
1587 {"DIG MIXR", "DAC R2 Switch", "IF2 DAC R"},
1588
1589 {"IF2 DAC L", NULL, "DAC L2 Filter"},
1590 {"IF2 DAC R", NULL, "DAC R2 Filter"},
1591};
1592
1481static int get_sdp_info(struct snd_soc_codec *codec, int dai_id) 1593static int get_sdp_info(struct snd_soc_codec *codec, int dai_id)
1482{ 1594{
1483 int ret = 0, val; 1595 int ret = 0, val;
@@ -1885,6 +1997,28 @@ static int rt5640_probe(struct snd_soc_codec *codec)
1885 snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030); 1997 snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030);
1886 snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00); 1998 snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00);
1887 1999
2000 switch (snd_soc_read(codec, RT5640_RESET)) {
2001 case RT5640_RESET_ID:
2002 snd_soc_add_codec_controls(codec,
2003 rt5640_specific_snd_controls,
2004 ARRAY_SIZE(rt5640_specific_snd_controls));
2005 snd_soc_dapm_new_controls(&codec->dapm,
2006 rt5640_specific_dapm_widgets,
2007 ARRAY_SIZE(rt5640_specific_dapm_widgets));
2008 snd_soc_dapm_add_routes(&codec->dapm,
2009 rt5640_specific_dapm_routes,
2010 ARRAY_SIZE(rt5640_specific_dapm_routes));
2011 break;
2012 case RT5639_RESET_ID:
2013 snd_soc_dapm_new_controls(&codec->dapm,
2014 rt5639_specific_dapm_widgets,
2015 ARRAY_SIZE(rt5639_specific_dapm_widgets));
2016 snd_soc_dapm_add_routes(&codec->dapm,
2017 rt5639_specific_dapm_routes,
2018 ARRAY_SIZE(rt5639_specific_dapm_routes));
2019 break;
2020 }
2021
1888 return 0; 2022 return 0;
1889} 2023}
1890 2024
diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h
index d7bd525caf85..3b50459a83b4 100644
--- a/sound/soc/codecs/rt5640.h
+++ b/sound/soc/codecs/rt5640.h
@@ -14,6 +14,9 @@
14 14
15#include <sound/rt5640.h> 15#include <sound/rt5640.h>
16 16
17#define RT5639_RESET_ID 0x0008
18#define RT5640_RESET_ID 0x000c
19
17/* Info */ 20/* Info */
18#define RT5640_RESET 0x00 21#define RT5640_RESET 0x00
19#define RT5640_VENDOR_ID 0xfd 22#define RT5640_VENDOR_ID 0xfd