|
@@ -400,6 +400,26 @@ static void fsl_ssi_rxtx_config(struct fsl_ssi_private *ssi_private,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Clear RX or TX FIFO to remove samples from the previous
|
|
|
+ * stream session which may be still present in the FIFO and
|
|
|
+ * may introduce bad samples and/or channel slipping.
|
|
|
+ *
|
|
|
+ * Note: The SOR is not documented in recent IMX datasheet, but
|
|
|
+ * is described in IMX51 reference manual at section 56.3.3.15.
|
|
|
+ */
|
|
|
+static void fsl_ssi_fifo_clear(struct fsl_ssi_private *ssi_private,
|
|
|
+ bool is_rx)
|
|
|
+{
|
|
|
+ if (is_rx) {
|
|
|
+ regmap_update_bits(ssi_private->regs, CCSR_SSI_SOR,
|
|
|
+ CCSR_SSI_SOR_RX_CLR, CCSR_SSI_SOR_RX_CLR);
|
|
|
+ } else {
|
|
|
+ regmap_update_bits(ssi_private->regs, CCSR_SSI_SOR,
|
|
|
+ CCSR_SSI_SOR_TX_CLR, CCSR_SSI_SOR_TX_CLR);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* 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
|
|
@@ -475,6 +495,8 @@ static void fsl_ssi_config(struct fsl_ssi_private *ssi_private, bool enable,
|
|
|
* (online configuration)
|
|
|
*/
|
|
|
if (enable) {
|
|
|
+ fsl_ssi_fifo_clear(ssi_private, vals->scr & CCSR_SSI_SCR_RE);
|
|
|
+
|
|
|
regmap_update_bits(regs, CCSR_SSI_SRCR, vals->srcr, vals->srcr);
|
|
|
regmap_update_bits(regs, CCSR_SSI_STCR, vals->stcr, vals->stcr);
|
|
|
regmap_update_bits(regs, CCSR_SSI_SIER, vals->sier, vals->sier);
|