ASoC: rsnd: don't update status if rsnd_mod_call() doesn't match
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 21 Jan 2016 01:56:18 +0000 (01:56 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 22 Jan 2016 17:12:25 +0000 (17:12 +0000)
If system uses CTU/MUX, and if probe error happened, it will try to
call rsnd_dai_call(remove, ...). Then, MUX/DVC/SSIU/SSI might be called
without calling rsnd_dai_call(probe, ...). Then, each mod status might
be un-matched. It doesn't call un-matched remove function by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/core.c

index 691e223812806a9f5c5968d15063476890a40b35..3eb7e9a7b5dc7b2675fcb32904e9b647f7862578 100644 (file)
@@ -330,8 +330,11 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
        u8 add  = ((val + __rsnd_mod_add_##func) & 0xF);                \
        int ret = 0;                                                    \
        int call = (val == __rsnd_mod_call_##func) && (mod)->ops->func; \
-       *status = (*status & ~mask) +                                   \
-               (add << __rsnd_mod_shift_##func);                       \
+       if (add == 0xF)                                                 \
+               call = 0;                                               \
+       else                                                            \
+               *status = (*status & ~mask) +                           \
+                       (add << __rsnd_mod_shift_##func);               \
        dev_dbg(dev, "%s[%d]\t0x%08x %s\n",                             \
                rsnd_mod_name(mod), rsnd_mod_id(mod),                   \
                *status, call ? #func : "");                            \