Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10125444 authored by Laxminath Kasam's avatar Laxminath Kasam
Browse files

ASoC: wcd9335: add support for rock bottom sleep current



To make power savings during sleep in tasha 2.0, add
required changes for setting codec registers for
rock bottom current. Apply RBSC(rock bottom sleep current)
settings only when no audio and no SVA usecase running.
Apply default value back when any of audio or SVA usecase
starts.

Change-Id: If8516b15cf38575ed2e1a1f6ebfdf49566bc8237
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent 8feba8e0
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -682,6 +682,7 @@ struct tasha_priv {
	struct wcd_cpe_core *cpe_core;
	u32 current_cpe_clk_freq;
	enum tasha_sido_voltage sido_voltage;
	int sido_ccl_cnt;

	u32 ana_rx_supplies;
	/* Multiplication factor used for impedance detection */
@@ -805,6 +806,36 @@ static void tasha_enable_sido_buck(struct snd_soc_codec *codec)
	tasha->resmgr->sido_input_src = SIDO_SOURCE_RCO_BG;
}

static void tasha_cdc_sido_ccl_enable(struct tasha_priv *tasha, bool ccl_flag)
{
	struct snd_soc_codec *codec = tasha->codec;

	if (!codec)
		return;

	if (!TASHA_IS_2_0(tasha->wcd9xxx->version)) {
		dev_dbg(codec->dev, "%s: tasha version < 2p0, return\n",
			__func__);
		return;
	}
	dev_dbg(codec->dev, "%s: sido_ccl_cnt=%d, ccl_flag:%d\n",
			__func__, tasha->sido_ccl_cnt, ccl_flag);
	if (ccl_flag) {
		if (++tasha->sido_ccl_cnt == 1)
			snd_soc_update_bits(codec,
				WCD9335_SIDO_SIDO_CCL_10, 0xFF, 0x6E);
	} else {
		if (tasha->sido_ccl_cnt == 0) {
			dev_dbg(codec->dev, "%s: sido_ccl already disabled\n",
				__func__);
			return;
		}
		if (--tasha->sido_ccl_cnt == 0)
			snd_soc_update_bits(codec,
				WCD9335_SIDO_SIDO_CCL_10, 0xFF, 0x02);
	}
}

static bool tasha_cdc_is_svs_enabled(struct tasha_priv *tasha)
{
	if (TASHA_IS_2_0(tasha->wcd9xxx->version) &&
@@ -820,6 +851,7 @@ static int tasha_cdc_req_mclk_enable(struct tasha_priv *tasha,
	int ret = 0;

	if (enable) {
		tasha_cdc_sido_ccl_enable(tasha, true);
		ret = clk_prepare_enable(tasha->wcd_ext_clk);
		if (ret) {
			dev_err(tasha->dev, "%s: ext clk enable failed\n",
@@ -836,6 +868,7 @@ static int tasha_cdc_req_mclk_enable(struct tasha_priv *tasha,
		/* put BG */
		wcd_resmgr_disable_master_bias(tasha->resmgr);
		clk_disable_unprepare(tasha->wcd_ext_clk);
		tasha_cdc_sido_ccl_enable(tasha, false);
	}
err:
	return ret;
@@ -10212,6 +10245,7 @@ static int tasha_codec_internal_rco_ctrl(struct snd_soc_codec *codec,

	WCD9XXX_V2_BG_CLK_LOCK(tasha->resmgr);
	if (enable) {
		tasha_cdc_sido_ccl_enable(tasha, true);
		if (wcd_resmgr_get_clk_type(tasha->resmgr) ==
		    WCD_CLK_RCO) {
			ret = wcd_resmgr_enable_clk_block(tasha->resmgr,
@@ -10226,6 +10260,7 @@ static int tasha_codec_internal_rco_ctrl(struct snd_soc_codec *codec,
	} else {
		ret = wcd_resmgr_disable_clk_block(tasha->resmgr,
						   WCD_CLK_RCO);
		tasha_cdc_sido_ccl_enable(tasha, false);
	}

	if (ret) {
@@ -11847,6 +11882,7 @@ static int tasha_probe(struct platform_device *pdev)
	tasha->wcd_ext_clk = wcd_ext_clk;
	tasha->sido_voltage = SIDO_VOLTAGE_NOMINAL_MV;
	set_bit(AUDIO_NOMINAL, &tasha->status_mask);
	tasha->sido_ccl_cnt = 0;

	/* Register native clk for 44.1 playback */
	wcd_native_clk = clk_get(tasha->wcd9xxx->dev, "wcd_native_clk");