diff options
-rw-r--r-- | Documentation/devicetree/bindings/sound/rt5640.txt | 5 | ||||
-rw-r--r-- | include/sound/rt5640.h | 3 | ||||
-rw-r--r-- | sound/soc/codecs/rt5640.c | 22 |
3 files changed, 27 insertions, 3 deletions
diff --git a/Documentation/devicetree/bindings/sound/rt5640.txt b/Documentation/devicetree/bindings/sound/rt5640.txt index 5d062a567996..9e62f6eb348f 100644 --- a/Documentation/devicetree/bindings/sound/rt5640.txt +++ b/Documentation/devicetree/bindings/sound/rt5640.txt | |||
@@ -14,7 +14,8 @@ Optional properties: | |||
14 | 14 | ||
15 | - realtek,in1-differential | 15 | - realtek,in1-differential |
16 | - realtek,in2-differential | 16 | - realtek,in2-differential |
17 | Boolean. Indicate MIC1/2 input are differential, rather than single-ended. | 17 | - realtek,in3-differential |
18 | Boolean. Indicate MIC1/2/3 input are differential, rather than single-ended. | ||
18 | 19 | ||
19 | - realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin. | 20 | - realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin. |
20 | 21 | ||
@@ -27,6 +28,8 @@ Pins on the device (for linking into audio routes) for RT5639/RT5640: | |||
27 | * IN1N | 28 | * IN1N |
28 | * IN2P | 29 | * IN2P |
29 | * IN2N | 30 | * IN2N |
31 | * IN3P | ||
32 | * IN3N | ||
30 | * HPOL | 33 | * HPOL |
31 | * HPOR | 34 | * HPOR |
32 | * LOUTL | 35 | * LOUTL |
diff --git a/include/sound/rt5640.h b/include/sound/rt5640.h index 59d26dd81e45..e3c84b92ff70 100644 --- a/include/sound/rt5640.h +++ b/include/sound/rt5640.h | |||
@@ -12,9 +12,10 @@ | |||
12 | #define __LINUX_SND_RT5640_H | 12 | #define __LINUX_SND_RT5640_H |
13 | 13 | ||
14 | struct rt5640_platform_data { | 14 | struct rt5640_platform_data { |
15 | /* IN1 & IN2 can optionally be differential */ | 15 | /* IN1 & IN2 & IN3 can optionally be differential */ |
16 | bool in1_diff; | 16 | bool in1_diff; |
17 | bool in2_diff; | 17 | bool in2_diff; |
18 | bool in3_diff; | ||
18 | 19 | ||
19 | bool dmic_en; | 20 | bool dmic_en; |
20 | bool dmic1_data_pin; /* 0 = IN1P; 1 = GPIO3 */ | 21 | bool dmic1_data_pin; /* 0 = IN1P; 1 = GPIO3 */ |
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index e1ceeb885f7d..f2beb1aa5763 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c | |||
@@ -405,11 +405,14 @@ static const struct snd_kcontrol_new rt5640_snd_controls[] = { | |||
405 | SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5640_DAC1_DIG_VOL, | 405 | SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5640_DAC1_DIG_VOL, |
406 | RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, | 406 | RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, |
407 | 175, 0, dac_vol_tlv), | 407 | 175, 0, dac_vol_tlv), |
408 | /* IN1/IN2 Control */ | 408 | /* IN1/IN2/IN3 Control */ |
409 | SOC_SINGLE_TLV("IN1 Boost", RT5640_IN1_IN2, | 409 | SOC_SINGLE_TLV("IN1 Boost", RT5640_IN1_IN2, |
410 | RT5640_BST_SFT1, 8, 0, bst_tlv), | 410 | RT5640_BST_SFT1, 8, 0, bst_tlv), |
411 | SOC_SINGLE_TLV("IN2 Boost", RT5640_IN3_IN4, | 411 | SOC_SINGLE_TLV("IN2 Boost", RT5640_IN3_IN4, |
412 | RT5640_BST_SFT2, 8, 0, bst_tlv), | 412 | RT5640_BST_SFT2, 8, 0, bst_tlv), |
413 | SOC_SINGLE_TLV("IN3 Boost", RT5640_IN1_IN2, | ||
414 | RT5640_BST_SFT2, 8, 0, bst_tlv), | ||
415 | |||
413 | /* INL/INR Volume Control */ | 416 | /* INL/INR Volume Control */ |
414 | SOC_DOUBLE_TLV("IN Capture Volume", RT5640_INL_INR_VOL, | 417 | SOC_DOUBLE_TLV("IN Capture Volume", RT5640_INL_INR_VOL, |
415 | RT5640_INL_VOL_SFT, RT5640_INR_VOL_SFT, | 418 | RT5640_INL_VOL_SFT, RT5640_INR_VOL_SFT, |
@@ -598,6 +601,8 @@ static const struct snd_kcontrol_new rt5640_rec_l_mix[] = { | |||
598 | RT5640_M_HP_L_RM_L_SFT, 1, 1), | 601 | RT5640_M_HP_L_RM_L_SFT, 1, 1), |
599 | SOC_DAPM_SINGLE("INL Switch", RT5640_REC_L2_MIXER, | 602 | SOC_DAPM_SINGLE("INL Switch", RT5640_REC_L2_MIXER, |
600 | RT5640_M_IN_L_RM_L_SFT, 1, 1), | 603 | RT5640_M_IN_L_RM_L_SFT, 1, 1), |
604 | SOC_DAPM_SINGLE("BST3 Switch", RT5640_REC_L2_MIXER, | ||
605 | RT5640_M_BST2_RM_L_SFT, 1, 1), | ||
601 | SOC_DAPM_SINGLE("BST2 Switch", RT5640_REC_L2_MIXER, | 606 | SOC_DAPM_SINGLE("BST2 Switch", RT5640_REC_L2_MIXER, |
602 | RT5640_M_BST4_RM_L_SFT, 1, 1), | 607 | RT5640_M_BST4_RM_L_SFT, 1, 1), |
603 | SOC_DAPM_SINGLE("BST1 Switch", RT5640_REC_L2_MIXER, | 608 | SOC_DAPM_SINGLE("BST1 Switch", RT5640_REC_L2_MIXER, |
@@ -611,6 +616,8 @@ static const struct snd_kcontrol_new rt5640_rec_r_mix[] = { | |||
611 | RT5640_M_HP_R_RM_R_SFT, 1, 1), | 616 | RT5640_M_HP_R_RM_R_SFT, 1, 1), |
612 | SOC_DAPM_SINGLE("INR Switch", RT5640_REC_R2_MIXER, | 617 | SOC_DAPM_SINGLE("INR Switch", RT5640_REC_R2_MIXER, |
613 | RT5640_M_IN_R_RM_R_SFT, 1, 1), | 618 | RT5640_M_IN_R_RM_R_SFT, 1, 1), |
619 | SOC_DAPM_SINGLE("BST3 Switch", RT5640_REC_R2_MIXER, | ||
620 | RT5640_M_BST2_RM_R_SFT, 1, 1), | ||
614 | SOC_DAPM_SINGLE("BST2 Switch", RT5640_REC_R2_MIXER, | 621 | SOC_DAPM_SINGLE("BST2 Switch", RT5640_REC_R2_MIXER, |
615 | RT5640_M_BST4_RM_R_SFT, 1, 1), | 622 | RT5640_M_BST4_RM_R_SFT, 1, 1), |
616 | SOC_DAPM_SINGLE("BST1 Switch", RT5640_REC_R2_MIXER, | 623 | SOC_DAPM_SINGLE("BST1 Switch", RT5640_REC_R2_MIXER, |
@@ -1065,6 +1072,8 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { | |||
1065 | SND_SOC_DAPM_INPUT("IN1N"), | 1072 | SND_SOC_DAPM_INPUT("IN1N"), |
1066 | SND_SOC_DAPM_INPUT("IN2P"), | 1073 | SND_SOC_DAPM_INPUT("IN2P"), |
1067 | SND_SOC_DAPM_INPUT("IN2N"), | 1074 | SND_SOC_DAPM_INPUT("IN2N"), |
1075 | SND_SOC_DAPM_INPUT("IN3P"), | ||
1076 | SND_SOC_DAPM_INPUT("IN3N"), | ||
1068 | SND_SOC_DAPM_PGA("DMIC L1", SND_SOC_NOPM, 0, 0, NULL, 0), | 1077 | SND_SOC_DAPM_PGA("DMIC L1", SND_SOC_NOPM, 0, 0, NULL, 0), |
1069 | SND_SOC_DAPM_PGA("DMIC R1", SND_SOC_NOPM, 0, 0, NULL, 0), | 1078 | SND_SOC_DAPM_PGA("DMIC R1", SND_SOC_NOPM, 0, 0, NULL, 0), |
1070 | SND_SOC_DAPM_PGA("DMIC L2", SND_SOC_NOPM, 0, 0, NULL, 0), | 1079 | SND_SOC_DAPM_PGA("DMIC L2", SND_SOC_NOPM, 0, 0, NULL, 0), |
@@ -1081,6 +1090,8 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { | |||
1081 | RT5640_PWR_BST1_BIT, 0, NULL, 0), | 1090 | RT5640_PWR_BST1_BIT, 0, NULL, 0), |
1082 | SND_SOC_DAPM_PGA("BST2", RT5640_PWR_ANLG2, | 1091 | SND_SOC_DAPM_PGA("BST2", RT5640_PWR_ANLG2, |
1083 | RT5640_PWR_BST4_BIT, 0, NULL, 0), | 1092 | RT5640_PWR_BST4_BIT, 0, NULL, 0), |
1093 | SND_SOC_DAPM_PGA("BST3", RT5640_PWR_ANLG2, | ||
1094 | RT5640_PWR_BST2_BIT, 0, NULL, 0), | ||
1084 | /* Input Volume */ | 1095 | /* Input Volume */ |
1085 | SND_SOC_DAPM_PGA("INL VOL", RT5640_PWR_VOL, | 1096 | SND_SOC_DAPM_PGA("INL VOL", RT5640_PWR_VOL, |
1086 | RT5640_PWR_IN_L_BIT, 0, NULL, 0), | 1097 | RT5640_PWR_IN_L_BIT, 0, NULL, 0), |
@@ -1310,6 +1321,7 @@ static const struct snd_soc_dapm_widget rt5639_specific_dapm_widgets[] = { | |||
1310 | static const struct snd_soc_dapm_route rt5640_dapm_routes[] = { | 1321 | static const struct snd_soc_dapm_route rt5640_dapm_routes[] = { |
1311 | {"IN1P", NULL, "LDO2"}, | 1322 | {"IN1P", NULL, "LDO2"}, |
1312 | {"IN2P", NULL, "LDO2"}, | 1323 | {"IN2P", NULL, "LDO2"}, |
1324 | {"IN3P", NULL, "LDO2"}, | ||
1313 | 1325 | ||
1314 | {"DMIC L1", NULL, "DMIC1"}, | 1326 | {"DMIC L1", NULL, "DMIC1"}, |
1315 | {"DMIC R1", NULL, "DMIC1"}, | 1327 | {"DMIC R1", NULL, "DMIC1"}, |
@@ -1320,18 +1332,22 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = { | |||
1320 | {"BST1", NULL, "IN1N"}, | 1332 | {"BST1", NULL, "IN1N"}, |
1321 | {"BST2", NULL, "IN2P"}, | 1333 | {"BST2", NULL, "IN2P"}, |
1322 | {"BST2", NULL, "IN2N"}, | 1334 | {"BST2", NULL, "IN2N"}, |
1335 | {"BST3", NULL, "IN3P"}, | ||
1336 | {"BST3", NULL, "IN3N"}, | ||
1323 | 1337 | ||
1324 | {"INL VOL", NULL, "IN2P"}, | 1338 | {"INL VOL", NULL, "IN2P"}, |
1325 | {"INR VOL", NULL, "IN2N"}, | 1339 | {"INR VOL", NULL, "IN2N"}, |
1326 | 1340 | ||
1327 | {"RECMIXL", "HPOL Switch", "HPOL"}, | 1341 | {"RECMIXL", "HPOL Switch", "HPOL"}, |
1328 | {"RECMIXL", "INL Switch", "INL VOL"}, | 1342 | {"RECMIXL", "INL Switch", "INL VOL"}, |
1343 | {"RECMIXL", "BST3 Switch", "BST3"}, | ||
1329 | {"RECMIXL", "BST2 Switch", "BST2"}, | 1344 | {"RECMIXL", "BST2 Switch", "BST2"}, |
1330 | {"RECMIXL", "BST1 Switch", "BST1"}, | 1345 | {"RECMIXL", "BST1 Switch", "BST1"}, |
1331 | {"RECMIXL", "OUT MIXL Switch", "OUT MIXL"}, | 1346 | {"RECMIXL", "OUT MIXL Switch", "OUT MIXL"}, |
1332 | 1347 | ||
1333 | {"RECMIXR", "HPOR Switch", "HPOR"}, | 1348 | {"RECMIXR", "HPOR Switch", "HPOR"}, |
1334 | {"RECMIXR", "INR Switch", "INR VOL"}, | 1349 | {"RECMIXR", "INR Switch", "INR VOL"}, |
1350 | {"RECMIXR", "BST3 Switch", "BST3"}, | ||
1335 | {"RECMIXR", "BST2 Switch", "BST2"}, | 1351 | {"RECMIXR", "BST2 Switch", "BST2"}, |
1336 | {"RECMIXR", "BST1 Switch", "BST1"}, | 1352 | {"RECMIXR", "BST1 Switch", "BST1"}, |
1337 | {"RECMIXR", "OUT MIXR Switch", "OUT MIXR"}, | 1353 | {"RECMIXR", "OUT MIXR Switch", "OUT MIXR"}, |
@@ -2260,6 +2276,10 @@ static int rt5640_i2c_probe(struct i2c_client *i2c, | |||
2260 | regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4, | 2276 | regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4, |
2261 | RT5640_IN_DF2, RT5640_IN_DF2); | 2277 | RT5640_IN_DF2, RT5640_IN_DF2); |
2262 | 2278 | ||
2279 | if (rt5640->pdata.in3_diff) | ||
2280 | regmap_update_bits(rt5640->regmap, RT5640_IN1_IN2, | ||
2281 | RT5640_IN_DF2, RT5640_IN_DF2); | ||
2282 | |||
2263 | rt5640->hp_mute = 1; | 2283 | rt5640->hp_mute = 1; |
2264 | 2284 | ||
2265 | return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640, | 2285 | return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640, |