diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c index e7cec2b4d3..40b01b7e33 100644 --- a/asoc/codecs/wcd934x/wcd934x.c +++ b/asoc/codecs/wcd934x/wcd934x.c @@ -1858,6 +1858,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) @@ -1871,6 +1883,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)); @@ -1967,8 +1980,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); @@ -2007,6 +2022,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; }; @@ -2026,6 +2042,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)); @@ -2119,8 +2136,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); @@ -2160,6 +2179,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; };