summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-06-19 01:10:35 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2014-06-19 01:10:35 -0700
commitde53b932cd82e40379abccbba8ac203ac3d375a5 (patch)
tree7f4d577039726bc8bfb601b59b8c14090633b813 /sound/soc
parent9a2d4adcc6e27841e618a5d4b0fb0c38e315ed50 (diff)
parent5bb17a88e91a4c0202ad4743a0e231155f470f9a (diff)
Merge "ASoC: msm8x16-wcd: update power down sequence"
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/codecs/msm8x16-wcd.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/sound/soc/codecs/msm8x16-wcd.c b/sound/soc/codecs/msm8x16-wcd.c
index 674637bf6908..dda668bf5fdb 100644
--- a/sound/soc/codecs/msm8x16-wcd.c
+++ b/sound/soc/codecs/msm8x16-wcd.c
@@ -67,6 +67,11 @@
#define ADSP_STATE_READY_TIMEOUT_MS 50
+#define HPHL_PA_DISABLE (0x01 << 1)
+#define HPHR_PA_DISABLE (0x01 << 2)
+#define EAR_PA_DISABLE (0x01 << 3)
+#define SPKR_PA_DISABLE (0x01 << 4)
+
enum {
AIF1_PB = 0,
AIF1_CAP,
@@ -138,6 +143,7 @@ struct msm8x16_wcd_priv {
u32 adc_count;
u32 rx_bias_count;
s32 dmic_1_2_clk_cnt;
+ u32 mute_mask;
bool mclk_enabled;
bool clock_active;
bool config_mode_active;
@@ -1595,11 +1601,8 @@ static int msm8x16_wcd_codec_enable_spk_pa(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_PRE_PMD:
snd_soc_update_bits(codec,
MSM8X16_WCD_A_CDC_RX3_B6_CTL, 0x01, 0x01);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX3_B6_CTL, 0x01, 0x00);
msleep(20);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX3_B6_CTL, 0x01, 0x01);
+ msm8x16_wcd->mute_mask |= SPKR_PA_DISABLE;
snd_soc_update_bits(codec, w->reg, 0x80, 0x00);
if (msm8x16_wcd->spk_boost_set)
snd_soc_update_bits(codec,
@@ -2013,6 +2016,7 @@ static int msm8x16_wcd_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
int event)
{
struct snd_soc_codec *codec = w->codec;
+ struct msm8x16_wcd_priv *msm8x16_wcd = snd_soc_codec_get_drvdata(codec);
dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name);
@@ -2033,6 +2037,33 @@ static int msm8x16_wcd_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
snd_soc_update_bits(codec,
MSM8X16_WCD_A_CDC_CLK_RX_RESET_CTL,
1 << w->shift, 0x0);
+ /*
+ * disable the mute enabled during the PMD of this device
+ */
+ if (msm8x16_wcd->mute_mask & HPHL_PA_DISABLE) {
+ pr_debug("disabling HPHL mute\n");
+ snd_soc_update_bits(codec,
+ MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x00);
+ msm8x16_wcd->mute_mask &= ~(HPHL_PA_DISABLE);
+ }
+ if (msm8x16_wcd->mute_mask & HPHR_PA_DISABLE) {
+ pr_debug("disabling HPHR mute\n");
+ snd_soc_update_bits(codec,
+ MSM8X16_WCD_A_CDC_RX2_B6_CTL, 0x01, 0x00);
+ msm8x16_wcd->mute_mask &= ~(HPHR_PA_DISABLE);
+ }
+ if (msm8x16_wcd->mute_mask & SPKR_PA_DISABLE) {
+ pr_debug("disabling SPKR mute\n");
+ snd_soc_update_bits(codec,
+ MSM8X16_WCD_A_CDC_RX3_B6_CTL, 0x01, 0x00);
+ msm8x16_wcd->mute_mask &= ~(SPKR_PA_DISABLE);
+ }
+ if (msm8x16_wcd->mute_mask & EAR_PA_DISABLE) {
+ pr_debug("disabling EAR mute\n");
+ snd_soc_update_bits(codec,
+ MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x00);
+ msm8x16_wcd->mute_mask &= ~(EAR_PA_DISABLE);
+ }
}
return 0;
}
@@ -2159,19 +2190,13 @@ static int msm8x16_wcd_hph_pa_event(struct snd_soc_dapm_widget *w,
if (w->shift == 5) {
snd_soc_update_bits(codec,
MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x01);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x00);
msleep(20);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x01);
+ msm8x16_wcd->mute_mask |= HPHL_PA_DISABLE;
} else if (w->shift == 4) {
snd_soc_update_bits(codec,
MSM8X16_WCD_A_CDC_RX2_B6_CTL, 0x01, 0x01);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX2_B6_CTL, 0x01, 0x00);
msleep(20);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX2_B6_CTL, 0x01, 0x01);
+ msm8x16_wcd->mute_mask |= HPHR_PA_DISABLE;
}
break;
case SND_SOC_DAPM_POST_PMD:
@@ -2652,6 +2677,7 @@ static int msm8x16_wcd_codec_enable_ear_pa(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
+ struct msm8x16_wcd_priv *msm8x16_wcd = snd_soc_codec_get_drvdata(codec);
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
@@ -2674,11 +2700,8 @@ static int msm8x16_wcd_codec_enable_ear_pa(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_PRE_PMD:
snd_soc_update_bits(codec,
MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x01);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x00);
msleep(20);
- snd_soc_update_bits(codec,
- MSM8X16_WCD_A_CDC_RX1_B6_CTL, 0x01, 0x01);
+ msm8x16_wcd->mute_mask |= EAR_PA_DISABLE;
break;
case SND_SOC_DAPM_POST_PMD:
dev_dbg(w->codec->dev,