From: Ben Zhang benzh@chromium.org
The kcontrol 'DSP VAD Switch' is automatically enabled/disabled when the hotwording PCM stream is opened/closed.
A function pointer in struct rt5677_priv is used to avoid module dependency cycle between snd_soc_rt5677 and snd_soc_rt5677_spi.
Signed-off-by: Ben Zhang benzh@chromium.org Signed-off-by: Curtis Malainey cujomalainey@chromium.org --- sound/soc/codecs/rt5677-spi.c | 12 ++++++++++++ sound/soc/codecs/rt5677.c | 6 +++++- sound/soc/codecs/rt5677.h | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/rt5677-spi.c b/sound/soc/codecs/rt5677-spi.c index 62621fe4747c..25d75a803cb5 100644 --- a/sound/soc/codecs/rt5677-spi.c +++ b/sound/soc/codecs/rt5677-spi.c @@ -26,6 +26,7 @@
#include <sound/soc.h>
+#include "rt5677.h" #include "rt5677-spi.h"
#define DRV_NAME "rt5677spi" @@ -100,6 +101,12 @@ static struct snd_soc_dai_driver rt5677_spi_dai = { /* PCM for streaming audio from the DSP buffer */ static int rt5677_spi_pcm_open(struct snd_pcm_substream *substream) { + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, "rt5677"); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); + + rt5677->set_dsp_vad(component, true); snd_soc_set_runtime_hwparams(substream, &rt5677_spi_pcm_hardware); return 0; } @@ -109,10 +116,15 @@ static int rt5677_spi_pcm_close(struct snd_pcm_substream *substream) struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct snd_soc_component *codec_component = + snd_soc_rtdcom_lookup(rtd, "rt5677"); + struct rt5677_priv *rt5677 = + snd_soc_component_get_drvdata(codec_component); struct rt5677_dsp *rt5677_dsp = snd_soc_component_get_drvdata(component);
cancel_delayed_work_sync(&rt5677_dsp->copy_work); + rt5677->set_dsp_vad(codec_component, false); return 0; }
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c index 35d4ec1b7dfd..9cdfe7d488fe 100644 --- a/sound/soc/codecs/rt5677.c +++ b/sound/soc/codecs/rt5677.c @@ -918,7 +918,9 @@ static int rt5677_set_dsp_vad(struct snd_soc_component *component, bool on) if (!IS_ENABLED(CONFIG_SND_SOC_RT5677_SPI)) return -ENXIO;
+ rt5677->dsp_vad_en = on; dev_info(component->dev, "DSP VAD: on=%d, activity=%d\n", on, activity); + if (on && !activity) { activity = true;
@@ -1005,7 +1007,8 @@ static int rt5677_dsp_vad_put(struct snd_kcontrol *kcontrol, rt5677->dsp_vad_en = !!ucontrol->value.integer.value[0];
if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) - rt5677_set_dsp_vad(component, rt5677->dsp_vad_en); + rt5677_set_dsp_vad(component, + !!ucontrol->value.integer.value[0]);
return 0; } @@ -5471,6 +5474,7 @@ static int rt5677_i2c_probe(struct i2c_client *i2c) return -ENOMEM;
rt5677->dev = &i2c->dev; + rt5677->set_dsp_vad = rt5677_set_dsp_vad; i2c_set_clientdata(i2c, rt5677);
if (i2c->dev.of_node) { diff --git a/sound/soc/codecs/rt5677.h b/sound/soc/codecs/rt5677.h index 2bbd618b51ac..ec5be7e01fd1 100644 --- a/sound/soc/codecs/rt5677.h +++ b/sound/soc/codecs/rt5677.h @@ -1854,6 +1854,8 @@ struct rt5677_priv { struct irq_domain *domain; struct mutex irq_lock; unsigned int irq_en; + + int (*set_dsp_vad)(struct snd_soc_component *component, bool on); };
int rt5677_sel_asrc_clk_src(struct snd_soc_component *component,