[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