[alsa-devel] [PATCH v2 1/2] ASoC: msm8916-wcd-analog: Simplify MIC BIAS Internal

Srinivas Kandagatla srinivas.kandagatla at linaro.org
Tue Jan 14 19:25:46 CET 2020



On 14/01/2020 18:12, Stephan Gerhold wrote:
> At the moment, MIC BIAS Internal* and MIC BIAS External* both reference
> the same register, and have a part of their initialization sequence
> duplicated.
> 
> For example, the sequence for enabling MIC BIAS Internal1 is:
>    I1. Enable MIC_BIAS1 supply (MICB_EN bit in CDC_A_MICB_1_EN)
>    I2. Enable internal RBIAS (TX1_INT_RBIAS_EN bit in CDC_A_MICB_1_INT_RBIAS)
> 
> The sequence for enabling MIC BIAS External1 is:
>    E1. Enable MIC_BIAS1 supply (MICB_EN bit in CDC_A_MICB_1_EN)
>    (E2. Ideally, make sure internal RBIAS is disabled. However, this should
>     not happen in practice because DAPM will disable unused supplies...)
> 
> Right now we have:
>    SND_SOC_DAPM_SUPPLY("MIC BIAS Internal1", CDC_A_MICB_1_EN, 7, 0, ...) // I1
>    SND_SOC_DAPM_SUPPLY("MIC BIAS External1", CDC_A_MICB_1_EN, 7, 0, ...) // E1
> and I2 is done in the PM event handler (pm8916_wcd_analog_enable_micbias_int1).
> 
> We can simplify this by defining a common DAPM supply for I1/E1 ("MIC_BIAS1"),
> and one DAPM supply for I2 ("MIC BIAS Internal1"). Additional DAPM routes
> ensure that we also enable the MIC_BIAS1 supply for the internal and external
> pull up resistor.
> 
> Another advantage of this is that we now disable the internal RBIAS
> when it is not needed. This makes it much easier to add support for
> MIC BIAS Internal3 as a next step.
> 
> Tested-by: Nikita Travkin <nikitos.tr at gmail.com> # longcheer-l8150
> Cc: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
> Signed-off-by: Stephan Gerhold <stephan at gerhold.net>

Thanks for the patch, routing looks much better now!


Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>


> ---
> v1: https://lore.kernel.org/alsa-devel/20200111164006.43074-4-stephan@gerhold.net/
> Changes in v2:
>    - Use an extra DAPM supply for MIC_BIASX that is referenced by
>      MIC BIAS InternalX and MIC BIAS ExternalX, instead of combining it with
>      MIC BIAS ExternalX
>    - Clarify commit message
> ---
>   sound/soc/codecs/msm8916-wcd-analog.c | 112 ++++++++++----------------
>   1 file changed, 42 insertions(+), 70 deletions(-)
> 
> diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
> index 1f7964beb20c..d6d727f5bae5 100644
> --- a/sound/soc/codecs/msm8916-wcd-analog.c
> +++ b/sound/soc/codecs/msm8916-wcd-analog.c
> @@ -374,9 +374,8 @@ static void pm8916_wcd_analog_micbias_enable(struct snd_soc_component *component
>   
>   }
>   
> -static int pm8916_wcd_analog_enable_micbias_ext(struct snd_soc_component
> -						 *component, int event,
> -						 int reg, unsigned int cap_mode)
> +static int pm8916_wcd_analog_enable_micbias(struct snd_soc_component *component,
> +					    int event, unsigned int cap_mode)
>   {
>   	switch (event) {
>   	case SND_SOC_DAPM_POST_PMU:
> @@ -389,72 +388,44 @@ static int pm8916_wcd_analog_enable_micbias_ext(struct snd_soc_component
>   	return 0;
>   }
>   
> -static int pm8916_wcd_analog_enable_micbias_int(struct snd_soc_component
> -						 *component, int event,
> -						 int reg, u32 cap_mode)
> +static int pm8916_wcd_analog_enable_micbias_int(struct snd_soc_dapm_widget *w,
> +						struct snd_kcontrol *kcontrol,
> +						int event)
>   {
> +	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
>   
>   	switch (event) {
>   	case SND_SOC_DAPM_PRE_PMU:
> -		snd_soc_component_update_bits(component, reg, MICB_1_EN_PULL_DOWN_EN_MASK, 0);
>   		snd_soc_component_update_bits(component, CDC_A_MICB_1_EN,
>   				    MICB_1_EN_OPA_STG2_TAIL_CURR_MASK,
>   				    MICB_1_EN_OPA_STG2_TAIL_CURR_1_60UA);
> -
> -		break;
> -	case SND_SOC_DAPM_POST_PMU:
> -		pm8916_wcd_analog_micbias_enable(component);
> -		snd_soc_component_update_bits(component, CDC_A_MICB_1_EN,
> -				    MICB_1_EN_BYP_CAP_MASK, cap_mode);
>   		break;
>   	}
>   
>   	return 0;
>   }
>   
> -static int pm8916_wcd_analog_enable_micbias_ext1(struct
> -						  snd_soc_dapm_widget
> -						  *w, struct snd_kcontrol
> -						  *kcontrol, int event)
> +static int pm8916_wcd_analog_enable_micbias1(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 pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component);
>   
> -	return pm8916_wcd_analog_enable_micbias_ext(component, event, w->reg,
> -						     wcd->micbias1_cap_mode);
> +	return pm8916_wcd_analog_enable_micbias(component, event,
> +						wcd->micbias1_cap_mode);
>   }
>   
> -static int pm8916_wcd_analog_enable_micbias_ext2(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 pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component);
> -
> -	return pm8916_wcd_analog_enable_micbias_ext(component, event, w->reg,
> -						     wcd->micbias2_cap_mode);
> -
> -}
> -
> -static int pm8916_wcd_analog_enable_micbias_int1(struct
> -						  snd_soc_dapm_widget
> -						  *w, struct snd_kcontrol
> -						  *kcontrol, int event)
> +static int pm8916_wcd_analog_enable_micbias2(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 pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component);
>   
> -	switch (event) {
> -	case SND_SOC_DAPM_PRE_PMU:
> -		snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS,
> -				    MICB_1_INT_TX1_INT_RBIAS_EN_MASK,
> -				    MICB_1_INT_TX1_INT_RBIAS_EN_ENABLE);
> -		break;
> -	}
> +	return pm8916_wcd_analog_enable_micbias(component, event,
> +						wcd->micbias2_cap_mode);
>   
> -	return pm8916_wcd_analog_enable_micbias_int(component, event, w->reg,
> -						     wcd->micbias1_cap_mode);
>   }
>   
>   static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv,
> @@ -564,9 +535,8 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct
>   
>   	switch (event) {
>   	case SND_SOC_DAPM_PRE_PMU:
> -		snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS,
> -				    MICB_1_INT_TX2_INT_RBIAS_EN_MASK,
> -				    MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE);
> +		snd_soc_component_update_bits(component, CDC_A_MICB_2_EN,
> +					      CDC_A_MICB_2_PULL_DOWN_EN_MASK, 0);
>   		break;
>   	case SND_SOC_DAPM_POST_PMU:
>   		pm8916_mbhc_configure_bias(wcd, true);
> @@ -576,8 +546,7 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct
>   		break;
>   	}
>   
> -	return pm8916_wcd_analog_enable_micbias_int(component, event, w->reg,
> -						     wcd->micbias2_cap_mode);
> +	return pm8916_wcd_analog_enable_micbias_int(w, kcontrol, event);
>   }
>   
>   static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w,
> @@ -878,14 +847,15 @@ static const struct snd_soc_dapm_route pm8916_wcd_analog_audio_map[] = {
>   	{"SPK PA", NULL, "SPK DAC"},
>   	{"SPK DAC", "Switch", "PDM_RX3"},
>   
> -	{"MIC BIAS Internal1", NULL, "INT_LDO_H"},
> -	{"MIC BIAS Internal2", NULL, "INT_LDO_H"},
> -	{"MIC BIAS External1", NULL, "INT_LDO_H"},
> -	{"MIC BIAS External2", NULL, "INT_LDO_H"},
> -	{"MIC BIAS Internal1", NULL, "vdd-micbias"},
> -	{"MIC BIAS Internal2", NULL, "vdd-micbias"},
> -	{"MIC BIAS External1", NULL, "vdd-micbias"},
> -	{"MIC BIAS External2", NULL, "vdd-micbias"},
> +	{"MIC_BIAS1", NULL, "INT_LDO_H"},
> +	{"MIC_BIAS2", NULL, "INT_LDO_H"},
> +	{"MIC_BIAS1", NULL, "vdd-micbias"},
> +	{"MIC_BIAS2", NULL, "vdd-micbias"},
> +
> +	{"MIC BIAS External1", NULL, "MIC_BIAS1"},
> +	{"MIC BIAS Internal1", NULL, "MIC_BIAS1"},
> +	{"MIC BIAS External2", NULL, "MIC_BIAS2"},
> +	{"MIC BIAS Internal2", NULL, "MIC_BIAS2"},
>   };
>   
>   static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
> @@ -937,22 +907,24 @@ static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
>   	SND_SOC_DAPM_SUPPLY("RX_BIAS", CDC_A_RX_COM_BIAS_DAC, 7, 0, NULL, 0),
>   
>   	/* TX */
> -	SND_SOC_DAPM_SUPPLY("MIC BIAS Internal1", CDC_A_MICB_1_EN, 7, 0,
> -			    pm8916_wcd_analog_enable_micbias_int1,
> -			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
> -			    SND_SOC_DAPM_POST_PMD),
> -	SND_SOC_DAPM_SUPPLY("MIC BIAS Internal2", CDC_A_MICB_2_EN, 7, 0,
> +	SND_SOC_DAPM_SUPPLY("MIC_BIAS1", CDC_A_MICB_1_EN, 7, 0,
> +			    pm8916_wcd_analog_enable_micbias1,
> +			    SND_SOC_DAPM_POST_PMU),
> +	SND_SOC_DAPM_SUPPLY("MIC_BIAS2", CDC_A_MICB_2_EN, 7, 0,
> +			    pm8916_wcd_analog_enable_micbias2,
> +			    SND_SOC_DAPM_POST_PMU),
> +
> +	SND_SOC_DAPM_SUPPLY("MIC BIAS External1", SND_SOC_NOPM, 0, 0, NULL, 0),
> +	SND_SOC_DAPM_SUPPLY("MIC BIAS External2", SND_SOC_NOPM, 0, 0, NULL, 0),
> +
> +	SND_SOC_DAPM_SUPPLY("MIC BIAS Internal1", CDC_A_MICB_1_INT_RBIAS, 7, 0,
> +			    pm8916_wcd_analog_enable_micbias_int,
> +			    SND_SOC_DAPM_PRE_PMU),
> +	SND_SOC_DAPM_SUPPLY("MIC BIAS Internal2", CDC_A_MICB_1_INT_RBIAS, 4, 0,
>   			    pm8916_wcd_analog_enable_micbias_int2,
>   			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
>   			    SND_SOC_DAPM_POST_PMD),
>   
> -	SND_SOC_DAPM_SUPPLY("MIC BIAS External1", CDC_A_MICB_1_EN, 7, 0,
> -			    pm8916_wcd_analog_enable_micbias_ext1,
> -			    SND_SOC_DAPM_POST_PMU),
> -	SND_SOC_DAPM_SUPPLY("MIC BIAS External2", CDC_A_MICB_2_EN, 7, 0,
> -			    pm8916_wcd_analog_enable_micbias_ext2,
> -			    SND_SOC_DAPM_POST_PMU),
> -
>   	SND_SOC_DAPM_ADC_E("ADC1", NULL, CDC_A_TX_1_EN, 7, 0,
>   			   pm8916_wcd_analog_enable_adc,
>   			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
> 


More information about the Alsa-devel mailing list