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>
This commit is contained in:
Phani Kumar Uppalapati 2016-10-24 15:22:08 -07:00 committed by Gerrit - the friendly Code Review server
parent 758693b4a6
commit 492e06c8a0
3 changed files with 78 additions and 26 deletions

View file

@ -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;

View file

@ -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

View file

@ -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