It's reasonable that DAI parameters should be cleared if current DAI becomes inactive.
Only check DAI active status in soc_pcm_hw_free() is not enough since there's the risk that DAI parameters never be cleared if there're more than one stream [see A]. Only check DAI active status in soc_pcm_close() is also not enough since it will cause the cleanup just happening in soc_pcm_close() [see B].
[A] For example, we have stream1 and stream2 for DAI about to stop. stream2 executes soc_pcm_hw_free() before stream1 executes soc_pcm_close(). At the moment, stream2 should clear current DAI parameters because stream1 passed the cleanup stage in soc_pcm_hw_free() and stream2 in fact is the only active stream which has a chance to do clean up. Since DAI active status is not yet updated by stream1 in soc_pcm_close(), stream2 doesn't know itself should clear DAI parameters. In result both stream1 and stream2 don't clear the parameters.
[B] Suppose a case: aplay -Dhw:0 44100.wav 48000.wav In this case, we call soc_pcm_open()->soc_pcm_hw_params()->soc_pcm_hw_free() ->soc_pcm_hw_params()->soc_pcm_hw_free()->soc_pcm_close() in order. The DAI parameters would be remained in the system even if the playback of 44100.wav is finished.
In conclusion, it's better to check DAI active status in both soc_pcm_hw_free() and soc_pcm_close() which makes sure DAI parameters cleared if the DAI becomes inactive.
changes in v2: - Patch v1 link: https://lore.kernel.org/all/20230112065834.580192-1-chancel.liu@nxp.com/ Patch v1 tries to introduce a usage count called hw_params_count to fix issue on DAI parameters cleanup. However it's not a good fix because not considering hw_params() and hw_free() are not symmetrical and hw_params() might be called multilpe times by user. - Both check DAI active status in soc_pcm_hw_free() and soc_pcm_close() which makes sure DAI parameters cleared if the DAI becomes inactive.
Chancel Liu (1): ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes inactive
sound/soc/soc-pcm.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
-- 2.25.1