[alsa-devel] [PATCH v3 2/2] ASoC: ssm2602: Fix ADC powerup sequencing
Marco Felsch
m.felsch at pengutronix.de
Wed Feb 6 18:03:12 CET 2019
Hi Mark,
sorry didn't got your 'Applied mail' in time. Please drop this patch.
Thanks,
Marco
On 19-02-06 18:00, Marco Felsch wrote:
> From: Philipp Zabel <p.zabel at pengutronix.de>
>
> According to the ssm2603 data sheet (control register sequencing), the
> digital core should be activated only after all necessary bits in the
> power register are enabled, and a delay determined by the decoupling
> capacitor on the VMID pin has passed. If the digital core is activated
> too early, or even before the ADC is powered up, audible artifacts
> appear at the beginning of the recorded signal.
>
> The digital core is also needed for playback, so when recording starts
> it may already be enabled. This means we cannot get the power sequence
> correct when we want to be able to start recording after playback.
>
> As a workaround put the MIC mute switch into the DAPM routes. This
> way we can keep the recording disabled until the MIC Bias has settled
> and thus get rid of audible artifacts.
>
> Signed-off-by: Philipp Zabel <p.zabel at pengutronix.de>
> [m.felsch at pengutronix.de: adapt commit message]
> [m.felsch at pengutronix.de: drop of configuration as mentioned by Mark:
> https://patchwork.kernel.org/patch/10407449/]
> Signed-off-by: Marco Felsch <m.felsch at pengutronix.de>
> ---
> Changelog:
> v3:
> - no changes
> v2:
> - drop OF timeout configuration
> - adapt commit message
>
> sound/soc/codecs/ssm2602.c | 30 ++++++++++++++++++++++++++++--
> 1 file changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
> index 30b6d30e8e7c..464a4d7873bb 100644
> --- a/sound/soc/codecs/ssm2602.c
> +++ b/sound/soc/codecs/ssm2602.c
> @@ -11,6 +11,7 @@
> //
> // Bugs: Enter bugs at http://blackfin.uclinux.org/
>
> +#include <linux/delay.h>
> #include <linux/module.h>
> #include <linux/regmap.h>
> #include <linux/slab.h>
> @@ -96,7 +97,6 @@ SOC_SINGLE_TLV("Sidetone Playback Volume", SSM2602_APANA, 6, 3, 1,
>
> SOC_SINGLE("Mic Boost (+20dB)", SSM2602_APANA, 0, 1, 0),
> SOC_SINGLE("Mic Boost2 (+20dB)", SSM2602_APANA, 8, 1, 0),
> -SOC_SINGLE("Mic Switch", SSM2602_APANA, 1, 1, 1),
> };
>
> /* Output Mixer */
> @@ -106,10 +106,31 @@ SOC_DAPM_SINGLE("HiFi Playback Switch", SSM2602_APANA, 4, 1, 0),
> SOC_DAPM_SINGLE("Mic Sidetone Switch", SSM2602_APANA, 5, 1, 0),
> };
>
> +static const struct snd_kcontrol_new mic_ctl =
> + SOC_DAPM_SINGLE("Switch", SSM2602_APANA, 1, 1, 1);
> +
> /* Input mux */
> static const struct snd_kcontrol_new ssm2602_input_mux_controls =
> SOC_DAPM_ENUM("Input Select", ssm2602_enum[0]);
>
> +static int ssm2602_mic_switch_event(struct snd_soc_dapm_widget *w,
> + struct snd_kcontrol *kcontrol, int event)
> +{
> + /*
> + * According to the ssm2603 data sheet (control register sequencing),
> + * the digital core should be activated only after all necessary bits
> + * in the power register are enabled, and a delay determined by the
> + * decoupling capacitor on the VMID pin has passed. If the digital core
> + * is activated too early, or even before the ADC is powered up, audible
> + * artifacts appear at the beginning and end of the recorded signal.
> + *
> + * In practice, audible artifacts disappear well over 500 ms.
> + */
> + msleep(500);
> +
> + return 0;
> +}
> +
> static const struct snd_soc_dapm_widget ssm260x_dapm_widgets[] = {
> SND_SOC_DAPM_DAC("DAC", "HiFi Playback", SSM2602_PWR, 3, 1),
> SND_SOC_DAPM_ADC("ADC", "HiFi Capture", SSM2602_PWR, 2, 1),
> @@ -131,6 +152,9 @@ SND_SOC_DAPM_MIXER("Output Mixer", SSM2602_PWR, 4, 1,
> SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0, &ssm2602_input_mux_controls),
> SND_SOC_DAPM_MICBIAS("Mic Bias", SSM2602_PWR, 1, 1),
>
> +SND_SOC_DAPM_SWITCH_E("Mic Switch", SSM2602_APANA, 1, 1, &mic_ctl,
> + ssm2602_mic_switch_event, SND_SOC_DAPM_PRE_PMU),
> +
> SND_SOC_DAPM_OUTPUT("LHPOUT"),
> SND_SOC_DAPM_OUTPUT("RHPOUT"),
> SND_SOC_DAPM_INPUT("MICIN"),
> @@ -163,9 +187,11 @@ static const struct snd_soc_dapm_route ssm2602_routes[] = {
> {"LHPOUT", NULL, "Output Mixer"},
>
> {"Input Mux", "Line", "Line Input"},
> - {"Input Mux", "Mic", "Mic Bias"},
> + {"Input Mux", "Mic", "Mic Switch"},
> {"ADC", NULL, "Input Mux"},
>
> + {"Mic Switch", NULL, "Mic Bias"},
> +
> {"Mic Bias", NULL, "MICIN"},
> };
>
> --
> 2.20.1
>
>
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the Alsa-devel
mailing list