imx8mm fsl_sai clock config failing
Greetings,
I'm trying to get imx8mm sai working with a tlv320aic3x codec on a new board and am finding that the sai3 bus clock is getting derived from the wrong source leading hw_params() to fail with 'fsl-sai 30030000.sai: failed to derive required Tx rate: 3072000'
In comparison to the imx8mm-evk I find it's clock gets configured as desired yet I have the same device-tree configuration for sai3.
Here is my board's dts: / { ... sound { compatible = "simple-audio-card"; simple-audio-card,name = "tlv320-audio"; simple-audio-card,format = "i2s"; simple-audio-card,frame-master = <&cpudai>; simple-audio-card,bitclock-master = <&cpudai>; simple-audio-card,widgets = "Line", "Left Line Out Jack", "Line", "Right Line Out Jack"; simple-audio-card,routing = "Left Line Out Jack", "LLOUT", "Right Line Out Jack", "RLOUT";
cpudai: simple-audio-card,cpu { sound-dai = <&sai3>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; };
simple-audio-card,codec { sound-dai = <&tlv320aic3105>; clocks = <&clk IMX8MM_CLK_SAI3_ROOT>; }; }; };
&i2c2 { ... tlv320aic3105: codec@18 { #sound-dai-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_tlv>; compatible = "ti,tlv320aic3x"; reg = <0x18>; reset-gpios = <&gpio4 4 GPIO_ACTIVE_LOW>; ai3x-micbias-vg = <2>; /* MICBIAS_2_5V */ /* Regulators */ DRVDD-supply = <®_3p3v>; AVDD-supply = <®_3p3v>; IOVDD-supply = <®_3p3v>; DVDD-supply = <®_1p8v>; }; }
&sai3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai3>; assigned-clocks = <&clk IMX8MM_CLK_SAI3>; assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; status = "okay"; };
and /sys/kernel/debug/clk/clk_summary from my board: osc_24m 7 10 0 24000000 0 0 50000 ... audio_pll1_ref_sel 0 0 0 24000000 0 0 50000 audio_pll1 0 0 0 650000000 0 0 50000 audio_pll1_bypass 0 0 0 650000000 0 0 50000 audio_pll1_out 0 0 0 650000000 0 0 50000 sai3 0 0 0 25000000 0 0 50000 sai3_root_clk 0 0 0 25000000 0 0 50000 ^^^^ note 25000000 instead of requested 24576000
And Here is the imx8mm-evk dts: / { ... wm8524: audio-codec { #sound-dai-cells = <0>; compatible = "wlf,wm8524"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gpio_wlf>; wlf,mute-gpios = <&gpio5 21 GPIO_ACTIVE_LOW>; };
sound-wm8524 { compatible = "simple-audio-card"; simple-audio-card,name = "wm8524-audio"; simple-audio-card,format = "i2s"; simple-audio-card,frame-master = <&cpudai>; simple-audio-card,bitclock-master = <&cpudai>; simple-audio-card,widgets = "Line", "Left Line Out Jack", "Line", "Right Line Out Jack"; simple-audio-card,routing = "Left Line Out Jack", "LINEVOUTL", "Right Line Out Jack", "LINEVOUTR";
cpudai: simple-audio-card,cpu { sound-dai = <&sai3>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; };
simple-audio-card,codec { sound-dai = <&wm8524>; clocks = <&clk IMX8MM_CLK_SAI3_ROOT>; }; }; };
&sai3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai3>; assigned-clocks = <&clk IMX8MM_CLK_SAI3>; assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; status = "okay"; };
and /sys/kernel/debug/clk/clk_summary from imx8mm_evk: osc_24m 7 10 0 24000000 0 0 50000 ... audio_pll1_ref_sel 0 0 0 24000000 0 0 50000 audio_pll1 0 0 0 393215995 0 0 50000 audio_pll1_bypass 0 0 0 393215995 0 0 50000 audio_pll1_out 0 0 0 393215995 0 0 50000 sai3 0 0 0 24576000 0 0 50000 sai3_root_clk 0 0 0 24576000 0 0 50000 ^^^^ note 24576000 as requested
Any ideas what I'm doing wrong here?
Note that even though the imx8mm-evk appears to configure its clock correctly I still have not been able to play audio out the wm8524 and the system appears to hang during playback as if BCLK/MCLK were not clocking.
Perhaps there is something not supported yet upstream with regards to IMX8MM SAI?
Best Regards,
Tim
From: Tim Harvey tharvey@gateworks.com Sent: Tuesday, May 12, 2020 5:58 AM
Greetings,
I'm trying to get imx8mm sai working with a tlv320aic3x codec on a new board and am finding that the sai3 bus clock is getting derived from the wrong source leading hw_params() to fail with 'fsl-sai 30030000.sai: failed to derive required Tx rate: 3072000'
In comparison to the imx8mm-evk I find it's clock gets configured as desired yet I have the same device-tree configuration for sai3.
Here is my board's dts: / { ... sound { compatible = "simple-audio-card"; simple-audio-card,name = "tlv320-audio"; simple-audio-card,format = "i2s"; simple-audio-card,frame-master = <&cpudai>; simple-audio-card,bitclock-master = <&cpudai>; simple-audio-card,widgets = "Line", "Left Line Out Jack", "Line", "Right Line Out Jack"; simple-audio-card,routing = "Left Line Out Jack", "LLOUT", "Right Line Out Jack", "RLOUT";
cpudai: simple-audio-card,cpu { sound-dai = <&sai3>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; }; simple-audio-card,codec { sound-dai = <&tlv320aic3105>; clocks = <&clk IMX8MM_CLK_SAI3_ROOT>; }; };
};
&i2c2 { ... tlv320aic3105: codec@18 { #sound-dai-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_tlv>; compatible = "ti,tlv320aic3x"; reg = <0x18>; reset-gpios = <&gpio4 4 GPIO_ACTIVE_LOW>; ai3x-micbias-vg = <2>; /* MICBIAS_2_5V */ /* Regulators */ DRVDD-supply = <®_3p3v>; AVDD-supply = <®_3p3v>; IOVDD-supply = <®_3p3v>; DVDD-supply = <®_1p8v>; }; }
&sai3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai3>; assigned-clocks = <&clk IMX8MM_CLK_SAI3>; assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; status = "okay"; };
and /sys/kernel/debug/clk/clk_summary from my board: osc_24m 7 10 0 24000000 0 0 50000 ... audio_pll1_ref_sel 0 0 0 24000000 0 0 50000 audio_pll1 0 0 0 650000000 0 0 50000 audio_pll1_bypass 0 0 0 650000000 0 0 50000 audio_pll1_out 0 0 0 650000000 0 0 50000 sai3 0 0 0 25000000 0 0 50000 sai3_root_clk 0 0 0 25000000 0 0 50000 ^^^^ note 25000000 instead of requested 24576000
And Here is the imx8mm-evk dts: / { ... wm8524: audio-codec { #sound-dai-cells = <0>; compatible = "wlf,wm8524"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gpio_wlf>; wlf,mute-gpios = <&gpio5 21 GPIO_ACTIVE_LOW>; };
sound-wm8524 { compatible = "simple-audio-card"; simple-audio-card,name = "wm8524-audio"; simple-audio-card,format = "i2s"; simple-audio-card,frame-master = <&cpudai>; simple-audio-card,bitclock-master = <&cpudai>; simple-audio-card,widgets = "Line", "Left Line Out Jack", "Line", "Right Line Out Jack"; simple-audio-card,routing = "Left Line Out Jack", "LINEVOUTL", "Right Line Out Jack", "LINEVOUTR"; cpudai: simple-audio-card,cpu { sound-dai = <&sai3>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; }; simple-audio-card,codec { sound-dai = <&wm8524>; clocks = <&clk IMX8MM_CLK_SAI3_ROOT>; }; };
};
&sai3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai3>; assigned-clocks = <&clk IMX8MM_CLK_SAI3>; assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; status = "okay"; };
and /sys/kernel/debug/clk/clk_summary from imx8mm_evk: osc_24m 7 10 0 24000000 0 0 50000 ... audio_pll1_ref_sel 0 0 0 24000000 0 0 50000 audio_pll1 0 0 0 393215995 0 0 50000 audio_pll1_bypass 0 0 0 393215995 0 0 50000 audio_pll1_out 0 0 0 393215995 0 0 50000 sai3 0 0 0 24576000 0 0 50000 sai3_root_clk 0 0 0 24576000 0 0 50000 ^^^^ note 24576000 as requested
Any ideas what I'm doing wrong here?
Note that even though the imx8mm-evk appears to configure its clock correctly I still have not been able to play audio out the wm8524 and the system appears to hang during playback as if BCLK/MCLK were not clocking.
Perhaps there is something not supported yet upstream with regards to IMX8MM SAI?
Copy Daniel in case he has some comments.
Regards Aisheng
Best Regards,
Tim
Hi Tim,
<snip>
I'm trying to get imx8mm sai working with a tlv320aic3x codec on a new board and am finding that the sai3 bus clock is getting derived from the wrong source leading hw_params() to fail with 'fsl-sai 30030000.sai: failed to derive required Tx rate: 3072000'
In comparison to the imx8mm-evk I find it's clock gets configured as desired yet I have the same device-tree configuration for sai3.
It is strange that setting sai3 works with wolfson codec but not yours.
It should either work for both or for none.
Anyhow, can you please try to create a more specific clock hierarchy
similar with the on for 8mq (see imx8mq-evk.dts).
&sai2 { » pinctrl-names = "default"; » pinctrl-0 = <&pinctrl_sai2>; » assigned-clocks = <&clk IMX8MQ_AUDIO_PLL1_BYPASS>, <&clk IMX8MQ_CLK_SAI2>; » assigned-clock-parents = <&clk IMX8MQ_AUDIO_PLL1>, <&clk IMX8MQ_AUDIO_PLL1_OUT>; » assigned-clock-rates = <0>, <24576000>; » status = "okay"; }; Note that even though the imx8mm-evk appears to configure its clock correctly I
still have not been able to play audio out the wm8524 and the system appears to hang during playback as if BCLK/MCLK were not clocking.
Perhaps there is something not supported yet upstream with regards to IMX8MM SAI?
I remember that wm8524 worked for me both with imx8mm/imx8mq. Can you sync
at commit
commit 13f3b9fdef6c7d9ad069ae617707e5a10a685074 Author: Daniel Baluta daniel.baluta@nxp.com Date: Tue Jun 4 20:32:57 2019 +0800
and give it a try.
Also, what SDMA firmware are you using? That might be a problem. I don't remember
if the default ROM firmware worked.
Sorry for the late reply. Somehow I missed your email. You can always find some of us
from NXP on linux-imx IRC channel on irc.freenode.net
thanks,
Daniel.
On Mon, May 18, 2020 at 7:48 AM Daniel Baluta daniel.baluta@nxp.com wrote:
Hi Tim,
<snip>
Daniel,
Thanks for the reply!
I'm trying to get imx8mm sai working with a tlv320aic3x codec on a new board and am finding that the sai3 bus clock is getting derived from the wrong source leading hw_params() to fail with 'fsl-sai 30030000.sai: failed to derive required Tx rate: 3072000'
In comparison to the imx8mm-evk I find it's clock gets configured as desired yet I have the same device-tree configuration for sai3.
It is strange that setting sai3 works with wolfson codec but not yours.
It should either work for both or for none.
Well... it doesn't 'work' for the imx8mm-evk wm8524-audio as it hangs during playback (see below) yet it does get past negotiating the sai master clock.
Anyhow, can you please try to create a more specific clock hierarchy
similar with the on for 8mq (see imx8mq-evk.dts).
&sai2 { » pinctrl-names = "default"; » pinctrl-0 = <&pinctrl_sai2>; » assigned-clocks = <&clk IMX8MQ_AUDIO_PLL1_BYPASS>, <&clk IMX8MQ_CLK_SAI2>; » assigned-clock-parents = <&clk IMX8MQ_AUDIO_PLL1>, <&clk IMX8MQ_AUDIO_PLL1_OUT>; » assigned-clock-rates = <0>, <24576000>; » status = "okay"; }; Note that even though the imx8mm-evk appears to configure its clock correctly I
still have not been able to play audio out the wm8524 and the system appears to hang during playback as if BCLK/MCLK were not clocking.
Perhaps there is something not supported yet upstream with regards to IMX8MM SAI?
I remember that wm8524 worked for me both with imx8mm/imx8mq. Can you sync
at commit
commit 13f3b9fdef6c7d9ad069ae617707e5a10a685074 Author: Daniel Baluta daniel.baluta@nxp.com Date: Tue Jun 4 20:32:57 2019 +0800
and give it a try.
looks like fsl-sai isn't supported yet in 13f3b9fdef6c7d9ad069ae617707e5a10a685074... used a860fac420971c5a90d4f78959b44ead793aee4f instead which has the sai driver but fails with:
[ 2.579234] wm8524-codec audio-codec: simple-card: set_sysclk error [ 2.585512] asoc-simple-card sound-wm8524: ASoC: failed to init 30030000.sai-wm8524-hifi: -22 [ 2.594050] asoc-simple-card sound-wm8524: ASoC: failed to instantiate card -22 [ 2.601467] asoc_simple_probe err:-22 [ 2.605161] asoc-simple-card: probe of sound-wm8524 failed with error -22
Can you please sync up with mainline and take a look?
Also, what SDMA firmware are you using? That might be a problem. I don't remember
if the default ROM firmware worked.
I've tried the default as well as that from https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.0.bin which shows as firmware 4.4:
# dmesg | grep imx-sdma [ 2.037854] imx-sdma 302c0000.dma-controller: loaded firmware 4.4 [ 2.042705] imx-sdma 302b0000.dma-controller: loaded firmware 4.4 [ 2.049132] imx-sdma 30bd0000.dma-controller: loaded firmware 4.4
I ended up working around this on my board by making the tlv320aic3x the master. I do recall reading someplace that using the codec as the master is a better choice anyway as it provides better clk per sample-rate matching... is this true? I'm not clear which option to pick in general.
So in summary I have my imx8mm board working using codec as master but imx8mm-evk in mainline does not work currently, at least 5.7-rc4 which is what I tested.
Thanks,
Tim
participants (3)
-
Aisheng Dong
-
Daniel Baluta
-
Tim Harvey