]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ASoC: soc-pcm: fixup dpcm_prune_paths() loop continue
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 15 Oct 2019 03:59:38 +0000 (12:59 +0900)
committerMark Brown <broonie@kernel.org>
Tue, 22 Oct 2019 18:12:21 +0000 (19:12 +0100)
dpcm_prune_paths() is checking widget at 2 parts.
(A) is for CPU, (B) is for Codec.
If we focus to (A) part, continue at (a) is for (1) loop. But,
if we focus to (B) part, continue at (b) is for (2) loop, not for (1).
This is bug.
This patch fixup this issue.

static int dpcm_prune_paths(...)
{
...
   (1) for_each_dpcm_be(fe, stream, dpcm) {
...

 ^ widget = dai_get_widget(...);
 |
(A) if (widget && widget_in_list(...))
 | (a) continue;
 v
 ^ (2) for_each_rtd_codec_dai(...) {
 | widget = dai_get_widget(...);
(B)
 | if (widget && widget_in_list(...))
 v (b) continue;
}
...

Fixes: 2e5894d73789 ("ASoC: pcm: Add support for DAI multicodec")
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87blui64mf.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-pcm.c

index f462947a5d27d2ee420ee75261931077daf722f5..600d9bf3b076d156ff0e2ed38a0302f73b87b665 100644 (file)
@@ -1436,6 +1436,7 @@ static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
        struct snd_soc_dapm_widget *widget;
        struct snd_soc_dai *dai;
        int prune = 0;
+       int do_prune;
 
        /* Destroy any old FE <--> BE connections */
        for_each_dpcm_be(fe, stream, dpcm) {
@@ -1449,13 +1450,16 @@ static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
                        continue;
 
                /* is there a valid CODEC DAI widget for this BE */
+               do_prune = 1;
                for_each_rtd_codec_dai(dpcm->be, i, dai) {
                        widget = dai_get_widget(dai, stream);
 
                        /* prune the BE if it's no longer in our active list */
                        if (widget && widget_in_list(list, widget))
-                               continue;
+                               do_prune = 0;
                }
+               if (!do_prune)
+                       continue;
 
                dev_dbg(fe->dev, "ASoC: pruning %s BE %s for %s\n",
                        stream ? "capture" : "playback",