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@xxxxxx> > Suggested-by: Stefan Müller-Klieser <s.mueller-klieser@xxxxxxxxx> > --- > 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) > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel