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>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
da56c67bc4
commit
3a4607028c
@@ -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);
|
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,
|
static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol,
|
struct snd_kcontrol *kcontrol,
|
||||||
int event)
|
int event)
|
||||||
@@ -1871,6 +1883,7 @@ static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_PRE_PMU:
|
case SND_SOC_DAPM_PRE_PMU:
|
||||||
|
tavil_ocp_control(codec, false);
|
||||||
if (TAVIL_IS_1_0(tavil->wcd9xxx))
|
if (TAVIL_IS_1_0(tavil->wcd9xxx))
|
||||||
snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL,
|
snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL,
|
||||||
0x06, (0x03 << 1));
|
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);
|
ret = tavil_codec_enable_anc(w, kcontrol, event);
|
||||||
}
|
}
|
||||||
tavil_codec_override(codec, tavil->hph_mode, event);
|
tavil_codec_override(codec, tavil->hph_mode, event);
|
||||||
|
tavil_ocp_control(codec, true);
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAPM_PRE_PMD:
|
case SND_SOC_DAPM_PRE_PMD:
|
||||||
|
tavil_ocp_control(codec, false);
|
||||||
blocking_notifier_call_chain(&tavil->mbhc->notifier,
|
blocking_notifier_call_chain(&tavil->mbhc->notifier,
|
||||||
WCD_EVENT_PRE_HPHR_PA_OFF,
|
WCD_EVENT_PRE_HPHR_PA_OFF,
|
||||||
&tavil->mbhc->wcd_mbhc);
|
&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,
|
WCD934X_CDC_RX2_RX_PATH_CFG0,
|
||||||
0x10, 0x00);
|
0x10, 0x00);
|
||||||
}
|
}
|
||||||
|
tavil_ocp_control(codec, true);
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2026,6 +2042,7 @@ static int tavil_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w,
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_PRE_PMU:
|
case SND_SOC_DAPM_PRE_PMU:
|
||||||
|
tavil_ocp_control(codec, false);
|
||||||
if (TAVIL_IS_1_0(tavil->wcd9xxx))
|
if (TAVIL_IS_1_0(tavil->wcd9xxx))
|
||||||
snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL,
|
snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL,
|
||||||
0x06, (0x03 << 1));
|
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);
|
ret = tavil_codec_enable_anc(w, kcontrol, event);
|
||||||
}
|
}
|
||||||
tavil_codec_override(codec, tavil->hph_mode, event);
|
tavil_codec_override(codec, tavil->hph_mode, event);
|
||||||
|
tavil_ocp_control(codec, true);
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAPM_PRE_PMD:
|
case SND_SOC_DAPM_PRE_PMD:
|
||||||
|
tavil_ocp_control(codec, false);
|
||||||
blocking_notifier_call_chain(&tavil->mbhc->notifier,
|
blocking_notifier_call_chain(&tavil->mbhc->notifier,
|
||||||
WCD_EVENT_PRE_HPHL_PA_OFF,
|
WCD_EVENT_PRE_HPHL_PA_OFF,
|
||||||
&tavil->mbhc->wcd_mbhc);
|
&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,
|
snd_soc_update_bits(codec,
|
||||||
WCD934X_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00);
|
WCD934X_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00);
|
||||||
}
|
}
|
||||||
|
tavil_ocp_control(codec, true);
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user