Commit 14dc5734 authored by Jassi Brar's avatar Jassi Brar Committed by Mark Brown

ASoC: Allow mulitple usage count of codec and cpu dai

If we are to have a snd_soc_dai i.e, cpu_dai and codec_dai, shared among two
or more dai_links we need to log the number of active users of the dai.
For that, we change semantics of the snd_soc_dai.active flag from indicator
to reference counter.
Signed-off-by: default avatarJassi Brar <jassi.brar@samsung.com>
Acked-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 6423c187
...@@ -375,7 +375,7 @@ struct snd_soc_pcm_stream { ...@@ -375,7 +375,7 @@ struct snd_soc_pcm_stream {
unsigned int rate_max; /* max rate */ unsigned int rate_max; /* max rate */
unsigned int channels_min; /* min channels */ unsigned int channels_min; /* min channels */
unsigned int channels_max; /* max channels */ unsigned int channels_max; /* max channels */
unsigned int active:1; /* stream is in use */ unsigned int active; /* num of active users of the stream */
}; };
/* SoC audio ops */ /* SoC audio ops */
......
...@@ -454,11 +454,15 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) ...@@ -454,11 +454,15 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min, pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min,
runtime->hw.rate_max); runtime->hw.rate_max);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
cpu_dai->playback.active = codec_dai->playback.active = 1; cpu_dai->playback.active++;
else codec_dai->playback.active++;
cpu_dai->capture.active = codec_dai->capture.active = 1; } else {
cpu_dai->active = codec_dai->active = 1; cpu_dai->capture.active++;
codec_dai->capture.active++;
}
cpu_dai->active++;
codec_dai->active++;
card->codec->active++; card->codec->active++;
mutex_unlock(&pcm_mutex); mutex_unlock(&pcm_mutex);
return 0; return 0;
...@@ -530,15 +534,16 @@ static int soc_codec_close(struct snd_pcm_substream *substream) ...@@ -530,15 +534,16 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
mutex_lock(&pcm_mutex); mutex_lock(&pcm_mutex);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
cpu_dai->playback.active = codec_dai->playback.active = 0; cpu_dai->playback.active--;
else codec_dai->playback.active--;
cpu_dai->capture.active = codec_dai->capture.active = 0; } else {
cpu_dai->capture.active--;
if (codec_dai->playback.active == 0 && codec_dai->capture.active--;
codec_dai->capture.active == 0) {
cpu_dai->active = codec_dai->active = 0;
} }
cpu_dai->active--;
codec_dai->active--;
codec->active--; codec->active--;
/* Muting the DAC suppresses artifacts caused during digital /* Muting the DAC suppresses artifacts caused during digital
......
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