aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-15 12:27:22 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-03-03 22:01:01 -0500
commitddbce97cd1798ba4661e33662c659b168e9f51ed (patch)
tree71d0238f92143a022c973f52ba8ba9f1ca536a83
parentf3f1163d19ebd5aa374e5df5372a8f932f2bd5f9 (diff)
ASoC: arizona: Only allow input volume updates when inputs are enabled
Since we are automatically managing the mutes we may as well also manage the volume update bits, disabling volume updates while none of the inputs are active. Since we are doing this we may as well allow the volumes to ramp together so only enable volume updates once at the end of power up. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/codecs/arizona.c39
-rw-r--r--sound/soc/codecs/arizona.h3
-rw-r--r--sound/soc/codecs/wm5102.c26
-rw-r--r--sound/soc/codecs/wm5110.c34
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);
333EXPORT_SYMBOL_GPL(arizona_ng_hold); 334EXPORT_SYMBOL_GPL(arizona_ng_hold);
334 335
336static 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
335int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, 353int 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
974SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT, 974SND_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),
977SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT, 978SND_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),
980SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT, 982SND_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),
983SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT, 986SND_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),
986SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT, 990SND_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),
989SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT, 994SND_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
993SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1, 999SND_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
1601static unsigned int wm5102_digital_vu[] = { 1607static 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
417SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT, 417SND_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),
420SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT, 421SND_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),
423SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT, 425SND_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),
426SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT, 429SND_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),
429SND_SOC_DAPM_PGA_E("IN3L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3L_ENA_SHIFT, 433SND_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),
432SND_SOC_DAPM_PGA_E("IN3R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN3R_ENA_SHIFT, 437SND_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),
435SND_SOC_DAPM_PGA_E("IN4L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4L_ENA_SHIFT, 441SND_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),
438SND_SOC_DAPM_PGA_E("IN4R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN4R_ENA_SHIFT, 445SND_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
442SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1, 450SND_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
995static unsigned int wm5110_digital_vu[] = { 1003static 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;