Skip to content

Commit

Permalink
ASoC: soc-dai: add flag to mute and unmute stream during trigger
Browse files Browse the repository at this point in the history
commit f022057 upstream.

In some setups like Speaker amps which are very sensitive, ex: keeping them
unmute without actual data stream for very short duration results in a
static charge and results in pop and clicks. To minimize this, provide a way
to mute and unmute such codecs during trigger callbacks.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Tested-by: Johan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20231027105747.32450-2-srinivas.kandagatla@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
[ johan: backport to v6.6.2 ]
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Srinivas-Kandagatla authored and gregkh committed Nov 28, 2023
1 parent e31eb7d commit 94da565
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
1 change: 1 addition & 0 deletions include/sound/soc-dai.h
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,7 @@ struct snd_soc_dai_ops {

/* bit field */
unsigned int no_capture_mute:1;
unsigned int mute_unmute_on_trigger:1;
};

struct snd_soc_cdai_ops {
Expand Down
7 changes: 7 additions & 0 deletions sound/soc/soc-dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,10 @@ int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream,
ret = soc_dai_trigger(dai, substream, cmd);
if (ret < 0)
break;

if (dai->driver->ops && dai->driver->ops->mute_unmute_on_trigger)
snd_soc_dai_digital_mute(dai, 0, substream->stream);

soc_dai_mark_push(dai, substream, trigger);
}
break;
Expand All @@ -651,6 +655,9 @@ int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream,
if (rollback && !soc_dai_mark_match(dai, substream, trigger))
continue;

if (dai->driver->ops && dai->driver->ops->mute_unmute_on_trigger)
snd_soc_dai_digital_mute(dai, 1, substream->stream);

r = soc_dai_trigger(dai, substream, cmd);
if (r < 0)
ret = r; /* use last ret */
Expand Down
12 changes: 8 additions & 4 deletions sound/soc/soc-pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -896,8 +896,10 @@ static int __soc_pcm_prepare(struct snd_soc_pcm_runtime *rtd,
snd_soc_dapm_stream_event(rtd, substream->stream,
SND_SOC_DAPM_STREAM_START);

for_each_rtd_dais(rtd, i, dai)
snd_soc_dai_digital_mute(dai, 0, substream->stream);
for_each_rtd_dais(rtd, i, dai) {
if (dai->driver->ops && !dai->driver->ops->mute_unmute_on_trigger)
snd_soc_dai_digital_mute(dai, 0, substream->stream);
}

out:
return soc_pcm_ret(rtd, ret);
Expand Down Expand Up @@ -939,8 +941,10 @@ static int soc_pcm_hw_clean(struct snd_soc_pcm_runtime *rtd,
if (snd_soc_dai_active(dai) == 1)
soc_pcm_set_dai_params(dai, NULL);

if (snd_soc_dai_stream_active(dai, substream->stream) == 1)
snd_soc_dai_digital_mute(dai, 1, substream->stream);
if (snd_soc_dai_stream_active(dai, substream->stream) == 1) {
if (dai->driver->ops && !dai->driver->ops->mute_unmute_on_trigger)
snd_soc_dai_digital_mute(dai, 1, substream->stream);
}
}

/* run the stream event */
Expand Down

0 comments on commit 94da565

Please sign in to comment.