summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-11-19 11:27:20 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2014-11-19 11:27:20 -0800
commit75200d6b7b0dbeb2151e68515b062c6a13d0b733 (patch)
tree98394f06037b3513a29e4020b3dba99d2155e4b2
parentd1617cc69b3e07807d360008277bf23575be1b49 (diff)
parentdaf1cfdd89c679cab540191022b76469168a851c (diff)
Merge "ASoC: msm8x16-wcd: update register write sequences"
-rw-r--r--sound/soc/codecs/msm8x16-wcd.c105
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[] = {