Commit d3383420 authored by Nicolin Chen's avatar Nicolin Chen Committed by Mark Brown

ASoC: soc-pcm: move DAIs parameters cleaning into hw_free()

We're now applying soc_hw_params_symmetry() to reject unmatched parameters
while we clear parameters in soc_pcm_close(). So here's a use case might be
broken by this mechanism: aplay -Dhw:0 44100.wav 48000.wav 32000.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. As we
only clear parameters in soc_pcm_close(). The parameters would be remained
in the system even if the playback of 44100.wav is finished.

Thus, this patch is trying to move parameters cleaning into hw_free() so that
the system can continue to serve this kind of use case.

Also, since we set them in hw_params(), it should be better to clear them in
hw_free() for symmetry.
Signed-off-by: default avatarNicolin Chen <b42378@freescale.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 3635bf09
...@@ -450,19 +450,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream) ...@@ -450,19 +450,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
codec_dai->active--; codec_dai->active--;
codec->active--; codec->active--;
/* clear the corresponding DAIs rate when inactive */
if (!cpu_dai->active) {
cpu_dai->rate = 0;
cpu_dai->channels = 0;
cpu_dai->sample_bits = 0;
}
if (!codec_dai->active) {
codec_dai->rate = 0;
codec_dai->channels = 0;
codec_dai->sample_bits = 0;
}
/* Muting the DAC suppresses artifacts caused during digital /* Muting the DAC suppresses artifacts caused during digital
* shutdown, for example from stopping clocks. * shutdown, for example from stopping clocks.
*/ */
...@@ -682,6 +669,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) ...@@ -682,6 +669,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
/* clear the corresponding DAIs parameters when going to be inactive */
if (cpu_dai->active == 1) {
cpu_dai->rate = 0;
cpu_dai->channels = 0;
cpu_dai->sample_bits = 0;
}
if (codec_dai->active == 1) {
codec_dai->rate = 0;
codec_dai->channels = 0;
codec_dai->sample_bits = 0;
}
/* apply codec digital mute */ /* apply codec digital mute */
if (!codec->active) if (!codec->active)
snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment