[PATCH 6/6] arm64: dts: qcom: qcs6490-rubikpi3: Add audio support

Hongyang Zhao posted 6 patches 1 month ago
There is a newer version of this series
[PATCH 6/6] arm64: dts: qcom: qcs6490-rubikpi3: Add audio support
Posted by Hongyang Zhao 1 month ago
Add audio support for the Thundercomm RubikPi3 board:
- Enable AudioReach via qcs6490-audioreach.dtsi
- Add ES8316 codec on I2C0 with MCLK from LPASS PRM and jack detection
- Add fixed 3.3V regulator for ES8316 power supply
- Add MI2S playback/capture dai-links for ES8316
- Add HDMI audio via LT9611 bridge on quaternary MI2S
- Add SPDIF TX/RX on tertiary MI2S exposed at the board 40‑pin header
- Add LPASS pin configurations for quaternary MI2S and LPI I2S1

Signed-off-by: Hongyang Zhao <hongyang.zhao@thundersoft.com>
---
 .../boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts | 191 +++++++++++++++++++++
 1 file changed, 191 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts b/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts
index 0b64a0b91202..0d2b019886b2 100644
--- a/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts
+++ b/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts
@@ -19,6 +19,7 @@
 #include "pm7325.dtsi"
 #include "pm8350c.dtsi" /* PM7350C */
 #include "pmk8350.dtsi" /* PMK7325 */
+#include "qcs6490-audioreach.dtsi"
 
 /delete-node/ &adsp_mem;
 /delete-node/ &cdsp_mem;
@@ -128,6 +129,23 @@ fan0: pwm-fan {
 		pinctrl-names = "default";
 	};
 
+	vreg_es8316_3v3: vreg-es8316-3v3 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "vreg_es8316_3v3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+
+		gpio = <&tlmm 117 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-0 = <&es8316_power_on>;
+		pinctrl-names = "default";
+
+		regulator-always-on;
+		regulator-boot-on;
+	};
+
 	vreg_eth_1v8: regulator-eth-1v8 {
 		compatible = "regulator-fixed";
 
@@ -364,6 +382,16 @@ usb1_sbu_mux: endpoint {
 			};
 		};
 	};
