[PATCH 4/7] ASoC: soc-pcm: Merge for_each_rtd_cpu/codec_dais()
Sridharan, Ranjani
ranjani.sridharan at intel.com
Wed Mar 11 02:30:29 CET 2020
On Tue, Mar 10, 2020 at 6:10 PM Kuninori Morimoto <
kuninori.morimoto.gx at renesas.com> wrote:
>
> From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
>
> Now we can use for_each_rtd_dais().
> Let's use it instead of for_each_rtd_cpu/codec_dais().
>
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> ---
> sound/soc/soc-pcm.c | 314 +++++++++++---------------------------------
> 1 file changed, 75 insertions(+), 239 deletions(-)
>
> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
> index 733d7e8a0e55..dae1821c78dc 100644
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -259,25 +259,15 @@ static int soc_rtd_trigger(struct
> snd_soc_pcm_runtime *rtd,
> static void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd,
> int stream, int action)
> {
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> int i;
>
> lockdep_assert_held(&rtd->card->pcm_mutex);
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - cpu_dai->stream_active[stream] += action;
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - codec_dai->stream_active[stream] += action;
> -
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - cpu_dai->active += action;
> - cpu_dai->component->active += action;
> - }
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - codec_dai->active += action;
> - codec_dai->component->active += action;
> + for_each_rtd_dais(rtd, i, dai) {
> + dai->stream_active[stream] += action;
> + dai->active += action;
> + dai->component->active += action;
> }
> }
>
> @@ -444,8 +434,8 @@ static int soc_pcm_params_symmetry(struct
> snd_pcm_substream *substream,
> struct snd_pcm_hw_params *params)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> + struct snd_soc_dai *dai;
> struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> unsigned int rate, channels, sample_bits, symmetry, i;
>
> rate = params_rate(params);
> @@ -455,11 +445,8 @@ static int soc_pcm_params_symmetry(struct
> snd_pcm_substream *substream,
> /* reject unmatched parameters when applying symmetry */
> symmetry = rtd->dai_link->symmetric_rates;
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - symmetry |= cpu_dai->driver->symmetric_rates;
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - symmetry |= codec_dai->driver->symmetric_rates;
> + for_each_rtd_cpu_dais(rtd, i, dai)
> + symmetry |= dai->driver->symmetric_rates;
>
> if (symmetry) {
> for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> @@ -473,11 +460,8 @@ static int soc_pcm_params_symmetry(struct
> snd_pcm_substream *substream,
>
> symmetry = rtd->dai_link->symmetric_channels;
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - symmetry |= cpu_dai->driver->symmetric_channels;
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - symmetry |= codec_dai->driver->symmetric_channels;
> + for_each_rtd_dais(rtd, i, dai)
> + symmetry |= dai->driver->symmetric_channels;
>
> if (symmetry) {
> for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> @@ -492,11 +476,8 @@ static int soc_pcm_params_symmetry(struct
> snd_pcm_substream *substream,
>
> symmetry = rtd->dai_link->symmetric_samplebits;
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - symmetry |= cpu_dai->driver->symmetric_samplebits;
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - symmetry |= codec_dai->driver->symmetric_samplebits;
> + for_each_rtd_dais(rtd, i, dai)
> + symmetry |= dai->driver->symmetric_samplebits;
>
> if (symmetry) {
> for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> @@ -516,25 +497,18 @@ static bool soc_pcm_has_symmetry(struct
> snd_pcm_substream *substream)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> struct snd_soc_dai_link *link = rtd->dai_link;
> - struct snd_soc_dai *codec_dai;
> - struct snd_soc_dai *cpu_dai;
> + struct snd_soc_dai *dai;
> unsigned int symmetry, i;
>
> symmetry = link->symmetric_rates ||
> link->symmetric_channels ||
> link->symmetric_samplebits;
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - symmetry = symmetry ||
> - cpu_dai->driver->symmetric_rates ||
> - cpu_dai->driver->symmetric_channels ||
> - cpu_dai->driver->symmetric_samplebits;
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> + for_each_rtd_dais(rtd, i, dai)
> symmetry = symmetry ||
> - codec_dai->driver->symmetric_rates ||
> - codec_dai->driver->symmetric_channels ||
> - codec_dai->driver->symmetric_samplebits;
> + dai->driver->symmetric_rates ||
> + dai->driver->symmetric_channels ||
> + dai->driver->symmetric_samplebits;
>
> return symmetry;
> }
> @@ -772,19 +746,15 @@ static int soc_pcm_close(struct snd_pcm_substream
> *substream)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> struct snd_soc_component *component;
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> int i;
>
> mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
>
> snd_soc_runtime_deactivate(rtd, substream->stream);
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - snd_soc_dai_shutdown(cpu_dai, substream);
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - snd_soc_dai_shutdown(codec_dai, substream);
> + for_each_rtd_dais(rtd, i, dai)
> + snd_soc_dai_shutdown(dai, substream);
>
> soc_rtd_shutdown(rtd, substream);
>
> @@ -816,8 +786,7 @@ static int soc_pcm_open(struct snd_pcm_substream
> *substream)
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> struct snd_pcm_runtime *runtime = substream->runtime;
> struct snd_soc_component *component;
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> const char *codec_dai_name = "multicodec";
> const char *cpu_dai_name = "multicpu";
> int i, ret = 0;
> @@ -842,28 +811,19 @@ static int soc_pcm_open(struct snd_pcm_substream
> *substream)
> }
>
> /* startup the audio subsystem */
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - ret = snd_soc_dai_startup(cpu_dai, substream);
> - if (ret < 0) {
> - dev_err(cpu_dai->dev, "ASoC: can't open interface
> %s: %d\n",
> - cpu_dai->name, ret);
> - goto cpu_dai_err;
> - }
> - }
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - ret = snd_soc_dai_startup(codec_dai, substream);
> + for_each_rtd_dais(rtd, i, dai) {
> + ret = snd_soc_dai_startup(dai, substream);
> if (ret < 0) {
> - dev_err(codec_dai->dev,
> - "ASoC: can't open codec %s: %d\n",
> - codec_dai->name, ret);
> + dev_err(dai->dev,
> + "ASoC: can't open DAI %s: %d\n",
> + dai->name, ret);
> goto config_err;
> }
>
> if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
> - codec_dai->tx_mask = 0;
> + dai->tx_mask = 0;
> else
> - codec_dai->rx_mask = 0;
> + dai->rx_mask = 0;
> }
>
> /* Dynamic PCM DAI links compat checks use dynamic capabilities */
> @@ -903,17 +863,9 @@ static int soc_pcm_open(struct snd_pcm_substream
> *substream)
> soc_pcm_apply_msb(substream);
>
> /* Symmetry only applies if we've already got an active stream. */
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - if (cpu_dai->active) {
> - ret = soc_pcm_apply_symmetry(substream, cpu_dai);
> - if (ret != 0)
> - goto config_err;
> - }
> - }
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - if (codec_dai->active) {
> - ret = soc_pcm_apply_symmetry(substream, codec_dai);
> + for_each_rtd_dais(rtd, i, dai) {
> + if (dai->active) {
> + ret = soc_pcm_apply_symmetry(substream, dai);
> if (ret != 0)
> goto config_err;
> }
> @@ -935,11 +887,8 @@ static int soc_pcm_open(struct snd_pcm_substream
> *substream)
> return 0;
>
> config_err:
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - snd_soc_dai_shutdown(codec_dai, substream);
> -cpu_dai_err:
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - snd_soc_dai_shutdown(cpu_dai, substream);
> + for_each_rtd_dais(rtd, i, dai)
> + snd_soc_dai_shutdown(dai, substream);
>
> soc_rtd_shutdown(rtd, substream);
> rtd_startup_err:
> @@ -978,8 +927,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream
> *substream)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> struct snd_soc_component *component;
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> int i, ret = 0;
>
> mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
> @@ -1000,21 +948,11 @@ static int soc_pcm_prepare(struct snd_pcm_substream
> *substream)
> }
> }
>
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - ret = snd_soc_dai_prepare(codec_dai, substream);
> - if (ret < 0) {
> - dev_err(codec_dai->dev,
> - "ASoC: codec DAI prepare error: %d\n",
> - ret);
> - goto out;
> - }
> - }
> -
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - ret = snd_soc_dai_prepare(cpu_dai, substream);
> + for_each_rtd_dais(rtd, i, dai) {
> + ret = snd_soc_dai_prepare(dai, substream);
> if (ret < 0) {
> - dev_err(cpu_dai->dev,
> - "ASoC: cpu DAI prepare error: %d\n", ret);
> + dev_err(dai->dev,
> + "ASoC: DAI prepare error: %d\n", ret);
> goto out;
> }
> }
> @@ -1029,11 +967,8 @@ static int soc_pcm_prepare(struct snd_pcm_substream
> *substream)
> snd_soc_dapm_stream_event(rtd, substream->stream,
> SND_SOC_DAPM_STREAM_START);
>
> - for_each_rtd_codec_dais(rtd, i, codec_dai)
> - snd_soc_dai_digital_mute(codec_dai, 0,
> - substream->stream);
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai)
> - snd_soc_dai_digital_mute(cpu_dai, 0, substream->stream);
> + for_each_rtd_dais(rtd, i, dai)
> + snd_soc_dai_digital_mute(dai, 0, substream->stream);
>
> out:
> mutex_unlock(&rtd->card->pcm_mutex);
> @@ -1217,44 +1152,23 @@ static int soc_pcm_hw_params(struct
> snd_pcm_substream *substream,
> static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> int i;
>
> mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
>
> /* clear the corresponding DAIs parameters when going to be
> inactive */
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - if (cpu_dai->active == 1) {
> - cpu_dai->rate = 0;
> - cpu_dai->channels = 0;
> - cpu_dai->sample_bits = 0;
> - }
> - }
> + for_each_rtd_dais(rtd, i, dai) {
> + int active = dai->stream_active[substream->stream];
>
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - if (codec_dai->active == 1) {
> - codec_dai->rate = 0;
> - codec_dai->channels = 0;
> - codec_dai->sample_bits = 0;
> + if (dai->active == 1) {
> + dai->rate = 0;
> + dai->channels = 0;
> + dai->sample_bits = 0;
> }
> - }
> -
> - /* apply codec digital mute */
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - int active = codec_dai->stream_active[substream->stream];
> -
> - if (active == 1)
> - snd_soc_dai_digital_mute(codec_dai, 1,
> - substream->stream);
> - }
> -
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - int active = cpu_dai->stream_active[substream->stream];
>
> if (active == 1)
> - snd_soc_dai_digital_mute(cpu_dai, 1,
> - substream->stream);
> + snd_soc_dai_digital_mute(dai, 1,
> substream->stream);
> }
>
> /* free any machine hw params */
> @@ -1264,18 +1178,11 @@ static int soc_pcm_hw_free(struct
> snd_pcm_substream *substream)
> soc_pcm_components_hw_free(substream, NULL);
>
> /* now free hw params for the DAIs */
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - if (!snd_soc_dai_stream_valid(codec_dai,
> substream->stream))
> + for_each_rtd_dais(rtd, i, dai) {
> + if (!snd_soc_dai_stream_valid(dai, substream->stream))
> continue;
>
> - snd_soc_dai_hw_free(codec_dai, substream);
> - }
> -
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - if (!snd_soc_dai_stream_valid(cpu_dai, substream->stream))
> - continue;
> -
> - snd_soc_dai_hw_free(cpu_dai, substream);
> + snd_soc_dai_hw_free(dai, substream);
> }
>
> mutex_unlock(&rtd->card->pcm_mutex);
> @@ -1286,8 +1193,7 @@ static int soc_pcm_trigger_start(struct
> snd_pcm_substream *substream, int cmd)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> struct snd_soc_component *component;
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> int i, ret;
>
> ret = soc_rtd_trigger(rtd, substream, cmd);
> @@ -1300,14 +1206,8 @@ static int soc_pcm_trigger_start(struct
> snd_pcm_substream *substream, int cmd)
> return ret;
> }
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - ret = snd_soc_dai_trigger(cpu_dai, substream, cmd);
> - if (ret < 0)
> - return ret;
> - }
> -
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
> + for_each_rtd_dais(rtd, i, dai) {
> + ret = snd_soc_dai_trigger(dai, substream, cmd);
> if (ret < 0)
> return ret;
> }
> @@ -1319,18 +1219,11 @@ static int soc_pcm_trigger_stop(struct
> snd_pcm_substream *substream, int cmd)
> {
> struct snd_soc_pcm_runtime *rtd = substream->private_data;
> struct snd_soc_component *component;
> - struct snd_soc_dai *cpu_dai;
> - struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dai;
> int i, ret;
>
> - for_each_rtd_codec_dais(rtd, i, codec_dai) {
> - ret = snd_soc_dai_trigger(codec_dai, substream, cmd);
> - if (ret < 0)
> - return ret;
> - }
> -
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - ret = snd_soc_dai_trigger(cpu_dai, substream, cmd);
> + for_each_rtd_dais(rtd, i, dai) {
>
Morimoto-san,
We are switching the order in which the codec dais and cpu dais are stopped
here with this new macro no. Does it make a difference? The same comment
applies to some other changes as well.
If the trigger_start() started cpu dais first and then codec dais, do we
need to stop in the reverse order?
Thanks,
Ranjani
More information about the Alsa-devel
mailing list