aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2015-05-06 06:58:24 -0400
committerMark Brown <broonie@kernel.org>2015-05-06 06:58:24 -0400
commit292d2497cd8f551642a38f7a55b1b7965049c75d (patch)
tree1332204457623c47341dffbcd4ff33bf83599d47
parent26f63c692f012ff665a8fd085a36549fe734f59f (diff)
parent177e1e1fbc63f6e4ac0fab56dcb61bb8c8597681 (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.c702
-rw-r--r--sound/soc/codecs/rt5645.h28
-rw-r--r--sound/soc/intel/boards/cht_bsw_rt5645.c2
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
416static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); 419static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
417static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); 420static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
418static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); 421static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
419static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); 422static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
420static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); 423static 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
434static const char * const rt5645_tdm_data_swap_select[] = {
435 "L/R", "R/L", "L/L", "R/R"
436};
437
438static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot0_1_enum,
439 RT5645_TDM_CTRL_1, 6, rt5645_tdm_data_swap_select);
440
441static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot2_3_enum,
442 RT5645_TDM_CTRL_1, 4, rt5645_tdm_data_swap_select);
443
444static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot4_5_enum,
445 RT5645_TDM_CTRL_1, 2, rt5645_tdm_data_swap_select);
446
447static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot6_7_enum,
448 RT5645_TDM_CTRL_1, 0, rt5645_tdm_data_swap_select);
449
450static const char * const rt5645_tdm_adc_data_select[] = {
451 "1/2/R", "2/1/R", "R/1/2", "R/2/1"
452};
453
454static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_sel_enum,
455 RT5645_TDM_CTRL_1, 8,
456 rt5645_tdm_adc_data_select);
457
458static const struct snd_kcontrol_new rt5645_snd_controls[] = { 437static 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] */
1094static const char * const rt5645_if1_adc_in_src[] = { 1062static 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
1098static SOC_ENUM_SINGLE_DECL( 1067static SOC_ENUM_SINGLE_DECL(
@@ -1102,6 +1071,140 @@ static SOC_ENUM_SINGLE_DECL(
1102static const struct snd_kcontrol_new rt5645_if1_adc_in_mux = 1071static 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] */
1075static 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
1105static SOC_ENUM_SINGLE_DECL(
1106 rt5650_if1_adc_in_enum, RT5645_TDM_CTRL_2,
1107 0, rt5650_if1_adc_in_src);
1108
1109static 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] */
1113static const char * const rt5645_tdm_adc_swap_select[] = {
1114 "L/R", "R/L", "L/L", "R/R"
1115};
1116
1117static SOC_ENUM_SINGLE_DECL(rt5650_tdm_adc_slot0_1_enum,
1118 RT5645_TDM_CTRL_2, 14, rt5645_tdm_adc_swap_select);
1119
1120static 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
1123static SOC_ENUM_SINGLE_DECL(rt5650_tdm_adc_slot2_3_enum,
1124 RT5645_TDM_CTRL_2, 12, rt5645_tdm_adc_swap_select);
1125
1126static 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
1129static SOC_ENUM_SINGLE_DECL(rt5650_tdm_adc_slot4_5_enum,
1130 RT5645_TDM_CTRL_2, 10, rt5645_tdm_adc_swap_select);
1131
1132static 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] */
1136static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot0_1_enum,
1137 RT5645_TDM_CTRL_1, 6, rt5645_tdm_adc_swap_select);
1138
1139static 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
1142static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot2_3_enum,
1143 RT5645_TDM_CTRL_1, 4, rt5645_tdm_adc_swap_select);
1144
1145static 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
1148static SOC_ENUM_SINGLE_DECL(rt5645_tdm_adc_slot4_5_enum,
1149 RT5645_TDM_CTRL_1, 2, rt5645_tdm_adc_swap_select);
1150
1151static 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] */
1155static const char * const rt5645_tdm_dac_swap_select[] = {
1156 "Slot0", "Slot1", "Slot2", "Slot3"
1157};
1158
1159static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac0_enum,
1160 RT5645_TDM_CTRL_3, 12, rt5645_tdm_dac_swap_select);
1161
1162static const struct snd_kcontrol_new rt5645_if1_dac0_tdm_sel_mux =
1163 SOC_DAPM_ENUM("IF1 DAC0 source", rt5645_tdm_dac0_enum);
1164
1165static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac1_enum,
1166 RT5645_TDM_CTRL_3, 8, rt5645_tdm_dac_swap_select);
1167
1168static const struct snd_kcontrol_new rt5645_if1_dac1_tdm_sel_mux =
1169 SOC_DAPM_ENUM("IF1 DAC1 source", rt5645_tdm_dac1_enum);
1170
1171static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac2_enum,
1172 RT5645_TDM_CTRL_3, 4, rt5645_tdm_dac_swap_select);
1173
1174static const struct snd_kcontrol_new rt5645_if1_dac2_tdm_sel_mux =
1175 SOC_DAPM_ENUM("IF1 DAC2 source", rt5645_tdm_dac2_enum);
1176
1177static SOC_ENUM_SINGLE_DECL(rt5645_tdm_dac3_enum,
1178 RT5645_TDM_CTRL_3, 0, rt5645_tdm_dac_swap_select);
1179
1180static 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] */
1184static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac0_enum,
1185 RT5650_TDM_CTRL_4, 12, rt5645_tdm_dac_swap_select);
1186
1187static const struct snd_kcontrol_new rt5650_if1_dac0_tdm_sel_mux =
1188 SOC_DAPM_ENUM("IF1 DAC0 source", rt5650_tdm_dac0_enum);
1189
1190static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac1_enum,
1191 RT5650_TDM_CTRL_4, 8, rt5645_tdm_dac_swap_select);
1192
1193static const struct snd_kcontrol_new rt5650_if1_dac1_tdm_sel_mux =
1194 SOC_DAPM_ENUM("IF1 DAC1 source", rt5650_tdm_dac1_enum);
1195
1196static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac2_enum,
1197 RT5650_TDM_CTRL_4, 4, rt5645_tdm_dac_swap_select);
1198
1199static const struct snd_kcontrol_new rt5650_if1_dac2_tdm_sel_mux =
1200 SOC_DAPM_ENUM("IF1 DAC2 source", rt5650_tdm_dac2_enum);
1201
1202static SOC_ENUM_SINGLE_DECL(rt5650_tdm_dac3_enum,
1203 RT5650_TDM_CTRL_4, 0, rt5645_tdm_dac_swap_select);
1204
1205static 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] */
1106static const char * const rt5650_a_dac1_src[] = { 1209static 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
2042static const struct snd_soc_dapm_route rt5645_specific_dapm_routes[] = { 2235static 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
2049static int rt5645_hw_params(struct snd_pcm_substream *substream, 2293static 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,
2368static int rt5645_set_bias_level(struct snd_soc_codec *codec, 2611static 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
2417static int rt5645_jack_detect(struct snd_soc_codec *codec) 2663static 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, 2701static 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
2778static int rt5645_irq_detection(struct rt5645_priv *rt5645);
2779
2470int rt5645_set_jack_detect(struct snd_soc_codec *codec, 2780int 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
2491static irqreturn_t rt5645_irq(int irq, void *data) 2812static 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
2822static 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
2834static 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
2501static int rt5645_probe(struct snd_soc_codec *codec) 2942static 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};
2657MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id); 3098MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
2658 3099
3100#ifdef CONFIG_ACPI
3101static struct acpi_device_id rt5645_acpi_match[] = {
3102 { "10EC5645", 0 },
3103 { "10EC5650", 0 },
3104 {},
3105};
3106MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match);
3107#endif
3108
3109static struct rt5645_platform_data *rt5645_pdata;
3110
3111static 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
3119static int strago_quirk_cb(const struct dmi_system_id *id)
3120{
3121 rt5645_pdata = &strago_platform_data;
3122
3123 return 1;
3124}
3125
3126static 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
2659static int rt5645_i2c_probe(struct i2c_client *i2c, 3137static 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
2201int rt5645_set_jack_detect(struct snd_soc_codec *codec, 2203int 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}