aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorBenoît Thébaudeau <benoit.thebaudeau@advansee.com>2012-06-18 16:41:28 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-06-29 03:13:32 -0400
commit8a720718b37d00cf8ab311902705ae7c7890bb95 (patch)
tree7a5a4378432af0ee9d970114fb29e9d3e5ed5c6b /sound/soc/soc-dapm.c
parentadf643aba8ed620f8c8e2533f4ace3a90e5daecf (diff)
ASoC: dapm: Fix snd_soc_dapm_put_volsw() connect
snd_soc_dapm_put_volsw() sets connect incorrectly in the case max > 1 with invert. In that case, the raw disconnect value should be max, which corresponds to the userspace value 0. This use case currently does not appear upstream, but it could break SOC_DAPM_SINGLE() or SOC_DAPM_SINGLE_TLV() elsewhere or in the future. Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index c2206bc835da..967066873aad 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2515,19 +2515,13 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
2515 int wi; 2515 int wi;
2516 2516
2517 val = (ucontrol->value.integer.value[0] & mask); 2517 val = (ucontrol->value.integer.value[0] & mask);
2518 connect = !!val;
2518 2519
2519 if (invert) 2520 if (invert)
2520 val = max - val; 2521 val = max - val;
2521 mask = mask << shift; 2522 mask = mask << shift;
2522 val = val << shift; 2523 val = val << shift;
2523 2524
2524 if (val)
2525 /* new connection */
2526 connect = invert ? 0 : 1;
2527 else
2528 /* old connection must be powered down */
2529 connect = invert ? 1 : 0;
2530
2531 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 2525 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2532 2526
2533 change = snd_soc_test_bits(widget->codec, reg, mask, val); 2527 change = snd_soc_test_bits(widget->codec, reg, mask, val);