aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-03-03 12:45:21 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-03-17 10:08:31 -0400
commita6c65736bc2e63392334bd800f1b2754ab55db1e (patch)
tree8ac7c2c70e61084a07e7af433452d9ddf3e6dc0e /sound/soc/soc-dapm.c
parent2a0761a35b70f170a9c14ecbcb6a959fb6e7bdf3 (diff)
ASoC: Remove current PGA control handling
A code audit reveals that there are currently no users of the widget controls on PGAs. This is likely to continue to be the case since while there are useful things that can be done with integrating the PGA gain and mute controls with the power sequencing userspace generally wants stereo controls for output stages which this doesn't map onto well. In preparation for implementing something more useful strip out the existing code, leaving the parameters there for use by the new code. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c93
1 files changed, 3 insertions, 90 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index bbb2135a0b21..611284194000 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -321,54 +321,6 @@ static int dapm_update_bits(struct snd_soc_dapm_widget *widget)
321 return change; 321 return change;
322} 322}
323 323
324/* ramps the volume up or down to minimise pops before or after a
325 * DAPM power event */
326static int dapm_set_pga(struct snd_soc_dapm_widget *widget, int power)
327{
328 const struct snd_kcontrol_new *k = widget->kcontrols;
329
330 if (widget->muted && !power)
331 return 0;
332 if (!widget->muted && power)
333 return 0;
334
335 if (widget->num_kcontrols && k) {
336 struct soc_mixer_control *mc =
337 (struct soc_mixer_control *)k->private_value;
338 unsigned int reg = mc->reg;
339 unsigned int shift = mc->shift;
340 int max = mc->max;
341 unsigned int mask = (1 << fls(max)) - 1;
342 unsigned int invert = mc->invert;
343
344 if (power) {
345 int i;
346 /* power up has happended, increase volume to last level */
347 if (invert) {
348 for (i = max; i > widget->saved_value; i--)
349 snd_soc_update_bits(widget->codec, reg, mask, i);
350 } else {
351 for (i = 0; i < widget->saved_value; i++)
352 snd_soc_update_bits(widget->codec, reg, mask, i);
353 }
354 widget->muted = 0;
355 } else {
356 /* power down is about to occur, decrease volume to mute */
357 int val = snd_soc_read(widget->codec, reg);
358 int i = widget->saved_value = (val >> shift) & mask;
359 if (invert) {
360 for (; i < mask; i++)
361 snd_soc_update_bits(widget->codec, reg, mask, i);
362 } else {
363 for (; i > 0; i--)
364 snd_soc_update_bits(widget->codec, reg, mask, i);
365 }
366 widget->muted = 1;
367 }
368 }
369 return 0;
370}
371
372/* create new dapm mixer control */ 324/* create new dapm mixer control */
373static int dapm_new_mixer(struct snd_soc_codec *codec, 325static int dapm_new_mixer(struct snd_soc_codec *codec,
374 struct snd_soc_dapm_widget *w) 326 struct snd_soc_dapm_widget *w)
@@ -463,20 +415,10 @@ err:
463static int dapm_new_pga(struct snd_soc_codec *codec, 415static int dapm_new_pga(struct snd_soc_codec *codec,
464 struct snd_soc_dapm_widget *w) 416 struct snd_soc_dapm_widget *w)
465{ 417{
466 struct snd_kcontrol *kcontrol; 418 if (w->num_kcontrols)
467 int ret = 0; 419 pr_err("asoc: PGA controls not supported: '%s'\n", w->name);
468
469 if (!w->num_kcontrols)
470 return -EINVAL;
471 420
472 kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name); 421 return 0;
473 ret = snd_ctl_add(codec->card, kcontrol);
474 if (ret < 0) {
475 printk(KERN_ERR "asoc: failed to add kcontrol %s\n", w->name);
476 return ret;
477 }
478
479 return ret;
480} 422}
481 423
482/* reset 'walked' bit for each dapm path */ 424/* reset 'walked' bit for each dapm path */
@@ -632,16 +574,8 @@ static int dapm_generic_apply_power(struct snd_soc_dapm_widget *w)
632 return ret; 574 return ret;
633 } 575 }
634 576
635 /* Lower PGA volume to reduce pops */
636 if (w->id == snd_soc_dapm_pga && !w->power)
637 dapm_set_pga(w, w->power);
638
639 dapm_update_bits(w); 577 dapm_update_bits(w);
640 578
641 /* Raise PGA volume to reduce pops */
642 if (w->id == snd_soc_dapm_pga && w->power)
643 dapm_set_pga(w, w->power);
644
645 /* power up post event */ 579 /* power up post event */
646 if (w->power && w->event && 580 if (w->power && w->event &&
647 (w->event_flags & SND_SOC_DAPM_POST_PMU)) { 581 (w->event_flags & SND_SOC_DAPM_POST_PMU)) {
@@ -808,10 +742,6 @@ static void dapm_seq_run_coalesced(struct snd_soc_codec *codec,
808 pr_err("%s: pre event failed: %d\n", 742 pr_err("%s: pre event failed: %d\n",
809 w->name, ret); 743 w->name, ret);
810 } 744 }
811
812 /* Lower PGA volume to reduce pops */
813 if (w->id == snd_soc_dapm_pga && !w->power)
814 dapm_set_pga(w, w->power);
815 } 745 }
816 746
817 if (reg >= 0) { 747 if (reg >= 0) {
@@ -823,10 +753,6 @@ static void dapm_seq_run_coalesced(struct snd_soc_codec *codec,
823 } 753 }
824 754
825 list_for_each_entry(w, pending, power_list) { 755 list_for_each_entry(w, pending, power_list) {
826 /* Raise PGA volume to reduce pops */
827 if (w->id == snd_soc_dapm_pga && w->power)
828 dapm_set_pga(w, w->power);
829
830 /* power up post event */ 756 /* power up post event */
831 if (w->power && w->event && 757 if (w->power && w->event &&
832 (w->event_flags & SND_SOC_DAPM_POST_PMU)) { 758 (w->event_flags & SND_SOC_DAPM_POST_PMU)) {
@@ -1596,12 +1522,6 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
1596 unsigned int invert = mc->invert; 1522 unsigned int invert = mc->invert;
1597 unsigned int mask = (1 << fls(max)) - 1; 1523 unsigned int mask = (1 << fls(max)) - 1;
1598 1524
1599 /* return the saved value if we are powered down */
1600 if (widget->id == snd_soc_dapm_pga && !widget->power) {
1601 ucontrol->value.integer.value[0] = widget->saved_value;
1602 return 0;
1603 }
1604
1605 ucontrol->value.integer.value[0] = 1525 ucontrol->value.integer.value[0] =
1606 (snd_soc_read(widget->codec, reg) >> shift) & mask; 1526 (snd_soc_read(widget->codec, reg) >> shift) & mask;
1607 if (shift != rshift) 1527 if (shift != rshift)
@@ -1661,13 +1581,6 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
1661 mutex_lock(&widget->codec->mutex); 1581 mutex_lock(&widget->codec->mutex);
1662 widget->value = val; 1582 widget->value = val;
1663 1583
1664 /* save volume value if the widget is powered down */
1665 if (widget->id == snd_soc_dapm_pga && !widget->power) {
1666 widget->saved_value = val;
1667 mutex_unlock(&widget->codec->mutex);
1668 return 1;
1669 }
1670
1671 if (snd_soc_test_bits(widget->codec, reg, val_mask, val)) { 1584 if (snd_soc_test_bits(widget->codec, reg, val_mask, val)) {
1672 if (val) 1585 if (val)
1673 /* new connection */ 1586 /* new connection */