| From 9ff3b222e6b52fc93f4dbcd4e96d05b219c70341 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 7 Apr 2022 10:43:13 +0100 |
| Subject: ASoC: codecs: wcd934x: do not switch off SIDO Buck when codec is in |
| use |
| |
| From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> |
| |
| [ Upstream commit db6dd1bee63d1d88fbddfe07af800af5948ac28e ] |
| |
| 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 |
| |
| Reported-by: Amit Pundir <amit.pundir@linaro.org> |
| Fixes: a61f3b4f476e ("ASoC: wcd934x: add support to wcd9340/wcd9341 codec") |
| Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> |
| Tested-by: Amit Pundir <amit.pundir@linaro.org> |
| Link: https://lore.kernel.org/r/20220407094313.2880-1-srinivas.kandagatla@linaro.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 8540ac230d0e..fd704df9b175 100644 |
| --- a/sound/soc/codecs/wcd934x.c |
| +++ b/sound/soc/codecs/wcd934x.c |
| @@ -1188,29 +1188,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); |
| @@ -1296,8 +1274,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.35.1 |
| |