Message ID | 20200114181229.42302-1-stephan@gerhold.net (mailing list archive) |
---|---|
State | Accepted |
Commit | 65fe457e7bafcbb844c66e8c54a414f090967eaa |
Headers | show |
Series | [v2,1/2] ASoC: msm8916-wcd-analog: Simplify MIC BIAS Internal | expand |
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@gmail.com> # longcheer-l8150 > Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> > Signed-off-by: Stephan Gerhold <stephan@gerhold.net> Thanks for the patch, routing looks much better now! Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@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 | >
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 |