diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 3625e0e69629..311a38cc7484 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -680,6 +680,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 */ @@ -803,6 +804,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 (svs_scaling_enabled && (codec_ver == WCD9335) && @@ -818,6 +849,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", @@ -834,6 +866,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; @@ -10075,6 +10108,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, @@ -10089,6 +10123,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) { @@ -11793,6 +11828,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; /* Update codec register default values */ tasha_update_reg_defaults(tasha);