On Tue, 2020-05-12 at 08:53 +0900, Kuninori Morimoto wrote:
Hi Ranjani
Thank you for reviewing
- if (!cpu_dai->active)
- if (!snd_soc_dai_activity(cpu_dai))
I have a feeling this is probably incorrect. snd_soc_dai_activity() checks for stream_active count which is different from snd_soc_dai's active member, isnt it?
OK, let me check. The original code is like this
static void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd, int stream, int action) { ... for_each_rtd_dais(rtd, i, dai) { dai->stream_active[stream] += action; dai->active += action; ... } }
void snd_soc_runtime_activate(...) { snd_soc_runtime_action(rtd, stream, 1); }
void snd_soc_runtime_deactivate(...) { snd_soc_runtime_action(rtd, stream, -1); }
Basically, ASoC calls snd_soc_runtime_activate() for activate count up, and, snd_soc_runtime_deactivate() for activate count down.
I think snd_soc_dai_activity() is correct, *so far*.
Exceptions are soc-dapm.c :: snd_soc_dai_link_event_pre_pmu() soc-dapm.c :: snd_soc_dai_link_event()
snd_soc_dai_link_event_pre_pmu(...) { ... snd_soc_dapm_widget_for_each_source_path(w, path) { ... source->active++; } ... snd_soc_dapm_widget_for_each_sink_path(w, path) { ... sink->active++; } ... }
snd_soc_dai_link_event(...) { ... snd_soc_dapm_widget_for_each_source_path(w, path) { ... source->active--; ... }
snd_soc_dapm_widget_for_each_sink_path(w, path) { ... sink->active--; ... } ...
}
Only these directly access to dai->active, *without* thinking stream_active. I think it should use snd_soc_runtime_activate() / snd_soc_runtime_deactivate(). My patch cares it... Oops !! I thought my patch cares it, but not enough (= [02/17]).
Can you agree below ?
- use runtime_activate()/deactivate() at above functions.
I am wondering what the original intention for having separate stream_active and active members for snd_soc_dai was. With your proposal there wouldnt be a need for "active" anymore, isnt it?
Thanks, Ranjani