[PATCH v2 3/3] ASoC: codec: tlv3204: Moving GPIO reset and add ADC reset
Sit, Michael Wei Hong
michael.wei.hong.sit at intel.com
Tue Aug 18 08:53:52 CEST 2020
> -----Original Message-----
> From: Alsa-devel <alsa-devel-bounces at alsa-project.org> On Behalf
> Of Michael Sit Wei Hong
> Sent: Wednesday, 12 August, 2020 5:47 PM
> To: alsa-devel at alsa-project.org
> Cc: Rojewski, Cezary <cezary.rojewski at intel.com>; a-
> estrada at ti.com; Shevchenko, Andriy
> <andriy.shevchenko at intel.com>; zakkaye at ti.com; tiwai at suse.com;
> Sia, Jee Heng <jee.heng.sia at intel.com>; pierre-
> louis.bossart at linux.intel.com; liam.r.girdwood at linux.intel.com;
> broonie at kernel.org; dmurphy at ti.com
> Subject: [PATCH v2 3/3] ASoC: codec: tlv3204: Moving GPIO reset
> and add ADC reset
>
> Moving GPIO reset to a later stage and before clock registration to
> ensure that the host system and codec clocks are in sync. If the host
> register clock values prior to gpio reset, the last configured codec
> clock is registered to the host. The codec then gets gpio resetted
> setting the codec clocks to their default value, causing a mismatch.
> Host system will skip clock setting thinking the codec clocks are
> already at the requested rate.
>
> ADC reset is added to ensure the next audio capture does not have
> undesired artifacts. It is probably related to the original code where
> the probe function resets the ADC prior to 1st record.
>
> Signed-off-by: Michael Sit Wei Hong
> <michael.wei.hong.sit at intel.com>
> Reviewed-by: Sia Jee Heng <jee.heng.sia at intel.com>
> Reviewed-by: Pierre-Louis Bossart <pierre-
> louis.bossart at linux.intel.com>
> ---
> sound/soc/codecs/tlv320aic32x4.c | 47
> ++++++++++++++++++++++++--------
> 1 file changed, 35 insertions(+), 12 deletions(-)
>
> diff --git a/sound/soc/codecs/tlv320aic32x4.c
> b/sound/soc/codecs/tlv320aic32x4.c
> index 6c2338ea5d8d..8dcea566b375 100644
> --- a/sound/soc/codecs/tlv320aic32x4.c
> +++ b/sound/soc/codecs/tlv320aic32x4.c
> @@ -50,6 +50,28 @@ struct aic32x4_priv {
> struct device *dev;
> };
>
> +static int aic32x4_reset_adc(struct snd_soc_dapm_widget *w,
> + struct snd_kcontrol *kcontrol, int event)
> {
> + struct snd_soc_component *component =
> snd_soc_dapm_to_component(w->dapm);
> + u32 adc_reg;
> +
> + /*
> + * Workaround: the datasheet does not mention a required
> programming
> + * sequence but experiments show the ADC needs to be
> reset after each
> + * capture to avoid audible artifacts.
> + */
> + switch (event) {
> + case SND_SOC_DAPM_POST_PMD:
> + adc_reg = snd_soc_component_read(component,
> AIC32X4_ADCSETUP);
> + snd_soc_component_write(component,
> AIC32X4_ADCSETUP, adc_reg |
> + AIC32X4_LADC_EN |
> AIC32X4_RADC_EN);
> + snd_soc_component_write(component,
> AIC32X4_ADCSETUP, adc_reg);
> + break;
> + }
> + return 0;
> +};
> +
> static int mic_bias_event(struct snd_soc_dapm_widget *w,
> struct snd_kcontrol *kcontrol, int event) { @@ -434,6
> +456,7 @@ static const struct snd_soc_dapm_widget
> aic32x4_dapm_widgets[] = {
> SND_SOC_DAPM_SUPPLY("Mic Bias", AIC32X4_MICBIAS, 6,
> 0, mic_bias_event,
> SND_SOC_DAPM_POST_PMU |
> SND_SOC_DAPM_PRE_PMD),
>
> + SND_SOC_DAPM_POST("ADC Reset", aic32x4_reset_adc),
>
> SND_SOC_DAPM_OUTPUT("HPL"),
> SND_SOC_DAPM_OUTPUT("HPR"),
> @@ -665,8 +688,8 @@ static int
> aic32x4_set_processing_blocks(struct snd_soc_component
> *component, }
>
> static int aic32x4_setup_clocks(struct snd_soc_component
> *component,
> - unsigned int sample_rate, unsigned int
> channel,
> - unsigned int bit_depth)
> + unsigned int sample_rate, unsigned
> int channel,
> + unsigned int bit_depth)
> {
> u8 aosr;
> u16 dosr;
> @@ -958,12 +981,6 @@ static int
> aic32x4_component_probe(struct snd_soc_component
> *component)
> if (ret)
> return ret;
>
> - if (gpio_is_valid(aic32x4->rstn_gpio)) {
> - ndelay(10);
> - gpio_set_value(aic32x4->rstn_gpio, 1);
> - mdelay(1);
> - }
> -
> snd_soc_component_write(component, AIC32X4_RESET,
> 0x01);
>
> if (aic32x4->setup)
> @@ -1196,10 +1213,6 @@ int aic32x4_probe(struct device *dev,
> struct regmap *regmap)
> aic32x4->mclk_name = "mclk";
> }
>
> - ret = aic32x4_register_clocks(dev, aic32x4->mclk_name);
> - if (ret)
> - return ret;
> -
> if (gpio_is_valid(aic32x4->rstn_gpio)) {
> ret = devm_gpio_request_one(dev, aic32x4-
> >rstn_gpio,
> GPIOF_OUT_INIT_LOW,
> "tlv320aic32x4 rstn"); @@ -1221,6 +1234,16 @@ int
> aic32x4_probe(struct device *dev, struct regmap *regmap)
> return ret;
> }
>
> + if (gpio_is_valid(aic32x4->rstn_gpio)) {
> + ndelay(10);
> + gpio_set_value_cansleep(aic32x4->rstn_gpio, 1);
> + mdelay(1);
> + }
> +
> + ret = aic32x4_register_clocks(dev, aic32x4->mclk_name);
> + if (ret)
> + return ret;
> +
> return 0;
> }
> EXPORT_SYMBOL(aic32x4_probe);
> --
> 2.17.1
Hi everyone,
Any comments on this patch set?
Thanks,
Regards,
Michael
More information about the Alsa-devel
mailing list