diff options
Diffstat (limited to 'sound/soc/codecs/twl4030.c')
-rw-r--r-- | sound/soc/codecs/twl4030.c | 118 |
1 files changed, 55 insertions, 63 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 31e44e346dc..fd0f338374a 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c | |||
@@ -192,39 +192,51 @@ static void twl4030_init_chip(struct snd_soc_codec *codec) | |||
192 | 192 | ||
193 | /* Earpiece */ | 193 | /* Earpiece */ |
194 | static const char *twl4030_earpiece_texts[] = | 194 | static const char *twl4030_earpiece_texts[] = |
195 | {"Off", "DACL1", "DACL2", "Invalid", "DACR1"}; | 195 | {"Off", "DACL1", "DACL2", "DACR1"}; |
196 | 196 | ||
197 | static const struct soc_enum twl4030_earpiece_enum = | 197 | static const unsigned int twl4030_earpiece_values[] = |
198 | SOC_ENUM_SINGLE(TWL4030_REG_EAR_CTL, 1, | 198 | {0x0, 0x1, 0x2, 0x4}; |
199 | |||
200 | static const struct soc_value_enum twl4030_earpiece_enum = | ||
201 | SOC_VALUE_ENUM_SINGLE(TWL4030_REG_EAR_CTL, 1, 0x7, | ||
199 | ARRAY_SIZE(twl4030_earpiece_texts), | 202 | ARRAY_SIZE(twl4030_earpiece_texts), |
200 | twl4030_earpiece_texts); | 203 | twl4030_earpiece_texts, |
204 | twl4030_earpiece_values); | ||
201 | 205 | ||
202 | static const struct snd_kcontrol_new twl4030_dapm_earpiece_control = | 206 | static const struct snd_kcontrol_new twl4030_dapm_earpiece_control = |
203 | SOC_DAPM_ENUM("Route", twl4030_earpiece_enum); | 207 | SOC_DAPM_VALUE_ENUM("Route", twl4030_earpiece_enum); |
204 | 208 | ||
205 | /* PreDrive Left */ | 209 | /* PreDrive Left */ |
206 | static const char *twl4030_predrivel_texts[] = | 210 | static const char *twl4030_predrivel_texts[] = |
207 | {"Off", "DACL1", "DACL2", "Invalid", "DACR2"}; | 211 | {"Off", "DACL1", "DACL2", "DACR2"}; |
212 | |||
213 | static const unsigned int twl4030_predrivel_values[] = | ||
214 | {0x0, 0x1, 0x2, 0x4}; | ||
208 | 215 | ||
209 | static const struct soc_enum twl4030_predrivel_enum = | 216 | static const struct soc_value_enum twl4030_predrivel_enum = |
210 | SOC_ENUM_SINGLE(TWL4030_REG_PREDL_CTL, 1, | 217 | SOC_VALUE_ENUM_SINGLE(TWL4030_REG_PREDL_CTL, 1, 0x7, |
211 | ARRAY_SIZE(twl4030_predrivel_texts), | 218 | ARRAY_SIZE(twl4030_predrivel_texts), |
212 | twl4030_predrivel_texts); | 219 | twl4030_predrivel_texts, |
220 | twl4030_predrivel_values); | ||
213 | 221 | ||
214 | static const struct snd_kcontrol_new twl4030_dapm_predrivel_control = | 222 | static const struct snd_kcontrol_new twl4030_dapm_predrivel_control = |
215 | SOC_DAPM_ENUM("Route", twl4030_predrivel_enum); | 223 | SOC_DAPM_VALUE_ENUM("Route", twl4030_predrivel_enum); |
216 | 224 | ||
217 | /* PreDrive Right */ | 225 | /* PreDrive Right */ |
218 | static const char *twl4030_predriver_texts[] = | 226 | static const char *twl4030_predriver_texts[] = |
219 | {"Off", "DACR1", "DACR2", "Invalid", "DACL2"}; | 227 | {"Off", "DACR1", "DACR2", "DACL2"}; |
220 | 228 | ||
221 | static const struct soc_enum twl4030_predriver_enum = | 229 | static const unsigned int twl4030_predriver_values[] = |
222 | SOC_ENUM_SINGLE(TWL4030_REG_PREDR_CTL, 1, | 230 | {0x0, 0x1, 0x2, 0x4}; |
231 | |||
232 | static const struct soc_value_enum twl4030_predriver_enum = | ||
233 | SOC_VALUE_ENUM_SINGLE(TWL4030_REG_PREDR_CTL, 1, 0x7, | ||
223 | ARRAY_SIZE(twl4030_predriver_texts), | 234 | ARRAY_SIZE(twl4030_predriver_texts), |
224 | twl4030_predriver_texts); | 235 | twl4030_predriver_texts, |
236 | twl4030_predriver_values); | ||
225 | 237 | ||
226 | static const struct snd_kcontrol_new twl4030_dapm_predriver_control = | 238 | static const struct snd_kcontrol_new twl4030_dapm_predriver_control = |
227 | SOC_DAPM_ENUM("Route", twl4030_predriver_enum); | 239 | SOC_DAPM_VALUE_ENUM("Route", twl4030_predriver_enum); |
228 | 240 | ||
229 | /* Headset Left */ | 241 | /* Headset Left */ |
230 | static const char *twl4030_hsol_texts[] = | 242 | static const char *twl4030_hsol_texts[] = |
@@ -300,28 +312,35 @@ SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum); | |||
300 | 312 | ||
301 | /* Left analog microphone selection */ | 313 | /* Left analog microphone selection */ |
302 | static const char *twl4030_analoglmic_texts[] = | 314 | static const char *twl4030_analoglmic_texts[] = |
303 | {"Off", "Main mic", "Headset mic", "Invalid", "AUXL", | 315 | {"Off", "Main mic", "Headset mic", "AUXL", "Carkit mic"}; |
304 | "Invalid", "Invalid", "Invalid", "Carkit mic"}; | 316 | |
317 | static const unsigned int twl4030_analoglmic_values[] = | ||
318 | {0x0, 0x1, 0x2, 0x4, 0x8}; | ||
305 | 319 | ||
306 | static const struct soc_enum twl4030_analoglmic_enum = | 320 | static const struct soc_value_enum twl4030_analoglmic_enum = |
307 | SOC_ENUM_SINGLE(TWL4030_REG_ANAMICL, 0, | 321 | SOC_VALUE_ENUM_SINGLE(TWL4030_REG_ANAMICL, 0, 0xf, |
308 | ARRAY_SIZE(twl4030_analoglmic_texts), | 322 | ARRAY_SIZE(twl4030_analoglmic_texts), |
309 | twl4030_analoglmic_texts); | 323 | twl4030_analoglmic_texts, |
324 | twl4030_analoglmic_values); | ||
310 | 325 | ||
311 | static const struct snd_kcontrol_new twl4030_dapm_analoglmic_control = | 326 | static const struct snd_kcontrol_new twl4030_dapm_analoglmic_control = |
312 | SOC_DAPM_ENUM("Route", twl4030_analoglmic_enum); | 327 | SOC_DAPM_VALUE_ENUM("Route", twl4030_analoglmic_enum); |
313 | 328 | ||
314 | /* Right analog microphone selection */ | 329 | /* Right analog microphone selection */ |
315 | static const char *twl4030_analogrmic_texts[] = | 330 | static const char *twl4030_analogrmic_texts[] = |
316 | {"Off", "Sub mic", "Invalid", "Invalid", "AUXR"}; | 331 | {"Off", "Sub mic", "AUXR"}; |
317 | 332 | ||
318 | static const struct soc_enum twl4030_analogrmic_enum = | 333 | static const unsigned int twl4030_analogrmic_values[] = |
319 | SOC_ENUM_SINGLE(TWL4030_REG_ANAMICR, 0, | 334 | {0x0, 0x1, 0x4}; |
335 | |||
336 | static const struct soc_value_enum twl4030_analogrmic_enum = | ||
337 | SOC_VALUE_ENUM_SINGLE(TWL4030_REG_ANAMICR, 0, 0x5, | ||
320 | ARRAY_SIZE(twl4030_analogrmic_texts), | 338 | ARRAY_SIZE(twl4030_analogrmic_texts), |
321 | twl4030_analogrmic_texts); | 339 | twl4030_analogrmic_texts, |
340 | twl4030_analogrmic_values); | ||
322 | 341 | ||
323 | static const struct snd_kcontrol_new twl4030_dapm_analogrmic_control = | 342 | static const struct snd_kcontrol_new twl4030_dapm_analogrmic_control = |
324 | SOC_DAPM_ENUM("Route", twl4030_analogrmic_enum); | 343 | SOC_DAPM_VALUE_ENUM("Route", twl4030_analogrmic_enum); |
325 | 344 | ||
326 | /* TX1 L/R Analog/Digital microphone selection */ | 345 | /* TX1 L/R Analog/Digital microphone selection */ |
327 | static const char *twl4030_micpathtx1_texts[] = | 346 | static const char *twl4030_micpathtx1_texts[] = |
@@ -347,28 +366,6 @@ static const struct soc_enum twl4030_micpathtx2_enum = | |||
347 | static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control = | 366 | static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control = |
348 | SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum); | 367 | SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum); |
349 | 368 | ||
350 | /* | ||
351 | * This function filters out the non valid mux settings, named as "Invalid" | ||
352 | * in the enum texts. | ||
353 | * Just refuse to set an invalid mux mode. | ||
354 | */ | ||
355 | static int twl4030_enum_event(struct snd_soc_dapm_widget *w, | ||
356 | struct snd_kcontrol *kcontrol, int event) | ||
357 | { | ||
358 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
359 | int ret = 0; | ||
360 | int val; | ||
361 | |||
362 | val = w->value >> e->shift_l; | ||
363 | if (!strcmp("Invalid", e->texts[val])) { | ||
364 | printk(KERN_WARNING "Invalid MUX setting on 0x%02x (%d)\n", | ||
365 | e->reg, val); | ||
366 | ret = -1; | ||
367 | } | ||
368 | |||
369 | return ret; | ||
370 | } | ||
371 | |||
372 | static int micpath_event(struct snd_soc_dapm_widget *w, | 369 | static int micpath_event(struct snd_soc_dapm_widget *w, |
373 | struct snd_kcontrol *kcontrol, int event) | 370 | struct snd_kcontrol *kcontrol, int event) |
374 | { | 371 | { |
@@ -737,16 +734,13 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { | |||
737 | 734 | ||
738 | /* Output MUX controls */ | 735 | /* Output MUX controls */ |
739 | /* Earpiece */ | 736 | /* Earpiece */ |
740 | SND_SOC_DAPM_MUX_E("Earpiece Mux", SND_SOC_NOPM, 0, 0, | 737 | SND_SOC_DAPM_VALUE_MUX("Earpiece Mux", SND_SOC_NOPM, 0, 0, |
741 | &twl4030_dapm_earpiece_control, twl4030_enum_event, | 738 | &twl4030_dapm_earpiece_control), |
742 | SND_SOC_DAPM_PRE_REG), | ||
743 | /* PreDrivL/R */ | 739 | /* PreDrivL/R */ |
744 | SND_SOC_DAPM_MUX_E("PredriveL Mux", SND_SOC_NOPM, 0, 0, | 740 | SND_SOC_DAPM_VALUE_MUX("PredriveL Mux", SND_SOC_NOPM, 0, 0, |
745 | &twl4030_dapm_predrivel_control, twl4030_enum_event, | 741 | &twl4030_dapm_predrivel_control), |
746 | SND_SOC_DAPM_PRE_REG), | 742 | SND_SOC_DAPM_VALUE_MUX("PredriveR Mux", SND_SOC_NOPM, 0, 0, |
747 | SND_SOC_DAPM_MUX_E("PredriveR Mux", SND_SOC_NOPM, 0, 0, | 743 | &twl4030_dapm_predriver_control), |
748 | &twl4030_dapm_predriver_control, twl4030_enum_event, | ||
749 | SND_SOC_DAPM_PRE_REG), | ||
750 | /* HeadsetL/R */ | 744 | /* HeadsetL/R */ |
751 | SND_SOC_DAPM_MUX("HeadsetL Mux", SND_SOC_NOPM, 0, 0, | 745 | SND_SOC_DAPM_MUX("HeadsetL Mux", SND_SOC_NOPM, 0, 0, |
752 | &twl4030_dapm_hsol_control), | 746 | &twl4030_dapm_hsol_control), |
@@ -789,12 +783,10 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { | |||
789 | SND_SOC_DAPM_POST_REG), | 783 | SND_SOC_DAPM_POST_REG), |
790 | 784 | ||
791 | /* Analog input muxes with power switch for the physical ADCL/R */ | 785 | /* Analog input muxes with power switch for the physical ADCL/R */ |
792 | SND_SOC_DAPM_MUX_E("Analog Left Capture Route", | 786 | SND_SOC_DAPM_VALUE_MUX("Analog Left Capture Route", |
793 | TWL4030_REG_AVADC_CTL, 3, 0, &twl4030_dapm_analoglmic_control, | 787 | TWL4030_REG_AVADC_CTL, 3, 0, &twl4030_dapm_analoglmic_control), |
794 | twl4030_enum_event, SND_SOC_DAPM_PRE_REG), | 788 | SND_SOC_DAPM_VALUE_MUX("Analog Right Capture Route", |
795 | SND_SOC_DAPM_MUX_E("Analog Right Capture Route", | 789 | TWL4030_REG_AVADC_CTL, 1, 0, &twl4030_dapm_analogrmic_control), |
796 | TWL4030_REG_AVADC_CTL, 1, 0, &twl4030_dapm_analogrmic_control, | ||
797 | twl4030_enum_event, SND_SOC_DAPM_PRE_REG), | ||
798 | 790 | ||
799 | SND_SOC_DAPM_PGA("Analog Left Amplifier", | 791 | SND_SOC_DAPM_PGA("Analog Left Amplifier", |
800 | TWL4030_REG_ANAMICL, 4, 0, NULL, 0), | 792 | TWL4030_REG_ANAMICL, 4, 0, NULL, 0), |