Skip to content

Commit 51659ca

Browse files
Zidan Wangbroonie
authored andcommitted
ASoC: fsl-sai: set xCR4/xCR5/xMR for SAI master mode
For SAI master mode, when Tx(Rx) sync with Rx(Tx) clock, Rx(Tx) will generate bclk and frame clock for Tx(Rx), we should set RCR4(TCR4), RCR5(TCR5) and RMR(TMR) for playback(capture), or there will be sync error sometimes. Signed-off-by: Zidan Wang <zidan.wang@freescale.com> Acked-by: Nicolin Chen <nicoleotsuka@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 9cc5871 commit 51659ca

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

sound/soc/fsl/fsl_sai.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,35 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
427427

428428
val_cr4 |= FSL_SAI_CR4_FRSZ(channels);
429429

430+
/*
431+
* For SAI master mode, when Tx(Rx) sync with Rx(Tx) clock, Rx(Tx) will
432+
* generate bclk and frame clock for Tx(Rx), we should set RCR4(TCR4),
433+
* RCR5(TCR5) and RMR(TMR) for playback(capture), or there will be sync
434+
* error.
435+
*/
436+
437+
if (!sai->is_slave_mode) {
438+
if (!sai->synchronous[TX] && sai->synchronous[RX] && !tx) {
439+
regmap_update_bits(sai->regmap, FSL_SAI_TCR4,
440+
FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
441+
val_cr4);
442+
regmap_update_bits(sai->regmap, FSL_SAI_TCR5,
443+
FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
444+
FSL_SAI_CR5_FBT_MASK, val_cr5);
445+
regmap_write(sai->regmap, FSL_SAI_TMR,
446+
~0UL - ((1 << channels) - 1));
447+
} else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) {
448+
regmap_update_bits(sai->regmap, FSL_SAI_RCR4,
449+
FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
450+
val_cr4);
451+
regmap_update_bits(sai->regmap, FSL_SAI_RCR5,
452+
FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
453+
FSL_SAI_CR5_FBT_MASK, val_cr5);
454+
regmap_write(sai->regmap, FSL_SAI_RMR,
455+
~0UL - ((1 << channels) - 1));
456+
}
457+
}
458+
430459
regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx),
431460
FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
432461
val_cr4);

0 commit comments

Comments
 (0)