Skip to content

Commit

Permalink
ASoC: Allow mulitple usage count of codec and cpu dai
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jassi Brar authored and Mark Brown committed Feb 26, 2010
1 parent 6423c18 commit 14dc573
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 14 deletions.
2 changes: 1 addition & 1 deletion include/sound/soc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
31 changes: 18 additions & 13 deletions sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 14dc573

Please sign in to comment.