ASoC: dapm: Fix snd_soc_dapm_put_volsw() connect
authorBenoît Thébaudeau <benoit.thebaudeau@advansee.com>
Mon, 18 Jun 2012 20:41:28 +0000 (22:41 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 29 Jun 2012 07:13:32 +0000 (08:13 +0100)
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>
sound/soc/soc-dapm.c

index c2206bc835da7315c9467eb99cb8ec033f9fbaa4..967066873aadd922e3e8d6b9fab35bf484cdbdad 100644 (file)
@@ -2515,19 +2515,13 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
        int wi;
 
        val = (ucontrol->value.integer.value[0] & mask);
+       connect = !!val;
 
        if (invert)
                val = max - val;
        mask = mask << shift;
        val = val << shift;
 
-       if (val)
-               /* new connection */
-               connect = invert ? 0 : 1;
-       else
-               /* old connection must be powered down */
-               connect = invert ? 1 : 0;
-
        mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
 
        change = snd_soc_test_bits(widget->codec, reg, mask, val);