On Tue, Mar 10, 2020 at 6:10 PM Kuninori Morimoto < kuninori.morimoto.gx@renesas.com> wrote:
From: Kuninori Morimoto kuninori.morimoto.gx@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@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