ASoC: wcd934x: reset ASRC after playback

Reset ASRC after audio playback is completed to clear
the FIFO and avoid any noise being generated.

CRs-Fixed: 2129994
Change-Id: Ie45796e1bd68d5a8bd790490a65520358f26b811
Signed-off-by: Walter Yang <yandongy@codeaurora.org>
This commit is contained in:
Walter Yang
2017-10-25 11:50:43 +08:00
committed by Gerrit - the friendly Code Review server
parent abebf0b484
commit 09d4168c79

View File

@@ -2879,7 +2879,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
int asrc_in, int event) int asrc_in, int event)
{ {
struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec);
u16 cfg_reg, ctl_reg, clk_reg, asrc_ctl, mix_ctl_reg; u16 cfg_reg, ctl_reg, clk_reg, asrc_ctl, mix_ctl_reg, paired_reg;
int asrc, ret = 0; int asrc, ret = 0;
u8 main_sr, mix_sr, asrc_mode = 0; u8 main_sr, mix_sr, asrc_mode = 0;
@@ -2888,6 +2888,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
cfg_reg = WCD934X_CDC_RX1_RX_PATH_CFG0; cfg_reg = WCD934X_CDC_RX1_RX_PATH_CFG0;
ctl_reg = WCD934X_CDC_RX1_RX_PATH_CTL; ctl_reg = WCD934X_CDC_RX1_RX_PATH_CTL;
clk_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL; clk_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL;
paired_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL;
asrc_ctl = WCD934X_MIXING_ASRC0_CTL1; asrc_ctl = WCD934X_MIXING_ASRC0_CTL1;
asrc = ASRC0; asrc = ASRC0;
break; break;
@@ -2895,6 +2896,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
cfg_reg = WCD934X_CDC_RX3_RX_PATH_CFG0; cfg_reg = WCD934X_CDC_RX3_RX_PATH_CFG0;
ctl_reg = WCD934X_CDC_RX3_RX_PATH_CTL; ctl_reg = WCD934X_CDC_RX3_RX_PATH_CTL;
clk_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL; clk_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL;
paired_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL;
asrc_ctl = WCD934X_MIXING_ASRC0_CTL1; asrc_ctl = WCD934X_MIXING_ASRC0_CTL1;
asrc = ASRC0; asrc = ASRC0;
break; break;
@@ -2902,6 +2904,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
cfg_reg = WCD934X_CDC_RX2_RX_PATH_CFG0; cfg_reg = WCD934X_CDC_RX2_RX_PATH_CFG0;
ctl_reg = WCD934X_CDC_RX2_RX_PATH_CTL; ctl_reg = WCD934X_CDC_RX2_RX_PATH_CTL;
clk_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL; clk_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL;
paired_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL;
asrc_ctl = WCD934X_MIXING_ASRC1_CTL1; asrc_ctl = WCD934X_MIXING_ASRC1_CTL1;
asrc = ASRC1; asrc = ASRC1;
break; break;
@@ -2909,6 +2912,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
cfg_reg = WCD934X_CDC_RX4_RX_PATH_CFG0; cfg_reg = WCD934X_CDC_RX4_RX_PATH_CFG0;
ctl_reg = WCD934X_CDC_RX4_RX_PATH_CTL; ctl_reg = WCD934X_CDC_RX4_RX_PATH_CTL;
clk_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL; clk_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL;
paired_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL;
asrc_ctl = WCD934X_MIXING_ASRC1_CTL1; asrc_ctl = WCD934X_MIXING_ASRC1_CTL1;
asrc = ASRC1; asrc = ASRC1;
break; break;
@@ -2916,6 +2920,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
cfg_reg = WCD934X_CDC_RX7_RX_PATH_CFG0; cfg_reg = WCD934X_CDC_RX7_RX_PATH_CFG0;
ctl_reg = WCD934X_CDC_RX7_RX_PATH_CTL; ctl_reg = WCD934X_CDC_RX7_RX_PATH_CTL;
clk_reg = WCD934X_MIXING_ASRC2_CLK_RST_CTL; clk_reg = WCD934X_MIXING_ASRC2_CLK_RST_CTL;
paired_reg = WCD934X_MIXING_ASRC3_CLK_RST_CTL;
asrc_ctl = WCD934X_MIXING_ASRC2_CTL1; asrc_ctl = WCD934X_MIXING_ASRC2_CTL1;
asrc = ASRC2; asrc = ASRC2;
break; break;
@@ -2923,6 +2928,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
cfg_reg = WCD934X_CDC_RX8_RX_PATH_CFG0; cfg_reg = WCD934X_CDC_RX8_RX_PATH_CFG0;
ctl_reg = WCD934X_CDC_RX8_RX_PATH_CTL; ctl_reg = WCD934X_CDC_RX8_RX_PATH_CTL;
clk_reg = WCD934X_MIXING_ASRC3_CLK_RST_CTL; clk_reg = WCD934X_MIXING_ASRC3_CLK_RST_CTL;
paired_reg = WCD934X_MIXING_ASRC2_CLK_RST_CTL;
asrc_ctl = WCD934X_MIXING_ASRC3_CTL1; asrc_ctl = WCD934X_MIXING_ASRC3_CTL1;
asrc = ASRC3; asrc = ASRC3;
break; break;
@@ -2936,6 +2942,13 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
switch (event) { switch (event) {
case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU:
if (tavil->asrc_users[asrc] == 0) { if (tavil->asrc_users[asrc] == 0) {
if ((snd_soc_read(codec, clk_reg) & 0x02) ||
(snd_soc_read(codec, paired_reg) & 0x02)) {
snd_soc_update_bits(codec, clk_reg,
0x02, 0x00);
snd_soc_update_bits(codec, paired_reg,
0x02, 0x00);
}
snd_soc_update_bits(codec, cfg_reg, 0x80, 0x80); snd_soc_update_bits(codec, cfg_reg, 0x80, 0x80);
snd_soc_update_bits(codec, clk_reg, 0x01, 0x01); snd_soc_update_bits(codec, clk_reg, 0x01, 0x01);
main_sr = snd_soc_read(codec, ctl_reg) & 0x0F; main_sr = snd_soc_read(codec, ctl_reg) & 0x0F;
@@ -2955,7 +2968,7 @@ static int tavil_codec_enable_asrc(struct snd_soc_codec *codec,
tavil->asrc_users[asrc] = 0; tavil->asrc_users[asrc] = 0;
snd_soc_update_bits(codec, asrc_ctl, 0x07, 0x00); snd_soc_update_bits(codec, asrc_ctl, 0x07, 0x00);
snd_soc_update_bits(codec, cfg_reg, 0x80, 0x00); snd_soc_update_bits(codec, cfg_reg, 0x80, 0x00);
snd_soc_update_bits(codec, clk_reg, 0x01, 0x00); snd_soc_update_bits(codec, clk_reg, 0x03, 0x02);
} }
break; break;
}; };