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. > > 1. do the cleanup locally in soc_pcm_components_open() > > [PATCH] ASoC: soc-pcm: fix state tracking error in snd_soc_component_open/close() > > > > 2. revert to original implementation with "last" passed to components_open() > > [PATCH] ASoC: soc-pcm: Revert "call snd_soc_component_open/close() once" > > > > 3. 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