ASoC: tegra: disable rx_fifo after disable stream
authorBen Dooks <ben.dooks@codethink.co.uk>
Fri, 18 Oct 2019 15:48:30 +0000 (16:48 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 25 Oct 2019 10:07:33 +0000 (11:07 +0100)
We see odd FIFO overruns with this, we assume the best thing to do is
to disable the RX I2S frontend first, and then disable the FIFO that
is using it.

This also fixes an issue where using multi-word frames (TDM) have
partial samples stuck in the FIFO which then get read out when the
next capture is started.

Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Link: https://lore.kernel.org/r/20191018154833.7560-5-ben.dooks@codethink.co.uk
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/tegra/tegra30_i2s.c

index 8f8924060d9dda2e2e79b928af79d4c221b3e87b..dbed3c5408e76963cdc4770dbde1b96c8107b65c 100644 (file)
@@ -231,9 +231,9 @@ static void tegra30_i2s_start_capture(struct tegra30_i2s *i2s)
 
 static void tegra30_i2s_stop_capture(struct tegra30_i2s *i2s)
 {
-       tegra30_ahub_disable_rx_fifo(i2s->capture_fifo_cif);
        regmap_update_bits(i2s->regmap, TEGRA30_I2S_CTRL,
                           TEGRA30_I2S_CTRL_XFER_EN_RX, 0);
+       tegra30_ahub_disable_rx_fifo(i2s->capture_fifo_cif);
 }
 
 static int tegra30_i2s_trigger(struct snd_pcm_substream *substream, int cmd,