ASoC: ssm2518: Fix off-by-one error by ffs()
authorTakashi Iwai <tiwai@suse.de>
Mon, 23 Dec 2013 10:42:55 +0000 (11:42 +0100)
committerMark Brown <broonie@linaro.org>
Thu, 2 Jan 2014 11:54:15 +0000 (11:54 +0000)
ffs() returns the bit position from 1, while the ssm2158 driver code
assumes it being 0-based.  Also, the bit mask computation of the two
channel slots are incorrect; it must have worked just casually.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/codecs/ssm2518.c

index 95aed55..cc8debc 100644 (file)
@@ -549,13 +549,13 @@ static int ssm2518_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
                right_slot = 0;
        } else {
                /* We assume the left channel < right channel */
-               left_slot = ffs(tx_mask);
-               tx_mask &= ~(1 << tx_mask);
+               left_slot = __ffs(tx_mask);
+               tx_mask &= ~(1 << left_slot);
                if (tx_mask == 0) {
                        right_slot = left_slot;
                } else {
-                       right_slot = ffs(tx_mask);
-                       tx_mask &= ~(1 << tx_mask);
+                       right_slot = __ffs(tx_mask);
+                       tx_mask &= ~(1 << right_slot);
                }
        }