[alsa-devel] [PATCH 3/4] ASoC: msm8916-wcd-analog: Simplify MIC BIAS Internal
Srinivas Kandagatla
srinivas.kandagatla at linaro.org
Tue Jan 14 14:03:22 CET 2020
On 14/01/2020 12:08, Stephan Gerhold wrote:
> On Tue, Jan 14, 2020 at 10:54:44AM +0000, Srinivas Kandagatla wrote:
>>
>>
>> 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.
>>
>
> You are right. Maybe the naming is a bit confusing here.
> Let me try to clarify it:
>
> If I understand it correctly, setting the MICB_EN bit in CDC_A_MICB_1_EN
> enables the MIC_BIAS1 supply. This supply can be either used with an
> external pull up resistor ("MIC BIAS External1") or with the internal
> pull up resistor ("MIC BIAS Internal1"). Which one of them, is board-specific.
>
> To use the internal pull up resistor, we need to set the TX1_INT_RBIAS_EN
> bit in CDC_A_MICB_1_INT_RBIAS additionally.
>
> In other words, 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)
In theory, We should also disable the internal pull up here. if not we
end up in two parallel resistors, effectively 1/2 the value of external
resistor.
>
> 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
>
> I2 is done in the PM event handler (pm8916_wcd_analog_enable_micbias_int1).
>
> The idea of this patch is to simplify this, and use one DAPM supply
> that handles the common (I1/E1), and one DAPM supply that handles (I2).
>
> Translated to code we get:
> SND_SOC_DAPM_SUPPLY("MIC BIAS1", CDC_A_MICB_1_EN, 7, 0, ...) // I1/E1
> SND_SOC_DAPM_SUPPLY("MIC BIAS Internal1", CDC_A_MICB_1_INT_RBIAS, 7, 0, ...) // I2
> SND_SOC_DAPM_SUPPLY("MIC BIAS External1", SND_SOC_NOPM, ...) // dummy
>
> And the routes:
> {"MIC BIAS Internal1", NULL, "MIC BIAS1"} // If I2, also do I1
> {"MIC BIAS External1", NULL, "MIC BIAS1"} // Only do E1
This should work! and makes it much clear too.
>
> As you can see, for "MIC BIAS External1" we just do "MIC BIAS1".
> The confusing element of this patch might be that I simplified it a bit
> further and combined "MIC BIAS1" with "MIC BIAS External1".
> This works because we don't do anything extra for "MIC BIAS External1".
Should we not make sure that internal resistor switch is disabled here?
--srini
>
> Does that make sense?
>
> Thanks for taking the time to review all my patches.
> Stephan
>
>>
>> --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