Commit 92a99ea439c4 ("ASoC: dapm: Use more aggressive caching") only invalidates necessary caches to improve the cache hit rate. However, in snd_soc_dapm_add_path(), the cache is too aggressive which results in wrong state of the audio map.
E.g. imaging the following examples during snd_soc_instantiate_card():
time 1: at the beginning
in:-1 in:-1 in:-1 out:-1 out:-1 out:-1 A -----> B Spk
time 2: after someone called snd_soc_dapm_new_widgets() (e.g. create_fill_widget_route_map() in sound/soc/codecs/hdac_hdmi.c)
in:0 in:0 in:0 out:0 out:0 out:1 A ----> B Spk
time 3: route added to Spk
in:0 in:0 in:0 out:0 out:0 out:1 A ----> B ----> Spk
time N: route added from SIGGEN
in:1 in:0 in:0 in:0 out:0 out:0 out:0 out:1 SIGGEN ----> A ----> B ----> Spk
In the end, the path will not power on but it should be. At time 2, the caches have been polluted. At time 3, it will not get the correct state if snd_soc_dapm_add_path() does not invalidate "out" of B and A.
time 3 (expected result):
in:0 in:0 in:0 out:1 out:1 out:1 A ----> B ----> Spk
Signed-off-by: Tzung-Bi Shih tzungbi@google.com --- sound/soc/soc-dapm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index a5178845065b..2914f3adb333 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -2722,7 +2722,7 @@ static int snd_soc_dapm_add_path(struct snd_soc_dapm_context *dapm, dapm_mark_dirty(widgets[dir], "Route added"); }
- if (dapm->card->instantiated && path->connect) + if (path->connect) dapm_path_invalidate(path);
return 0;