Inter-revision diff: patch 3

Comparing v1 (message) to v6 (message)

--- 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help