ASoC: fix oops w/ for_each_rtd_codec_dai_rollback() macro
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 26 Oct 2018 21:54:43 +0000 (16:54 -0500)
committerMark Brown <broonie@kernel.org>
Tue, 30 Oct 2018 15:31:11 +0000 (15:31 +0000)
A kernel oops happens on an error case (usual missing BE mixer
configuration required by Intel SST driver). Git bisect points to this
macro and an operator precedence issue.

for (; ((i--) >= 0) && ((dai) = rtd->codec_dais[i]);)

The initial code replaced by this macro was
while (--i >= 0) {
codec_dai = rtd->codec_dais[i];

Fix the C operator precedence difference by reverting to pre-decrement

Fixes: 0b7990e3897 ('ASoC: add for_each_rtd_codec_dai() macro')
Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc.h

index f1dab1f4b194d46423bd168e9027eab8fe09891a..70c10a8f3e90a7a828d9df930e16fed5915f1686 100644 (file)
@@ -1192,7 +1192,7 @@ struct snd_soc_pcm_runtime {
             ((i) < rtd->num_codecs) && ((dai) = rtd->codec_dais[i]); \
             (i)++)
 #define for_each_rtd_codec_dai_rollback(rtd, i, dai)           \
-       for (; ((i--) >= 0) && ((dai) = rtd->codec_dais[i]);)
+       for (; ((--i) >= 0) && ((dai) = rtd->codec_dais[i]);)
 
 
 /* mixer control */