Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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 */
+18 −13
Original line number Diff line number Diff line
@@ -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