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 >