ASoC: dapm: Fix dapm_set_path_status() connect
authorBenoît Thébaudeau <benoit.thebaudeau@advansee.com>
Mon, 2 Jul 2012 11:45:21 +0000 (13:45 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 3 Jul 2012 19:08:29 +0000 (20:08 +0100)
dapm_set_path_status() 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.

This patch completes commit 3a9abe8.

Cc: Liam Girdwood <lrg@ti.com>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
Cc: <alsa-devel@alsa-project.org>
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 89eae93445cf517e5e356297374fcbcf183529ae..5be4f9a2edb896154c0be70f67c9e9541314eba6 100644 (file)
@@ -321,11 +321,10 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
 
                val = soc_widget_read(w, reg);
                val = (val >> shift) & mask;
+               if (invert)
+                       val = max - val;
 
-               if ((invert && !val) || (!invert && val))
-                       p->connect = 1;
-               else
-                       p->connect = 0;
+               p->connect = !!val;
        }
        break;
        case snd_soc_dapm_mux: {