diff options
author | Mark Brown <broonie@kernel.org> | 2015-05-06 06:58:24 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-05-06 06:58:24 -0400 |
commit | 292d2497cd8f551642a38f7a55b1b7965049c75d (patch) | |
tree | 1332204457623c47341dffbcd4ff33bf83599d47 | |
parent | 26f63c692f012ff665a8fd085a36549fe734f59f (diff) | |
parent | 177e1e1fbc63f6e4ac0fab56dcb61bb8c8597681 (diff) |
Merge branch 'topic/rt5645' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-intel
-rw-r--r-- | sound/soc/codecs/rt5645.c | 702 | ||||
-rw-r--r-- | sound/soc/codecs/rt5645.h | 28 | ||||
-rw-r--r-- | sound/soc/intel/boards/cht_bsw_rt5645.c | 2 |
3 files changed, 614 insertions, 118 deletions
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c index 69528ae5410c..7996c9ceff5c 100644 --- a/sound/soc/codecs/rt5645.c +++ b/sound/soc/codecs/rt5645.c | |||
@@ -18,6 +18,9 @@ | |||
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/spi/spi.h> | 19 | #include <linux/spi/spi.h> |
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | #include <linux/gpio/consumer.h> | ||
22 | #include <linux/acpi.h> | ||
23 | #include <linux/dmi.h> | ||
21 | #include <sound/core.h> | 24 | #include <sound/core.h> |
22 | #include <sound/pcm.h> | 25 | #include <sound/pcm.h> |
23 | #include <sound/pcm_params.h> | 26 | #include <sound/pcm_params.h> |
@@ -414,9 +417,9 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg) | |||
414 | } | 417 | } |
415 | 418 | ||
416 | static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); | 419 | static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); |
417 | static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); | 420 | static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0); |
418 | static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); | 421 | static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); |
419 | static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); | 422 | static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0); |
420 | static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); | 423 | static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); |
421 | 424 | ||
422 | /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ | 425 | /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ |
@@ -431,30 +434,6 @@ static unsigned int bst_tlv[] = { | |||
431 | 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0), | 434 | 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0), |
432 | }; | 435 | }; |
433 | 436 | ||
434 | static const char * const rt5645_tdm_data_swap_select[] = { | ||
435 | "L/R", "R/L", "L/L", "R/R" | ||
436 | }; | ||
437 | |||
438 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot0_1_enum, | ||
439 | RT5645_TDM_CTRL_1, 6, rt5645_tdm_data_swap_select); | ||
440 | |||
441 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot2_3_enum, | ||
442 | RT5645_TDM_CTRL_1, 4, rt5645_tdm_data_swap_select); | ||
443 | |||
444 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot4_5_enum, | ||
445 | RT5645_TDM_CTRL_1, 2, rt5645_tdm_data_swap_select); | ||
446 | |||
447 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot6_7_enum, | ||
448 | RT5645_TDM_CTRL_1, 0, rt5645_tdm_data_swap_select); | ||
449 | |||
450 | static const char * const rt5645_tdm_adc_data_select[] = { | ||
451 | "1/2/R", "2/1/R", "R/1/2", "R/2/1" | ||
452 | }; | ||
453 | |||
454 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_sel_enum, | ||
455 | RT5645_TDM_CTRL_1, 8, | ||
456 | rt5645_tdm_adc_data_select); | ||
457 | |||
458 | static const struct snd_kcontrol_new rt5645_snd_controls[] = { | 437 | static const struct snd_kcontrol_new rt5645_snd_controls[] = { |
459 | /* Speaker Output Volume */ | 438 | /* Speaker Output Volume */ |
460 | SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL, | 439 | SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL, |
@@ -480,9 +459,9 @@ static const struct snd_kcontrol_new rt5645_snd_controls[] = { | |||
480 | SOC_DOUBLE("DAC2 Playback Switch", RT5645_DAC_CTRL, | 459 | SOC_DOUBLE("DAC2 Playback Switch", RT5645_DAC_CTRL, |
481 | RT5645_M_DAC_L2_VOL_SFT, RT5645_M_DAC_R2_VOL_SFT, 1, 1), | 460 | RT5645_M_DAC_L2_VOL_SFT, RT5645_M_DAC_R2_VOL_SFT, 1, 1), |
482 | SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5645_DAC1_DIG_VOL, | 461 | SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5645_DAC1_DIG_VOL, |
483 | RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 175, 0, dac_vol_tlv), | 462 | RT5645_L_VOL_SFT + 1, RT5645_R_VOL_SFT + 1, 87, 0, dac_vol_tlv), |
484 | SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5645_DAC2_DIG_VOL, | 463 | SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5645_DAC2_DIG_VOL, |
485 | RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 175, 0, dac_vol_tlv), | 464 | RT5645_L_VOL_SFT + 1, RT5645_R_VOL_SFT + 1, 87, 0, dac_vol_tlv), |
486 | 465 | ||
487 | /* IN1/IN2 Control */ | 466 | /* IN1/IN2 Control */ |
488 | SOC_SINGLE_TLV("IN1 Boost", RT5645_IN1_CTRL1, | 467 | SOC_SINGLE_TLV("IN1 Boost", RT5645_IN1_CTRL1, |
@@ -498,11 +477,11 @@ static const struct snd_kcontrol_new rt5645_snd_controls[] = { | |||
498 | SOC_DOUBLE("ADC Capture Switch", RT5645_STO1_ADC_DIG_VOL, | 477 | SOC_DOUBLE("ADC Capture Switch", RT5645_STO1_ADC_DIG_VOL, |
499 | RT5645_L_MUTE_SFT, RT5645_R_MUTE_SFT, 1, 1), | 478 | RT5645_L_MUTE_SFT, RT5645_R_MUTE_SFT, 1, 1), |
500 | SOC_DOUBLE_TLV("ADC Capture Volume", RT5645_STO1_ADC_DIG_VOL, | 479 | SOC_DOUBLE_TLV("ADC Capture Volume", RT5645_STO1_ADC_DIG_VOL, |
501 | RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 127, 0, adc_vol_tlv), | 480 | RT5645_L_VOL_SFT + 1, RT5645_R_VOL_SFT + 1, 63, 0, adc_vol_tlv), |
502 | SOC_DOUBLE("Mono ADC Capture Switch", RT5645_MONO_ADC_DIG_VOL, | 481 | SOC_DOUBLE("Mono ADC Capture Switch", RT5645_MONO_ADC_DIG_VOL, |
503 | RT5645_L_MUTE_SFT, RT5645_R_MUTE_SFT, 1, 1), | 482 | RT5645_L_MUTE_SFT, RT5645_R_MUTE_SFT, 1, 1), |
504 | SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5645_MONO_ADC_DIG_VOL, | 483 | SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5645_MONO_ADC_DIG_VOL, |
505 | RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 127, 0, adc_vol_tlv), | 484 | RT5645_L_VOL_SFT + 1, RT5645_R_VOL_SFT + 1, 63, 0, adc_vol_tlv), |
506 | 485 | ||
507 | /* ADC Boost Volume Control */ | 486 | /* ADC Boost Volume Control */ |
508 | SOC_DOUBLE_TLV("STO1 ADC Boost Gain", RT5645_ADC_BST_VOL1, | 487 | SOC_DOUBLE_TLV("STO1 ADC Boost Gain", RT5645_ADC_BST_VOL1, |
@@ -515,17 +494,6 @@ static const struct snd_kcontrol_new rt5645_snd_controls[] = { | |||
515 | /* I2S2 function select */ | 494 | /* I2S2 function select */ |
516 | SOC_SINGLE("I2S2 Func Switch", RT5645_GPIO_CTRL1, RT5645_I2S2_SEL_SFT, | 495 | SOC_SINGLE("I2S2 Func Switch", RT5645_GPIO_CTRL1, RT5645_I2S2_SEL_SFT, |
517 | 1, 1), | 496 | 1, 1), |
518 | |||
519 | /* TDM */ | ||
520 | SOC_ENUM("TDM Adc Slot0 1 Data", rt5645_tdm_adc_slot0_1_enum), | ||
521 | SOC_ENUM("TDM Adc Slot2 3 Data", rt5645_tdm_adc_slot2_3_enum), | ||
522 | SOC_ENUM("TDM Adc Slot4 5 Data", rt5645_tdm_adc_slot4_5_enum), | ||
523 | SOC_ENUM("TDM Adc Slot6 7 Data", rt5645_tdm_adc_slot6_7_enum), | ||
524 | SOC_ENUM("TDM IF1 ADC DATA Sel", rt5645_tdm_adc_sel_enum), | ||
525 | SOC_SINGLE("TDM IF1_DAC1_L Sel", RT5645_TDM_CTRL_3, 12, 7, 0), | ||
526 | SOC_SINGLE("TDM IF1_DAC1_R Sel", RT5645_TDM_CTRL_3, 8, 7, 0), | ||
527 | SOC_SINGLE("TDM IF1_DAC2_L Sel", RT5645_TDM_CTRL_3, 4, 7, 0), | ||
528 | SOC_SINGLE("TDM IF1_DAC2_R Sel", RT5645_TDM_CTRL_3, 0, 7, 0), | ||
529 | }; | 497 | }; |
530 | 498 | ||
531 | /** | 499 | /** |
@@ -1092,7 +1060,8 @@ static const struct snd_kcontrol_new rt5645_mono_adc_r2_mux = | |||
1092 | 1060 | ||
1093 | /* MX-77 [9:8] */ | 1061 | /* MX-77 [9:8] */ |
1094 | static const char * const rt5645_if1_adc_in_src[] = { | 1062 | static const char * const rt5645_if1_adc_in_src[] = { |
1095 | "IF_ADC1", "IF_ADC2", "VAD_ADC" | 1063 | "IF_ADC1/IF_ADC2/VAD_ADC", "IF_ADC2/IF_ADC1/VAD_ADC", |
1064 | "VAD_ADC/IF_ADC1/IF_ADC2", "VAD_ADC/IF_ADC2/IF_ADC1" | ||
1096 | }; | 1065 | }; |
1097 | 1066 | ||
1098 | static SOC_ENUM_SINGLE_DECL( | 1067 | static SOC_ENUM_SINGLE_DECL( |
@@ -1102,6 +1071,140 @@ static SOC_ENUM_SINGLE_DECL( | |||
1102 | static const struct snd_kcontrol_new rt5645_if1_adc_in_mux = | 1071 | static const struct snd_kcontrol_new rt5645_if1_adc_in_mux = |
1103 | SOC_DAPM_ENUM("IF1 ADC IN source", rt5645_if1_adc_in_enum); | 1072 | SOC_DAPM_ENUM("IF1 ADC IN source", rt5645_if1_adc_in_enum); |
1104 | 1073 | ||
1074 | /* MX-78 [4:0] */ | ||
1075 | static const char * const rt5650_if1_adc_in_src[] = { | ||
1076 | "IF_ADC1/IF_ADC2/DAC_REF/Null", | ||
1077 | "IF_ADC1/IF_ADC2/Null/DAC_REF", | ||
1078 | "IF_ADC1/DAC_REF/IF_ADC2/Null", | ||
1079 | "IF_ADC1/DAC_REF/Null/IF_ADC2", | ||
1080 | "IF_ADC1/Null/DAC_REF/IF_ADC2", | ||
1081 | "IF_ADC1/Null/IF_ADC2/DAC_REF", | ||
1082 | |||
1083 | "IF_ADC2/IF_ADC1/DAC_REF/Null", | ||
1084 | "IF_ADC2/IF_ADC1/Null/DAC_REF", | ||
1085 | "IF_ADC2/DAC_REF/IF_ADC1/Null", | ||
1086 | "IF_ADC2/DAC_REF/Null/IF_ADC1", | ||
1087 | "IF_ADC2/Null/DAC_REF/IF_ADC1", | ||
1088 | "IF_ADC2/Null/IF_ADC1/DAC_REF", | ||
1089 | |||
1090 | "DAC_REF/IF_ADC1/IF_ADC2/Null", | ||
1091 | "DAC_REF/IF_ADC1/Null/IF_ADC2", | ||
1092 | "DAC_REF/IF_ADC2/IF_ADC1/Null", | ||
1093 | "DAC_REF/IF_ADC2/Null/IF_ADC1", | ||
1094 | "DAC_REF/Null/IF_ADC1/IF_ADC2", | ||
1095 | "DAC_REF/Null/IF_ADC2/IF_ADC1", | ||
1096 | |||
1097 | "Null/IF_ADC1/IF_ADC2/DAC_REF", | ||
1098 | "Null/IF_ADC1/DAC_REF/IF_ADC2", | ||
1099 | "Null/IF_ADC2/IF_ADC1/DAC_REF", | ||
1100 | "Null/IF_ADC2/DAC_REF/IF_ADC1", | ||
1101 | "Null/DAC_REF/IF_ADC1/IF_ADC2", | ||
1102 | "Null/DAC_REF/IF_ADC2/IF_ADC1", | ||
1103 | }; | ||
1104 | |||
1105 | static SOC_ENUM_SINGLE_DECL( | ||
1106 | rt5650_if1_adc_in_enum, RT5645_TDM_CTRL_2, | ||
1107 | 0, rt5650_if1_adc_in_src); | ||
1108 | |||
1109 | static const struct snd_kcontrol_new rt5650_if1_adc_in_mux = | ||
1110 | SOC_DAPM_ENUM("IF1 ADC IN source", rt5650_if1_adc_in_enum); | ||
1111 | |||
1112 | /* MX-78 [15:14][13:12][11:10] */ | ||
1113 | static const char * const rt5645_tdm_adc_swap_select[] = { | ||
1114 | "L/R", "R/L", "L/L", "R/R" | ||
1115 | }; | ||
1116 | |||
1117 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_adc_slot0_1_enum, | ||
1118 | RT5645_TDM_CTRL_2, 14, rt5645_tdm_adc_swap_select); | ||
1119 | |||
1120 | static const struct snd_kcontrol_new rt5650_if1_adc1_in_mux = | ||
1121 | SOC_DAPM_ENUM("IF1 ADC1 IN source", rt5650_tdm_adc_slot0_1_enum); | ||
1122 | |||
1123 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_adc_slot2_3_enum, | ||
1124 | RT5645_TDM_CTRL_2, 12, rt5645_tdm_adc_swap_select); | ||
1125 | |||
1126 | static const struct snd_kcontrol_new rt5650_if1_adc2_in_mux = | ||
1127 | SOC_DAPM_ENUM("IF1 ADC2 IN source", rt5650_tdm_adc_slot2_3_enum); | ||
1128 | |||
1129 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_adc_slot4_5_enum, | ||
1130 | RT5645_TDM_CTRL_2, 10, rt5645_tdm_adc_swap_select); | ||
1131 | |||
1132 | static const struct snd_kcontrol_new rt5650_if1_adc3_in_mux = | ||
1133 | SOC_DAPM_ENUM("IF1 ADC3 IN source", rt5650_tdm_adc_slot4_5_enum); | ||
1134 | |||
1135 | /* MX-77 [7:6][5:4][3:2] */ | ||
1136 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot0_1_enum, | ||
1137 | RT5645_TDM_CTRL_1, 6, rt5645_tdm_adc_swap_select); | ||
1138 | |||
1139 | static const struct snd_kcontrol_new rt5645_if1_adc1_in_mux = | ||
1140 | SOC_DAPM_ENUM("IF1 ADC1 IN source", rt5645_tdm_adc_slot0_1_enum); | ||
1141 | |||
1142 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot2_3_enum, | ||
1143 | RT5645_TDM_CTRL_1, 4, rt5645_tdm_adc_swap_select); | ||
1144 | |||
1145 | static const struct snd_kcontrol_new rt5645_if1_adc2_in_mux = | ||
1146 | SOC_DAPM_ENUM("IF1 ADC2 IN source", rt5645_tdm_adc_slot2_3_enum); | ||
1147 | |||
1148 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot4_5_enum, | ||
1149 | RT5645_TDM_CTRL_1, 2, rt5645_tdm_adc_swap_select); | ||
1150 | |||
1151 | static const struct snd_kcontrol_new rt5645_if1_adc3_in_mux = | ||
1152 | SOC_DAPM_ENUM("IF1 ADC3 IN source", rt5645_tdm_adc_slot4_5_enum); | ||
1153 | |||
1154 | /* MX-79 [14:12][10:8][6:4][2:0] */ | ||
1155 | static const char * const rt5645_tdm_dac_swap_select[] = { | ||
1156 | "Slot0", "Slot1", "Slot2", "Slot3" | ||
1157 | }; | ||
1158 | |||
1159 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac0_enum, | ||
1160 | RT5645_TDM_CTRL_3, 12, rt5645_tdm_dac_swap_select); | ||
1161 | |||
1162 | static const struct snd_kcontrol_new rt5645_if1_dac0_tdm_sel_mux = | ||
1163 | SOC_DAPM_ENUM("IF1 DAC0 source", rt5645_tdm_dac0_enum); | ||
1164 | |||
1165 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac1_enum, | ||
1166 | RT5645_TDM_CTRL_3, 8, rt5645_tdm_dac_swap_select); | ||
1167 | |||
1168 | static const struct snd_kcontrol_new rt5645_if1_dac1_tdm_sel_mux = | ||
1169 | SOC_DAPM_ENUM("IF1 DAC1 source", rt5645_tdm_dac1_enum); | ||
1170 | |||
1171 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac2_enum, | ||
1172 | RT5645_TDM_CTRL_3, 4, rt5645_tdm_dac_swap_select); | ||
1173 | |||
1174 | static const struct snd_kcontrol_new rt5645_if1_dac2_tdm_sel_mux = | ||
1175 | SOC_DAPM_ENUM("IF1 DAC2 source", rt5645_tdm_dac2_enum); | ||
1176 | |||
1177 | static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac3_enum, | ||
1178 | RT5645_TDM_CTRL_3, 0, rt5645_tdm_dac_swap_select); | ||
1179 | |||
1180 | static const struct snd_kcontrol_new rt5645_if1_dac3_tdm_sel_mux = | ||
1181 | SOC_DAPM_ENUM("IF1 DAC3 source", rt5645_tdm_dac3_enum); | ||
1182 | |||
1183 | /* MX-7a [14:12][10:8][6:4][2:0] */ | ||
1184 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac0_enum, | ||
1185 | RT5650_TDM_CTRL_4, 12, rt5645_tdm_dac_swap_select); | ||
1186 | |||
1187 | static const struct snd_kcontrol_new rt5650_if1_dac0_tdm_sel_mux = | ||
1188 | SOC_DAPM_ENUM("IF1 DAC0 source", rt5650_tdm_dac0_enum); | ||
1189 | |||
1190 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac1_enum, | ||
1191 | RT5650_TDM_CTRL_4, 8, rt5645_tdm_dac_swap_select); | ||
1192 | |||
1193 | static const struct snd_kcontrol_new rt5650_if1_dac1_tdm_sel_mux = | ||
1194 | SOC_DAPM_ENUM("IF1 DAC1 source", rt5650_tdm_dac1_enum); | ||
1195 | |||
1196 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac2_enum, | ||
1197 | RT5650_TDM_CTRL_4, 4, rt5645_tdm_dac_swap_select); | ||
1198 | |||
1199 | static const struct snd_kcontrol_new rt5650_if1_dac2_tdm_sel_mux = | ||
1200 | SOC_DAPM_ENUM("IF1 DAC2 source", rt5650_tdm_dac2_enum); | ||
1201 | |||
1202 | static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac3_enum, | ||
1203 | RT5650_TDM_CTRL_4, 0, rt5645_tdm_dac_swap_select); | ||
1204 | |||
1205 | static const struct snd_kcontrol_new rt5650_if1_dac3_tdm_sel_mux = | ||
1206 | SOC_DAPM_ENUM("IF1 DAC3 source", rt5650_tdm_dac3_enum); | ||
1207 | |||
1105 | /* MX-2d [3] [2] */ | 1208 | /* MX-2d [3] [2] */ |
1106 | static const char * const rt5650_a_dac1_src[] = { | 1209 | static const char * const rt5650_a_dac1_src[] = { |
1107 | "DAC1", "Stereo DAC Mixer" | 1210 | "DAC1", "Stereo DAC Mixer" |
@@ -1570,8 +1673,24 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = { | |||
1570 | SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0), | 1673 | SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0), |
1571 | 1674 | ||
1572 | /* IF1 2 Mux */ | 1675 | /* IF1 2 Mux */ |
1573 | SND_SOC_DAPM_MUX("IF1 ADC Mux", SND_SOC_NOPM, | 1676 | SND_SOC_DAPM_MUX("RT5645 IF1 ADC1 Swap Mux", SND_SOC_NOPM, |
1677 | 0, 0, &rt5645_if1_adc1_in_mux), | ||
1678 | SND_SOC_DAPM_MUX("RT5645 IF1 ADC2 Swap Mux", SND_SOC_NOPM, | ||
1679 | 0, 0, &rt5645_if1_adc2_in_mux), | ||
1680 | SND_SOC_DAPM_MUX("RT5645 IF1 ADC3 Swap Mux", SND_SOC_NOPM, | ||
1681 | 0, 0, &rt5645_if1_adc3_in_mux), | ||
1682 | SND_SOC_DAPM_MUX("RT5645 IF1 ADC Mux", SND_SOC_NOPM, | ||
1574 | 0, 0, &rt5645_if1_adc_in_mux), | 1683 | 0, 0, &rt5645_if1_adc_in_mux), |
1684 | |||
1685 | SND_SOC_DAPM_MUX("RT5650 IF1 ADC1 Swap Mux", SND_SOC_NOPM, | ||
1686 | 0, 0, &rt5650_if1_adc1_in_mux), | ||
1687 | SND_SOC_DAPM_MUX("RT5650 IF1 ADC2 Swap Mux", SND_SOC_NOPM, | ||
1688 | 0, 0, &rt5650_if1_adc2_in_mux), | ||
1689 | SND_SOC_DAPM_MUX("RT5650 IF1 ADC3 Swap Mux", SND_SOC_NOPM, | ||
1690 | 0, 0, &rt5650_if1_adc3_in_mux), | ||
1691 | SND_SOC_DAPM_MUX("RT5650 IF1 ADC Mux", SND_SOC_NOPM, | ||
1692 | 0, 0, &rt5650_if1_adc_in_mux), | ||
1693 | |||
1575 | SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, | 1694 | SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, |
1576 | 0, 0, &rt5645_if2_adc_in_mux), | 1695 | 0, 0, &rt5645_if2_adc_in_mux), |
1577 | 1696 | ||
@@ -1580,10 +1699,22 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = { | |||
1580 | RT5645_PWR_I2S1_BIT, 0, NULL, 0), | 1699 | RT5645_PWR_I2S1_BIT, 0, NULL, 0), |
1581 | SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0), | 1700 | SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0), |
1582 | SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0), | 1701 | SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0), |
1583 | SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), | 1702 | SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 L Mux", SND_SOC_NOPM, 0, 0, |
1584 | SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0), | 1703 | &rt5645_if1_dac0_tdm_sel_mux), |
1585 | SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0), | 1704 | SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 R Mux", SND_SOC_NOPM, 0, 0, |
1586 | SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0), | 1705 | &rt5645_if1_dac1_tdm_sel_mux), |
1706 | SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 L Mux", SND_SOC_NOPM, 0, 0, | ||
1707 | &rt5645_if1_dac2_tdm_sel_mux), | ||
1708 | SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 R Mux", SND_SOC_NOPM, 0, 0, | ||
1709 | &rt5645_if1_dac3_tdm_sel_mux), | ||
1710 | SND_SOC_DAPM_MUX("RT5650 IF1 DAC1 L Mux", SND_SOC_NOPM, 0, 0, | ||
1711 | &rt5650_if1_dac0_tdm_sel_mux), | ||
1712 | SND_SOC_DAPM_MUX("RT5650 IF1 DAC1 R Mux", SND_SOC_NOPM, 0, 0, | ||
1713 | &rt5650_if1_dac1_tdm_sel_mux), | ||
1714 | SND_SOC_DAPM_MUX("RT5650 IF1 DAC2 L Mux", SND_SOC_NOPM, 0, 0, | ||
1715 | &rt5650_if1_dac2_tdm_sel_mux), | ||
1716 | SND_SOC_DAPM_MUX("RT5650 IF1 DAC2 R Mux", SND_SOC_NOPM, 0, 0, | ||
1717 | &rt5650_if1_dac3_tdm_sel_mux), | ||
1587 | SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0), | 1718 | SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0), |
1588 | SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0), | 1719 | SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0), |
1589 | SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0), | 1720 | SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0), |
@@ -1847,42 +1978,32 @@ static const struct snd_soc_dapm_route rt5645_dapm_routes[] = { | |||
1847 | { "IF_ADC2", NULL, "Mono ADC MIXR" }, | 1978 | { "IF_ADC2", NULL, "Mono ADC MIXR" }, |
1848 | { "VAD_ADC", NULL, "VAD ADC Mux" }, | 1979 | { "VAD_ADC", NULL, "VAD ADC Mux" }, |
1849 | 1980 | ||
1850 | { "IF1 ADC Mux", "IF_ADC1", "IF_ADC1" }, | ||
1851 | { "IF1 ADC Mux", "IF_ADC2", "IF_ADC2" }, | ||
1852 | { "IF1 ADC Mux", "VAD_ADC", "VAD_ADC" }, | ||
1853 | |||
1854 | { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" }, | 1981 | { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" }, |
1855 | { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" }, | 1982 | { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" }, |
1856 | { "IF2 ADC Mux", "VAD_ADC", "VAD_ADC" }, | 1983 | { "IF2 ADC Mux", "VAD_ADC", "VAD_ADC" }, |
1857 | 1984 | ||
1858 | { "IF1 ADC", NULL, "I2S1" }, | 1985 | { "IF1 ADC", NULL, "I2S1" }, |
1859 | { "IF1 ADC", NULL, "IF1 ADC Mux" }, | ||
1860 | { "IF2 ADC", NULL, "I2S2" }, | 1986 | { "IF2 ADC", NULL, "I2S2" }, |
1861 | { "IF2 ADC", NULL, "IF2 ADC Mux" }, | 1987 | { "IF2 ADC", NULL, "IF2 ADC Mux" }, |
1862 | 1988 | ||
1863 | { "AIF1TX", NULL, "IF1 ADC" }, | ||
1864 | { "AIF1TX", NULL, "IF2 ADC" }, | ||
1865 | { "AIF2TX", NULL, "IF2 ADC" }, | 1989 | { "AIF2TX", NULL, "IF2 ADC" }, |
1866 | 1990 | ||
1991 | { "IF1 DAC0", NULL, "AIF1RX" }, | ||
1867 | { "IF1 DAC1", NULL, "AIF1RX" }, | 1992 | { "IF1 DAC1", NULL, "AIF1RX" }, |
1868 | { "IF1 DAC2", NULL, "AIF1RX" }, | 1993 | { "IF1 DAC2", NULL, "AIF1RX" }, |
1994 | { "IF1 DAC3", NULL, "AIF1RX" }, | ||
1869 | { "IF2 DAC", NULL, "AIF2RX" }, | 1995 | { "IF2 DAC", NULL, "AIF2RX" }, |
1870 | 1996 | ||
1997 | { "IF1 DAC0", NULL, "I2S1" }, | ||
1871 | { "IF1 DAC1", NULL, "I2S1" }, | 1998 | { "IF1 DAC1", NULL, "I2S1" }, |
1872 | { "IF1 DAC2", NULL, "I2S1" }, | 1999 | { "IF1 DAC2", NULL, "I2S1" }, |
2000 | { "IF1 DAC3", NULL, "I2S1" }, | ||
1873 | { "IF2 DAC", NULL, "I2S2" }, | 2001 | { "IF2 DAC", NULL, "I2S2" }, |
1874 | 2002 | ||
1875 | { "IF1 DAC2 L", NULL, "IF1 DAC2" }, | ||
1876 | { "IF1 DAC2 R", NULL, "IF1 DAC2" }, | ||
1877 | { "IF1 DAC1 L", NULL, "IF1 DAC1" }, | ||
1878 | { "IF1 DAC1 R", NULL, "IF1 DAC1" }, | ||
1879 | { "IF2 DAC L", NULL, "IF2 DAC" }, | 2003 | { "IF2 DAC L", NULL, "IF2 DAC" }, |
1880 | { "IF2 DAC R", NULL, "IF2 DAC" }, | 2004 | { "IF2 DAC R", NULL, "IF2 DAC" }, |
1881 | 2005 | ||
1882 | { "DAC1 L Mux", "IF1 DAC", "IF1 DAC1 L" }, | ||
1883 | { "DAC1 L Mux", "IF2 DAC", "IF2 DAC L" }, | 2006 | { "DAC1 L Mux", "IF2 DAC", "IF2 DAC L" }, |
1884 | |||
1885 | { "DAC1 R Mux", "IF1 DAC", "IF1 DAC1 R" }, | ||
1886 | { "DAC1 R Mux", "IF2 DAC", "IF2 DAC R" }, | 2007 | { "DAC1 R Mux", "IF2 DAC", "IF2 DAC R" }, |
1887 | 2008 | ||
1888 | { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" }, | 2009 | { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" }, |
@@ -1892,14 +2013,12 @@ static const struct snd_soc_dapm_route rt5645_dapm_routes[] = { | |||
1892 | { "DAC1 MIXR", "DAC1 Switch", "DAC1 R Mux" }, | 2013 | { "DAC1 MIXR", "DAC1 Switch", "DAC1 R Mux" }, |
1893 | { "DAC1 MIXR", NULL, "dac stereo1 filter" }, | 2014 | { "DAC1 MIXR", NULL, "dac stereo1 filter" }, |
1894 | 2015 | ||
1895 | { "DAC L2 Mux", "IF1 DAC", "IF1 DAC2 L" }, | ||
1896 | { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" }, | 2016 | { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" }, |
1897 | { "DAC L2 Mux", "Mono ADC", "Mono ADC MIXL" }, | 2017 | { "DAC L2 Mux", "Mono ADC", "Mono ADC MIXL" }, |
1898 | { "DAC L2 Mux", "VAD_ADC", "VAD_ADC" }, | 2018 | { "DAC L2 Mux", "VAD_ADC", "VAD_ADC" }, |
1899 | { "DAC L2 Volume", NULL, "DAC L2 Mux" }, | 2019 | { "DAC L2 Volume", NULL, "DAC L2 Mux" }, |
1900 | { "DAC L2 Volume", NULL, "dac mono left filter" }, | 2020 | { "DAC L2 Volume", NULL, "dac mono left filter" }, |
1901 | 2021 | ||
1902 | { "DAC R2 Mux", "IF1 DAC", "IF1 DAC2 R" }, | ||
1903 | { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" }, | 2022 | { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" }, |
1904 | { "DAC R2 Mux", "Mono ADC", "Mono ADC MIXR" }, | 2023 | { "DAC R2 Mux", "Mono ADC", "Mono ADC MIXR" }, |
1905 | { "DAC R2 Mux", "Haptic", "Haptic Generator" }, | 2024 | { "DAC R2 Mux", "Haptic", "Haptic Generator" }, |
@@ -2037,6 +2156,80 @@ static const struct snd_soc_dapm_route rt5650_specific_dapm_routes[] = { | |||
2037 | { "DAC R1", NULL, "A DAC1 R Mux" }, | 2156 | { "DAC R1", NULL, "A DAC1 R Mux" }, |
2038 | { "DAC L2", NULL, "A DAC2 L Mux" }, | 2157 | { "DAC L2", NULL, "A DAC2 L Mux" }, |
2039 | { "DAC R2", NULL, "A DAC2 R Mux" }, | 2158 | { "DAC R2", NULL, "A DAC2 R Mux" }, |
2159 | |||
2160 | { "RT5650 IF1 ADC1 Swap Mux", "L/R", "IF_ADC1" }, | ||
2161 | { "RT5650 IF1 ADC1 Swap Mux", "R/L", "IF_ADC1" }, | ||
2162 | { "RT5650 IF1 ADC1 Swap Mux", "L/L", "IF_ADC1" }, | ||
2163 | { "RT5650 IF1 ADC1 Swap Mux", "R/R", "IF_ADC1" }, | ||
2164 | |||
2165 | { "RT5650 IF1 ADC2 Swap Mux", "L/R", "IF_ADC2" }, | ||
2166 | { "RT5650 IF1 ADC2 Swap Mux", "R/L", "IF_ADC2" }, | ||
2167 | { "RT5650 IF1 ADC2 Swap Mux", "L/L", "IF_ADC2" }, | ||
2168 | { "RT5650 IF1 ADC2 Swap Mux", "R/R", "IF_ADC2" }, | ||
2169 | |||
2170 | { "RT5650 IF1 ADC3 Swap Mux", "L/R", "VAD_ADC" }, | ||
2171 | { "RT5650 IF1 ADC3 Swap Mux", "R/L", "VAD_ADC" }, | ||
2172 | { "RT5650 IF1 ADC3 Swap Mux", "L/L", "VAD_ADC" }, | ||
2173 | { "RT5650 IF1 ADC3 Swap Mux", "R/R", "VAD_ADC" }, | ||
2174 | |||
2175 | { "IF1 ADC", NULL, "RT5650 IF1 ADC1 Swap Mux" }, | ||
2176 | { "IF1 ADC", NULL, "RT5650 IF1 ADC2 Swap Mux" }, | ||
2177 | { "IF1 ADC", NULL, "RT5650 IF1 ADC3 Swap Mux" }, | ||
2178 | |||
2179 | { "RT5650 IF1 ADC Mux", "IF_ADC1/IF_ADC2/DAC_REF/Null", "IF1 ADC" }, | ||
2180 | { "RT5650 IF1 ADC Mux", "IF_ADC1/IF_ADC2/Null/DAC_REF", "IF1 ADC" }, | ||
2181 | { "RT5650 IF1 ADC Mux", "IF_ADC1/DAC_REF/IF_ADC2/Null", "IF1 ADC" }, | ||
2182 | { "RT5650 IF1 ADC Mux", "IF_ADC1/DAC_REF/Null/IF_ADC2", "IF1 ADC" }, | ||
2183 | { "RT5650 IF1 ADC Mux", "IF_ADC1/Null/DAC_REF/IF_ADC2", "IF1 ADC" }, | ||
2184 | { "RT5650 IF1 ADC Mux", "IF_ADC1/Null/IF_ADC2/DAC_REF", "IF1 ADC" }, | ||
2185 | |||
2186 | { "RT5650 IF1 ADC Mux", "IF_ADC2/IF_ADC1/DAC_REF/Null", "IF1 ADC" }, | ||
2187 | { "RT5650 IF1 ADC Mux", "IF_ADC2/IF_ADC1/Null/DAC_REF", "IF1 ADC" }, | ||
2188 | { "RT5650 IF1 ADC Mux", "IF_ADC2/DAC_REF/IF_ADC1/Null", "IF1 ADC" }, | ||
2189 | { "RT5650 IF1 ADC Mux", "IF_ADC2/DAC_REF/Null/IF_ADC1", "IF1 ADC" }, | ||
2190 | { "RT5650 IF1 ADC Mux", "IF_ADC2/Null/DAC_REF/IF_ADC1", "IF1 ADC" }, | ||
2191 | { "RT5650 IF1 ADC Mux", "IF_ADC2/Null/IF_ADC1/DAC_REF", "IF1 ADC" }, | ||
2192 | |||
2193 | { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC1/IF_ADC2/Null", "IF1 ADC" }, | ||
2194 | { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC1/Null/IF_ADC2", "IF1 ADC" }, | ||
2195 | { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC2/IF_ADC1/Null", "IF1 ADC" }, | ||
2196 | { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC2/Null/IF_ADC1", "IF1 ADC" }, | ||
2197 | { "RT5650 IF1 ADC Mux", "DAC_REF/Null/IF_ADC1/IF_ADC2", "IF1 ADC" }, | ||
2198 | { "RT5650 IF1 ADC Mux", "DAC_REF/Null/IF_ADC2/IF_ADC1", "IF1 ADC" }, | ||
2199 | |||
2200 | { "RT5650 IF1 ADC Mux", "Null/IF_ADC1/IF_ADC2/DAC_REF", "IF1 ADC" }, | ||
2201 | { "RT5650 IF1 ADC Mux", "Null/IF_ADC1/DAC_REF/IF_ADC2", "IF1 ADC" }, | ||
2202 | { "RT5650 IF1 ADC Mux", "Null/IF_ADC2/IF_ADC1/DAC_REF", "IF1 ADC" }, | ||
2203 | { "RT5650 IF1 ADC Mux", "Null/IF_ADC2/DAC_REF/IF_ADC1", "IF1 ADC" }, | ||
2204 | { "RT5650 IF1 ADC Mux", "Null/DAC_REF/IF_ADC1/IF_ADC2", "IF1 ADC" }, | ||
2205 | { "RT5650 IF1 ADC Mux", "Null/DAC_REF/IF_ADC2/IF_ADC1", "IF1 ADC" }, | ||
2206 | { "AIF1TX", NULL, "RT5650 IF1 ADC Mux" }, | ||
2207 | |||
2208 | { "RT5650 IF1 DAC1 L Mux", "Slot0", "IF1 DAC0" }, | ||
2209 | { "RT5650 IF1 DAC1 L Mux", "Slot1", "IF1 DAC1" }, | ||
2210 | { "RT5650 IF1 DAC1 L Mux", "Slot2", "IF1 DAC2" }, | ||
2211 | { "RT5650 IF1 DAC1 L Mux", "Slot3", "IF1 DAC3" }, | ||
2212 | |||
2213 | { "RT5650 IF1 DAC1 R Mux", "Slot0", "IF1 DAC0" }, | ||
2214 | { "RT5650 IF1 DAC1 R Mux", "Slot1", "IF1 DAC1" }, | ||
2215 | { "RT5650 IF1 DAC1 R Mux", "Slot2", "IF1 DAC2" }, | ||
2216 | { "RT5650 IF1 DAC1 R Mux", "Slot3", "IF1 DAC3" }, | ||
2217 | |||
2218 | { "RT5650 IF1 DAC2 L Mux", "Slot0", "IF1 DAC0" }, | ||
2219 | { "RT5650 IF1 DAC2 L Mux", "Slot1", "IF1 DAC1" }, | ||
2220 | { "RT5650 IF1 DAC2 L Mux", "Slot2", "IF1 DAC2" }, | ||
2221 | { "RT5650 IF1 DAC2 L Mux", "Slot3", "IF1 DAC3" }, | ||
2222 | |||
2223 | { "RT5650 IF1 DAC2 R Mux", "Slot0", "IF1 DAC0" }, | ||
2224 | { "RT5650 IF1 DAC2 R Mux", "Slot1", "IF1 DAC1" }, | ||
2225 | { "RT5650 IF1 DAC2 R Mux", "Slot2", "IF1 DAC2" }, | ||
2226 | { "RT5650 IF1 DAC2 R Mux", "Slot3", "IF1 DAC3" }, | ||
2227 | |||
2228 | { "DAC1 L Mux", "IF1 DAC", "RT5650 IF1 DAC1 L Mux" }, | ||
2229 | { "DAC1 R Mux", "IF1 DAC", "RT5650 IF1 DAC1 R Mux" }, | ||
2230 | |||
2231 | { "DAC L2 Mux", "IF1 DAC", "RT5650 IF1 DAC2 L Mux" }, | ||
2232 | { "DAC R2 Mux", "IF1 DAC", "RT5650 IF1 DAC2 R Mux" }, | ||
2040 | }; | 2233 | }; |
2041 | 2234 | ||
2042 | static const struct snd_soc_dapm_route rt5645_specific_dapm_routes[] = { | 2235 | static const struct snd_soc_dapm_route rt5645_specific_dapm_routes[] = { |
@@ -2044,6 +2237,57 @@ static const struct snd_soc_dapm_route rt5645_specific_dapm_routes[] = { | |||
2044 | { "DAC R1", NULL, "Stereo DAC MIXR" }, | 2237 | { "DAC R1", NULL, "Stereo DAC MIXR" }, |
2045 | { "DAC L2", NULL, "Mono DAC MIXL" }, | 2238 | { "DAC L2", NULL, "Mono DAC MIXL" }, |
2046 | { "DAC R2", NULL, "Mono DAC MIXR" }, | 2239 | { "DAC R2", NULL, "Mono DAC MIXR" }, |
2240 | |||
2241 | { "RT5645 IF1 ADC1 Swap Mux", "L/R", "IF_ADC1" }, | ||
2242 | { "RT5645 IF1 ADC1 Swap Mux", "R/L", "IF_ADC1" }, | ||
2243 | { "RT5645 IF1 ADC1 Swap Mux", "L/L", "IF_ADC1" }, | ||
2244 | { "RT5645 IF1 ADC1 Swap Mux", "R/R", "IF_ADC1" }, | ||
2245 | |||
2246 | { "RT5645 IF1 ADC2 Swap Mux", "L/R", "IF_ADC2" }, | ||
2247 | { "RT5645 IF1 ADC2 Swap Mux", "R/L", "IF_ADC2" }, | ||
2248 | { "RT5645 IF1 ADC2 Swap Mux", "L/L", "IF_ADC2" }, | ||
2249 | { "RT5645 IF1 ADC2 Swap Mux", "R/R", "IF_ADC2" }, | ||
2250 | |||
2251 | { "RT5645 IF1 ADC3 Swap Mux", "L/R", "VAD_ADC" }, | ||
2252 | { "RT5645 IF1 ADC3 Swap Mux", "R/L", "VAD_ADC" }, | ||
2253 | { "RT5645 IF1 ADC3 Swap Mux", "L/L", "VAD_ADC" }, | ||
2254 | { "RT5645 IF1 ADC3 Swap Mux", "R/R", "VAD_ADC" }, | ||
2255 | |||
2256 | { "IF1 ADC", NULL, "RT5645 IF1 ADC1 Swap Mux" }, | ||
2257 | { "IF1 ADC", NULL, "RT5645 IF1 ADC2 Swap Mux" }, | ||
2258 | { "IF1 ADC", NULL, "RT5645 IF1 ADC3 Swap Mux" }, | ||
2259 | |||
2260 | { "RT5645 IF1 ADC Mux", "IF_ADC1/IF_ADC2/VAD_ADC", "IF1 ADC" }, | ||
2261 | { "RT5645 IF1 ADC Mux", "IF_ADC2/IF_ADC1/VAD_ADC", "IF1 ADC" }, | ||
2262 | { "RT5645 IF1 ADC Mux", "VAD_ADC/IF_ADC1/IF_ADC2", "IF1 ADC" }, | ||
2263 | { "RT5645 IF1 ADC Mux", "VAD_ADC/IF_ADC2/IF_ADC1", "IF1 ADC" }, | ||
2264 | { "AIF1TX", NULL, "RT5645 IF1 ADC Mux" }, | ||
2265 | |||
2266 | { "RT5645 IF1 DAC1 L Mux", "Slot0", "IF1 DAC0" }, | ||
2267 | { "RT5645 IF1 DAC1 L Mux", "Slot1", "IF1 DAC1" }, | ||
2268 | { "RT5645 IF1 DAC1 L Mux", "Slot2", "IF1 DAC2" }, | ||
2269 | { "RT5645 IF1 DAC1 L Mux", "Slot3", "IF1 DAC3" }, | ||
2270 | |||
2271 | { "RT5645 IF1 DAC1 R Mux", "Slot0", "IF1 DAC0" }, | ||
2272 | { "RT5645 IF1 DAC1 R Mux", "Slot1", "IF1 DAC1" }, | ||
2273 | { "RT5645 IF1 DAC1 R Mux", "Slot2", "IF1 DAC2" }, | ||
2274 | { "RT5645 IF1 DAC1 R Mux", "Slot3", "IF1 DAC3" }, | ||
2275 | |||
2276 | { "RT5645 IF1 DAC2 L Mux", "Slot0", "IF1 DAC0" }, | ||
2277 | { "RT5645 IF1 DAC2 L Mux", "Slot1", "IF1 DAC1" }, | ||
2278 | { "RT5645 IF1 DAC2 L Mux", "Slot2", "IF1 DAC2" }, | ||
2279 | { "RT5645 IF1 DAC2 L Mux", "Slot3", "IF1 DAC3" }, | ||
2280 | |||
2281 | { "RT5645 IF1 DAC2 R Mux", "Slot0", "IF1 DAC0" }, | ||
2282 | { "RT5645 IF1 DAC2 R Mux", "Slot1", "IF1 DAC1" }, | ||
2283 | { "RT5645 IF1 DAC2 R Mux", "Slot2", "IF1 DAC2" }, | ||
2284 | { "RT5645 IF1 DAC2 R Mux", "Slot3", "IF1 DAC3" }, | ||
2285 | |||
2286 | { "DAC1 L Mux", "IF1 DAC", "RT5645 IF1 DAC1 L Mux" }, | ||
2287 | { "DAC1 R Mux", "IF1 DAC", "RT5645 IF1 DAC1 R Mux" }, | ||
2288 | |||
2289 | { "DAC L2 Mux", "IF1 DAC", "RT5645 IF1 DAC2 L Mux" }, | ||
2290 | { "DAC R2 Mux", "IF1 DAC", "RT5645 IF1 DAC2 R Mux" }, | ||
2047 | }; | 2291 | }; |
2048 | 2292 | ||
2049 | static int rt5645_hw_params(struct snd_pcm_substream *substream, | 2293 | static int rt5645_hw_params(struct snd_pcm_substream *substream, |
@@ -2101,9 +2345,8 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream, | |||
2101 | 2345 | ||
2102 | switch (dai->id) { | 2346 | switch (dai->id) { |
2103 | case RT5645_AIF1: | 2347 | case RT5645_AIF1: |
2104 | mask_clk = RT5645_I2S_BCLK_MS1_MASK | RT5645_I2S_PD1_MASK; | 2348 | mask_clk = RT5645_I2S_PD1_MASK; |
2105 | val_clk = bclk_ms << RT5645_I2S_BCLK_MS1_SFT | | 2349 | val_clk = pre_div << RT5645_I2S_PD1_SFT; |
2106 | pre_div << RT5645_I2S_PD1_SFT; | ||
2107 | snd_soc_update_bits(codec, RT5645_I2S1_SDP, | 2350 | snd_soc_update_bits(codec, RT5645_I2S1_SDP, |
2108 | (0x3 << dl_sft), (val_len << dl_sft)); | 2351 | (0x3 << dl_sft), (val_len << dl_sft)); |
2109 | snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); | 2352 | snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); |
@@ -2368,6 +2611,8 @@ static int rt5645_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, | |||
2368 | static int rt5645_set_bias_level(struct snd_soc_codec *codec, | 2611 | static int rt5645_set_bias_level(struct snd_soc_codec *codec, |
2369 | enum snd_soc_bias_level level) | 2612 | enum snd_soc_bias_level level) |
2370 | { | 2613 | { |
2614 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); | ||
2615 | |||
2371 | switch (level) { | 2616 | switch (level) { |
2372 | case SND_SOC_BIAS_PREPARE: | 2617 | case SND_SOC_BIAS_PREPARE: |
2373 | if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) { | 2618 | if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) { |
@@ -2398,8 +2643,9 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec, | |||
2398 | 2643 | ||
2399 | case SND_SOC_BIAS_OFF: | 2644 | case SND_SOC_BIAS_OFF: |
2400 | snd_soc_write(codec, RT5645_DEPOP_M2, 0x1100); | 2645 | snd_soc_write(codec, RT5645_DEPOP_M2, 0x1100); |
2401 | snd_soc_update_bits(codec, RT5645_GEN_CTRL1, | 2646 | if (!rt5645->en_button_func) |
2402 | RT5645_DIG_GATE_CTRL, 0); | 2647 | snd_soc_update_bits(codec, RT5645_GEN_CTRL1, |
2648 | RT5645_DIG_GATE_CTRL, 0); | ||
2403 | snd_soc_update_bits(codec, RT5645_PWR_ANLG1, | 2649 | snd_soc_update_bits(codec, RT5645_PWR_ANLG1, |
2404 | RT5645_PWR_VREF1 | RT5645_PWR_MB | | 2650 | RT5645_PWR_VREF1 | RT5645_PWR_MB | |
2405 | RT5645_PWR_BG | RT5645_PWR_VREF2 | | 2651 | RT5645_PWR_BG | RT5645_PWR_VREF2 | |
@@ -2414,28 +2660,71 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec, | |||
2414 | return 0; | 2660 | return 0; |
2415 | } | 2661 | } |
2416 | 2662 | ||
2417 | static int rt5645_jack_detect(struct snd_soc_codec *codec) | 2663 | static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec, |
2664 | bool enable) | ||
2418 | { | 2665 | { |
2419 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); | 2666 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); |
2420 | int gpio_state, jack_type = 0; | ||
2421 | unsigned int val; | ||
2422 | 2667 | ||
2423 | if (!gpio_is_valid(rt5645->pdata.hp_det_gpio)) { | 2668 | if (enable) { |
2424 | dev_err(codec->dev, "invalid gpio\n"); | 2669 | snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm, |
2425 | return -EINVAL; | 2670 | "ADC L power"); |
2671 | snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm, | ||
2672 | "ADC R power"); | ||
2673 | snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm, | ||
2674 | "LDO2"); | ||
2675 | snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm, | ||
2676 | "Mic Det Power"); | ||
2677 | snd_soc_dapm_sync_unlocked(&codec->dapm); | ||
2678 | snd_soc_update_bits(codec, | ||
2679 | RT5645_INT_IRQ_ST, 0x8, 0x8); | ||
2680 | snd_soc_update_bits(codec, | ||
2681 | RT5650_4BTN_IL_CMD2, 0x8000, 0x8000); | ||
2682 | snd_soc_read(codec, RT5650_4BTN_IL_CMD1); | ||
2683 | pr_debug("%s read %x = %x\n", __func__, RT5650_4BTN_IL_CMD1, | ||
2684 | snd_soc_read(codec, RT5650_4BTN_IL_CMD1)); | ||
2685 | } else { | ||
2686 | snd_soc_update_bits(codec, RT5650_4BTN_IL_CMD2, 0x8000, 0x0); | ||
2687 | snd_soc_update_bits(codec, RT5645_INT_IRQ_ST, 0x8, 0x0); | ||
2688 | snd_soc_dapm_disable_pin_unlocked(&codec->dapm, | ||
2689 | "ADC L power"); | ||
2690 | snd_soc_dapm_disable_pin_unlocked(&codec->dapm, | ||
2691 | "ADC R power"); | ||
2692 | if (rt5645->pdata.jd_mode == 0) | ||
2693 | snd_soc_dapm_disable_pin_unlocked(&codec->dapm, | ||
2694 | "LDO2"); | ||
2695 | snd_soc_dapm_disable_pin_unlocked(&codec->dapm, | ||
2696 | "Mic Det Power"); | ||
2697 | snd_soc_dapm_sync_unlocked(&codec->dapm); | ||
2426 | } | 2698 | } |
2427 | gpio_state = gpio_get_value(rt5645->pdata.hp_det_gpio); | 2699 | } |
2428 | 2700 | ||
2429 | dev_dbg(codec->dev, "gpio = %d(%d)\n", rt5645->pdata.hp_det_gpio, | 2701 | static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert) |
2430 | gpio_state); | 2702 | { |
2703 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); | ||
2704 | unsigned int val; | ||
2431 | 2705 | ||
2432 | if ((rt5645->pdata.gpio_hp_det_active_high && gpio_state) || | 2706 | if (jack_insert) { |
2433 | (!rt5645->pdata.gpio_hp_det_active_high && !gpio_state)) { | 2707 | if (codec->component.card->instantiated) { |
2434 | snd_soc_dapm_force_enable_pin(&codec->dapm, "micbias1"); | 2708 | snd_soc_dapm_force_enable_pin(&codec->dapm, |
2435 | snd_soc_dapm_force_enable_pin(&codec->dapm, "micbias2"); | 2709 | "micbias1"); |
2436 | snd_soc_dapm_force_enable_pin(&codec->dapm, "LDO2"); | 2710 | snd_soc_dapm_force_enable_pin(&codec->dapm, |
2437 | snd_soc_dapm_force_enable_pin(&codec->dapm, "Mic Det Power"); | 2711 | "micbias2"); |
2438 | snd_soc_dapm_sync(&codec->dapm); | 2712 | snd_soc_dapm_force_enable_pin(&codec->dapm, |
2713 | "LDO2"); | ||
2714 | snd_soc_dapm_force_enable_pin(&codec->dapm, | ||
2715 | "Mic Det Power"); | ||
2716 | snd_soc_dapm_sync(&codec->dapm); | ||
2717 | } else { | ||
2718 | /* Power up necessary bits for JD if dapm is | ||
2719 | not ready yet */ | ||
2720 | snd_soc_update_bits(codec, RT5645_PWR_ANLG2, | ||
2721 | RT5645_PWR_MB1 | RT5645_PWR_MB2, | ||
2722 | RT5645_PWR_MB1 | RT5645_PWR_MB2); | ||
2723 | snd_soc_update_bits(codec, RT5645_PWR_MIXER, | ||
2724 | RT5645_PWR_LDO2, RT5645_PWR_LDO2); | ||
2725 | snd_soc_update_bits(codec, RT5645_PWR_VOL, | ||
2726 | RT5645_PWR_MIC_DET, RT5645_PWR_MIC_DET); | ||
2727 | } | ||
2439 | 2728 | ||
2440 | snd_soc_write(codec, RT5645_IN1_CTRL1, 0x0006); | 2729 | snd_soc_write(codec, RT5645_IN1_CTRL1, 0x0006); |
2441 | snd_soc_write(codec, RT5645_JD_CTRL3, 0x00b0); | 2730 | snd_soc_write(codec, RT5645_JD_CTRL3, 0x00b0); |
@@ -2449,32 +2738,64 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec) | |||
2449 | val = snd_soc_read(codec, RT5645_IN1_CTRL3) & 0x7; | 2738 | val = snd_soc_read(codec, RT5645_IN1_CTRL3) & 0x7; |
2450 | dev_dbg(codec->dev, "val = %d\n", val); | 2739 | dev_dbg(codec->dev, "val = %d\n", val); |
2451 | 2740 | ||
2452 | if (val == 1 || val == 2) | 2741 | if (codec->component.card->instantiated) { |
2453 | jack_type = SND_JACK_HEADSET; | 2742 | snd_soc_dapm_disable_pin(&codec->dapm, "micbias1"); |
2454 | else | 2743 | snd_soc_dapm_disable_pin(&codec->dapm, "micbias2"); |
2455 | jack_type = SND_JACK_HEADPHONE; | 2744 | if (rt5645->pdata.jd_mode == 0) |
2745 | snd_soc_dapm_disable_pin(&codec->dapm, "LDO2"); | ||
2746 | snd_soc_dapm_disable_pin(&codec->dapm, | ||
2747 | "Mic Det Power"); | ||
2748 | snd_soc_dapm_sync(&codec->dapm); | ||
2749 | } else { | ||
2750 | snd_soc_update_bits(codec, RT5645_PWR_ANLG2, | ||
2751 | RT5645_PWR_MB1 | RT5645_PWR_MB2, 0); | ||
2752 | if (rt5645->pdata.jd_mode == 0) | ||
2753 | snd_soc_update_bits(codec, RT5645_PWR_MIXER, | ||
2754 | RT5645_PWR_LDO2, 0); | ||
2755 | snd_soc_update_bits(codec, RT5645_PWR_VOL, | ||
2756 | RT5645_PWR_MIC_DET, 0); | ||
2757 | } | ||
2456 | 2758 | ||
2457 | snd_soc_dapm_disable_pin(&codec->dapm, "micbias1"); | 2759 | if (val == 1 || val == 2) { |
2458 | snd_soc_dapm_disable_pin(&codec->dapm, "micbias2"); | 2760 | rt5645->jack_type = SND_JACK_HEADSET; |
2459 | if (rt5645->pdata.jd_mode == 0) | 2761 | if (rt5645->en_button_func) { |
2460 | snd_soc_dapm_disable_pin(&codec->dapm, "LDO2"); | 2762 | msleep(100); |
2461 | snd_soc_dapm_disable_pin(&codec->dapm, "Mic Det Power"); | 2763 | rt5645_enable_push_button_irq(codec, true); |
2462 | snd_soc_dapm_sync(&codec->dapm); | 2764 | } |
2765 | } else { | ||
2766 | rt5645->jack_type = SND_JACK_HEADPHONE; | ||
2767 | } | ||
2768 | |||
2769 | } else { /* jack out */ | ||
2770 | rt5645->jack_type = 0; | ||
2771 | if (rt5645->en_button_func) | ||
2772 | rt5645_enable_push_button_irq(codec, false); | ||
2463 | } | 2773 | } |
2464 | 2774 | ||
2465 | snd_soc_jack_report(rt5645->hp_jack, jack_type, SND_JACK_HEADPHONE); | 2775 | return rt5645->jack_type; |
2466 | snd_soc_jack_report(rt5645->mic_jack, jack_type, SND_JACK_MICROPHONE); | ||
2467 | return 0; | ||
2468 | } | 2776 | } |
2469 | 2777 | ||
2778 | static int rt5645_irq_detection(struct rt5645_priv *rt5645); | ||
2779 | |||
2470 | int rt5645_set_jack_detect(struct snd_soc_codec *codec, | 2780 | int rt5645_set_jack_detect(struct snd_soc_codec *codec, |
2471 | struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack) | 2781 | struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack, |
2782 | struct snd_soc_jack *btn_jack) | ||
2472 | { | 2783 | { |
2473 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); | 2784 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); |
2474 | 2785 | ||
2475 | rt5645->hp_jack = hp_jack; | 2786 | rt5645->hp_jack = hp_jack; |
2476 | rt5645->mic_jack = mic_jack; | 2787 | rt5645->mic_jack = mic_jack; |
2477 | rt5645_jack_detect(codec); | 2788 | rt5645->btn_jack = btn_jack; |
2789 | if (rt5645->btn_jack && rt5645->codec_type == CODEC_TYPE_RT5650) { | ||
2790 | rt5645->en_button_func = true; | ||
2791 | regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, | ||
2792 | RT5645_GP1_PIN_IRQ, RT5645_GP1_PIN_IRQ); | ||
2793 | regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1, | ||
2794 | RT5645_HP_CB_MASK, RT5645_HP_CB_PU); | ||
2795 | regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1, | ||
2796 | RT5645_DIG_GATE_CTRL, RT5645_DIG_GATE_CTRL); | ||
2797 | } | ||
2798 | rt5645_irq_detection(rt5645); | ||
2478 | 2799 | ||
2479 | return 0; | 2800 | return 0; |
2480 | } | 2801 | } |
@@ -2485,7 +2806,7 @@ static void rt5645_jack_detect_work(struct work_struct *work) | |||
2485 | struct rt5645_priv *rt5645 = | 2806 | struct rt5645_priv *rt5645 = |
2486 | container_of(work, struct rt5645_priv, jack_detect_work.work); | 2807 | container_of(work, struct rt5645_priv, jack_detect_work.work); |
2487 | 2808 | ||
2488 | rt5645_jack_detect(rt5645->codec); | 2809 | rt5645_irq_detection(rt5645); |
2489 | } | 2810 | } |
2490 | 2811 | ||
2491 | static irqreturn_t rt5645_irq(int irq, void *data) | 2812 | static irqreturn_t rt5645_irq(int irq, void *data) |
@@ -2498,6 +2819,126 @@ static irqreturn_t rt5645_irq(int irq, void *data) | |||
2498 | return IRQ_HANDLED; | 2819 | return IRQ_HANDLED; |
2499 | } | 2820 | } |
2500 | 2821 | ||
2822 | static int rt5645_button_detect(struct snd_soc_codec *codec) | ||
2823 | { | ||
2824 | int btn_type, val; | ||
2825 | |||
2826 | val = snd_soc_read(codec, RT5650_4BTN_IL_CMD1); | ||
2827 | pr_debug("val=0x%x\n", val); | ||
2828 | btn_type = val & 0xfff0; | ||
2829 | snd_soc_write(codec, RT5650_4BTN_IL_CMD1, val); | ||
2830 | |||
2831 | return btn_type; | ||
2832 | } | ||
2833 | |||
2834 | static int rt5645_irq_detection(struct rt5645_priv *rt5645) | ||
2835 | { | ||
2836 | int val, btn_type, gpio_state = 0, report = 0; | ||
2837 | |||
2838 | switch (rt5645->pdata.jd_mode) { | ||
2839 | case 0: /* Not using rt5645 JD */ | ||
2840 | if (gpio_is_valid(rt5645->pdata.hp_det_gpio)) { | ||
2841 | gpio_state = gpio_get_value(rt5645->pdata.hp_det_gpio); | ||
2842 | dev_dbg(rt5645->codec->dev, "gpio = %d(%d)\n", | ||
2843 | rt5645->pdata.hp_det_gpio, gpio_state); | ||
2844 | } | ||
2845 | if ((rt5645->pdata.gpio_hp_det_active_high && gpio_state) || | ||
2846 | (!rt5645->pdata.gpio_hp_det_active_high && | ||
2847 | !gpio_state)) { | ||
2848 | report = rt5645_jack_detect(rt5645->codec, 1); | ||
2849 | } else { | ||
2850 | report = rt5645_jack_detect(rt5645->codec, 0); | ||
2851 | } | ||
2852 | snd_soc_jack_report(rt5645->hp_jack, | ||
2853 | report, SND_JACK_HEADPHONE); | ||
2854 | snd_soc_jack_report(rt5645->mic_jack, | ||
2855 | report, SND_JACK_MICROPHONE); | ||
2856 | return report; | ||
2857 | case 1: /* 2 port */ | ||
2858 | val = snd_soc_read(rt5645->codec, RT5645_A_JD_CTRL1) & 0x0070; | ||
2859 | break; | ||
2860 | default: /* 1 port */ | ||
2861 | val = snd_soc_read(rt5645->codec, RT5645_A_JD_CTRL1) & 0x0020; | ||
2862 | break; | ||
2863 | |||
2864 | } | ||
2865 | |||
2866 | switch (val) { | ||
2867 | /* jack in */ | ||
2868 | case 0x30: /* 2 port */ | ||
2869 | case 0x0: /* 1 port or 2 port */ | ||
2870 | if (rt5645->jack_type == 0) { | ||
2871 | report = rt5645_jack_detect(rt5645->codec, 1); | ||
2872 | /* for push button and jack out */ | ||
2873 | break; | ||
2874 | } | ||
2875 | btn_type = 0; | ||
2876 | if (snd_soc_read(rt5645->codec, RT5645_INT_IRQ_ST) & 0x4) { | ||
2877 | /* button pressed */ | ||
2878 | report = SND_JACK_HEADSET; | ||
2879 | btn_type = rt5645_button_detect(rt5645->codec); | ||
2880 | /* rt5650 can report three kinds of button behavior, | ||
2881 | one click, double click and hold. However, | ||
2882 | currently we will report button pressed/released | ||
2883 | event. So all the three button behaviors are | ||
2884 | treated as button pressed. */ | ||
2885 | switch (btn_type) { | ||
2886 | case 0x8000: | ||
2887 | case 0x4000: | ||
2888 | case 0x2000: | ||
2889 | report |= SND_JACK_BTN_0; | ||
2890 | break; | ||
2891 | case 0x1000: | ||
2892 | case 0x0800: | ||
2893 | case 0x0400: | ||
2894 | report |= SND_JACK_BTN_1; | ||
2895 | break; | ||
2896 | case 0x0200: | ||
2897 | case 0x0100: | ||
2898 | case 0x0080: | ||
2899 | report |= SND_JACK_BTN_2; | ||
2900 | break; | ||
2901 | case 0x0040: | ||
2902 | case 0x0020: | ||
2903 | case 0x0010: | ||
2904 | report |= SND_JACK_BTN_3; | ||
2905 | break; | ||
2906 | case 0x0000: /* unpressed */ | ||
2907 | break; | ||
2908 | default: | ||
2909 | dev_err(rt5645->codec->dev, | ||
2910 | "Unexpected button code 0x%04x\n", | ||
2911 | btn_type); | ||
2912 | break; | ||
2913 | } | ||
2914 | } | ||
2915 | if (btn_type == 0)/* button release */ | ||
2916 | report = rt5645->jack_type; | ||
2917 | |||
2918 | break; | ||
2919 | /* jack out */ | ||
2920 | case 0x70: /* 2 port */ | ||
2921 | case 0x10: /* 2 port */ | ||
2922 | case 0x20: /* 1 port */ | ||
2923 | report = 0; | ||
2924 | snd_soc_update_bits(rt5645->codec, | ||
2925 | RT5645_INT_IRQ_ST, 0x1, 0x0); | ||
2926 | rt5645_jack_detect(rt5645->codec, 0); | ||
2927 | break; | ||
2928 | default: | ||
2929 | break; | ||
2930 | } | ||
2931 | |||
2932 | snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); | ||
2933 | snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE); | ||
2934 | if (rt5645->en_button_func) | ||
2935 | snd_soc_jack_report(rt5645->btn_jack, | ||
2936 | report, SND_JACK_BTN_0 | SND_JACK_BTN_1 | | ||
2937 | SND_JACK_BTN_2 | SND_JACK_BTN_3); | ||
2938 | |||
2939 | return report; | ||
2940 | } | ||
2941 | |||
2501 | static int rt5645_probe(struct snd_soc_codec *codec) | 2942 | static int rt5645_probe(struct snd_soc_codec *codec) |
2502 | { | 2943 | { |
2503 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); | 2944 | struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); |
@@ -2656,6 +3097,43 @@ static const struct i2c_device_id rt5645_i2c_id[] = { | |||
2656 | }; | 3097 | }; |
2657 | MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id); | 3098 | MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id); |
2658 | 3099 | ||
3100 | #ifdef CONFIG_ACPI | ||
3101 | static struct acpi_device_id rt5645_acpi_match[] = { | ||
3102 | { "10EC5645", 0 }, | ||
3103 | { "10EC5650", 0 }, | ||
3104 | {}, | ||
3105 | }; | ||
3106 | MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match); | ||
3107 | #endif | ||
3108 | |||
3109 | static struct rt5645_platform_data *rt5645_pdata; | ||
3110 | |||
3111 | static struct rt5645_platform_data strago_platform_data = { | ||
3112 | .dmic_en = true, | ||
3113 | .dmic1_data_pin = -1, | ||
3114 | .dmic2_data_pin = RT5645_DMIC_DATA_IN2P, | ||
3115 | .en_jd_func = true, | ||
3116 | .jd_mode = 3, | ||
3117 | }; | ||
3118 | |||
3119 | static int strago_quirk_cb(const struct dmi_system_id *id) | ||
3120 | { | ||
3121 | rt5645_pdata = &strago_platform_data; | ||
3122 | |||
3123 | return 1; | ||
3124 | } | ||
3125 | |||
3126 | static struct dmi_system_id dmi_platform_intel_braswell[] = { | ||
3127 | { | ||
3128 | .ident = "Intel Strago", | ||
3129 | .callback = strago_quirk_cb, | ||
3130 | .matches = { | ||
3131 | DMI_MATCH(DMI_PRODUCT_NAME, "Strago"), | ||
3132 | }, | ||
3133 | }, | ||
3134 | { } | ||
3135 | }; | ||
3136 | |||
2659 | static int rt5645_i2c_probe(struct i2c_client *i2c, | 3137 | static int rt5645_i2c_probe(struct i2c_client *i2c, |
2660 | const struct i2c_device_id *id) | 3138 | const struct i2c_device_id *id) |
2661 | { | 3139 | { |
@@ -2663,6 +3141,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, | |||
2663 | struct rt5645_priv *rt5645; | 3141 | struct rt5645_priv *rt5645; |
2664 | int ret; | 3142 | int ret; |
2665 | unsigned int val; | 3143 | unsigned int val; |
3144 | struct gpio_desc *gpiod; | ||
2666 | 3145 | ||
2667 | rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv), | 3146 | rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv), |
2668 | GFP_KERNEL); | 3147 | GFP_KERNEL); |
@@ -2672,8 +3151,23 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, | |||
2672 | rt5645->i2c = i2c; | 3151 | rt5645->i2c = i2c; |
2673 | i2c_set_clientdata(i2c, rt5645); | 3152 | i2c_set_clientdata(i2c, rt5645); |
2674 | 3153 | ||
2675 | if (pdata) | 3154 | if (pdata) { |
2676 | rt5645->pdata = *pdata; | 3155 | rt5645->pdata = *pdata; |
3156 | } else { | ||
3157 | if (dmi_check_system(dmi_platform_intel_braswell)) { | ||
3158 | rt5645->pdata = *rt5645_pdata; | ||
3159 | gpiod = devm_gpiod_get_index(&i2c->dev, "rt5645", 0); | ||
3160 | |||
3161 | if (IS_ERR(gpiod) || gpiod_direction_input(gpiod)) { | ||
3162 | rt5645->pdata.hp_det_gpio = -1; | ||
3163 | dev_err(&i2c->dev, "failed to initialize gpiod\n"); | ||
3164 | } else { | ||
3165 | rt5645->pdata.hp_det_gpio = desc_to_gpio(gpiod); | ||
3166 | rt5645->pdata.gpio_hp_det_active_high | ||
3167 | = !gpiod_is_active_low(gpiod); | ||
3168 | } | ||
3169 | } | ||
3170 | } | ||
2677 | 3171 | ||
2678 | rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap); | 3172 | rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap); |
2679 | if (IS_ERR(rt5645->regmap)) { | 3173 | if (IS_ERR(rt5645->regmap)) { |
@@ -2770,7 +3264,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, | |||
2770 | 3264 | ||
2771 | case RT5645_DMIC_DATA_GPIO12: | 3265 | case RT5645_DMIC_DATA_GPIO12: |
2772 | regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, | 3266 | regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, |
2773 | RT5645_DMIC_1_DP_MASK, RT5645_DMIC_2_DP_GPIO12); | 3267 | RT5645_DMIC_2_DP_MASK, RT5645_DMIC_2_DP_GPIO12); |
2774 | regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, | 3268 | regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, |
2775 | RT5645_GP12_PIN_MASK, | 3269 | RT5645_GP12_PIN_MASK, |
2776 | RT5645_GP12_PIN_DMIC2_SDA); | 3270 | RT5645_GP12_PIN_DMIC2_SDA); |
@@ -2784,8 +3278,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, | |||
2784 | 3278 | ||
2785 | if (rt5645->pdata.en_jd_func) { | 3279 | if (rt5645->pdata.en_jd_func) { |
2786 | regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, | 3280 | regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, |
2787 | RT5645_IRQ_CLK_GATE_CTRL | RT5645_MICINDET_MANU, | 3281 | RT5645_IRQ_CLK_GATE_CTRL, RT5645_IRQ_CLK_GATE_CTRL); |
2788 | RT5645_IRQ_CLK_GATE_CTRL | RT5645_MICINDET_MANU); | ||
2789 | regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, | 3282 | regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, |
2790 | RT5645_CBJ_BST1_EN, RT5645_CBJ_BST1_EN); | 3283 | RT5645_CBJ_BST1_EN, RT5645_CBJ_BST1_EN); |
2791 | regmap_update_bits(rt5645->regmap, RT5645_JD_CTRL3, | 3284 | regmap_update_bits(rt5645->regmap, RT5645_JD_CTRL3, |
@@ -2872,6 +3365,7 @@ static struct i2c_driver rt5645_i2c_driver = { | |||
2872 | .driver = { | 3365 | .driver = { |
2873 | .name = "rt5645", | 3366 | .name = "rt5645", |
2874 | .owner = THIS_MODULE, | 3367 | .owner = THIS_MODULE, |
3368 | .acpi_match_table = ACPI_PTR(rt5645_acpi_match), | ||
2875 | }, | 3369 | }, |
2876 | .probe = rt5645_i2c_probe, | 3370 | .probe = rt5645_i2c_probe, |
2877 | .remove = rt5645_i2c_remove, | 3371 | .remove = rt5645_i2c_remove, |
diff --git a/sound/soc/codecs/rt5645.h b/sound/soc/codecs/rt5645.h index db78e9462876..c204861d31d9 100644 --- a/sound/soc/codecs/rt5645.h +++ b/sound/soc/codecs/rt5645.h | |||
@@ -105,6 +105,7 @@ | |||
105 | #define RT5645_TDM_CTRL_1 0x77 | 105 | #define RT5645_TDM_CTRL_1 0x77 |
106 | #define RT5645_TDM_CTRL_2 0x78 | 106 | #define RT5645_TDM_CTRL_2 0x78 |
107 | #define RT5645_TDM_CTRL_3 0x79 | 107 | #define RT5645_TDM_CTRL_3 0x79 |
108 | #define RT5650_TDM_CTRL_4 0x7a | ||
108 | 109 | ||
109 | /* Function - Analog */ | 110 | /* Function - Analog */ |
110 | #define RT5645_GLB_CLK 0x80 | 111 | #define RT5645_GLB_CLK 0x80 |
@@ -942,10 +943,6 @@ | |||
942 | #define RT5645_I2S2_SDI_I2S2 (0x1 << 6) | 943 | #define RT5645_I2S2_SDI_I2S2 (0x1 << 6) |
943 | 944 | ||
944 | /* ADC/DAC Clock Control 1 (0x73) */ | 945 | /* ADC/DAC Clock Control 1 (0x73) */ |
945 | #define RT5645_I2S_BCLK_MS1_MASK (0x1 << 15) | ||
946 | #define RT5645_I2S_BCLK_MS1_SFT 15 | ||
947 | #define RT5645_I2S_BCLK_MS1_32 (0x0 << 15) | ||
948 | #define RT5645_I2S_BCLK_MS1_64 (0x1 << 15) | ||
949 | #define RT5645_I2S_PD1_MASK (0x7 << 12) | 946 | #define RT5645_I2S_PD1_MASK (0x7 << 12) |
950 | #define RT5645_I2S_PD1_SFT 12 | 947 | #define RT5645_I2S_PD1_SFT 12 |
951 | #define RT5645_I2S_PD1_1 (0x0 << 12) | 948 | #define RT5645_I2S_PD1_1 (0x0 << 12) |
@@ -1067,13 +1064,14 @@ | |||
1067 | #define RT5645_SCLK_SRC_SFT 14 | 1064 | #define RT5645_SCLK_SRC_SFT 14 |
1068 | #define RT5645_SCLK_SRC_MCLK (0x0 << 14) | 1065 | #define RT5645_SCLK_SRC_MCLK (0x0 << 14) |
1069 | #define RT5645_SCLK_SRC_PLL1 (0x1 << 14) | 1066 | #define RT5645_SCLK_SRC_PLL1 (0x1 << 14) |
1070 | #define RT5645_SCLK_SRC_RCCLK (0x2 << 14) /* 15MHz */ | 1067 | #define RT5645_SCLK_SRC_RCCLK (0x2 << 14) |
1071 | #define RT5645_PLL1_SRC_MASK (0x3 << 12) | 1068 | #define RT5645_PLL1_SRC_MASK (0x7 << 11) |
1072 | #define RT5645_PLL1_SRC_SFT 12 | 1069 | #define RT5645_PLL1_SRC_SFT 11 |
1073 | #define RT5645_PLL1_SRC_MCLK (0x0 << 12) | 1070 | #define RT5645_PLL1_SRC_MCLK (0x0 << 11) |
1074 | #define RT5645_PLL1_SRC_BCLK1 (0x1 << 12) | 1071 | #define RT5645_PLL1_SRC_BCLK1 (0x1 << 11) |
1075 | #define RT5645_PLL1_SRC_BCLK2 (0x2 << 12) | 1072 | #define RT5645_PLL1_SRC_BCLK2 (0x2 << 11) |
1076 | #define RT5645_PLL1_SRC_BCLK3 (0x3 << 12) | 1073 | #define RT5645_PLL1_SRC_BCLK3 (0x3 << 11) |
1074 | #define RT5645_PLL1_SRC_RCCLK (0x4 << 11) | ||
1077 | #define RT5645_PLL1_PD_MASK (0x1 << 3) | 1075 | #define RT5645_PLL1_PD_MASK (0x1 << 3) |
1078 | #define RT5645_PLL1_PD_SFT 3 | 1076 | #define RT5645_PLL1_PD_SFT 3 |
1079 | #define RT5645_PLL1_PD_1 (0x0 << 3) | 1077 | #define RT5645_PLL1_PD_1 (0x0 << 3) |
@@ -2184,6 +2182,7 @@ struct rt5645_priv { | |||
2184 | struct i2c_client *i2c; | 2182 | struct i2c_client *i2c; |
2185 | struct snd_soc_jack *hp_jack; | 2183 | struct snd_soc_jack *hp_jack; |
2186 | struct snd_soc_jack *mic_jack; | 2184 | struct snd_soc_jack *mic_jack; |
2185 | struct snd_soc_jack *btn_jack; | ||
2187 | struct delayed_work jack_detect_work; | 2186 | struct delayed_work jack_detect_work; |
2188 | 2187 | ||
2189 | int codec_type; | 2188 | int codec_type; |
@@ -2196,9 +2195,12 @@ struct rt5645_priv { | |||
2196 | int pll_src; | 2195 | int pll_src; |
2197 | int pll_in; | 2196 | int pll_in; |
2198 | int pll_out; | 2197 | int pll_out; |
2198 | |||
2199 | int jack_type; | ||
2200 | bool en_button_func; | ||
2199 | }; | 2201 | }; |
2200 | 2202 | ||
2201 | int rt5645_set_jack_detect(struct snd_soc_codec *codec, | 2203 | int rt5645_set_jack_detect(struct snd_soc_codec *codec, |
2202 | struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack); | 2204 | struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack, |
2203 | 2205 | struct snd_soc_jack *btn_jack); | |
2204 | #endif /* __RT5645_H__ */ | 2206 | #endif /* __RT5645_H__ */ |
diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c index 7d23ead3fd40..8f96c21fef4f 100644 --- a/sound/soc/intel/boards/cht_bsw_rt5645.c +++ b/sound/soc/intel/boards/cht_bsw_rt5645.c | |||
@@ -214,7 +214,7 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) | |||
214 | return ret; | 214 | return ret; |
215 | } | 215 | } |
216 | 216 | ||
217 | rt5645_set_jack_detect(codec, &ctx->hp_jack, &ctx->mic_jack); | 217 | rt5645_set_jack_detect(codec, &ctx->hp_jack, &ctx->mic_jack, NULL); |
218 | 218 | ||
219 | return ret; | 219 | return ret; |
220 | } | 220 | } |