[alsa-devel] [PATCH 4/7] ASoC: soc-pcm: goto error after trying for_each_rtd_codec_dai

Takashi Iwai tiwai at suse.de
Tue Jan 28 08:01:37 CET 2020


On Mon, 27 Jan 2020 02:49:22 +0100,
Kuninori Morimoto wrote:
> 
> From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> 
> soc_pcm_open() might goto error process *during* for_each_rtd_codec_dai.
> In such case, fallback process need to care about operated/non-operated
> codec dai.
> 
> But, if it goto error process *after* loop even though error happen
> during loop, it don't need to care about operated/non-operated.
> In such case code can be more simple.
> This patch do it. And this is prepare for soc_snd_open() cleanup

This would mean that snd_soc_dai_shutdown() is called even for the
stream that returned the error.  This isn't the expected behavior.

Also, bit-OR-ing the multiple error codes isn't wise, they may return
different error codes, and you'll mixed up to a different number.


thanks,

Takashi

> 
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> ---
>  sound/soc/soc-pcm.c | 20 ++++++++------------
>  1 file changed, 8 insertions(+), 12 deletions(-)
> 
> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
> index f11c15f..57d2f00 100644
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -547,25 +547,24 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
>  		goto component_err;
>  
>  	for_each_rtd_codec_dai(rtd, i, codec_dai) {
> -		ret = snd_soc_dai_startup(codec_dai, substream);
> -		if (ret < 0) {
> -			dev_err(codec_dai->dev,
> -				"ASoC: can't open codec %s: %d\n",
> -				codec_dai->name, ret);
> -			goto codec_dai_err;
> -		}
> +		ret |= snd_soc_dai_startup(codec_dai, substream);
>  
>  		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
>  			codec_dai->tx_mask = 0;
>  		else
>  			codec_dai->rx_mask = 0;
>  	}
> +	if (ret < 0) {
> +		dev_err(codec_dai->dev, "ASoC: can't open codec %s: %d\n",
> +			codec_dai->name, ret);
> +		goto codec_dai_err;
> +	}
>  
>  	ret = soc_rtd_startup(rtd, substream);
>  	if (ret < 0) {
>  		pr_err("ASoC: %s startup failed: %d\n",
>  		       rtd->dai_link->name, ret);
> -		goto machine_err;
> +		goto codec_dai_err;
>  	}
>  
>  	/* Dynamic PCM DAI links compat checks use dynamic capabilities */
> @@ -634,11 +633,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
>  config_err:
>  	soc_rtd_shutdown(rtd, substream);
>  
> -machine_err:
> -	i = rtd->num_codecs;
> -
>  codec_dai_err:
> -	for_each_rtd_codec_dai_rollback(rtd, i, codec_dai)
> +	for_each_rtd_codec_dai(rtd, i, codec_dai)
>  		snd_soc_dai_shutdown(codec_dai, substream);
>  
>  component_err:
> -- 
> 2.7.4
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> https://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list