diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c index 4f1d089369..b75df18da7 100644 --- a/asoc/codecs/wcd934x/wcd934x.c +++ b/asoc/codecs/wcd934x/wcd934x.c @@ -2178,6 +2178,18 @@ static void tavil_codec_clear_anc_tx_hold(struct tavil_priv *tavil) tavil_codec_set_tx_hold(tavil->codec, WCD934X_ANA_AMIC4, false); } + +static void tavil_ocp_control(struct snd_soc_codec *codec, bool enable) +{ + if (enable) { + snd_soc_update_bits(codec, WCD934X_HPH_OCP_CTL, 0x10, 0x10); + snd_soc_update_bits(codec, WCD934X_RX_OCP_CTL, 0x0F, 0x02); + } else { + snd_soc_update_bits(codec, WCD934X_RX_OCP_CTL, 0x0F, 0x0F); + snd_soc_update_bits(codec, WCD934X_HPH_OCP_CTL, 0x10, 0x00); + } +} + static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) @@ -2191,6 +2203,7 @@ static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: + tavil_ocp_control(codec, false); if (TAVIL_IS_1_0(tavil->wcd9xxx)) snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL, 0x06, (0x03 << 1)); @@ -2287,8 +2300,10 @@ static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, ret = tavil_codec_enable_anc(w, kcontrol, event); } tavil_codec_override(codec, tavil->hph_mode, event); + tavil_ocp_control(codec, true); break; case SND_SOC_DAPM_PRE_PMD: + tavil_ocp_control(codec, false); blocking_notifier_call_chain(&tavil->mbhc->notifier, WCD_EVENT_PRE_HPHR_PA_OFF, &tavil->mbhc->wcd_mbhc); @@ -2327,6 +2342,7 @@ static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, WCD934X_CDC_RX2_RX_PATH_CFG0, 0x10, 0x00); } + tavil_ocp_control(codec, true); break; }; @@ -2346,6 +2362,7 @@ static int tavil_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: + tavil_ocp_control(codec, false); if (TAVIL_IS_1_0(tavil->wcd9xxx)) snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL, 0x06, (0x03 << 1)); @@ -2439,8 +2456,10 @@ static int tavil_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, ret = tavil_codec_enable_anc(w, kcontrol, event); } tavil_codec_override(codec, tavil->hph_mode, event); + tavil_ocp_control(codec, true); break; case SND_SOC_DAPM_PRE_PMD: + tavil_ocp_control(codec, false); blocking_notifier_call_chain(&tavil->mbhc->notifier, WCD_EVENT_PRE_HPHL_PA_OFF, &tavil->mbhc->wcd_mbhc); @@ -2480,6 +2499,7 @@ static int tavil_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00); } + tavil_ocp_control(codec, true); break; };