summaryrefslogtreecommitdiff
path: root/sound/soc/codecs
diff options
context:
space:
mode:
authorVidyakumar Athota <vathota@codeaurora.org>2016-01-11 21:54:12 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:18:20 -0700
commit964f63a54523344b4114aa9f984b3d64767818a3 (patch)
tree361fc7c78fe781e934b5980d68892b403c0e9249 /sound/soc/codecs
parent870f781d2c9caca05727fab46d8294952c8b9b93 (diff)
ASoC: wcd9335: fix pop during CLS-AB mode
Pop is observed during starting of the playback in CLS-AB mode. Fix the pop issue by updating register sequence properly. Change-Id: Iff17245e8a2b14354cc99150a57394ce81ec29b8 Signed-off-by: Vidyakumar Athota <vathota@codeaurora.org>
Diffstat (limited to 'sound/soc/codecs')
-rwxr-xr-xsound/soc/codecs/wcd9335.c28
-rw-r--r--sound/soc/codecs/wcd9xxx-common-v2.c10
2 files changed, 31 insertions, 7 deletions
diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c
index 05daa956fa49..2665f13be9b8 100755
--- a/sound/soc/codecs/wcd9335.c
+++ b/sound/soc/codecs/wcd9335.c
@@ -3608,6 +3608,28 @@ static void tasha_codec_hph_post_pa_config(struct tasha_priv *tasha,
}
}
+static void tasha_codec_override(struct snd_soc_codec *codec,
+ int mode,
+ int event)
+{
+ if (mode == CLS_AB) {
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ if (!(snd_soc_read(codec,
+ WCD9335_CDC_RX2_RX_PATH_CTL) & 0x10) &&
+ (!(snd_soc_read(codec,
+ WCD9335_CDC_RX1_RX_PATH_CTL) & 0x10)))
+ snd_soc_update_bits(codec,
+ WCD9XXX_A_ANA_RX_SUPPLIES, 0x02, 0x02);
+ break;
+ case SND_SOC_DAPM_POST_PMD:
+ snd_soc_update_bits(codec,
+ WCD9XXX_A_ANA_RX_SUPPLIES, 0x02, 0x00);
+ break;
+ }
+ }
+}
+
static int tasha_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol,
int event)
@@ -3641,6 +3663,7 @@ static int tasha_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
snd_soc_update_bits(codec,
WCD9335_CDC_RX2_RX_PATH_MIX_CTL,
0x10, 0x00);
+ tasha_codec_override(codec, hph_mode, event);
break;
case SND_SOC_DAPM_PRE_PMD:
blocking_notifier_call_chain(&tasha->notifier,
@@ -3653,6 +3676,7 @@ static int tasha_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
* HW requirement
*/
usleep_range(5000, 5500);
+ tasha_codec_override(codec, hph_mode, event);
blocking_notifier_call_chain(&tasha->notifier,
WCD_EVENT_POST_HPHR_PA_OFF,
&tasha->mbhc);
@@ -3702,6 +3726,7 @@ static int tasha_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w,
snd_soc_update_bits(codec,
WCD9335_CDC_RX1_RX_PATH_MIX_CTL,
0x10, 0x00);
+ tasha_codec_override(codec, hph_mode, event);
break;
case SND_SOC_DAPM_PRE_PMD:
blocking_notifier_call_chain(&tasha->notifier,
@@ -3714,6 +3739,7 @@ static int tasha_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w,
* HW requirement
*/
usleep_range(5000, 5500);
+ tasha_codec_override(codec, hph_mode, event);
blocking_notifier_call_chain(&tasha->notifier,
WCD_EVENT_POST_HPHL_PA_OFF,
&tasha->mbhc);
@@ -3774,12 +3800,14 @@ static int tasha_codec_enable_lineout_pa(struct snd_soc_dapm_widget *w,
snd_soc_update_bits(codec,
lineout_mix_vol_reg,
0x10, 0x00);
+ tasha_codec_override(codec, CLS_AB, event);
break;
case SND_SOC_DAPM_POST_PMD:
/* 5ms sleep is required after PA is disabled as per
* HW requirement
*/
usleep_range(5000, 5500);
+ tasha_codec_override(codec, CLS_AB, event);
if (!(strcmp(w->name, "ANC LINEOUT1 PA")) ||
!(strcmp(w->name, "ANC LINEOUT2 PA"))) {
ret = tasha_codec_enable_anc(w, kcontrol, event);
diff --git a/sound/soc/codecs/wcd9xxx-common-v2.c b/sound/soc/codecs/wcd9xxx-common-v2.c
index fae244e48037..1d132bd04831 100644
--- a/sound/soc/codecs/wcd9xxx-common-v2.c
+++ b/sound/soc/codecs/wcd9xxx-common-v2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -348,12 +348,8 @@ static void wcd_clsh_set_flyback_current(struct snd_soc_codec *codec, int mode)
static void wcd_clsh_set_buck_regulator_mode(struct snd_soc_codec *codec,
int mode)
{
- if (mode == CLS_AB)
- snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES,
- 0x02, 0x02);
- else
- snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES,
- 0x02, 0x00);
+ snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES,
+ 0x02, 0x00);
}
static void wcd_clsh_state_lo(struct snd_soc_codec *codec,