ASoC: Allow mulitple usage count of codec and cpu dai
authorJassi Brar <jassi.brar@samsung.com>
Fri, 26 Feb 2010 00:12:32 +0000 (09:12 +0900)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 26 Feb 2010 11:17:48 +0000 (11:17 +0000)
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: Jassi Brar <jassi.brar@samsung.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
include/sound/soc.h
sound/soc/soc-core.c

index 27a2ad9a6b8b7d106c3360b5f23f31d1de2a841f..f792c1881b0a66874084a47962f60a2ef145475d 100644 (file)
@@ -375,7 +375,7 @@ struct snd_soc_pcm_stream {
        unsigned int rate_max;          /* max rate */
        unsigned int channels_min;      /* min 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 */
index 1215a0ec2df0bfcec2d3c5b1ae9a6bc373393ec0..f30959cc954a77bb4ebacd874f7410d00f906581 100644 (file)
@@ -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,
                 runtime->hw.rate_max);
 
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               cpu_dai->playback.active = codec_dai->playback.active = 1;
-       else
-               cpu_dai->capture.active = codec_dai->capture.active = 1;
-       cpu_dai->active = codec_dai->active = 1;
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               cpu_dai->playback.active++;
+               codec_dai->playback.active++;
+       } else {
+               cpu_dai->capture.active++;
+               codec_dai->capture.active++;
+       }
+       cpu_dai->active++;
+       codec_dai->active++;
        card->codec->active++;
        mutex_unlock(&pcm_mutex);
        return 0;
@@ -530,15 +534,16 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
 
        mutex_lock(&pcm_mutex);
 
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               cpu_dai->playback.active = codec_dai->playback.active = 0;
-       else
-               cpu_dai->capture.active = codec_dai->capture.active = 0;
-
-       if (codec_dai->playback.active == 0 &&
-               codec_dai->capture.active == 0) {
-               cpu_dai->active = codec_dai->active = 0;
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               cpu_dai->playback.active--;
+               codec_dai->playback.active--;
+       } else {
+               cpu_dai->capture.active--;
+               codec_dai->capture.active--;
        }
+
+       cpu_dai->active--;
+       codec_dai->active--;
        codec->active--;
 
        /* Muting the DAC suppresses artifacts caused during digital