Hi Kai, again Cc Mark
Maybe this is too late, but I want to tell the reason why I wanted to add flag on each component.
do the cleanup locally in soc_pcm_components_open() [PATCH] ASoC: soc-pcm: fix state tracking error in snd_soc_component_open/close()
revert to original implementation with "last" passed to components_open() [PATCH] ASoC: soc-pcm: Revert "call snd_soc_component_open/close() once"
implement opened/module counters [PATCH][RFC] ASoC: soc-component: count snd_soc_component_open/close()
I can see this kind of implementation at many place.
For example, soc_pcm_open() has error handling. But, it is same as soc_pcm_close(), but it can't call it directly, because it needs to care about "successed until where" for now.
If each component / rtd / dai have "done" flag or count, soc_pcm_open() can call soc_pcm_close() directly without thinking about "until", because each flag can handle/indicate it.
The good point is we can reduce duplicate implementation. And it can avoid future bug. Because today, we need to care both soc_pcm_close() and error handling in soc_pcm_open(), it is not good for me.
static int soc_pcm_open(struct snd_pcm_substream *substream) { ... return 0;
/* * From here, "implementation" is same as soc_pcm_close() */
config_err: for_each_rtd_dais(rtd, i, dai) snd_soc_dai_shutdown(dai, substream);
soc_rtd_shutdown(rtd, substream); rtd_startup_err: soc_pcm_components_close(substream, NULL); component_err: mutex_unlock(&rtd->card->pcm_mutex);
for_each_rtd_components(rtd, i, component) { pm_runtime_mark_last_busy(component->dev); pm_runtime_put_autosuspend(component->dev); }
for_each_rtd_components(rtd, i, component) if (!component->active) pinctrl_pm_select_sleep_state(component->dev);
return ret; }
Thank you for your help !! Best regards --- Kuninori Morimoto