[PATCH] ASoC: fsl_sai: Enable transmitter when generating MCLK

Marek Vasut marex at denx.de
Tue Nov 15 02:25:09 CET 2022


On 11/14/22 08:55, Shengjiu Wang wrote:
> On Wed, Nov 9, 2022 at 8:55 PM Marek Vasut <marex at denx.de> wrote:
> 
>> On 11/9/22 10:30, Shengjiu Wang wrote:
>>
>> [...]
>>
>>>> diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
>>>> index 1c9be8a5dcb13..98c62027e5799 100644
>>>> --- a/sound/soc/fsl/fsl_sai.c
>>>> +++ b/sound/soc/fsl/fsl_sai.c
>>>> @@ -503,6 +503,10 @@ static int fsl_sai_set_bclk(struct snd_soc_dai
>> *dai,
>>>> bool tx, u32 freq)
>>>>                   /* SAI is in master mode at this point, so enable MCLK
>> */
>>>>                   regmap_update_bits(sai->regmap, FSL_SAI_MCTL,
>>>>                                      FSL_SAI_MCTL_MCLK_EN,
>>>> FSL_SAI_MCTL_MCLK_EN);
>>>> +
>>>> +               /* Transmitter must be enabled to generate MCLK on pad
>> */
>>>> +               regmap_update_bits(sai->regmap, FSL_SAI_xCSR(1, ofs),
>>>> +                                  FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
>>>>
>>>
>>> No need to fix the transmitter,   FSL_SAI_xCSR(tx, ofs) should work also.
>>
>> That's probably not a good idea, since this could also enable the
>> RE(receiver) part . We always need to enable the TE(transmitter) to
>> generate MCLK.
>>
> 
> TCSR.TERE and RCSR.TERE all can enable the MCLK.
> if use the FSL_SAI_xCSR(tx, ofs), both cases can be covered.
> if the bclk is generated by TX, then enable the TE(transmitter) to
> generate MCLK.  or if the bclk is generated by RX, then enable
> the RE(receiver) to generate MCLK.

I will need to do a full re-test to validate this claim.

>>>> @@ -1445,6 +1449,11 @@ static int fsl_sai_probe(struct platform_device
>>>> *pdev)
>>>>               sai->soc_data->max_register >= FSL_SAI_MCTL) {
>>>>                   regmap_update_bits(sai->regmap, FSL_SAI_MCTL,
>>>>                                      FSL_SAI_MCTL_MCLK_EN,
>>>> FSL_SAI_MCTL_MCLK_EN);
>>>> +
>>>> +               /* Transmitter must be enabled to generate MCLK on pad
>> */
>>>> +               regmap_update_bits(sai->regmap,
>>>> +                                  FSL_SAI_xCSR(1,
>>>> sai->soc_data->reg_offset),
>>>> +                                  FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
>>>>
>>>
>>> After one time playback or recording,  the TERE is disabled, so this
>> changes
>>> in probe() only for the first time.  There is the same issue for the
>> second
>>> time.
>>
>> So what would you suggest to keep the MCLK clock generated always ?
>>
>> I was almost tempted to turn the SAI into a clock provider, so that the
>> codec could become its clock consumer and enable the MCLK on demand, but
>> that seems to be a rather invasive change.
>>
> 
> May you can try to enhance the drivers/clk/clk-fsl-sai.c

This is not really useful in this case, this lets users use the SAI as a 
plain clock source. I use the SAI as audio IP, all I need in addition to 
that is enable the MCLK as codec Master Clock to drive the codec 
register file and whatever internal state it has.


More information about the Alsa-devel mailing list