mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 13:34:30 +00:00
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: Jassi Brar <jassi.brar@samsung.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
6423c1875c
commit
14dc5734bd
@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user