+++ /dev/null
-From foo@baz Tue May 1 14:59:18 PDT 2018
-From: Nicolin Chen <nicoleotsuka@gmail.com>
-Date: Mon, 12 Feb 2018 14:03:12 -0800
-Subject: ASoC: fsl_ssi: Maintain a mask of active streams
-
-From: Nicolin Chen <nicoleotsuka@gmail.com>
-
-[ Upstream commit e0582731abe004163e78ad2dac4cd1196db0908f ]
-
-Checking TE and RE bits in SCR register doesn't work for AC97 mode
-which enables SSIEN, TE and RE in the fsl_ssi_setup_ac97() that's
-called during probe().
-
-So when running into the trigger(), it will always get the result
-of both TE and RE being enabled already, even if actually there is
-no active stream.
-
-This patch fixes this issue by adding a variable to log the active
-streams manually.
-
-Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
-Tested-by: Caleb Crome <caleb@crome.org>
-Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
-Reviewed-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- sound/soc/fsl/fsl_ssi.c | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
---- a/sound/soc/fsl/fsl_ssi.c
-+++ b/sound/soc/fsl/fsl_ssi.c
-@@ -201,6 +201,7 @@ struct fsl_ssi_soc_data {
- * @cpu_dai_drv: CPU DAI driver for this device
- *
- * @dai_fmt: DAI configuration this device is currently used with
-+ * @streams: Mask of current active streams: BIT(TX) and BIT(RX)
- * @i2s_net: I2S and Network mode configurations of SCR register
- * @use_dma: DMA is used or FIQ with stream filter
- * @use_dual_fifo: DMA with support for dual FIFO mode
-@@ -245,6 +246,7 @@ struct fsl_ssi {
- struct snd_soc_dai_driver cpu_dai_drv;
-
- unsigned int dai_fmt;
-+ u8 streams;
- u8 i2s_net;
- bool use_dma;
- bool use_dual_fifo;
-@@ -440,15 +442,14 @@ static void fsl_ssi_fifo_clear(struct fs
- static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable,
- struct fsl_ssi_regvals *vals)
- {
-+ int dir = (&ssi->regvals[TX] == vals) ? TX : RX;
- struct regmap *regs = ssi->regs;
- struct fsl_ssi_regvals *avals;
- int nr_active_streams;
-- u32 scr;
- int keep_active;
-
-- regmap_read(regs, REG_SSI_SCR, &scr);
--
-- nr_active_streams = !!(scr & SSI_SCR_TE) + !!(scr & SSI_SCR_RE);
-+ nr_active_streams = !!(ssi->streams & BIT(TX)) +
-+ !!(ssi->streams & BIT(RX));
-
- if (nr_active_streams - 1 > 0)
- keep_active = 1;
-@@ -470,6 +471,9 @@ static void fsl_ssi_config(struct fsl_ss
- keep_active);
- /* Safely disable SCR register for the stream */
- regmap_update_bits(regs, REG_SSI_SCR, scr, 0);
-+
-+ /* Log the disabled stream to the mask */
-+ ssi->streams &= ~BIT(dir);
- }
-
- /*
-@@ -545,6 +549,9 @@ config_done:
- }
- /* Enable all remaining bits */
- regmap_update_bits(regs, REG_SSI_SCR, vals->scr, vals->scr);
-+
-+ /* Log the enabled stream to the mask */
-+ ssi->streams |= BIT(dir);
- }
- }
-