Re: [PATCH] ASoC: fsl_sai: Clean code for synchronize mode

From: Shengjiu Wang
Date: Mon Aug 03 2020 - 04:04:41 EST


On Mon, Aug 3, 2020 at 1:42 PM Nicolin Chen <nicoleotsuka@xxxxxxxxx> wrote:
>
> On Mon, Aug 03, 2020 at 11:17:54AM +0800, Shengjiu Wang wrote:
> > TX synchronous with RX: The RMR is no need to be changed when
> > Tx is enabled, the other configuration in hw_params() is enough for
>
> Probably you should explain why RMR can be removed, like what
> it really does so as to make it clear that there's no such a
> relationship between RMR and clock generating.
>
> Anyway, this is against the warning comments in the driver:
> /*
> * 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.
> */
>
> So would need to update it.
>
> > clock generation. The TCSR.TE is no need to enabled when only RX
> > is enabled.
>
> You are correct if there's only RX running without TX joining.
> However, that's something we can't guarantee. Then we'd enable
> TE after RE is enabled, which is against what RM recommends:
>
> # From 54.3.3.1 Synchronous mode in IMX6SXRM
> # If the receiver bit clock and frame sync are to be used by
> # both the transmitter and receiver, it is recommended that
> # the receiver is the last enabled and the first disabled.
>
> I remember I did this "ugly" design by strictly following what
> RM says. If hardware team has updated the RM or removed this
> limitation, please quote in the commit logs.

There is no change in RM and same recommandation.

My change does not violate the RM. The direction which generates
the clock is still last enabled.

>
> > + if (!sai->synchronous[TX] && sai->synchronous[RX] && !tx) {
> > + regmap_update_bits(sai->regmap, FSL_SAI_xCSR((!tx), ofs),
> > + FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
> > + } else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) {
> > + regmap_update_bits(sai->regmap, FSL_SAI_xCSR((!tx), ofs),
> > + FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
>
> Two identical regmap_update_bits calls -- both on !tx (RX?)
The content for regmap_update_bits is the same, but the precondition
is different.
The first one is for tx=false and enable TCSR.TE. (TX generate clock)
The second one is for tx=true and enable RSCR.RE (RX generate clock)

best regards
wang shengjiu