Re: [PATCH] ASoC: codecs: wcd934x: do not switch off SIDO Buck when codec is in use

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 7 Apr 2022 at 15:13, Srinivas Kandagatla
<srinivas.kandagatla@xxxxxxxxxx> wrote:
>
> SIDO(Single-Inductor Dual-Ouput) Buck powers up both analog and digital
> circuits along with internal memory, powering off this is the last thing
> that codec should do when going to very low power.
>
> Current code was powering off this Buck if there are no users of sysclk,
> which is not correct. Powering off this buck will result in no register access.
> This code path was never tested until recently after adding pm support
> in SoundWire controller. Fix this by removing the buck poweroff when the
> codec is active and also the code that is not used.
>
> Without this patch all the read/write transactions will never complete and
> results in SLIMBus Errors like:
>
> qcom,slim-ngd qcom,slim-ngd.1: Tx:MT:0x0, MC:0x60, LA:0xcf failed:-110
> wcd934x-codec wcd934x-codec.1.auto: ASoC: error at soc_component_read_no_lock
>         on wcd934x-codec.1.auto for register: [0x00000d05] -110
> qcom,slim-ngd-ctrl 171c0000.slim: Error Interrupt received 0x82000000
>

Thanks Srinivas. It fixes the above regression I see on DB845c and
Xiaomi Pocophone F1 running AOSP with v5.18-rc1.

Tested-by: Amit Pundir <amit.pundir@xxxxxxxxxx>

> Reported-by: Amit Pundir <amit.pundir@xxxxxxxxxx>
> Fixes: a61f3b4f476e ("ASoC: wcd934x: add support to wcd9340/wcd9341 codec")
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
> ---
>  sound/soc/codecs/wcd934x.c | 26 +-------------------------
>  1 file changed, 1 insertion(+), 25 deletions(-)
>
> diff --git a/sound/soc/codecs/wcd934x.c b/sound/soc/codecs/wcd934x.c
> index 1e75e93cf28f..6298ebe96e94 100644
> --- a/sound/soc/codecs/wcd934x.c
> +++ b/sound/soc/codecs/wcd934x.c
> @@ -1274,29 +1274,7 @@ static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
>         if (sido_src == wcd->sido_input_src)
>                 return 0;
>
> -       if (sido_src == SIDO_SOURCE_INTERNAL) {
> -               regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
> -                                  WCD934X_ANA_BUCK_HI_ACCU_EN_MASK, 0);
> -               usleep_range(100, 110);
> -               regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
> -                                  WCD934X_ANA_BUCK_HI_ACCU_PRE_ENX_MASK, 0x0);
> -               usleep_range(100, 110);
> -               regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
> -                                  WCD934X_ANA_RCO_BG_EN_MASK, 0);
> -               usleep_range(100, 110);
> -               regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
> -                                  WCD934X_ANA_BUCK_PRE_EN1_MASK,
> -                                  WCD934X_ANA_BUCK_PRE_EN1_ENABLE);
> -               usleep_range(100, 110);
> -               regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
> -                                  WCD934X_ANA_BUCK_PRE_EN2_MASK,
> -                                  WCD934X_ANA_BUCK_PRE_EN2_ENABLE);
> -               usleep_range(100, 110);
> -               regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
> -                                  WCD934X_ANA_BUCK_HI_ACCU_EN_MASK,
> -                                  WCD934X_ANA_BUCK_HI_ACCU_ENABLE);
> -               usleep_range(100, 110);
> -       } else if (sido_src == SIDO_SOURCE_RCO_BG) {
> +       if (sido_src == SIDO_SOURCE_RCO_BG) {
>                 regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
>                                    WCD934X_ANA_RCO_BG_EN_MASK,
>                                    WCD934X_ANA_RCO_BG_ENABLE);
> @@ -1382,8 +1360,6 @@ static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
>         regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
>                            WCD934X_EXT_CLK_BUF_EN_MASK |
>                            WCD934X_MCLK_EN_MASK, 0x0);
> -       wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_INTERNAL);
> -
>         regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
>                            WCD934X_ANA_BIAS_EN_MASK, 0);
>         regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
> --
> 2.21.0
>



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux