[alsa-devel] [PATCH 3/4] ASoC: msm8916-wcd-analog: Simplify MIC BIAS Internal

Srinivas Kandagatla srinivas.kandagatla at linaro.org
Tue Jan 14 11:54:44 CET 2020



On 11/01/2020 16:40, 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.
> 
> In general, the sequence for enabling MIC BIAS InternalX seems to be:
>    1. Enable MIC BIAS ExternalX
>    2. Enable internal RBIAS resistor

Does not sound correct to me.

What external means here is if the MICBIAS has external pull up resistor 
or not. And this is very much board specific. In order for driver to 
enable/disable internal pull up resistor in such cases we use two dapm 
paths to differentiate it.


--srini




> 
> This means that we can simplify the code by modelling MIC BIAS InternalX
> as supply connected to MIC BIAS ExternalX. MIC BIAS InternalX is only
> responsible for enabling the internal RBIAS resistor (2). The DAPM enable
> sequence will automatically enable MIC BIAS ExternalX (1).
> 
> 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>
> ---
>   sound/soc/codecs/msm8916-wcd-analog.c | 57 ++++++---------------------
>   1 file changed, 13 insertions(+), 44 deletions(-)
> 
> diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
> index 1f7964beb20c..930baae6eff5 100644
> --- a/sound/soc/codecs/msm8916-wcd-analog.c
> +++ b/sound/soc/codecs/msm8916-wcd-analog.c
> @@ -389,23 +389,17 @@ 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;
>   	}
>   
> @@ -437,26 +431,6 @@ static int pm8916_wcd_analog_enable_micbias_ext2(struct
>   
>   }
>   
> -static int pm8916_wcd_analog_enable_micbias_int1(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_int(component, event, w->reg,
> -						     wcd->micbias1_cap_mode);
> -}
> -
>   static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv,
>   				      bool micbias2_enabled)
>   {
> @@ -564,9 +538,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 +549,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,12 +850,10 @@ 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 Internal1", NULL, "MIC BIAS External1"},
> +	{"MIC BIAS Internal2", NULL, "MIC BIAS External2"},
>   	{"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"},
>   };
> @@ -937,11 +907,10 @@ 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 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),
> 


More information about the Alsa-devel mailing list