From 58456af54db65b736baae083d20bd762f9cf26f3 Mon Sep 17 00:00:00 2001 From: Phani Kumar Uppalapati Date: Fri, 8 Jan 2016 16:16:03 -0800 Subject: [PATCH] ASoC: wcd9335: Reset spline resampler after playback Reset spline resampler after audio playback is completed to clear the FIFO and avoid any noise being generated. Change-Id: I30ed6a337c3bb08f6197f7ee575b323f0b0acfac Signed-off-by: Phani Kumar Uppalapati --- sound/soc/codecs/wcd9335.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 5a52edbced88..ff2d84598072 100755 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -4385,6 +4385,7 @@ static int tasha_codec_enable_spline_src(struct snd_soc_codec *codec, int src_num, int event) { + u16 src_paired_reg; struct tasha_priv *tasha; u16 rx_path_cfg_reg = WCD9335_CDC_RX1_RX_PATH_CFG0; u16 rx_path_ctl_reg = WCD9335_CDC_RX1_RX_PATH_CTL; @@ -4397,48 +4398,56 @@ static int tasha_codec_enable_spline_src(struct snd_soc_codec *codec, case SRC_IN_HPHL: rx_path_cfg_reg = WCD9335_CDC_RX1_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX1_RX_PATH_CTL; spl_src = SPLINE_SRC0; break; case SRC_IN_LO1: rx_path_cfg_reg = WCD9335_CDC_RX3_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX3_RX_PATH_CTL; spl_src = SPLINE_SRC0; break; case SRC_IN_HPHR: rx_path_cfg_reg = WCD9335_CDC_RX2_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX2_RX_PATH_CTL; spl_src = SPLINE_SRC1; break; case SRC_IN_LO2: rx_path_cfg_reg = WCD9335_CDC_RX4_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX4_RX_PATH_CTL; spl_src = SPLINE_SRC1; break; case SRC_IN_SPKRL: rx_path_cfg_reg = WCD9335_CDC_RX7_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX7_RX_PATH_CTL; spl_src = SPLINE_SRC2; break; case SRC_IN_LO3: rx_path_cfg_reg = WCD9335_CDC_RX5_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX5_RX_PATH_CTL; spl_src = SPLINE_SRC2; break; case SRC_IN_SPKRR: rx_path_cfg_reg = WCD9335_CDC_RX8_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX8_RX_PATH_CTL; spl_src = SPLINE_SRC3; break; case SRC_IN_LO4: rx_path_cfg_reg = WCD9335_CDC_RX6_RX_PATH_CFG0; src_clk_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; + src_paired_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; rx_path_ctl_reg = WCD9335_CDC_RX6_RX_PATH_CTL; spl_src = SPLINE_SRC3; break; @@ -4451,6 +4460,13 @@ static int tasha_codec_enable_spline_src(struct snd_soc_codec *codec, count = *src_users; count++; if (count == 1) { + if ((snd_soc_read(codec, src_clk_reg) & 0x02) || + (snd_soc_read(codec, src_paired_reg) & 0x02)) { + snd_soc_update_bits(codec, src_clk_reg, 0x02, + 0x00); + snd_soc_update_bits(codec, src_paired_reg, + 0x02, 0x00); + } snd_soc_update_bits(codec, src_clk_reg, 0x01, 0x01); snd_soc_update_bits(codec, rx_path_cfg_reg, 0x80, 0x80); @@ -4463,7 +4479,7 @@ static int tasha_codec_enable_spline_src(struct snd_soc_codec *codec, if (count == 0) { snd_soc_update_bits(codec, rx_path_cfg_reg, 0x80, 0x00); - snd_soc_update_bits(codec, src_clk_reg, 0x01, 0x00); + snd_soc_update_bits(codec, src_clk_reg, 0x03, 0x02); /* default sample rate */ snd_soc_update_bits(codec, rx_path_ctl_reg, 0x0f, 0x04);