]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ASoC: rt5682s: add delay time to fix pop sound issue
authorShuming Fan <shumingf@realtek.com>
Wed, 8 Dec 2021 10:17:18 +0000 (18:17 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 8 Dec 2021 13:07:58 +0000 (13:07 +0000)
There is a pop noise at the beginning of the capture data.
This patch adds the delay time before stereo1 ADC unmute to fix the pop sound issue.

Signed-off-by: Shuming Fan <shumingf@realtek.com>
Link: https://lore.kernel.org/r/20211208101718.28945-1-shumingf@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/rt5682s.h
sound/soc/codecs/rt5682s.c

index accfbc2dcdd2ca78a0c578c1b15d3eaa6288475a..f18d91308b9a0b14214ab31d46b8a04da05b8d5a 100644 (file)
@@ -40,6 +40,7 @@ struct rt5682s_platform_data {
        enum rt5682s_jd_src jd_src;
        unsigned int dmic_clk_rate;
        unsigned int dmic_delay;
+       unsigned int amic_delay;
        bool dmic_clk_driving_high;
 
        const char *dai_clk_names[RT5682S_DAI_NUM_CLKS];
index d49a4f68566d21e4de7e43595ceb99be4872d9ac..efa1016831dd216799de1c568212669ccf772533 100644 (file)
@@ -1367,6 +1367,31 @@ static int rt5682s_hp_amp_event(struct snd_soc_dapm_widget *w,
        return 0;
 }
 
+static int rt5682s_stereo1_adc_mixl_event(struct snd_soc_dapm_widget *w,
+               struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
+       unsigned int delay = 0;
+
+       if (rt5682s->pdata.amic_delay)
+               delay = rt5682s->pdata.amic_delay;
+
+       switch (event) {
+       case SND_SOC_DAPM_POST_PMU:
+               msleep(delay);
+               snd_soc_component_update_bits(component, RT5682S_STO1_ADC_DIG_VOL,
+                       RT5682S_L_MUTE, 0);
+               break;
+       case SND_SOC_DAPM_PRE_PMD:
+               snd_soc_component_update_bits(component, RT5682S_STO1_ADC_DIG_VOL,
+                       RT5682S_L_MUTE, RT5682S_L_MUTE);
+               break;
+       }
+
+       return 0;
+}
+
 static int sar_power_event(struct snd_soc_dapm_widget *w,
                struct snd_kcontrol *kcontrol, int event)
 {
@@ -1680,9 +1705,10 @@ static const struct snd_soc_dapm_widget rt5682s_dapm_widgets[] = {
        /* ADC Mixer */
        SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682S_PWR_DIG_2,
                RT5682S_PWR_ADC_S1F_BIT, 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),
-       SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5682S_STO1_ADC_DIG_VOL,
-               RT5682S_L_MUTE_SFT, 1, rt5682s_sto1_adc_l_mix,
-               ARRAY_SIZE(rt5682s_sto1_adc_l_mix)),
+       SND_SOC_DAPM_MIXER_E("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0,
+               rt5682s_sto1_adc_l_mix, ARRAY_SIZE(rt5682s_sto1_adc_l_mix),
+               rt5682s_stereo1_adc_mixl_event,
+               SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
        SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682S_STO1_ADC_DIG_VOL,
                RT5682S_R_MUTE_SFT, 1, rt5682s_sto1_adc_r_mix,
                ARRAY_SIZE(rt5682s_sto1_adc_r_mix)),
@@ -2885,6 +2911,8 @@ static int rt5682s_parse_dt(struct rt5682s_priv *rt5682s, struct device *dev)
                &rt5682s->pdata.dmic_clk_rate);
        device_property_read_u32(dev, "realtek,dmic-delay-ms",
                &rt5682s->pdata.dmic_delay);
+       device_property_read_u32(dev, "realtek,amic-delay-ms",
+               &rt5682s->pdata.amic_delay);
 
        rt5682s->pdata.ldo1_en = of_get_named_gpio(dev->of_node,
                "realtek,ldo1-en-gpios", 0);