--- v1
+++ v6
@@ -1,117 +1,41 @@
-The define of fsl_ssi_disable_val is not so clear as it mixes two
-steps of calculations together. And those parameter names are also
-a bit long to read.
-
-Since it just tries to exclude the shared bits from the regvals of
-current stream while the opposite stream is active, it's better to
-use something like ssi_excl_shared_bits.
-
-This patch also bisects fsl_ssi_disable_val into two macros of two
-corresponding steps and then shortens its parameter names. It also
-updates callers in the fsl_ssi_config() accordingly.
+This patch replaces the register read with ssi->i2s_net for
+simplification. It also removes masking SSIEN from scr value
+since it's handled later by regmap_update_bits() to set this
+scr value back.
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>
---
- sound/soc/fsl/fsl_ssi.c | 54 ++++++++++++++++++++-----------------------------
- 1 file changed, 22 insertions(+), 32 deletions(-)
+ sound/soc/fsl/fsl_ssi.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
-index f05f78d..6dda2e0 100644
+index d4f1f0d..14046c3 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
-@@ -417,24 +417,24 @@ static void fsl_ssi_fifo_clear(struct fsl_ssi *ssi, bool is_rx)
- }
+@@ -1055,9 +1055,7 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
+ }
- /**
-- * Calculate the bits that have to be disabled for the current stream that is
-- * getting disabled. This keeps the bits enabled that are necessary for the
-- * second stream to work if 'stream_active' is true.
-+ * Exclude bits that are used by the opposite stream
- *
-- * Detailed calculation:
-- * These are the values that need to be active after disabling. For non-active
-- * second stream, this is 0:
-- * vals_stream * !!stream_active
-+ * When both streams are active, disabling some bits for the current stream
-+ * might break the other stream if these bits are used by it.
- *
-- * The following computes the overall differences between the setup for the
-- * to-disable stream and the active stream, a simple XOR:
-- * vals_disable ^ (vals_stream * !!(stream_active))
-+ * @vals : regvals of the current stream
-+ * @avals: regvals of the opposite stream
-+ * @aactive: active state of the opposite stream
- *
-- * The full expression adds a mask on all values we care about
-+ * 1) XOR vals and avals to get the differences if the other stream is active;
-+ * Otherwise, return current vals if the other stream is not active
-+ * 2) AND the result of 1) with the current vals
- */
--#define fsl_ssi_disable_val(vals_disable, vals_stream, stream_active) \
-- ((vals_disable) & \
-- ((vals_disable) ^ ((vals_stream) * (u32)!!(stream_active))))
-+#define _ssi_xor_shared_bits(vals, avals, aactive) \
-+ ((vals) ^ ((avals) * (aactive)))
-+
-+#define ssi_excl_shared_bits(vals, avals, aactive) \
-+ ((vals) & _ssi_xor_shared_bits(vals, avals, aactive))
+ /* The slot number should be >= 2 if using Network mode or I2S mode */
+- regmap_read(regs, REG_SSI_SCR, &val);
+- val &= SSI_SCR_I2S_MODE_MASK | SSI_SCR_NET;
+- if (val && slots < 2) {
++ if (ssi->i2s_net && slots < 2) {
+ dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");
+ return -EINVAL;
+ }
+@@ -1067,9 +1065,8 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
+ regmap_update_bits(regs, REG_SSI_SRCCR,
+ SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
- /**
- * Enable or disable SSI configuration.
-@@ -445,16 +445,10 @@ static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable,
- bool tx = &ssi->regvals[TX] == vals;
- struct regmap *regs = ssi->regs;
- struct fsl_ssi_regvals *avals;
-- int nr_active_streams;
-- int keep_active;
--
-- nr_active_streams = !!(ssi->streams & BIT(TX)) +
-- !!(ssi->streams & BIT(RX));
-+ bool aactive;
+- /* Save SSIEN bit of the SCR register */
++ /* Save the SCR register value */
+ regmap_read(regs, REG_SSI_SCR, &val);
+- val &= SSI_SCR_SSIEN;
+ /* Temporarily enable SSI to allow SxMSKs to be configurable */
+ regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);
-- if (nr_active_streams - 1 > 0)
-- keep_active = 1;
-- else
-- keep_active = 0;
-+ /* Check if the opposite stream is active */
-+ aactive = ssi->streams & BIT(!tx);
-
- /* Get the opposite direction to keep its values untouched */
- if (&ssi->regvals[RX] == vals)
-@@ -467,8 +461,7 @@ static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable,
- * To keep the other stream safe, exclude shared bits between
- * both streams, and get safe bits to disable current stream
- */
-- u32 scr = fsl_ssi_disable_val(vals->scr, avals->scr,
-- keep_active);
-+ u32 scr = ssi_excl_shared_bits(vals->scr, avals->scr, aactive);
- /* Safely disable SCR register for the stream */
- regmap_update_bits(regs, REG_SSI_SCR, scr, 0);
-
-@@ -483,7 +476,7 @@ static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable,
- * 2) Disable all remaining bits of both streams when last stream ends
- */
- if (ssi->soc->offline_config) {
-- if ((enable && !nr_active_streams) || (!enable && !keep_active))
-+ if ((enable && !ssi->streams) || (!enable && !aactive))
- fsl_ssi_rxtx_config(ssi, enable);
-
- goto config_done;
-@@ -505,12 +498,9 @@ static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable,
- * To keep the other stream safe, exclude shared bits between
- * both streams, and get safe bits to disable current stream
- */
-- sier = fsl_ssi_disable_val(vals->sier, avals->sier,
-- keep_active);
-- srcr = fsl_ssi_disable_val(vals->srcr, avals->srcr,
-- keep_active);
-- stcr = fsl_ssi_disable_val(vals->stcr, avals->stcr,
-- keep_active);
-+ sier = ssi_excl_shared_bits(vals->sier, avals->sier, aactive);
-+ srcr = ssi_excl_shared_bits(vals->srcr, avals->srcr, aactive);
-+ stcr = ssi_excl_shared_bits(vals->stcr, avals->stcr, aactive);
-
- /* Safely disable other control registers for the stream */
- regmap_update_bits(regs, REG_SSI_SRCR, srcr, 0);
--
-2.7.4
+2.1.4