+
+	spdif_tx: spdif-tx {
+		compatible = "linux,spdif-dit";
+		#sound-dai-cells = <0>;
+	};
+
+	spdif_rx: spdif-rx {
+		compatible = "linux,spdif-dir";
+		#sound-dai-cells = <0>;
+	};
 };
 
 &apps_rsc {
@@ -727,6 +755,23 @@ &gpu_zap_shader {
 	firmware-name = "qcom/qcs6490/a660_zap.mbn";
 };
 
+&i2c0 {
+	status = "okay";
+
+	es8316: es8316@11 {
+		compatible = "everest,es8316";
+		reg = <0x11>;
+		#sound-dai-cells = <0>;
+
+		clocks = <&q6prmcc LPASS_CLK_ID_MCLK_1 LPASS_CLK_ATTRIBUTE_COUPLE_NO>;
+		clock-names = "mclk";
+
+		interrupts-extended = <&tlmm 63 IRQ_TYPE_EDGE_BOTH>;
+
+		everest,jack-detect-inverted;
+	};
+};
+
 /* Pin 3, 5 in 40-pin connector */
 &i2c1 {
 	status = "okay";
@@ -740,6 +785,7 @@ &i2c9 {
 	lt9611_codec: hdmi-bridge@39 {
 		compatible = "lontium,lt9611";
 		reg = <0x39>;
+		#sound-dai-cells = <1>;
 
 		interrupts-extended = <&tlmm 20 IRQ_TYPE_EDGE_FALLING>;
 		reset-gpios = <&tlmm 21 GPIO_ACTIVE_HIGH>;
@@ -970,6 +1016,16 @@ &pon_resin {
 	status = "okay";
 };
 
+&q6apmbedai {
+	pinctrl-0 = <&mi2s0_data0>, <&mi2s0_data1>, <&mi2s0_mclk>,
+		    <&mi2s0_sclk>, <&mi2s0_ws>,
+		    <&lpass_qua_mi2s_sclk>, <&lpass_qua_mi2s_ws>, <&lpass_qua_mi2s_data0>,
+		    <&lpass_qua_mi2s_data1>, <&lpass_qua_mi2s_data2>,
+		    <&lpass_lpi_i2s1_clk>, <&lpass_lpi_i2s1_ws>,
+		    <&lpass_lpi_i2s1_data0>, <&lpass_lpi_i2s1_data1>;
+	pinctrl-names = "default";
+};
+
 &qupv3_id_0 {
 	firmware-name = "qcom/qcm6490/qupv3fw.elf";
 
@@ -1006,6 +1062,76 @@ &sdhc_2 {
 	status = "okay";
 };
 
+&sound {
+	compatible = "qcom,qcs6490-rb3gen2-sndcard";
+	model = "QCS6490-Thundercomm-RubikPi3";
+
+	mi2s-playback-dai-link {
+		link-name = "MI2S-LPAIF-RX-PRIMARY";
+		cpu {
+			sound-dai = <&q6apmbedai PRIMARY_MI2S_RX>;
+		};
+		codec {
+			sound-dai = <&es8316>;
+		};
+		platform {
+			sound-dai = <&q6apm>;
+		};
+	};
+
+	mi2s-capture-dai-link {
+		link-name = "MI2S-LPAIF-TX-PRIMARY";
+		cpu {
+			sound-dai = <&q6apmbedai PRIMARY_MI2S_TX>;
+		};
+		codec {
+			sound-dai = <&es8316>;
+		};
+		platform {
+			sound-dai = <&q6apm>;
+		};
+	};
+
+	quaternary-mi2s-playback-dai-link {
+		link-name = "MI2S-LPAIF_RXTX-RX-PRIMARY";
+		cpu {
+			sound-dai = <&q6apmbedai QUATERNARY_MI2S_RX>;
+		};
+		codec {
+			sound-dai = <&lt9611_codec 0>;
+		};
+		platform {
+			sound-dai = <&q6apm>;
+		};
+	};
+
+	tert-mi2s-playback-dai-link {
+		link-name = "MI2S-LPAIF-RX-TERTIARY";
+		cpu {
+			sound-dai = <&q6apmbedai TERTIARY_MI2S_RX>;
+		};
+		codec {
+			sound-dai = <&spdif_tx>;
+		};
+		platform {
+			sound-dai = <&q6apm>;
+		};
+	};
+
+	tert-mi2s-capture-dai-link {
+		link-name = "MI2S-LPAIF-TX-TERTIARY";
+		cpu {
+			sound-dai = <&q6apmbedai TERTIARY_MI2S_TX>;
+		};
+		codec {
+			sound-dai = <&spdif_rx>;
+		};
+		platform {
+			sound-dai = <&q6apm>;
+		};
+	};
+};
+
 /* Pin 19, 21, 23, 24 in 40-pin connector */
 &spi12 {
 	status = "okay";
@@ -1220,6 +1346,64 @@ &sdc2_data {
 	drive-strength = <10>;
 };
 
+&lpass_tlmm {
+	lpass_qua_mi2s_sclk: qua-mi2s-sclk-state {
+		pins = "gpio0";
+		function = "qua_mi2s_sclk";
+		drive-strength = <8>;
+		bias-disable;
+		output-high;
+	};
+
+	lpass_qua_mi2s_ws: qua-mi2s-ws-state {
+		pins = "gpio1";
+		function = "qua_mi2s_ws";
+		drive-strength = <8>;
+		output-high;
+	};
+
+	lpass_qua_mi2s_data0: qua-mi2s-data0-state {
+		pins = "gpio2";
+		function = "qua_mi2s_data";
+		drive-strength = <8>;
+		bias-disable;
+	};
+
+	lpass_qua_mi2s_data1: qua-mi2s-data1-state {
+		pins = "gpio3";
+		function = "qua_mi2s_data";
+		drive-strength = <8>;
+		bias-disable;
+	};
+
+	lpass_qua_mi2s_data2: qua-mi2s-data2-state {
+		pins = "gpio4";
+		function = "qua_mi2s_data";
+		drive-strength = <8>;
+		bias-disable;
+	};
+
+	lpass_lpi_i2s1_clk: lpi-i2s1-clk-state {
+		pins = "gpio6";
+		function = "i2s1_clk";
+	};
+
+	lpass_lpi_i2s1_ws: lpi-i2s1-ws-state {
+		pins = "gpio7";
+		function = "i2s1_ws";
+	};
+
+	lpass_lpi_i2s1_data0: lpi-i2s1-data0-state {
+		pins = "gpio8";
+		function = "i2s1_data";
+	};
+
+	lpass_lpi_i2s1_data1: lpi-i2s1-data1-state {
+		pins = "gpio9";
+		function = "i2s1_data";
+	};
+};
+
 &tlmm {
 	pcie1_reset_n: pcie1-reset-n-state {
 		pins = "gpio2";
@@ -1387,6 +1571,13 @@ pcie0_wake_n: pcie0-wake-n-state {
 		bias-pull-up;
 	};
 
+	es8316_power_on: es8316-power-on-state {
+		pins = "gpio117";
+		function = "gpio";
+		drive-strength = <2>;
+		bias-pull-down;
+	};
+
 	wifi_power_on: wifi-power-on-state {
 		pins = "gpio125";
 		function = "gpio";

-- 
2.43.0

Re: [PATCH 6/6] arm64: dts: qcom: qcs6490-rubikpi3: Add audio support
Posted by Krzysztof Kozlowski 1 month ago
On 05/03/2026 06:47, Hongyang Zhao wrote:
>  
>  &apps_rsc {
> @@ -727,6 +755,23 @@ &gpu_zap_shader {
>  	firmware-name = "qcom/qcs6490/a660_zap.mbn";
>  };
>  
> +&i2c0 {
> +	status = "okay";
> +
> +	es8316: es8316@11 {

Node names should be generic. See also an explanation and list of
examples (not exhaustive) in DT specification:
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
If you cannot find a name matching your device, please check in kernel
sources for similar cases or you can grow the spec (via pull request to
DT spec repo).

> +		compatible = "everest,es8316";
> +		reg = <0x11>;
> +		#sound-dai-cells = <0>;
> +
> +		clocks = <&q6prmcc LPASS_CLK_ID_MCLK_1 LPASS_CLK_ATTRIBUTE_COUPLE_NO>;
> +		clock-names = "mclk";
> +
> +		interrupts-extended = <&tlmm 63 IRQ_TYPE_EDGE_BOTH>;
> +
> +		everest,jack-detect-inverted;
> +	};



Best regards,
Krzysztof
Re: [PATCH 6/6] arm64: dts: qcom: qcs6490-rubikpi3: Add audio support
Posted by Hongyang Zhao 1 month ago
Hi Krzysztof,

Thank you for your review.

> On 05/03/2026 06:47, Hongyang Zhao wrote:
> >  
> >  &apps_rsc {
> > @@ -727,6 +755,23 @@ &gpu_zap_shader {
> >  	firmware-name = "qcom/qcs6490/a660_zap.mbn";
> >  };
> >  
> > +&i2c0 {
> > +	status = "okay";
> > +
> > +	es8316: es8316@11 {
> 
> Node names should be generic. See also an explanation and list of
> examples (not exhaustive) in DT specification:
> https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
> If you cannot find a name matching your device, please check in kernel
> sources for similar cases or you can grow the spec (via pull request to
> DT spec repo).

I will change the node name to es8316: audio-codec@11 { ... };

> 
> > +		compatible = "everest,es8316";
> > +		reg = <0x11>;
> > +		#sound-dai-cells = <0>;
> > +
> > +		clocks = <&q6prmcc LPASS_CLK_ID_MCLK_1 LPASS_CLK_ATTRIBUTE_COUPLE_NO>;
> > +		clock-names = "mclk";
> > +
> > +		interrupts-extended = <&tlmm 63 IRQ_TYPE_EDGE_BOTH>;
> > +
> > +		everest,jack-detect-inverted;
> > +	};

Thanks,
Hongyang
Re: [PATCH 6/6] arm64: dts: qcom: qcs6490-rubikpi3: Add audio support
Posted by Konrad Dybcio 1 month ago
On 3/5/26 6:47 AM, Hongyang Zhao wrote:
> Add audio support for the Thundercomm RubikPi3 board:
> - Enable AudioReach via qcs6490-audioreach.dtsi
> - Add ES8316 codec on I2C0 with MCLK from LPASS PRM and jack detection
> - Add fixed 3.3V regulator for ES8316 power supply
> - Add MI2S playback/capture dai-links for ES8316
> - Add HDMI audio via LT9611 bridge on quaternary MI2S
> - Add SPDIF TX/RX on tertiary MI2S exposed at the board 40‑pin header
> - Add LPASS pin configurations for quaternary MI2S and LPI I2S1
> 
> Signed-off-by: Hongyang Zhao <hongyang.zhao@thundersoft.com>
> ---

[...]

> +	spdif_tx: spdif-tx {
> +		compatible = "linux,spdif-dit";
> +		#sound-dai-cells = <0>;
> +	};
> +
> +	spdif_rx: spdif-rx {

'r' < 't', please swap them

[...]

> +	mi2s-playback-dai-link {
> +		link-name = "MI2S-LPAIF-RX-PRIMARY";
> +		cpu {
> +			sound-dai = <&q6apmbedai PRIMARY_MI2S_RX>;
> +		};
> +		codec {
> +			sound-dai = <&es8316>;
> +		};

'co'dec < 'cp'u, please reshuffle

and leave a \n between the property (link-name) and the following subnode
as well as between the individual subnodes (but not after the last one)

[...]

> +&lpass_tlmm {
> +	lpass_qua_mi2s_sclk: qua-mi2s-sclk-state {
> +		pins = "gpio0";
> +		function = "qua_mi2s_sclk";
> +		drive-strength = <8>;
> +		bias-disable;
> +		output-high;
> +	};
> +
> +	lpass_qua_mi2s_ws: qua-mi2s-ws-state {
> +		pins = "gpio1";
> +		function = "qua_mi2s_ws";
> +		drive-strength = <8>;
> +		output-high;
> +	};
> +
> +	lpass_qua_mi2s_data0: qua-mi2s-data0-state {
> +		pins = "gpio2";
> +		function = "qua_mi2s_data";
> +		drive-strength = <8>;
> +		bias-disable;
> +	};
> +
> +	lpass_qua_mi2s_data1: qua-mi2s-data1-state {
> +		pins = "gpio3";
> +		function = "qua_mi2s_data";
> +		drive-strength = <8>;
> +		bias-disable;
> +	};

Because they have identical properties, you can squash GPIOs 2-4 into
'lpass_qua_mi2s_data' with:

gpios = "gpio2", "gpio3", "gpio4";

Konrad
Re: [PATCH 6/6] arm64: dts: qcom: qcs6490-rubikpi3: Add audio support
Posted by Hongyang Zhao 1 month ago
Hi Konrad,

Thank you for your review.

> On 3/5/26 6:47 AM, Hongyang Zhao wrote:
> > Add audio support for the Thundercomm RubikPi3 board:
> > - Enable AudioReach via qcs6490-audioreach.dtsi
> > - Add ES8316 codec on I2C0 with MCLK from LPASS PRM and jack detection
> > - Add fixed 3.3V regulator for ES8316 power supply
> > - Add MI2S playback/capture dai-links for ES8316
> > - Add HDMI audio via LT9611 bridge on quaternary MI2S
> > - Add SPDIF TX/RX on tertiary MI2S exposed at the board 40‑pin header
> > - Add LPASS pin configurations for quaternary MI2S and LPI I2S1
> > 
> > Signed-off-by: Hongyang Zhao <hongyang.zhao@thundersoft.com>
> > ---
> 
> [...]
> 
> > +	spdif_tx: spdif-tx {
> > +		compatible = "linux,spdif-dit";
> > +		#sound-dai-cells = <0>;
> > +	};
> > +
> > +	spdif_rx: spdif-rx {
> 
> 'r' < 't', please swap them

I will swap them:
	spdif_rx: spdif-rx { ... };
	spdif_tx: spdif-tx { ... };

> 
> [...]
> 
> > +	mi2s-playback-dai-link {
> > +		link-name = "MI2S-LPAIF-RX-PRIMARY";
> > +		cpu {
> > +			sound-dai = <&q6apmbedai PRIMARY_MI2S_RX>;
> > +		};
> > +		codec {
> > +			sound-dai = <&es8316>;
> > +		};
> 
> 'co'dec < 'cp'u, please reshuffle
> 
> and leave a \n between the property (link-name) and the following subnode
> as well as between the individual subnodes (but not after the last one)

I will change this series to:
	mi2s-playback-dai-link {
		link-name = "MI2S-LPAIF-RX-PRIMARY";

		codec {
			sound-dai = <&es8316>;
		};

		cpu {
			sound-dai = <&q6apmbedai PRIMARY_MI2S_RX>;
		};

		platform {
			sound-dai = <&q6apm>;
		};
	};

> 
> [...]
> 
> > +&lpass_tlmm {
> > +	lpass_qua_mi2s_sclk: qua-mi2s-sclk-state {
> > +		pins = "gpio0";
> > +		function = "qua_mi2s_sclk";
> > +		drive-strength = <8>;
> > +		bias-disable;
> > +		output-high;
> > +	};
> > +
> > +	lpass_qua_mi2s_ws: qua-mi2s-ws-state {
> > +		pins = "gpio1";
> > +		function = "qua_mi2s_ws";
> > +		drive-strength = <8>;
> > +		output-high;
> > +	};
> > +
> > +	lpass_qua_mi2s_data0: qua-mi2s-data0-state {
> > +		pins = "gpio2";
> > +		function = "qua_mi2s_data";
> > +		drive-strength = <8>;
> > +		bias-disable;
> > +	};
> > +
> > +	lpass_qua_mi2s_data1: qua-mi2s-data1-state {
> > +		pins = "gpio3";
> > +		function = "qua_mi2s_data";
> > +		drive-strength = <8>;
> > +		bias-disable;
> > +	};
> 
> Because they have identical properties, you can squash GPIOs 2-4 into
> 'lpass_qua_mi2s_data' with:
> 
> gpios = "gpio2", "gpio3", "gpio4";
> 
> Konrad

I will revise it to:
	lpass_qua_mi2s_data: qua-mi2s-data-state {
		pins = "gpio2", "gpio3", "gpio4";
		function = "qua_mi2s_data";
		drive-strength = <8>;
		bias-disable;
	};

Thanks,
Hongyang