[alsa-devel] [PATCH 2/2] ASoC: tlv320aic31xx: Do not force power on the DAC/ADC in clock master mode

Stefan Müller-Klieser s.mueller-klieser at phytec.de
Mon Feb 19 13:52:40 CET 2018


Hi Peter,

On 19.02.2018 10:45, Peter Ujfalusi wrote:
> With P0 R29, Bit2 set the I2S clocks will be running when the DAC/ADC is
> powered down, but still the codec need to be powered up by needing at least
> one complete DAPM path for the stream.
> 
> If the AIF is not needed (analog loopback for example) the I2S clocks will
> not run as they are not needed.

Thanks for the work! This looks good. Sadly, I don't have an aic31 hardware for
testing at hand.
Stefan

> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
> Suggested-by: Stefan Müller-Klieser <s.mueller-klieser at phytec.de>
> ---
>  sound/soc/codecs/tlv320aic31xx.c | 32 ++++++++++++++++++++++----------
>  sound/soc/codecs/tlv320aic31xx.h |  1 +
>  2 files changed, 23 insertions(+), 10 deletions(-)
> 
> diff --git a/sound/soc/codecs/tlv320aic31xx.c b/sound/soc/codecs/tlv320aic31xx.c
> index e5a1e2be17aa..bf92d36b8f8a 100644
> --- a/sound/soc/codecs/tlv320aic31xx.c
> +++ b/sound/soc/codecs/tlv320aic31xx.c
> @@ -501,6 +501,10 @@ static const struct snd_soc_dapm_widget common31xx_dapm_widgets[] = {
>  	SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, mic_bias_event,
>  			    SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
>  
> +	/* Keep BCLK/WCLK enabled even if DAC/ADC is powered down */
> +	SND_SOC_DAPM_SUPPLY("Activate I2S clocks", AIC31XX_IFACE2, 2, 0,
> +			    NULL, 0),
> +
>  	/* Outputs */
>  	SND_SOC_DAPM_OUTPUT("HPL"),
>  	SND_SOC_DAPM_OUTPUT("HPR"),
> @@ -553,6 +557,8 @@ static const struct snd_soc_dapm_widget aic31xx_dapm_widgets[] = {
>  	SND_SOC_DAPM_MIXER("Output Right", SND_SOC_NOPM, 0, 0,
>  			   aic31xx_right_output_switches,
>  			   ARRAY_SIZE(aic31xx_right_output_switches)),
> +
> +	SND_SOC_DAPM_AIF_OUT("AIF OUT", "Capture", 0, SND_SOC_NOPM, 0, 0),
>  };
>  
>  static const struct snd_soc_dapm_widget aic311x_dapm_widgets[] = {
> @@ -640,6 +646,8 @@ aic31xx_audio_map[] = {
>  
>  	{"ADC", NULL, "MIC_GAIN_CTL"},
>  
> +	{"AIF OUT", NULL, "ADC"},
> +
>  	/* Left Output */
>  	{"Output Left", "From Left DAC", "DAC Left"},
>  	{"Output Left", "From MIC1LP", "MIC1LP"},
> @@ -673,25 +681,29 @@ aic310x_audio_map[] = {
>  
>  /*
>   * Always connected DAPM routes for codec clock master modes.
> - * If the codec is the master on the I2S bus, we need to power on components
> - * to have valid DAC_CLK and also the DACs and ADC for playback/capture.
> + * If the codec is the master on the I2S bus, we need to power up components
> + * to have valid DAC_CLK.
> + *
> + * In order to have the I2S clocks on the bus either the DACs/ADC need to be
> + * enabled, or the P0/R29/D2 (Keep bclk/wclk in power down) need to be set.
> + *
>   * Otherwise the codec will not generate clocks on the bus.
>   */
>  static const struct snd_soc_dapm_route
>  common31xx_cm_audio_map[] = {
> -	{"DAC Left Input", "Off", "AIF IN"},
> -	{"DAC Right Input", "Off", "AIF IN"},
> +	{"HPL", NULL, "AIF IN"},
> +	{"HPR", NULL, "AIF IN"},
>  
> -	{"HPL", NULL, "DAC Left"},
> -	{"HPR", NULL, "DAC Right"},
> +	{"AIF IN", NULL, "Activate I2S clocks"},
>  };
>  
>  static const struct snd_soc_dapm_route
>  aic31xx_cm_audio_map[] = {
> -	{"MIC1LP P-Terminal", "Off", "MIC1LP"},
> -	{"MIC1RP P-Terminal", "Off", "MIC1RP"},
> -	{"MIC1LM P-Terminal", "Off", "MIC1LM"},
> -	{"MIC1LM M-Terminal", "Off", "MIC1LM"},
> +	{"AIF OUT", NULL, "MIC1LP"},
> +	{"AIF OUT", NULL, "MIC1RP"},
> +	{"AIF OUT", NULL, "MIC1LM"},
> +
> +	{"AIF OUT", NULL, "Activate I2S clocks"},
>  };
>  
>  static int aic31xx_add_controls(struct snd_soc_component *component)
> diff --git a/sound/soc/codecs/tlv320aic31xx.h b/sound/soc/codecs/tlv320aic31xx.h
> index 15ac7cba86fe..0b587585b38b 100644
> --- a/sound/soc/codecs/tlv320aic31xx.h
> +++ b/sound/soc/codecs/tlv320aic31xx.h
> @@ -160,6 +160,7 @@ struct aic31xx_pdata {
>  #define AIC31XX_DACMOD2BCLK		0x01
>  #define AIC31XX_ADC2BCLK		0x02
>  #define AIC31XX_ADCMOD2BCLK		0x03
> +#define AIC31XX_KEEP_I2SCLK		BIT(2)
>  
>  /* AIC31XX_ADCFLAG */
>  #define AIC31XX_ADCPWRSTATUS_MASK	BIT(6)
> 


More information about the Alsa-devel mailing list