[PATCH] ASoC: nau8822: choose the best master clock prescalar
Hui Wang
hui.wang at canonical.com
Wed May 25 05:34:10 CEST 2022
On 5/24/22 18:22, David Lin wrote:
> On 2022/5/24 下午 04:38, Hui Wang wrote:
>>
>> On 5/24/22 16:07, David Lin wrote:
>>> On 2022/5/24 上午 11:33, Hui Wang wrote:
>>>> We have an imx6sx EVB with the codec nau8822, when playing the audio
>>>> with 48k sample rate, the audio sounds distorted and obviously faster
>>>>
>> <snip>
>>>> - div = i;
>>>> }
>>>> dev_dbg(component->dev, "master clock prescaler %x for fs
>>>> %d\n",
>>>> div, rate);
>>>
>>> Regarding to your environment with input MCLK is 24 MHz, I think you
>>> should enable PLL for the internal process of codec.
>>>
>>> So you should do the following calls/operations:
>>>
>> Thanks for your suggestion. In our case, we use the simple-card as
>> the machine driver, the simple-card hard-codes the 2nd parameter of
>> snd_soc_dai_set_sysclk() to 0, and we don't plan to write a new
>> machine driver since sound quality is pretty good if setting to 46875Hz.
>>
>> So according to your experience, does the new algorithm bring any
>> side effect or break existing platforms? If so, we have to write a
>> new machine driver (that is a big effort).
>>
>> Thanks,
>>
>> Hui.
>>
> Even you can hear better sound quality than original, it don't still
> have better performance(THD+N) than MCLK is 256FS. Generally, we will
> suggest the below that for customer support.
> 1. Check dts description from simple-card about the value of mclk-fs
> is 256? The reason is nau8822 codec just support 256FS. Besides, the
> I.MX EVB should be with flexible clock generation.
> 2. Based on the flexible clock generation, you should input 12.288Mhz
> as MCLK, so the simple-card is suitable for your case with low effort.
> 3. If your MCLK is always 24MHz, PLL enable is preferred as previous
> mention. One is to implement/porting a machine driver, the other is to
> revise asoc_simple_hw_params callback function from simple-card-utils.c.
OK, got it. Thanks.
>>> //PLL
>>> ret = snd_soc_dai_set_sysclk(codec_dai, NAU8822_CLK_PLL,
>>> 24000000, SND_SOC_CLOCK_IN);
>>> if (ret < 0 )
>>> dev_err(card->dev, "failed to set codec sysclk: %d\n", ret);
>>>
>>> ret = snd_soc_dai_set_pll(codec_dai, 0, 0,
>>> 24000000, 256 * params_rate(params));
>>> if (ret < 0 )
>>>
>>> dev_err(card->dev, "failed to set codec pll: %d\n", ret);
>>>
>>> David
>>>
More information about the Alsa-devel
mailing list