aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolin Chen <b42378@freescale.com>2013-11-20 05:37:09 -0500
committerMark Brown <broonie@linaro.org>2013-11-24 08:32:50 -0500
commitd3383420c969c25deffd33270ebe321e8401191a (patch)
tree39e3ddfbbc675a9ccffb8ded6cbaa6d0014636d2
parent3635bf09a89cf92b80ac44198c5c8f0989624ea6 (diff)
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: Nicolin Chen <b42378@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/soc-pcm.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index ed1e077114a2..170ff9695753 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -450,19 +450,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
450 codec_dai->active--; 450 codec_dai->active--;
451 codec->active--; 451 codec->active--;
452 452
453 /* clear the corresponding DAIs rate when inactive */
454 if (!cpu_dai->active) {
455 cpu_dai->rate = 0;
456 cpu_dai->channels = 0;
457 cpu_dai->sample_bits = 0;
458 }
459
460 if (!codec_dai->active) {
461 codec_dai->rate = 0;
462 codec_dai->channels = 0;
463 codec_dai->sample_bits = 0;
464 }
465
466 /* Muting the DAC suppresses artifacts caused during digital 453 /* Muting the DAC suppresses artifacts caused during digital
467 * shutdown, for example from stopping clocks. 454 * shutdown, for example from stopping clocks.
468 */ 455 */
@@ -682,6 +669,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
682 669
683 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 670 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
684 671
672 /* clear the corresponding DAIs parameters when going to be inactive */
673 if (cpu_dai->active == 1) {
674 cpu_dai->rate = 0;
675 cpu_dai->channels = 0;
676 cpu_dai->sample_bits = 0;
677 }
678
679 if (codec_dai->active == 1) {
680 codec_dai->rate = 0;
681 codec_dai->channels = 0;
682 codec_dai->sample_bits = 0;
683 }
684
685 /* apply codec digital mute */ 685 /* apply codec digital mute */
686 if (!codec->active) 686 if (!codec->active)
687 snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); 687 snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);