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:
parent
758693b4a6
commit
492e06c8a0
3 changed files with 78 additions and 26 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue