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 <phaniu@codeaurora.org>
This commit is contained in:
Phani Kumar Uppalapati 2016-01-08 16:16:03 -08:00 committed by David Keitel
parent 905abbddb5
commit 58456af54d

View file

@ -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);