diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2014-11-19 11:27:20 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-11-19 11:27:20 -0800 |
commit | 75200d6b7b0dbeb2151e68515b062c6a13d0b733 (patch) | |
tree | 98394f06037b3513a29e4020b3dba99d2155e4b2 | |
parent | d1617cc69b3e07807d360008277bf23575be1b49 (diff) | |
parent | daf1cfdd89c679cab540191022b76469168a851c (diff) |
Merge "ASoC: msm8x16-wcd: update register write sequences"
-rw-r--r-- | sound/soc/codecs/msm8x16-wcd.c | 105 |
1 files changed, 89 insertions, 16 deletions
diff --git a/sound/soc/codecs/msm8x16-wcd.c b/sound/soc/codecs/msm8x16-wcd.c index f47052c0c3d8..1a61c6a1621f 100644 --- a/sound/soc/codecs/msm8x16-wcd.c +++ b/sound/soc/codecs/msm8x16-wcd.c @@ -1691,7 +1691,7 @@ static int msm8x16_wcd_codec_enable_spk_pa(struct snd_soc_dapm_widget *w, snd_soc_update_bits(codec, w->reg, 0x80, 0x00); if (msm8x16_wcd->spk_boost_set) snd_soc_update_bits(codec, - MSM8X16_WCD_A_ANALOG_SPKR_DRV_CTL, 0xEF, 0x00); + MSM8X16_WCD_A_ANALOG_SPKR_DRV_CTL, 0xEF, 0x69); else snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL, 0x10, 0x00); @@ -1712,11 +1712,56 @@ static int msm8x16_wcd_codec_enable_spk_pa(struct snd_soc_dapm_widget *w, return 0; } +static int msm8x16_wcd_tx_disable_pdm_clk(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + struct msm8916_asoc_mach_data *pdata = NULL; + + pdata = snd_soc_card_get_drvdata(codec->card); + + dev_dbg(w->codec->dev, "%s event %d w->name %s\n", __func__, + event, w->name); + switch (event) { + case SND_SOC_DAPM_POST_PMD: + if (atomic_read(&pdata->mclk_rsc_ref) == 0) + snd_soc_update_bits(codec, + MSM8X16_WCD_A_CDC_CLK_PDM_CTL, + 0x03, 0x00); + break; + } + return 0; +} +static int msm8x16_wcd_codec_enable_rx1_rx2_dig_clk( + struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + struct msm8916_asoc_mach_data *pdata = NULL; + + pdata = snd_soc_card_get_drvdata(codec->card); + + dev_dbg(w->codec->dev, "%s event %d w->name %s\n", __func__, + event, w->name); + switch (event) { + case SND_SOC_DAPM_POST_PMD: + if (atomic_read(&pdata->mclk_rsc_ref) == 0) + snd_soc_update_bits(codec, + MSM8X16_WCD_A_CDC_CLK_PDM_CTL, + 0x03, 0x00); + break; + } + return 0; +} + static int msm8x16_wcd_codec_enable_dig_clk(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); + struct msm8916_asoc_mach_data *pdata = NULL; + + pdata = snd_soc_card_get_drvdata(codec->card); dev_dbg(w->codec->dev, "%s event %d w->name %s\n", __func__, event, w->name); @@ -1725,6 +1770,9 @@ static int msm8x16_wcd_codec_enable_dig_clk(struct snd_soc_dapm_widget *w, snd_soc_update_bits(codec, w->reg, 0x80, 0x80); if (msm8x16_wcd->spk_boost_set) { snd_soc_update_bits(codec, + MSM8X16_WCD_A_DIGITAL_PERPH_RESET_CTL3, + 0x0F, 0x0F); + snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_SEC_ACCESS, 0xA5, 0xA5); snd_soc_update_bits(codec, @@ -1734,6 +1782,21 @@ static int msm8x16_wcd_codec_enable_dig_clk(struct snd_soc_dapm_widget *w, MSM8X16_WCD_A_ANALOG_CURRENT_LIMIT, 0x82, 0x82); snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_SPKR_DRV_CTL, + 0x69, 0x69); + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_SPKR_DRV_DBG, + 0x01, 0x01); + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_SLOPE_COMP_IP_ZERO, + 0x88, 0x88); + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_SPKR_DAC_CTL, + 0x03, 0x03); + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_SPKR_OCP_CTL, + 0xE1, 0xE1); + snd_soc_update_bits(codec, MSM8X16_WCD_A_DIGITAL_CDC_DIG_CLK_CTL, 0x20, 0x20); snd_soc_update_bits(codec, @@ -1749,6 +1812,9 @@ static int msm8x16_wcd_codec_enable_dig_clk(struct snd_soc_dapm_widget *w, } break; case SND_SOC_DAPM_POST_PMD: + snd_soc_update_bits(codec, + MSM8X16_WCD_A_DIGITAL_CDC_DIG_CLK_CTL, + 0x80, 0x00); if (msm8x16_wcd->spk_boost_set) { snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_BOOST_EN_CTL, @@ -1759,6 +1825,10 @@ static int msm8x16_wcd_codec_enable_dig_clk(struct snd_soc_dapm_widget *w, } else { snd_soc_update_bits(codec, w->reg, 1<<w->shift, 0x00); } + if (atomic_read(&pdata->mclk_rsc_ref) == 0) + snd_soc_update_bits(codec, + MSM8X16_WCD_A_CDC_CLK_PDM_CTL, + 0x03, 0x00); break; } return 0; @@ -2058,9 +2128,7 @@ static int msm8x16_wcd_codec_enable_dec(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_PRE_PMD: snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x01); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x00); msleep(20); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x01); snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x08, 0x08); cancel_delayed_work_sync(&tx_hpf_work[decimator - 1].dwork); break; @@ -2153,17 +2221,25 @@ static int msm8x16_wcd_codec_enable_rx_bias(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: msm8x16_wcd->rx_bias_count++; - if (msm8x16_wcd->rx_bias_count == 1) + if (msm8x16_wcd->rx_bias_count == 1) { snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_COM_BIAS_DAC, - 0x81, 0x81); + 0x80, 0x80); + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_RX_COM_BIAS_DAC, + 0x01, 0x01); + } break; case SND_SOC_DAPM_POST_PMD: msm8x16_wcd->rx_bias_count--; - if (msm8x16_wcd->rx_bias_count == 0) + if (msm8x16_wcd->rx_bias_count == 0) { + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_RX_COM_BIAS_DAC, + 0x01, 0x00); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_COM_BIAS_DAC, - 0x81, 0x00); + 0x80, 0x00); + } break; } dev_dbg(codec->dev, "%s rx_bias_count = %d\n", @@ -2252,8 +2328,6 @@ static int msm8x16_wcd_hph_pa_event(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - MSM8X16_WCD_A_DIGITAL_HDRIVE_CTL, 0x03, 0x03); usleep_range(4000, 4100); if (w->shift == 5) snd_soc_update_bits(codec, @@ -2295,8 +2369,6 @@ static int msm8x16_wcd_hph_pa_event(struct snd_soc_dapm_widget *w, msm8x16_notifier_call(codec, WCD_EVENT_POST_HPHR_PA_OFF); } - snd_soc_update_bits(codec, - MSM8X16_WCD_A_ANALOG_NCP_FBCTRL, 0x20, 0x00); usleep_range(4000, 4100); usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); @@ -2489,8 +2561,6 @@ static int msm8x16_wcd_codec_enable_clock_block(struct snd_soc_codec *codec, } else { snd_soc_update_bits(codec, MSM8X16_WCD_A_DIGITAL_CDC_TOP_CLK_CTL, 0x0C, 0x00); - snd_soc_update_bits(codec, MSM8X16_WCD_A_CDC_CLK_PDM_CTL, - 0x03, 0x00); } return 0; } @@ -2887,9 +2957,11 @@ static const struct snd_soc_dapm_widget msm8x16_wcd_dapm_widgets[] = { SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY("RX1 CLK", MSM8X16_WCD_A_DIGITAL_CDC_DIG_CLK_CTL, - 0, 0, NULL, 0), + 0, 0, msm8x16_wcd_codec_enable_rx1_rx2_dig_clk, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY("RX2 CLK", MSM8X16_WCD_A_DIGITAL_CDC_DIG_CLK_CTL, - 1, 0, NULL, 0), + 1, 0, msm8x16_wcd_codec_enable_rx1_rx2_dig_clk, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY("RX3 CLK", MSM8X16_WCD_A_DIGITAL_CDC_DIG_CLK_CTL, 2, 0, msm8x16_wcd_codec_enable_dig_clk, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), @@ -3040,7 +3112,8 @@ static const struct snd_soc_dapm_widget msm8x16_wcd_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("RX_I2S_CLK", MSM8X16_WCD_A_CDC_CLK_RX_I2S_CTL, 4, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("TX_I2S_CLK", - MSM8X16_WCD_A_CDC_CLK_TX_I2S_CTL, 4, 0, NULL, 0), + MSM8X16_WCD_A_CDC_CLK_TX_I2S_CTL, 4, 0, + msm8x16_wcd_tx_disable_pdm_clk, SND_SOC_DAPM_POST_PMD), }; static const struct msm8x16_wcd_reg_mask_val msm8x16_wcd_reg_defaults[] = { |