ASoC: dapm: Make sure to always update the DAPM graph in _put_volsw()
authorLars-Peter Clausen <lars@metafoo.de>
Sun, 4 May 2014 17:17:05 +0000 (19:17 +0200)
committerMark Brown <broonie@linaro.org>
Mon, 5 May 2014 19:31:14 +0000 (12:31 -0700)
When using auto-muted controls it may happen that the register value will not
change when changing a control from enabled to disabled (since the control might
be physically disabled due to the auto-muting). We have to make sure to still
update the DAPM graph and disconnect the mixer input.

Fixes: commit 5729507 ("ASoC: dapm: Implement mixer input auto-disable")
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/soc-dapm.c

index 1e171bd31f2ae378e1c1b13c9a634a7c8ab36ffa..fb6c7b793459f6a9cc5a520c85036dd2e8e90696 100644 (file)
@@ -2792,22 +2792,19 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
        mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
 
        change = dapm_kcontrol_set_value(kcontrol, val);
-
-       if (reg != SND_SOC_NOPM) {
-               mask = mask << shift;
-               val = val << shift;
-
-               change = snd_soc_test_bits(codec, reg, mask, val);
-       }
-
        if (change) {
                if (reg != SND_SOC_NOPM) {
-                       update.kcontrol = kcontrol;
-                       update.reg = reg;
-                       update.mask = mask;
-                       update.val = val;
+                       mask = mask << shift;
+                       val = val << shift;
+
+                       if (snd_soc_test_bits(codec, reg, mask, val)) {
+                               update.kcontrol = kcontrol;
+                               update.reg = reg;
+                               update.mask = mask;
+                               update.val = val;
+                               card->update = &update;
+                       }
 
-                       card->update = &update;
                }
 
                ret = soc_dapm_mixer_update_power(card, kcontrol, connect);