diff options
author | Phani Kumar Uppalapati <phaniu@codeaurora.org> | 2016-10-24 15:22:08 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-11-04 12:42:19 -0700 |
commit | 492e06c8a00a1dc7e74ae4de62c610131bed75e8 (patch) | |
tree | 0f2973621f69afcac6a45cadf41cc18aa7926f92 /sound | |
parent | 758693b4a6d94a0724081578d24f6ba1cc449255 (diff) |
ASoC: wcd934x: Change SIDO reference to internal
Add support to change SIDO reference to internal mode
during rock bottom sleep mode.
CRs-Fixed: 1080507
Change-Id: I8d70ad663f3476e1c81cc2126b1229a3c7c80265
Signed-off-by: Phani Kumar Uppalapati <phaniu@codeaurora.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/wcd934x/wcd934x.c | 28 | ||||
-rw-r--r-- | sound/soc/codecs/wcd9xxx-resmgr-v2.c | 74 | ||||
-rw-r--r-- | sound/soc/codecs/wcd9xxx-resmgr-v2.h | 2 |
3 files changed, 78 insertions, 26 deletions
diff --git a/sound/soc/codecs/wcd934x/wcd934x.c b/sound/soc/codecs/wcd934x/wcd934x.c index 6745aec41388..cedc179dbc47 100644 --- a/sound/soc/codecs/wcd934x/wcd934x.c +++ b/sound/soc/codecs/wcd934x/wcd934x.c @@ -8492,21 +8492,6 @@ done: return rc; } -static void tavil_enable_sido_buck(struct snd_soc_codec *codec) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - snd_soc_update_bits(codec, WCD934X_ANA_RCO, 0x80, 0x80); - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD934X_ANA_BUCK_CTL, 0x02, 0x02); - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD934X_ANA_BUCK_CTL, 0x01, 0x01); - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD934X_ANA_BUCK_CTL, 0x04, 0x04); - usleep_range(100, 110); - tavil->resmgr->sido_input_src = SIDO_SOURCE_RCO_BG; -} - static void tavil_cdc_vote_svs(struct snd_soc_codec *codec, bool vote) { struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); @@ -8609,7 +8594,8 @@ static int tavil_device_down(struct wcd9xxx *wcd9xxx) for (count = 0; count < NUM_CODEC_DAIS; count++) priv->dai[count].bus_down_in_recovery = true; wcd_dsp_ssr_event(priv->wdsp_cntl, WCD_CDC_DOWN_EVENT); - priv->resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; + wcd_resmgr_set_sido_input_src_locked(priv->resmgr, + SIDO_SOURCE_INTERNAL); return 0; } @@ -8781,7 +8767,6 @@ static int tavil_soc_codec_probe(struct snd_soc_codec *codec) tavil->comp_enabled[i] = 0; tavil_codec_init_reg(tavil); - tavil_enable_sido_buck(codec); pdata = dev_get_platdata(codec->dev->parent); ret = tavil_handle_pdata(tavil, pdata); @@ -9352,7 +9337,6 @@ err_mem: static int __tavil_enable_efuse_sensing(struct tavil_priv *tavil) { int val, rc; - struct snd_soc_codec *codec; __tavil_cdc_mclk_enable(tavil, true); @@ -9372,14 +9356,6 @@ static int __tavil_enable_efuse_sensing(struct tavil_priv *tavil) WARN(1, "%s: Efuse sense is not complete val=%x, ret=%d\n", __func__, val, rc); - codec = tavil->codec; - if (!codec) { - pr_debug("%s: codec is not yet registered\n", __func__); - goto done; - } - tavil_enable_sido_buck(codec); - -done: __tavil_cdc_mclk_enable(tavil, false); return rc; diff --git a/sound/soc/codecs/wcd9xxx-resmgr-v2.c b/sound/soc/codecs/wcd9xxx-resmgr-v2.c index 39ca965e791e..84754b8d09b0 100644 --- a/sound/soc/codecs/wcd9xxx-resmgr-v2.c +++ b/sound/soc/codecs/wcd9xxx-resmgr-v2.c @@ -25,6 +25,8 @@ #define WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 #define WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 +static void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr, + int sido_src); static const char *wcd_resmgr_clk_type_to_str(enum wcd_clock_type clk_type) { if (clk_type == WCD_CLK_OFF) @@ -262,6 +264,8 @@ static int wcd_resmgr_enable_clk_mclk(struct wcd9xxx_resmgr_v2 *resmgr) 0x01, 0x01); wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_CODEC_RPM_CLK_GATE, 0x03, 0x00); + wcd_resmgr_set_sido_input_src(resmgr, + SIDO_SOURCE_RCO_BG); } else { wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, @@ -315,6 +319,10 @@ static int wcd_resmgr_disable_clk_mclk(struct wcd9xxx_resmgr_v2 *resmgr) 0x80, 0x00); } + if ((resmgr->codec_type == WCD934X) && + (resmgr->clk_type == WCD_CLK_OFF)) + wcd_resmgr_set_sido_input_src(resmgr, SIDO_SOURCE_INTERNAL); + pr_debug("%s: mclk_users: %d, clk_type: %s\n", __func__, resmgr->clk_mclk_users, wcd_resmgr_clk_type_to_str(resmgr->clk_type)); @@ -444,6 +452,9 @@ static int wcd_resmgr_disable_clk_rco(struct wcd9xxx_resmgr_v2 *resmgr) wcd_resmgr_codec_reg_update_bits(resmgr, WCD9335_ANA_RCO, 0x80, 0x00); + wcd_resmgr_codec_reg_update_bits(resmgr, + WCD934X_CLK_SYS_MCLK_PRG, + 0x01, 0x00); resmgr->clk_type = WCD_CLK_OFF; } else if ((resmgr->clk_rco_users == 0) && (resmgr->clk_mclk_users)) { @@ -455,6 +466,11 @@ static int wcd_resmgr_disable_clk_rco(struct wcd9xxx_resmgr_v2 *resmgr) WCD9335_ANA_RCO, 0x80, 0x00); } + + if ((resmgr->codec_type == WCD934X) && + (resmgr->clk_type == WCD_CLK_OFF)) + wcd_resmgr_set_sido_input_src(resmgr, SIDO_SOURCE_INTERNAL); + pr_debug("%s: rco clk users: %d, clk_type: %s\n", __func__, resmgr->clk_rco_users, wcd_resmgr_clk_type_to_str(resmgr->clk_type)); @@ -493,6 +509,64 @@ int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, return ret; } +static void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr, + int sido_src) +{ + if (!resmgr) + return; + + if (sido_src == resmgr->sido_input_src) + return; + + if (sido_src == SIDO_SOURCE_INTERNAL) { + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_BUCK_CTL, + 0x04, 0x00); + usleep_range(100, 110); + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_BUCK_CTL, + 0x03, 0x00); + usleep_range(100, 110); + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_RCO, + 0x80, 0x00); + usleep_range(100, 110); + resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; + pr_debug("%s: sido input src to internal\n", __func__); + } else if (sido_src == SIDO_SOURCE_RCO_BG) { + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_RCO, + 0x80, 0x80); + usleep_range(100, 110); + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_BUCK_CTL, + 0x02, 0x02); + usleep_range(100, 110); + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_BUCK_CTL, + 0x01, 0x01); + usleep_range(100, 110); + wcd_resmgr_codec_reg_update_bits(resmgr, WCD934X_ANA_BUCK_CTL, + 0x04, 0x04); + usleep_range(100, 110); + resmgr->sido_input_src = SIDO_SOURCE_RCO_BG; + pr_debug("%s: sido input src to external\n", __func__); + } +} + +/* + * wcd_resmgr_set_sido_input_src_locked: + * Set SIDO input in BG_CLK locked context + * + * @resmgr: handle to struct wcd9xxx_resmgr_v2 + * @sido_src: Select the SIDO input source + */ +void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr, + int sido_src) +{ + if (!resmgr) + return; + + WCD9XXX_V2_BG_CLK_LOCK(resmgr); + wcd_resmgr_set_sido_input_src(resmgr, sido_src); + WCD9XXX_V2_BG_CLK_UNLOCK(resmgr); +} +EXPORT_SYMBOL(wcd_resmgr_set_sido_input_src_locked); + /* * wcd_resmgr_disable_clk_block: disable MCLK or RCO * @resmgr: handle to struct wcd9xxx_resmgr_v2 diff --git a/sound/soc/codecs/wcd9xxx-resmgr-v2.h b/sound/soc/codecs/wcd9xxx-resmgr-v2.h index c1955d31889f..f605a249a620 100644 --- a/sound/soc/codecs/wcd9xxx-resmgr-v2.h +++ b/sound/soc/codecs/wcd9xxx-resmgr-v2.h @@ -85,4 +85,6 @@ int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, enum wcd_clock_type type); int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr); void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr); +void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr, + int sido_src); #endif |