• Kuninori Morimoto's avatar
    ASoC: soc-pcm: add soc_pcm_clean() and call it from soc_pcm_open/close() · 140a4532
    Kuninori Morimoto authored
    soc_pcm_open() does rollback when failed (A),
    but, it is almost same as soc_pcm_close().
    
    	static int soc_pcm_open(xxx)
    	{
    		...
    		if (ret < 0)
    			goto xxx_err;
    		...
    		return 0;
    
     ^	config_err:
     |		...
     |	rtd_startup_err:
    (A)		...
     |	component_err:
     |		...
     v		return ret;
    	}
    
    The difference is
    soc_pcm_close() is for all dai/component/substream,
    rollback        is for succeeded part only.
    
    This kind of duplicated code can be a hotbed of bugs,
    thus, we want to share soc_pcm_close() and rollback.
    
    Now, soc_pcm_open/close() are handling
    	1) snd_soc_dai_startup/shutdown()
    	2) snd_soc_link_startup/shutdown()
    	3) snd_soc_component_module_get/put()
    	4) snd_soc_component_open/close()
    	5) pm_runtime_put/get()
    
    Now, 1) to 5) are handled.
    This patch adds new soc_pcm_clean() and call it from
    soc_pcm_open() as rollback, and from soc_pcm_close() as
    normal close handler.
    
    One note here is that it don't need to call snd_soc_runtime_deactivate()
    when rollback case, because it will be called without
    snd_soc_runtime_activate().
    It also don't need to call snd_soc_dapm_stream_stop() when rollback case.
    Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://lore.kernel.org/r/87ft72bwn4.wl-kuninori.morimoto.gx@renesas.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    140a4532
soc-pcm.c 79.2 KB