[PATCH v1] arm64: dts: qcom: hamoa-iot-evk: Fix 4-speaker playback support

leqi posted 1 patch 2 months, 1 week ago
There is a newer version of this series
arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts | 30 +++++++++++++++++-----
1 file changed, 23 insertions(+), 7 deletions(-)
[PATCH v1] arm64: dts: qcom: hamoa-iot-evk: Fix 4-speaker playback support
Posted by leqi 2 months, 1 week ago
On the HAMOA-IOT-EVK board only 2 out of 4 speakers were functional.
Unlike the CRD, which shares a single GPIO reset line for WSA1/2,
this board provides a dedicated GPIO reset for each WSA, resulting
in 4 separate reset lines.

Update the device tree accordingly so that all 4 speakers can
playback audio as expected.

Signed-off-by: leqi <le.qi@oss.qualcomm.com>
---
 arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts | 30 +++++++++++++++++-----
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts b/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
index df8d6e5c1f45..de9af19be6e8 100644
--- a/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
+++ b/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
@@ -743,7 +743,7 @@ retimer_ss1_con_sbu_out: endpoint {
 };
 
 &lpass_tlmm {
-	spkr_01_sd_n_active: spkr-01-sd-n-active-state {
+	spkr0_sd_n_active: spkr0-sd-n-active-state {
 		pins = "gpio12";
 		function = "gpio";
 		drive-strength = <16>;
@@ -751,13 +751,29 @@ spkr_01_sd_n_active: spkr-01-sd-n-active-state {
 		output-low;
 	};
 
-	spkr_23_sd_n_active: spkr-23-sd-n-active-state {
+	spkr1_sd_n_active: spkr1-sd-n-active-state {
 		pins = "gpio13";
 		function = "gpio";
 		drive-strength = <16>;
 		bias-disable;
 		output-low;
 	};
+
+	spkr2_sd_n_active: spkr2-sd-n-active-state {
+		pins = "gpio17";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+		output-low;
+	};
+
+	spkr3_sd_n_active: spkr3-sd-n-active-state {
+		pins = "gpio18";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+		output-low;
+	};
 };
 
 &lpass_vamacro {
@@ -908,7 +924,7 @@ &smb2360_2_eusb2_repeater {
 &swr0 {
 	status = "okay";
 
-	pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
+	pinctrl-0 = <&wsa_swr_active>, <&spkr0_sd_n_active>, <&spkr1_sd_n_active>;
 	pinctrl-names = "default";
 
 	/* WSA8845, Left Woofer */
@@ -927,7 +943,7 @@ left_woofer: speaker@0,0 {
 	left_tweeter: speaker@0,1 {
 		compatible = "sdw20217020400";
 		reg = <0 1>;
-		reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+		reset-gpios = <&lpass_tlmm 13 GPIO_ACTIVE_LOW>;
 		#sound-dai-cells = <0>;
 		sound-name-prefix = "TweeterLeft";
 		vdd-1p8-supply = <&vreg_l15b_1p8>;
@@ -961,14 +977,14 @@ wcd_tx: codec@0,3 {
 &swr3 {
 	status = "okay";
 
-	pinctrl-0 = <&wsa2_swr_active>, <&spkr_23_sd_n_active>;
+	pinctrl-0 = <&wsa2_swr_active>, <&spkr2_sd_n_active>, <&spkr3_sd_n_active>;
 	pinctrl-names = "default";
 
 	/* WSA8845, Right Woofer */
 	right_woofer: speaker@0,0 {
 		compatible = "sdw20217020400";
 		reg = <0 0>;
-		reset-gpios = <&lpass_tlmm 13 GPIO_ACTIVE_LOW>;
+		reset-gpios = <&lpass_tlmm 17 GPIO_ACTIVE_LOW>;
 		#sound-dai-cells = <0>;
 		sound-name-prefix = "WooferRight";
 		vdd-1p8-supply = <&vreg_l15b_1p8>;
@@ -980,7 +996,7 @@ right_woofer: speaker@0,0 {
 	right_tweeter: speaker@0,1 {
 		compatible = "sdw20217020400";
 		reg = <0 1>;
-		reset-gpios = <&lpass_tlmm 13 GPIO_ACTIVE_LOW>;
+		reset-gpios = <&lpass_tlmm 18 GPIO_ACTIVE_LOW>;
 		#sound-dai-cells = <0>;
 		sound-name-prefix = "TweeterRight";
 		vdd-1p8-supply = <&vreg_l15b_1p8>;
-- 
2.34.1
Re: [PATCH v1] arm64: dts: qcom: hamoa-iot-evk: Fix 4-speaker playback support
Posted by Konrad Dybcio 2 months, 1 week ago
On 10/9/25 9:26 AM, leqi wrote:
> On the HAMOA-IOT-EVK board only 2 out of 4 speakers were functional.
> Unlike the CRD, which shares a single GPIO reset line for WSA1/2,
> this board provides a dedicated GPIO reset for each WSA, resulting
> in 4 separate reset lines.
> 
> Update the device tree accordingly so that all 4 speakers can
> playback audio as expected.
> 
> Signed-off-by: leqi <le.qi@oss.qualcomm.com>
> ---
>  arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts | 30 +++++++++++++++++-----
>  1 file changed, 23 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts b/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
> index df8d6e5c1f45..de9af19be6e8 100644
> --- a/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
> +++ b/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
> @@ -743,7 +743,7 @@ retimer_ss1_con_sbu_out: endpoint {
>  };
>  
>  &lpass_tlmm {
> -	spkr_01_sd_n_active: spkr-01-sd-n-active-state {
> +	spkr0_sd_n_active: spkr0-sd-n-active-state {
>  		pins = "gpio12";
>  		function = "gpio";
>  		drive-strength = <16>;
> @@ -751,13 +751,29 @@ spkr_01_sd_n_active: spkr-01-sd-n-active-state {
>  		output-low;
>  	};
>  
> -	spkr_23_sd_n_active: spkr-23-sd-n-active-state {
> +	spkr1_sd_n_active: spkr1-sd-n-active-state {
>  		pins = "gpio13";
>  		function = "gpio";
>  		drive-strength = <16>;
>  		bias-disable;
>  		output-low;

output- properties should be removed in favor of in-code gpiod_
function calls, otherwise the reset gets asserted by the kernel as
the OF node is being processed, unbeknownst to the then-not-yet-
bound driver

[...]

> -	pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
> +	pinctrl-0 = <&wsa_swr_active>, <&spkr0_sd_n_active>, <&spkr1_sd_n_active>;

Similarly, because these pin configs relate to GPIOs connected to
the speaker amps, and not the soundwire host, these entries should
be split between each individual device

Konrad
Re: [PATCH v1] arm64: dts: qcom: hamoa-iot-evk: Fix 4-speaker playback support
Posted by Le Qi 2 months, 1 week ago
On 10/9/2025 5:26 PM, Konrad Dybcio wrote:
> On 10/9/25 9:26 AM, leqi wrote:
>> On the HAMOA-IOT-EVK board only 2 out of 4 speakers were functional.
>> Unlike the CRD, which shares a single GPIO reset line for WSA1/2,
>> this board provides a dedicated GPIO reset for each WSA, resulting
>> in 4 separate reset lines.
>>
>> Update the device tree accordingly so that all 4 speakers can
>> playback audio as expected.
>>
>> Signed-off-by: leqi <le.qi@oss.qualcomm.com>
>> ---
>>   arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts | 30 +++++++++++++++++-----
>>   1 file changed, 23 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts b/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
>> index df8d6e5c1f45..de9af19be6e8 100644
>> --- a/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
>> +++ b/arch/arm64/boot/dts/qcom/hamoa-iot-evk.dts
>> @@ -743,7 +743,7 @@ retimer_ss1_con_sbu_out: endpoint {
>>   };
>>   
>>   &lpass_tlmm {
>> -	spkr_01_sd_n_active: spkr-01-sd-n-active-state {
>> +	spkr0_sd_n_active: spkr0-sd-n-active-state {
>>   		pins = "gpio12";
>>   		function = "gpio";
>>   		drive-strength = <16>;
>> @@ -751,13 +751,29 @@ spkr_01_sd_n_active: spkr-01-sd-n-active-state {
>>   		output-low;
>>   	};
>>   
>> -	spkr_23_sd_n_active: spkr-23-sd-n-active-state {
>> +	spkr1_sd_n_active: spkr1-sd-n-active-state {
>>   		pins = "gpio13";
>>   		function = "gpio";
>>   		drive-strength = <16>;
>>   		bias-disable;
>>   		output-low;
> 
> output- properties should be removed in favor of in-code gpiod_
> function calls, otherwise the reset gets asserted by the kernel as
> the OF node is being processed, unbeknownst to the then-not-yet-
> bound driver
> 
> [...]
> 
>> -	pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
>> +	pinctrl-0 = <&wsa_swr_active>, <&spkr0_sd_n_active>, <&spkr1_sd_n_active>;
> 
> Similarly, because these pin configs relate to GPIOs connected to
> the speaker amps, and not the soundwire host, these entries should
> be split between each individual device
> 
> Konrad

Yes, will modify and test, thanks for pointing out.

-- 
Thx and BRs,
Le Qi