diff options
Diffstat (limited to 'sound/soc/codecs/twl4030.c')
-rw-r--r-- | sound/soc/codecs/twl4030.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 23bae74ebf0a..1a00e4b20390 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c | |||
@@ -396,6 +396,31 @@ static const struct soc_enum twl4030_handsfreer_enum = | |||
396 | static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control = | 396 | static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control = |
397 | SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum); | 397 | SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum); |
398 | 398 | ||
399 | /* Vibra */ | ||
400 | /* Vibra audio path selection */ | ||
401 | static const char *twl4030_vibra_texts[] = | ||
402 | {"AudioL1", "AudioR1", "AudioL2", "AudioR2"}; | ||
403 | |||
404 | static const struct soc_enum twl4030_vibra_enum = | ||
405 | SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 2, | ||
406 | ARRAY_SIZE(twl4030_vibra_texts), | ||
407 | twl4030_vibra_texts); | ||
408 | |||
409 | static const struct snd_kcontrol_new twl4030_dapm_vibra_control = | ||
410 | SOC_DAPM_ENUM("Route", twl4030_vibra_enum); | ||
411 | |||
412 | /* Vibra path selection: local vibrator (PWM) or audio driven */ | ||
413 | static const char *twl4030_vibrapath_texts[] = | ||
414 | {"Local vibrator", "Audio"}; | ||
415 | |||
416 | static const struct soc_enum twl4030_vibrapath_enum = | ||
417 | SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 4, | ||
418 | ARRAY_SIZE(twl4030_vibrapath_texts), | ||
419 | twl4030_vibrapath_texts); | ||
420 | |||
421 | static const struct snd_kcontrol_new twl4030_dapm_vibrapath_control = | ||
422 | SOC_DAPM_ENUM("Route", twl4030_vibrapath_enum); | ||
423 | |||
399 | /* Left analog microphone selection */ | 424 | /* Left analog microphone selection */ |
400 | static const char *twl4030_analoglmic_texts[] = | 425 | static const char *twl4030_analoglmic_texts[] = |
401 | {"Off", "Main mic", "Headset mic", "AUXL", "Carkit mic"}; | 426 | {"Off", "Main mic", "Headset mic", "AUXL", "Carkit mic"}; |
@@ -867,6 +892,26 @@ static const struct soc_enum twl4030_rampdelay_enum = | |||
867 | ARRAY_SIZE(twl4030_rampdelay_texts), | 892 | ARRAY_SIZE(twl4030_rampdelay_texts), |
868 | twl4030_rampdelay_texts); | 893 | twl4030_rampdelay_texts); |
869 | 894 | ||
895 | /* Vibra H-bridge direction mode */ | ||
896 | static const char *twl4030_vibradirmode_texts[] = { | ||
897 | "Vibra H-bridge direction", "Audio data MSB", | ||
898 | }; | ||
899 | |||
900 | static const struct soc_enum twl4030_vibradirmode_enum = | ||
901 | SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 5, | ||
902 | ARRAY_SIZE(twl4030_vibradirmode_texts), | ||
903 | twl4030_vibradirmode_texts); | ||
904 | |||
905 | /* Vibra H-bridge direction */ | ||
906 | static const char *twl4030_vibradir_texts[] = { | ||
907 | "Positive polarity", "Negative polarity", | ||
908 | }; | ||
909 | |||
910 | static const struct soc_enum twl4030_vibradir_enum = | ||
911 | SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 1, | ||
912 | ARRAY_SIZE(twl4030_vibradir_texts), | ||
913 | twl4030_vibradir_texts); | ||
914 | |||
870 | static const struct snd_kcontrol_new twl4030_snd_controls[] = { | 915 | static const struct snd_kcontrol_new twl4030_snd_controls[] = { |
871 | /* Common playback gain controls */ | 916 | /* Common playback gain controls */ |
872 | SOC_DOUBLE_R_TLV("DAC1 Digital Fine Playback Volume", | 917 | SOC_DOUBLE_R_TLV("DAC1 Digital Fine Playback Volume", |
@@ -933,6 +978,9 @@ static const struct snd_kcontrol_new twl4030_snd_controls[] = { | |||
933 | 0, 3, 5, 0, input_gain_tlv), | 978 | 0, 3, 5, 0, input_gain_tlv), |
934 | 979 | ||
935 | SOC_ENUM("HS ramp delay", twl4030_rampdelay_enum), | 980 | SOC_ENUM("HS ramp delay", twl4030_rampdelay_enum), |
981 | |||
982 | SOC_ENUM("Vibra H-bridge mode", twl4030_vibradirmode_enum), | ||
983 | SOC_ENUM("Vibra H-bridge direction", twl4030_vibradir_enum), | ||
936 | }; | 984 | }; |
937 | 985 | ||
938 | static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { | 986 | static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { |
@@ -960,6 +1008,7 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { | |||
960 | SND_SOC_DAPM_OUTPUT("CARKITR"), | 1008 | SND_SOC_DAPM_OUTPUT("CARKITR"), |
961 | SND_SOC_DAPM_OUTPUT("HFL"), | 1009 | SND_SOC_DAPM_OUTPUT("HFL"), |
962 | SND_SOC_DAPM_OUTPUT("HFR"), | 1010 | SND_SOC_DAPM_OUTPUT("HFR"), |
1011 | SND_SOC_DAPM_OUTPUT("VIBRA"), | ||
963 | 1012 | ||
964 | /* DACs */ | 1013 | /* DACs */ |
965 | SND_SOC_DAPM_DAC("DAC Right1", "Right Front Playback", | 1014 | SND_SOC_DAPM_DAC("DAC Right1", "Right Front Playback", |
@@ -1060,6 +1109,11 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { | |||
1060 | SND_SOC_DAPM_MUX_E("HandsfreeR Mux", TWL4030_REG_HFR_CTL, 5, 0, | 1109 | SND_SOC_DAPM_MUX_E("HandsfreeR Mux", TWL4030_REG_HFR_CTL, 5, 0, |
1061 | &twl4030_dapm_handsfreer_control, handsfree_event, | 1110 | &twl4030_dapm_handsfreer_control, handsfree_event, |
1062 | SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD), | 1111 | SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD), |
1112 | /* Vibra */ | ||
1113 | SND_SOC_DAPM_MUX("Vibra Mux", TWL4030_REG_VIBRA_CTL, 0, 0, | ||
1114 | &twl4030_dapm_vibra_control), | ||
1115 | SND_SOC_DAPM_MUX("Vibra Route", SND_SOC_NOPM, 0, 0, | ||
1116 | &twl4030_dapm_vibrapath_control), | ||
1063 | 1117 | ||
1064 | /* Introducing four virtual ADC, since TWL4030 have four channel for | 1118 | /* Introducing four virtual ADC, since TWL4030 have four channel for |
1065 | capture */ | 1119 | capture */ |
@@ -1161,6 +1215,11 @@ static const struct snd_soc_dapm_route intercon[] = { | |||
1161 | {"HandsfreeR Mux", "AudioR1", "ARXR1_APGA"}, | 1215 | {"HandsfreeR Mux", "AudioR1", "ARXR1_APGA"}, |
1162 | {"HandsfreeR Mux", "AudioR2", "ARXR2_APGA"}, | 1216 | {"HandsfreeR Mux", "AudioR2", "ARXR2_APGA"}, |
1163 | {"HandsfreeR Mux", "AudioL2", "ARXL2_APGA"}, | 1217 | {"HandsfreeR Mux", "AudioL2", "ARXL2_APGA"}, |
1218 | /* Vibra */ | ||
1219 | {"Vibra Mux", "AudioL1", "DAC Left1"}, | ||
1220 | {"Vibra Mux", "AudioR1", "DAC Right1"}, | ||
1221 | {"Vibra Mux", "AudioL2", "DAC Left2"}, | ||
1222 | {"Vibra Mux", "AudioR2", "DAC Right2"}, | ||
1164 | 1223 | ||
1165 | /* outputs */ | 1224 | /* outputs */ |
1166 | {"OUTL", NULL, "ARXL2_APGA"}, | 1225 | {"OUTL", NULL, "ARXL2_APGA"}, |
@@ -1174,6 +1233,8 @@ static const struct snd_soc_dapm_route intercon[] = { | |||
1174 | {"CARKITR", NULL, "CarkitR Mixer"}, | 1233 | {"CARKITR", NULL, "CarkitR Mixer"}, |
1175 | {"HFL", NULL, "HandsfreeL Mux"}, | 1234 | {"HFL", NULL, "HandsfreeL Mux"}, |
1176 | {"HFR", NULL, "HandsfreeR Mux"}, | 1235 | {"HFR", NULL, "HandsfreeR Mux"}, |
1236 | {"Vibra Route", "Audio", "Vibra Mux"}, | ||
1237 | {"VIBRA", NULL, "Vibra Route"}, | ||
1177 | 1238 | ||
1178 | /* Capture path */ | 1239 | /* Capture path */ |
1179 | {"Analog Left Capture Route", "Main mic", "MAINMIC"}, | 1240 | {"Analog Left Capture Route", "Main mic", "MAINMIC"}, |