diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2014-06-19 01:10:35 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-06-19 01:10:35 -0700 |
commit | de53b932cd82e40379abccbba8ac203ac3d375a5 (patch) | |
tree | 7f4d577039726bc8bfb601b59b8c14090633b813 /sound/soc | |
parent | 9a2d4adcc6e27841e618a5d4b0fb0c38e315ed50 (diff) | |
parent | 5bb17a88e91a4c0202ad4743a0e231155f470f9a (diff) |
Merge "ASoC: msm8x16-wcd: update power down sequence"
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/codecs/msm8x16-wcd.c | 55 |
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, |