ASoC: wcd934x: Update OCP before HPH PA enable/disable
Observe mute issue when PDR triggered while music playback
on HPH. As per HW recommendation, ensure OCP is turned off
before PA enable/disable. During PA enablement, turn off OCP
to avoid false OCP interrupts.
CRs-Fixed: 2167007
Change-Id: I0dc2cc6ded3416b635d14dc3b7aafa7997fe9a4d
Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c
index 5e67cde..f7ca0b7 100644
--- a/asoc/codecs/wcd934x/wcd934x.c
+++ b/asoc/codecs/wcd934x/wcd934x.c
@@ -2177,6 +2177,18 @@
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)
@@ -2190,6 +2202,7 @@
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));
@@ -2286,8 +2299,10 @@
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);
@@ -2326,6 +2341,7 @@
WCD934X_CDC_RX2_RX_PATH_CFG0,
0x10, 0x00);
}
+ tavil_ocp_control(codec, true);
break;
};
@@ -2345,6 +2361,7 @@
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));
@@ -2438,8 +2455,10 @@
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);
@@ -2479,6 +2498,7 @@
snd_soc_update_bits(codec,
WCD934X_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00);
}
+ tavil_ocp_control(codec, true);
break;
};