diff options
-rw-r--r-- | sound/soc/codecs/arizona.c | 39 | ||||
-rw-r--r-- | sound/soc/codecs/arizona.h | 3 | ||||
-rw-r--r-- | sound/soc/codecs/wm5102.c | 26 | ||||
-rw-r--r-- | sound/soc/codecs/wm5110.c | 34 |
4 files changed, 70 insertions, 32 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index 6837863b582d..debd184cc706 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/delay.h> | ||
13 | #include <linux/gcd.h> | 14 | #include <linux/gcd.h> |
14 | #include <linux/module.h> | 15 | #include <linux/module.h> |
15 | #include <linux/pm_runtime.h> | 16 | #include <linux/pm_runtime.h> |
@@ -332,9 +333,27 @@ const struct soc_enum arizona_ng_hold = | |||
332 | 4, arizona_ng_hold_text); | 333 | 4, arizona_ng_hold_text); |
333 | EXPORT_SYMBOL_GPL(arizona_ng_hold); | 334 | EXPORT_SYMBOL_GPL(arizona_ng_hold); |
334 | 335 | ||
336 | static void arizona_in_set_vu(struct snd_soc_codec *codec, int ena) | ||
337 | { | ||
338 | struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); | ||
339 | unsigned int val; | ||
340 | int i; | ||
341 | |||
342 | if (ena) | ||
343 | val = ARIZONA_IN_VU; | ||
344 | else | ||
345 | val = 0; | ||
346 | |||
347 | for (i = 0; i < priv->num_inputs; i++) | ||
348 | snd_soc_update_bits(codec, | ||
349 | ARIZONA_ADC_DIGITAL_VOLUME_1L + (i * 4), | ||
350 | ARIZONA_IN_VU, val); | ||
351 | } | ||
352 | |||
335 | int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, | 353 | int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, |
336 | int event) | 354 | int event) |
337 | { | 355 | { |
356 | struct arizona_priv *priv = snd_soc_codec_get_drvdata(w->codec); | ||
338 | unsigned int reg; | 357 | unsigned int reg; |
339 | 358 | ||
340 | if (w->shift % 2) | 359 | if (w->shift % 2) |
@@ -343,13 +362,29 @@ int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, | |||
343 | reg = ARIZONA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8); | 362 | reg = ARIZONA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8); |
344 | 363 | ||
345 | switch (event) { | 364 | switch (event) { |
365 | case SND_SOC_DAPM_PRE_PMU: | ||
366 | priv->in_pending++; | ||
367 | break; | ||
346 | case SND_SOC_DAPM_POST_PMU: | 368 | case SND_SOC_DAPM_POST_PMU: |
347 | snd_soc_update_bits(w->codec, reg, ARIZONA_IN1L_MUTE, 0); | 369 | snd_soc_update_bits(w->codec, reg, ARIZONA_IN1L_MUTE, 0); |
370 | |||
371 | /* If this is the last input pending then allow VU */ | ||
372 | priv->in_pending--; | ||
373 | if (priv->in_pending == 0) { | ||
374 | msleep(1); | ||
375 | arizona_in_set_vu(w->codec, 1); | ||
376 | } | ||
348 | break; | 377 | break; |
349 | case SND_SOC_DAPM_PRE_PMD: | 378 | case SND_SOC_DAPM_PRE_PMD: |
350 | snd_soc_update_bits(w->codec, reg, ARIZONA_IN1L_MUTE, | 379 | snd_soc_update_bits(w->codec, reg, |
351 | ARIZONA_IN1L_MUTE); | 380 | ARIZONA_IN1L_MUTE | ARIZONA_IN_VU, |
381 | ARIZONA_IN1L_MUTE | ARIZONA_IN_VU); | ||
352 | break; | 382 | break; |
383 | case SND_SOC_DAPM_POST_PMD: | ||
384 | /* Disable volume updates if no inputs are enabled */ | ||
385 | reg = snd_soc_read(w->codec, ARIZONA_INPUT_ENABLES); | ||
386 | if (reg == 0) | ||
387 | arizona_in_set_vu(w->codec, 0); | ||
353 | } | 388 | } |
354 | 389 | ||
355 | return 0; | 390 | return 0; |
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h index 3f84943b23bf..d592adcc969c 100644 --- a/sound/soc/codecs/arizona.h +++ b/sound/soc/codecs/arizona.h | |||
@@ -65,6 +65,9 @@ struct arizona_priv { | |||
65 | int sysclk; | 65 | int sysclk; |
66 | int asyncclk; | 66 | int asyncclk; |
67 | struct arizona_dai_priv dai[ARIZONA_MAX_DAI]; | 67 | struct arizona_dai_priv dai[ARIZONA_MAX_DAI]; |
68 | |||
69 | int num_inputs; | ||
70 | unsigned int in_pending; | ||
68 | }; | 71 | }; |
69 | 72 | ||
70 | #define ARIZONA_NUM_MIXER_INPUTS 99 | 73 | #define ARIZONA_NUM_MIXER_INPUTS 99 |
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index 5515d85fd82f..44d4c69d25e5 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c | |||
@@ -973,22 +973,28 @@ SND_SOC_DAPM_INPUT("IN3R"), | |||
973 | 973 | ||
974 | SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT, | 974 | SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT, |
975 | 0, NULL, 0, arizona_in_ev, | 975 | 0, NULL, 0, arizona_in_ev, |
976 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 976 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
977 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
977 | SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT, | 978 | SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT, |
978 | 0, NULL, 0, arizona_in_ev, | 979 | 0, NULL, 0, arizona_in_ev, |
979 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 980 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
981 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
980 | SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT, | 982 | SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT, |
981 | 0, NULL, 0, arizona_in_ev, | 983 | 0, NULL, 0, arizona_in_ev, |
982 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 984 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
985 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
983 | SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT, | 986 | SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT, |
984 | 0, NULL, 0, arizona_in_ev, | 987 | 0, NULL, 0, arizona_in_ev, |
985 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 988 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
989 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
986 | SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT, | 990 | SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT, |
987 | 0, NULL, 0, arizona_in_ev, | 991 | 0, NULL, 0, arizona_in_ev, |
988 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 992 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
993 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
989 | SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT, | 994 | SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT, |
990 | 0, NULL, 0, arizona_in_ev, | 995 | 0, NULL, 0, arizona_in_ev, |
991 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 996 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
997 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
992 | 998 | ||
993 | SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1, | 999 | SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1, |
994 | ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0), | 1000 | ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0), |
@@ -1599,13 +1605,6 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec) | |||
1599 | #define WM5102_DIG_VU 0x0200 | 1605 | #define WM5102_DIG_VU 0x0200 |
1600 | 1606 | ||
1601 | static unsigned int wm5102_digital_vu[] = { | 1607 | static unsigned int wm5102_digital_vu[] = { |
1602 | ARIZONA_ADC_DIGITAL_VOLUME_1L, | ||
1603 | ARIZONA_ADC_DIGITAL_VOLUME_1R, | ||
1604 | ARIZONA_ADC_DIGITAL_VOLUME_2L, | ||
1605 | ARIZONA_ADC_DIGITAL_VOLUME_2R, | ||
1606 | ARIZONA_ADC_DIGITAL_VOLUME_3L, | ||
1607 | ARIZONA_ADC_DIGITAL_VOLUME_3R, | ||
1608 | |||
1609 | ARIZONA_DAC_DIGITAL_VOLUME_1L, | 1608 | ARIZONA_DAC_DIGITAL_VOLUME_1L, |
1610 | ARIZONA_DAC_DIGITAL_VOLUME_1R, | 1609 | ARIZONA_DAC_DIGITAL_VOLUME_1R, |
1611 | ARIZONA_DAC_DIGITAL_VOLUME_2L, | 1610 | ARIZONA_DAC_DIGITAL_VOLUME_2L, |
@@ -1648,6 +1647,7 @@ static int wm5102_probe(struct platform_device *pdev) | |||
1648 | platform_set_drvdata(pdev, wm5102); | 1647 | platform_set_drvdata(pdev, wm5102); |
1649 | 1648 | ||
1650 | wm5102->core.arizona = arizona; | 1649 | wm5102->core.arizona = arizona; |
1650 | wm5102->core.num_inputs = 6; | ||
1651 | 1651 | ||
1652 | wm5102->core.adsp[0].part = "wm5102"; | 1652 | wm5102->core.adsp[0].part = "wm5102"; |
1653 | wm5102->core.adsp[0].num = 1; | 1653 | wm5102->core.adsp[0].num = 1; |
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index 2d9b55f57eed..a64d3b8bc3b4 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c | |||
@@ -416,28 +416,36 @@ SND_SOC_DAPM_INPUT("IN4R"), | |||
416 | 416 | ||
417 | SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT, | 417 | SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT, |
418 | 0, NULL, 0, arizona_in_ev, | 418 | 0, NULL, 0, arizona_in_ev, |
419 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 419 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
420 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
420 | SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT, | 421 | SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT, |
421 | 0, NULL, 0, arizona_in_ev, | 422 | 0, NULL, 0, arizona_in_ev, |
422 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 423 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
424 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
423 | SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT, | 425 | SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT, |
424 | 0, NULL, 0, arizona_in_ev, | 426 | 0, NULL, 0, arizona_in_ev, |
425 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 427 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
428 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
426 | SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT, | 429 | SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT, |
427 | 0, NULL, 0, arizona_in_ev, | 430 | 0, NULL, 0, arizona_in_ev, |
428 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 431 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
432 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
429 | SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT, | 433 | SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT, |
430 | 0, NULL, 0, arizona_in_ev, | 434 | 0, NULL, 0, arizona_in_ev, |
431 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 435 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
436 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
432 | SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT, | 437 | SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT, |
433 | 0, NULL, 0, arizona_in_ev, | 438 | 0, NULL, 0, arizona_in_ev, |
434 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 439 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
440 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
435 | SND_SOC_DAPM_PGA_E("IN4L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4L_ENA_SHIFT, | 441 | SND_SOC_DAPM_PGA_E("IN4L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4L_ENA_SHIFT, |
436 | 0, NULL, 0, arizona_in_ev, | 442 | 0, NULL, 0, arizona_in_ev, |
437 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 443 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
444 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
438 | SND_SOC_DAPM_PGA_E("IN4R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4R_ENA_SHIFT, | 445 | SND_SOC_DAPM_PGA_E("IN4R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4R_ENA_SHIFT, |
439 | 0, NULL, 0, arizona_in_ev, | 446 | 0, NULL, 0, arizona_in_ev, |
440 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), | 447 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | |
448 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), | ||
441 | 449 | ||
442 | SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1, | 450 | SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1, |
443 | ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0), | 451 | ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0), |
@@ -993,15 +1001,6 @@ static int wm5110_codec_remove(struct snd_soc_codec *codec) | |||
993 | #define WM5110_DIG_VU 0x0200 | 1001 | #define WM5110_DIG_VU 0x0200 |
994 | 1002 | ||
995 | static unsigned int wm5110_digital_vu[] = { | 1003 | static unsigned int wm5110_digital_vu[] = { |
996 | ARIZONA_ADC_DIGITAL_VOLUME_1L, | ||
997 | ARIZONA_ADC_DIGITAL_VOLUME_1R, | ||
998 | ARIZONA_ADC_DIGITAL_VOLUME_2L, | ||
999 | ARIZONA_ADC_DIGITAL_VOLUME_2R, | ||
1000 | ARIZONA_ADC_DIGITAL_VOLUME_3L, | ||
1001 | ARIZONA_ADC_DIGITAL_VOLUME_3R, | ||
1002 | ARIZONA_ADC_DIGITAL_VOLUME_4L, | ||
1003 | ARIZONA_ADC_DIGITAL_VOLUME_4R, | ||
1004 | |||
1005 | ARIZONA_DAC_DIGITAL_VOLUME_1L, | 1004 | ARIZONA_DAC_DIGITAL_VOLUME_1L, |
1006 | ARIZONA_DAC_DIGITAL_VOLUME_1R, | 1005 | ARIZONA_DAC_DIGITAL_VOLUME_1R, |
1007 | ARIZONA_DAC_DIGITAL_VOLUME_2L, | 1006 | ARIZONA_DAC_DIGITAL_VOLUME_2L, |
@@ -1046,6 +1045,7 @@ static int wm5110_probe(struct platform_device *pdev) | |||
1046 | platform_set_drvdata(pdev, wm5110); | 1045 | platform_set_drvdata(pdev, wm5110); |
1047 | 1046 | ||
1048 | wm5110->core.arizona = arizona; | 1047 | wm5110->core.arizona = arizona; |
1048 | wm5110->core.num_inputs = 8; | ||
1049 | 1049 | ||
1050 | for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++) | 1050 | for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++) |
1051 | wm5110->fll[i].vco_mult = 3; | 1051 | wm5110->fll[i].vco_mult = 3; |