From: Frank Li <Frank.li@oss.nxp.com>
To: Rudi Heitbaum <rudi@heitbaum.com>
Cc: imx@lists.linux.dev, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>, Frank Li <Frank.Li@nxp.com>,
Sascha Hauer <s.hauer@pengutronix.de>,
Pengutronix Kernel Team <kernel@pengutronix.de>,
Fabio Estevam <festevam@gmail.com>,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 5/5] arm64: dts: imx8mq-phanbell: Enable the rt5645 analog audio
Date: Mon, 10 Aug 2026 14:39:39 -0500 [thread overview]
Message-ID: <anoo--OdviQf6liI@SMW015318> (raw)
In-Reply-To: <7b0c26c6741c64291e03f668ce961c47cbcb0772.1786177290.git.rudi@heitbaum.com>
On Sat, Aug 08, 2026 at 10:14:27AM +0000, Rudi Heitbaum wrote:
> The board has an rt5645 on i2c3 driving the 3.5 mm headphone jack, its
> microphone and two on-board DMICs, fed by sai2. The vendor kernel drives it
> from a machine driver of its own, so its devicetree carries no widgets or
> routing and the graph is rebuilt here for simple-audio-card. micbias1 is a
> supply, so it is the source of its route rather than the sink.
>
> GPIO5_IO4 carries headphone detect and has to be muxed away from its reset
> function, or both hp-detect-gpios and the codec interrupt point at a pad
What's means "muxed away from its reset function ..."
> that is still SPDIF_RX. Leaving realtek,jd-mode unset selects the mode in
> which the driver takes jack state from hp-detect-gpios.
>
> Pin the slot width at 32 bits. With none set fsl_sai_hw_params() derives it
> from the sample width, and a 24 bit open then asks for a 2.304 MHz bit
> clock, which is not an even divider of 24.576 MHz, so hw_params returns
> -EINVAL. 32 bit slots give a ratio of 8 and still carry 16 and 24 bit data:
> rt5645_hw_params() only writes a BCLK-to-frame ratio for AIF2, so on AIF1
> the codec ignores the padding bits.
>
> Declare both audio PLL families and system-clock-direction-out, which
> 44.1 kHz needs. fsl_sai only reparents its mclk between the 8 kHz and
> 11.025 kHz families if the node names them pll8k and pll11k, and
> fsl_sai_set_dai_sysclk() returns immediately unless the direction is out.
> Without either, 44100 stays on the advertised rate list while the mclk
> cannot produce it, and hw_params fails.
>
> AVDD and CPVDD are required by the binding. Both come from ANALOG_1v8,
> which a baseboard DC-DC supplies rather than the PMIC on the SOM, so a
> fixed always-on regulator is the only description available.
Needn't this, patch show how AVDD and CPVDD connect.
>
> Route "Headphone Mic" to IN1P, the pin the jack's sleeve reaches. Without
> it only the micbias supply route exists and the microphone input is not
> connected to anything.
Can you try keep commit message short? and leave summary of what your
change.
Frank
>
> Signed-off-by: Rudi Heitbaum <rudi@heitbaum.com>
> ---
> v2:
> - add avdd-supply/cpvdd-supply and the fixed regulator they need; the
> binding requires them, so dtbs_check failed and the driver fell back to
> dummy regulators
> - route "Headphone Mic" to IN1P
> - no clocks property on the cpu dai, deliberately. The fallback in
> simple_util_parse_clk() picks the DAI node's IPG clock and
> simple_init_dai() sets it as the system clock once at card init, which
> is meaningless for the SAI but harmless - hw_params replaces it with
> rate * mclk-fs before any stream starts. Naming a clock instead makes
> simple_util_hw_params() call clk_set_rate() on it directly, bypassing
> fsl_sai_set_mclk_rate() and the PLL reparent, and 44.1 kHz then fails
> in hw_params. Tested both ways.
>
> .../boot/dts/freescale/imx8mq-phanbell.dts | 95 +++++++++++++++++++
> 1 file changed, 95 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/freescale/imx8mq-phanbell.dts b/arch/arm64/boot/dts/freescale/imx8mq-phanbell.dts
> index 2d134eefb765..af4b9d266451 100644
> --- a/arch/arm64/boot/dts/freescale/imx8mq-phanbell.dts
> +++ b/arch/arm64/boot/dts/freescale/imx8mq-phanbell.dts
> @@ -37,6 +37,14 @@ reg_usdhc2_vmmc: regulator-usdhc2-vmmc {
> enable-active-high;
> };
>
> + reg_audio_1v8: regulator-audio-1v8 {
> + compatible = "regulator-fixed";
> + regulator-name = "BB_1V8";
> + regulator-min-microvolt = <1800000>;
> + regulator-max-microvolt = <1800000>;
> + regulator-always-on;
> + };
> +
> fan: gpio-fan {
> compatible = "gpio-fan";
> gpio-fan,speed-map = <0 0>, <8600 1>;
> @@ -46,6 +54,42 @@ fan: gpio-fan {
> pinctrl-0 = <&pinctrl_gpio_fan>;
> status = "okay";
> };
> +
> + sound-analog {
> + compatible = "simple-audio-card";
> + simple-audio-card,name = "Coral Analog";
> + simple-audio-card,format = "i2s";
> + simple-audio-card,bitclock-master = <&sound_analog_cpu>;
> + simple-audio-card,frame-master = <&sound_analog_cpu>;
> + simple-audio-card,mclk-fs = <256>;
> +
> + simple-audio-card,widgets = "Headphone", "Headphone Jack",
> + "Microphone", "Headphone Mic",
> + "Microphone", "Internal Mic";
> +
> + simple-audio-card,routing = "Headphone Jack", "HPOL",
> + "Headphone Jack", "HPOR",
> + "Headphone Mic", "micbias1",
> + "IN1P", "Headphone Mic",
> + "DMIC L1", "Internal Mic",
> + "DMIC R1", "Internal Mic";
> +
> + /*
> + * 32 bit slots regardless of the sample width. sai2 divides its
> + * 24.576 MHz root by an even integer only, so a 24 bit frame at
> + * 48 kHz would ask for 2.304 MHz, a ratio of 10.67.
> + */
> + sound_analog_cpu: simple-audio-card,cpu {
> + sound-dai = <&sai2>;
> + system-clock-direction-out;
> + dai-tdm-slot-num = <2>;
> + dai-tdm-slot-width = <32>;
> + };
> +
> + simple-audio-card,codec {
> + sound-dai = <&rt5645>;
> + };
> + };
> };
>
> &A53_0 {
> @@ -272,6 +316,20 @@ &i2c3 {
> pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_i2c3>;
> status = "okay";
> +
> + rt5645: audio-codec@1a {
> + compatible = "realtek,rt5645";
> + reg = <0x1a>;
> + avdd-supply = <®_audio_1v8>;
> + cpvdd-supply = <®_audio_1v8>;
> + pinctrl-names = "default";
> + pinctrl-0 = <&pinctrl_hp_det>;
> + #sound-dai-cells = <0>;
> + interrupt-parent = <&gpio5>;
> + interrupts = <4 IRQ_TYPE_EDGE_BOTH>;
> + hp-detect-gpios = <&gpio5 4 GPIO_ACTIVE_HIGH>;
> + realtek,dmic1-data-pin = <2>;
> + };
> };
>
> &fec1 {
> @@ -295,6 +353,27 @@ ethphy0: ethernet-phy@0 {
> };
> };
>
> +&sai2 {
> + pinctrl-names = "default";
> + pinctrl-0 = <&pinctrl_sai2>;
> + /*
> + * pll8k and pll11k let fsl_sai move the mclk between the two
> + * audio PLL families, so 44.1 kHz rates work as well as 48 kHz.
> + */
> + clocks = <&clk IMX8MQ_CLK_SAI2_IPG>,
> + <&clk IMX8MQ_CLK_SAI2_ROOT>,
> + <&clk IMX8MQ_CLK_DUMMY>, <&clk IMX8MQ_CLK_DUMMY>,
> + <&clk IMX8MQ_AUDIO_PLL1_OUT>,
> + <&clk IMX8MQ_AUDIO_PLL2_OUT>;
> + clock-names = "bus", "mclk1", "mclk2", "mclk3",
> + "pll8k", "pll11k";
> + assigned-clocks = <&clk IMX8MQ_CLK_SAI2>;
> + assigned-clock-parents = <&clk IMX8MQ_AUDIO_PLL1_OUT>;
> + assigned-clock-rates = <24576000>;
> + fsl,sai-mclk-direction-output;
> + status = "okay";
> +};
> +
> &uart1 {
> pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_uart1>;
> @@ -383,6 +462,12 @@ MX8MQ_IOMUXC_GPIO1_IO00_ANAMIX_REF_CLK_32K 0x05
> >;
> };
>
> + pinctrl_hp_det: hpdetgrp {
> + fsl,pins = <
> + MX8MQ_IOMUXC_SPDIF_RX_GPIO5_IO4 0xd6
> + >;
> + };
> +
> pinctrl_i2c1: i2c1grp {
> fsl,pins = <
> MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL 0x4000007f
> @@ -410,6 +495,16 @@ MX8MQ_IOMUXC_GPIO1_IO03_GPIO1_IO3 0x41
> >;
> };
>
> + pinctrl_sai2: sai2grp {
> + fsl,pins = <
> + MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK 0xd6
> + MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC 0xd6
> + MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK 0xd6
> + MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0 0xd6
> + MX8MQ_IOMUXC_SAI2_RXD0_SAI2_RX_DATA0 0xd6
> + >;
> + };
> +
> pinctrl_uart1: uart1grp {
> fsl,pins = <
> MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX 0x49
> --
> 2.53.0
>
>
prev parent reply other threads:[~2026-08-10 19:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-08 10:12 [PATCH v2 0/5] arm64: dts: imx8mq-phanbell: Google Coral Dev Board enablement Rudi Heitbaum
2026-08-08 10:12 ` [PATCH v2 1/5] arm64: dts: imx8mq-phanbell: Keep the GPU rail on Rudi Heitbaum
2026-08-08 10:13 ` [PATCH v2 2/5] arm64: dts: imx8mq-phanbell: Do not hardcode a cooling state that may not exist Rudi Heitbaum
2026-08-08 10:13 ` [PATCH v2 3/5] arm64: dts: imx8mq-phanbell: Enable i2c2 and i2c3 Rudi Heitbaum
2026-08-08 10:13 ` [PATCH v2 4/5] arm64: dts: imx8mq-phanbell: Mux the 32 kHz reference clock pad Rudi Heitbaum
2026-08-10 19:25 ` Frank Li
2026-08-08 10:14 ` [PATCH v2 5/5] arm64: dts: imx8mq-phanbell: Enable the rt5645 analog audio Rudi Heitbaum
2026-08-10 19:39 ` Frank Li [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=anoo--OdviQf6liI@SMW015318 \
--to=frank.li@oss.nxp.com \
--cc=Frank.Li@nxp.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=festevam@gmail.com \
--cc=imx@lists.linux.dev \
--cc=kernel@pengutronix.de \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh@kernel.org \
--cc=rudi@heitbaum.com \
--cc=s.hauer@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.