Skip to content

Commit dc78f7e

Browse files
ford-prefectbroonie
authored andcommitted
ASoC: fsl_sai: Force a software reset when starting in consumer mode
On an imx8mm platform with an external clock provider, when running the receiver (arecord) and triggering an xrun with xrun_injection, we see a channel swap/offset. This happens sometimes when running only the receiver, but occurs reliably if a transmitter (aplay) is also concurrently running. It seems that the SAI loses track of frame sync during the trigger stop -> trigger start cycle that occurs during an xrun. Doing just a FIFO reset in this case does not suffice, and only a software reset seems to get it back on track. This looks like the same h/w bug that is already handled for the producer case, so we now do the reset unconditionally on config disable. Signed-off-by: Arun Raghavan <[email protected]> Reported-by: Pieterjan Camerlynck <[email protected]> Fixes: 3e3f8bd ("ASoC: fsl_sai: fix no frame clk in master mode") Cc: [email protected] Reviewed-by: Fabio Estevam <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 960aed3 commit dc78f7e

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

sound/soc/fsl/fsl_sai.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -803,13 +803,15 @@ static void fsl_sai_config_disable(struct fsl_sai *sai, int dir)
803803
* anymore. Add software reset to fix this issue.
804804
* This is a hardware bug, and will be fix in the
805805
* next sai version.
806+
*
807+
* In consumer mode, this can happen even after a
808+
* single open/close, especially if both tx and rx
809+
* are running concurrently.
806810
*/
807-
if (!sai->is_consumer_mode[tx]) {
808-
/* Software Reset */
809-
regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR);
810-
/* Clear SR bit to finish the reset */
811-
regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0);
812-
}
811+
/* Software Reset */
812+
regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR);
813+
/* Clear SR bit to finish the reset */
814+
regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0);
813815
}
814816

815817
static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,

0 commit comments

Comments
 (0)