* [PATCH v2 1/4] arm64: dts: qcom: nord: Add the USB controller nodes
2026-09-22 15:01 [PATCH v2 0/4] arm64: dts: qcom: nord: Add USB support Bartosz Golaszewski
@ 2026-09-22 15:01 ` Bartosz Golaszewski
2026-09-25 12:55 ` Konrad Dybcio
2026-09-22 15:01 ` [PATCH v2 2/4] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs Bartosz Golaszewski
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Bartosz Golaszewski @ 2026-09-22 15:01 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Abel Vesa, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Bartosz Golaszewski, Abel Vesa
Add the base nodes for the three DWC3 USB controllers. These carry only
the SoC-invariant properties and are disabled by default. The extension
for the embedded Nord variant and relevant board files will add the
platform resources and enable them.
USB_2 has no SuperSpeed PHY and no 'ss_phy_irq' on this SoC, so it is
capped to high-speed and told to use UTMI as its pipe clock.
Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/nord.dtsi | 100 +++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/nord.dtsi b/arch/arm64/boot/dts/qcom/nord.dtsi
index 926ccf3bbe4e4d27ac37873245c3871e4a290d65..4375284c59e649312a5e814239e5f91d49f9ec45 100644
--- a/arch/arm64/boot/dts/qcom/nord.dtsi
+++ b/arch/arm64/boot/dts/qcom/nord.dtsi
@@ -1737,6 +1737,106 @@ ipcc0: mailbox@9007000 {
#mbox-cells = <2>;
};
+ usb_2: usb@a200000 {
+ compatible = "qcom,nord-dwc3",
+ "qcom,snps-dwc3";
+ reg = <0x0 0x0a200000 0x0 0xfc100>;
+
+ interrupts-extended = <&intc GIC_SPI 910 IRQ_TYPE_LEVEL_HIGH>,
+ <&intc GIC_SPI 907 IRQ_TYPE_LEVEL_HIGH>,
+ <&intc GIC_SPI 908 IRQ_TYPE_LEVEL_HIGH>,
+ <&pdc 8 IRQ_TYPE_EDGE_BOTH>,
+ <&pdc 7 IRQ_TYPE_EDGE_BOTH>;
+ interrupt-names = "dwc_usb3",
+ "pwr_event",
+ "hs_phy_irq",
+ "dp_hs_phy_irq",
+ "dm_hs_phy_irq";
+
+ iommus = <&apps_smmu_0 0x14e0 0x0>;
+
+ dma-coherent;
+ wakeup-source;
+ usb-role-switch;
+
+ snps,dis-u1-entry-quirk;
+ snps,dis-u2-entry-quirk;
+ snps,dis_u2_susphy_quirk;
+ snps,dis_u3_susphy_quirk;
+ snps,dis_enblslpm_quirk;
+ qcom,select-utmi-as-pipe-clk;
+
+ maximum-speed = "high-speed";
+
+ status = "disabled";
+ };
+
+ usb_1: usb@a400000 {
+ compatible = "qcom,nord-dwc3",
+ "qcom,snps-dwc3";
+ reg = <0x0 0x0a400000 0x0 0xfc100>;
+
+ interrupts-extended = <&intc GIC_SPI 917 IRQ_TYPE_LEVEL_HIGH>,
+ <&intc GIC_SPI 918 IRQ_TYPE_LEVEL_HIGH>,
+ <&intc GIC_SPI 919 IRQ_TYPE_LEVEL_HIGH>,
+ <&pdc 13 IRQ_TYPE_EDGE_BOTH>,
+ <&pdc 12 IRQ_TYPE_EDGE_BOTH>,
+ <&pdc 41 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "dwc_usb3",
+ "pwr_event",
+ "hs_phy_irq",
+ "dp_hs_phy_irq",
+ "dm_hs_phy_irq",
+ "ss_phy_irq";
+
+ iommus = <&apps_smmu_0 0x15c0 0x0>;
+
+ dma-coherent;
+ wakeup-source;
+ usb-role-switch;
+
+ snps,dis-u1-entry-quirk;
+ snps,dis-u2-entry-quirk;
+ snps,dis_u2_susphy_quirk;
+ snps,dis_u3_susphy_quirk;
+ snps,dis_enblslpm_quirk;
+
+ status = "disabled";
+ };
+
+ usb_0: usb@a600000 {
+ compatible = "qcom,nord-dwc3",
+ "qcom,snps-dwc3";
+ reg = <0x0 0x0a600000 0x0 0xfc100>;
+
+ interrupts-extended = <&intc GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>,
+ <&intc GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
+ <&intc GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
+ <&pdc 14 IRQ_TYPE_EDGE_BOTH>,
+ <&pdc 15 IRQ_TYPE_EDGE_BOTH>,
+ <&pdc 17 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "dwc_usb3",
+ "pwr_event",
+ "hs_phy_irq",
+ "dp_hs_phy_irq",
+ "dm_hs_phy_irq",
+ "ss_phy_irq";
+
+ iommus = <&apps_smmu_0 0x1500 0x0>;
+
+ dma-coherent;
+ wakeup-source;
+ usb-role-switch;
+
+ snps,dis-u1-entry-quirk;
+ snps,dis-u2-entry-quirk;
+ snps,dis_u2_susphy_quirk;
+ snps,dis_u3_susphy_quirk;
+ snps,dis_enblslpm_quirk;
+
+ status = "disabled";
+ };
+
pdc: interrupt-controller@b220000 {
compatible = "qcom,nord-pdc",
"qcom,pdc";
--
2.47.3
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 1/4] arm64: dts: qcom: nord: Add the USB controller nodes
2026-09-22 15:01 ` [PATCH v2 1/4] arm64: dts: qcom: nord: Add the USB controller nodes Bartosz Golaszewski
@ 2026-09-25 12:55 ` Konrad Dybcio
0 siblings, 0 replies; 9+ messages in thread
From: Konrad Dybcio @ 2026-09-25 12:55 UTC (permalink / raw)
To: Bartosz Golaszewski, Bjorn Andersson, Konrad Dybcio, Abel Vesa,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Abel Vesa
On 9/22/26 5:01 PM, Bartosz Golaszewski wrote:
> Add the base nodes for the three DWC3 USB controllers. These carry only
> the SoC-invariant properties and are disabled by default. The extension
> for the embedded Nord variant and relevant board files will add the
> platform resources and enable them.
>
> USB_2 has no SuperSpeed PHY and no 'ss_phy_irq' on this SoC, so it is
> capped to high-speed and told to use UTMI as its pipe clock.
>
> Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
> Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/4] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs
2026-09-22 15:01 [PATCH v2 0/4] arm64: dts: qcom: nord: Add USB support Bartosz Golaszewski
2026-09-22 15:01 ` [PATCH v2 1/4] arm64: dts: qcom: nord: Add the USB controller nodes Bartosz Golaszewski
@ 2026-09-22 15:01 ` Bartosz Golaszewski
2026-09-22 15:49 ` Konrad Dybcio
2026-09-22 15:01 ` [PATCH v2 3/4] arm64: dts: qcom: nord-rrd: Enable USB ports Bartosz Golaszewski
2026-09-22 15:01 ` [PATCH v2 4/4] arm64: dts: qcom: nord-ride-embedded: " Bartosz Golaszewski
3 siblings, 1 reply; 9+ messages in thread
From: Bartosz Golaszewski @ 2026-09-22 15:01 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Abel Vesa, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Bartosz Golaszewski, Abel Vesa
Add the platform resources for the three USB controllers on the embedded
Nord variant: clocks, resets, power domains and interconnect paths.
Add the eUSB2 PHY for each of the three controllers, plus the QMP combo
PHYs for USB_0 and USB_1, and feed the two QMP USB3 pipe clocks back
into negcc, which so far carried placeholder zeros in their place.
The eUSB2 PHY of instance 2 gets no 'resets': the SoC provides only two
QUSB2PHY block resets, belonging to instances 0 and 1. Instance 2 comes
out of reset with the rest of the USB20 tile, driven by the controller.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/nord-embedded.dtsi | 311 +++++++++++++++++++++++++++-
1 file changed, 309 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/nord-embedded.dtsi b/arch/arm64/boot/dts/qcom/nord-embedded.dtsi
index c7ac2e66632e57852f6dd88d8070d5c28cf70d2f..e7ff8c420300f34a2ad4063ecad8a31f08b8d80b 100644
--- a/arch/arm64/boot/dts/qcom/nord-embedded.dtsi
+++ b/arch/arm64/boot/dts/qcom/nord-embedded.dtsi
@@ -11,6 +11,7 @@
#include <dt-bindings/clock/qcom,rpmh.h>
#include <dt-bindings/interconnect/qcom,icc.h>
#include <dt-bindings/interconnect/qcom,nord-rpmh.h>
+#include <dt-bindings/phy/phy-qcom-qmp.h>
#include <dt-bindings/power/qcom,rpmhpd.h>
#include <dt-bindings/soc/qcom,rpmh-rsc.h>
@@ -842,6 +843,161 @@ hpass_ag_noc: interconnect@5fc0000 {
qcom,bcm-voters = <&apps_bcm_voter>;
};
+ usb_2_hsphy: phy@88e0000 {
+ compatible = "qcom,nord-snps-eusb2-phy",
+ "qcom,sm8550-snps-eusb2-phy";
+ reg = <0x0 0x088e0000 0x0 0x154>;
+
+ clocks = <&tcsrcc TCSR_USB2_2_CLKREF_EN>;
+ clock-names = "ref";
+
+ /*
+ * The SoC has three eUSB2 PHYs but only two QUSB2PHY block
+ * resets, which belong to instances 0 and 1 (usb_0 and usb_1).
+ * This PHY, instance 2, has none of its own: it is taken out of
+ * reset together with the rest of the USB20 tile by
+ * NE_GCC_USB20_PRIM_BCR, which the controller owns and pulses
+ * before touching any register. So no 'resets' here - both
+ * consumers would need that single reset exclusively.
+ */
+
+ #phy-cells = <0>;
+
+ status = "disabled";
+ };
+
+ usb_0_qmpphy: phy@88e1000 {
+ compatible = "qcom,nord-qmp-usb3-dp-phy";
+ reg = <0x0 0x088e1000 0x0 0x3000>;
+
+ clocks = <&negcc NE_GCC_USB3_PRIM_PHY_AUX_CLK>,
+ <&tcsrcc TCSR_USB3_0_CLKREF_EN>,
+ <&negcc NE_GCC_USB3_PRIM_PHY_COM_AUX_CLK>,
+ <&negcc NE_GCC_USB3_PRIM_PHY_PIPE_CLK>;
+ clock-names = "aux",
+ "ref",
+ "com_aux",
+ "usb3_pipe";
+
+ power-domains = <&negcc NE_GCC_USB3_PHY_GDSC>;
+
+ resets = <&negcc NE_GCC_USB3_PHY_PRIM_BCR>,
+ <&negcc NE_GCC_USB3_DP_PHY_PRIM_BCR>;
+ reset-names = "phy",
+ "common";
+
+ #clock-cells = <1>;
+ #phy-cells = <1>;
+
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ usb_0_qmpphy_usb_ss_out: endpoint@1 {
+ reg = <1>;
+ data-lanes = <1 0>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_0_qmpphy_usb_ss_in: endpoint {
+ remote-endpoint = <&usb_0_dwc3_ss>;
+ };
+ };
+ };
+ };
+
+ usb_1_qmpphy: phy@88e4000 {
+ compatible = "qcom,nord-qmp-usb3-dp-phy";
+ reg = <0x0 0x088e4000 0x0 0x3000>;
+
+ clocks = <&negcc NE_GCC_USB3_SEC_PHY_AUX_CLK>,
+ <&tcsrcc TCSR_USB3_1_CLKREF_EN>,
+ <&negcc NE_GCC_USB3_SEC_PHY_COM_AUX_CLK>,
+ <&negcc NE_GCC_USB3_SEC_PHY_PIPE_CLK>;
+ clock-names = "aux",
+ "ref",
+ "com_aux",
+ "usb3_pipe";
+
+ power-domains = <&negcc NE_GCC_USB3_SEC_PHY_GDSC>;
+
+ resets = <&negcc NE_GCC_USB3_PHY_SEC_BCR>,
+ <&negcc NE_GCC_USB3_DP_PHY_SEC_BCR>;
+ reset-names = "phy",
+ "common";
+
+ #clock-cells = <1>;
+ #phy-cells = <1>;
+
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ usb_1_qmpphy_usb_ss_out: endpoint@1 {
+ reg = <1>;
+ data-lanes = <1 0>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_1_qmpphy_usb_ss_in: endpoint {
+ remote-endpoint = <&usb_1_dwc3_ss>;
+ };
+ };
+ };
+ };
+
+ usb_0_hsphy: phy@88ea000 {
+ compatible = "qcom,nord-snps-eusb2-phy",
+ "qcom,sm8550-snps-eusb2-phy";
+ reg = <0x0 0x088ea000 0x0 0x154>;
+
+ clocks = <&tcsrcc TCSR_USB2_0_CLKREF_EN>;
+ clock-names = "ref";
+
+ resets = <&negcc NE_GCC_QUSB2PHY_PRIM_BCR>;
+
+ #phy-cells = <0>;
+
+ status = "disabled";
+ };
+
+ usb_1_hsphy: phy@88eb000 {
+ compatible = "qcom,nord-snps-eusb2-phy",
+ "qcom,sm8550-snps-eusb2-phy";
+ reg = <0x0 0x088eb000 0x0 0x154>;
+
+ clocks = <&tcsrcc TCSR_USB2_1_CLKREF_EN>;
+ clock-names = "ref";
+
+ resets = <&negcc NE_GCC_QUSB2PHY_SEC_BCR>;
+
+ #phy-cells = <0>;
+
+ status = "disabled";
+ };
+
negcc: clock-controller@8900000 {
compatible = "qcom,nord-negcc";
reg = <0x0 0x08900000 0x0 0xf4200>;
@@ -850,8 +1006,8 @@ negcc: clock-controller@8900000 {
<0>,
<0>,
<0>,
- <0>,
- <0>;
+ <&usb_1_qmpphy QMP_USB43DP_USB3_PIPE_CLK>,
+ <&usb_0_qmpphy QMP_USB43DP_USB3_PIPE_CLK>;
#clock-cells = <1>;
#reset-cells = <1>;
#power-domain-cells = <1>;
@@ -1881,3 +2037,154 @@ opp-403000000 {
};
};
};
+
+&usb_0 {
+ clocks = <&negcc NE_GCC_CNOC_USB3_PRIM_AXI_CLK>,
+ <&negcc NE_GCC_USB31_PRIM_MASTER_CLK>,
+ <&negcc NE_GCC_AGGRE_NOC_USB3_PRIM_AXI_CLK>,
+ <&negcc NE_GCC_USB31_PRIM_SLEEP_CLK>,
+ <&negcc NE_GCC_USB31_PRIM_MOCK_UTMI_CLK>,
+ <&tcsrcc TCSR_USB3_0_CLKREF_EN>;
+ clock-names = "cfg_noc",
+ "core",
+ "iface",
+ "sleep",
+ "mock_utmi",
+ "xo";
+
+ assigned-clocks = <&negcc NE_GCC_USB31_PRIM_MOCK_UTMI_CLK>,
+ <&negcc NE_GCC_USB31_PRIM_MASTER_CLK>;
+ assigned-clock-rates = <19200000>, <200000000>;
+
+ power-domains = <&negcc NE_GCC_USB31_PRIM_GDSC>;
+ required-opps = <&rpmhpd_opp_nom>;
+
+ resets = <&negcc NE_GCC_USB31_PRIM_BCR>;
+
+ interconnects = <&aggre1_noc_tile MASTER_USB3_0 QCOM_ICC_TAG_ALWAYS
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>,
+ <&hscnoc MASTER_APPSS_PROC QCOM_ICC_TAG_ALWAYS
+ &config_noc SLAVE_USB3_0 QCOM_ICC_TAG_ALWAYS>;
+ interconnect-names = "usb-ddr",
+ "apps-usb";
+
+ phys = <&usb_0_hsphy>,
+ <&usb_0_qmpphy QMP_USB43DP_USB3_PHY>;
+ phy-names = "usb2-phy",
+ "usb3-phy";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ usb_0_dwc3_hs: endpoint {
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_0_dwc3_ss: endpoint {
+ remote-endpoint = <&usb_0_qmpphy_usb_ss_in>;
+ };
+ };
+ };
+};
+
+&usb_1 {
+ clocks = <&negcc NE_GCC_CNOC_USB3_SEC_AXI_CLK>,
+ <&negcc NE_GCC_USB31_SEC_MASTER_CLK>,
+ <&negcc NE_GCC_AGGRE_NOC_USB3_SEC_AXI_CLK>,
+ <&negcc NE_GCC_USB31_SEC_SLEEP_CLK>,
+ <&negcc NE_GCC_USB31_SEC_MOCK_UTMI_CLK>,
+ <&tcsrcc TCSR_USB3_1_CLKREF_EN>;
+ clock-names = "cfg_noc",
+ "core",
+ "iface",
+ "sleep",
+ "mock_utmi",
+ "xo";
+
+ assigned-clocks = <&negcc NE_GCC_USB31_SEC_MOCK_UTMI_CLK>,
+ <&negcc NE_GCC_USB31_SEC_MASTER_CLK>;
+ assigned-clock-rates = <19200000>, <200000000>;
+
+ power-domains = <&negcc NE_GCC_USB31_SEC_GDSC>;
+ required-opps = <&rpmhpd_opp_nom>;
+
+ resets = <&negcc NE_GCC_USB31_SEC_BCR>;
+
+ interconnects = <&aggre1_noc_tile MASTER_USB3_1 QCOM_ICC_TAG_ALWAYS
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>,
+ <&hscnoc MASTER_APPSS_PROC QCOM_ICC_TAG_ALWAYS
+ &config_noc SLAVE_USB3_1 QCOM_ICC_TAG_ALWAYS>;
+ interconnect-names = "usb-ddr",
+ "apps-usb";
+
+ phys = <&usb_1_hsphy>,
+ <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>;
+ phy-names = "usb2-phy",
+ "usb3-phy";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ usb_1_dwc3_hs: endpoint {
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_1_dwc3_ss: endpoint {
+ remote-endpoint = <&usb_1_qmpphy_usb_ss_in>;
+ };
+ };
+ };
+};
+
+&usb_2 {
+ clocks = <&negcc NE_GCC_CNOC_USB2_AXI_CLK>,
+ <&negcc NE_GCC_USB20_MASTER_CLK>,
+ <&negcc NE_GCC_AGGRE_NOC_USB2_AXI_CLK>,
+ <&negcc NE_GCC_USB20_SLEEP_CLK>,
+ <&negcc NE_GCC_USB20_MOCK_UTMI_CLK>,
+ <&tcsrcc TCSR_USB2_2_CLKREF_EN>;
+ clock-names = "cfg_noc",
+ "core",
+ "iface",
+ "sleep",
+ "mock_utmi",
+ "xo";
+
+ assigned-clocks = <&negcc NE_GCC_USB20_MOCK_UTMI_CLK>,
+ <&negcc NE_GCC_USB20_MASTER_CLK>;
+ assigned-clock-rates = <19200000>, <120000000>;
+
+ power-domains = <&negcc NE_GCC_USB20_PRIM_GDSC>;
+ required-opps = <&rpmhpd_opp_nom>;
+
+ resets = <&negcc NE_GCC_USB20_PRIM_BCR>;
+
+ interconnects = <&aggre1_noc_tile MASTER_USB2 QCOM_ICC_TAG_ALWAYS
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>,
+ <&hscnoc MASTER_APPSS_PROC QCOM_ICC_TAG_ALWAYS
+ &config_noc SLAVE_USB2 QCOM_ICC_TAG_ALWAYS>;
+ interconnect-names = "usb-ddr",
+ "apps-usb";
+
+ phys = <&usb_2_hsphy>;
+ phy-names = "usb2-phy";
+
+ port {
+ usb_2_dwc3_hs: endpoint {
+ };
+ };
+};
--
2.47.3
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 2/4] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs
2026-09-22 15:01 ` [PATCH v2 2/4] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs Bartosz Golaszewski
@ 2026-09-22 15:49 ` Konrad Dybcio
0 siblings, 0 replies; 9+ messages in thread
From: Konrad Dybcio @ 2026-09-22 15:49 UTC (permalink / raw)
To: Bartosz Golaszewski, Bjorn Andersson, Konrad Dybcio, Abel Vesa,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Abel Vesa
On 9/22/26 5:01 PM, Bartosz Golaszewski wrote:
> Add the platform resources for the three USB controllers on the embedded
> Nord variant: clocks, resets, power domains and interconnect paths.
>
> Add the eUSB2 PHY for each of the three controllers, plus the QMP combo
> PHYs for USB_0 and USB_1, and feed the two QMP USB3 pipe clocks back
> into negcc, which so far carried placeholder zeros in their place.
>
> The eUSB2 PHY of instance 2 gets no 'resets': the SoC provides only two
> QUSB2PHY block resets, belonging to instances 0 and 1. Instance 2 comes
> out of reset with the rest of the USB20 tile, driven by the controller.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
> Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 3/4] arm64: dts: qcom: nord-rrd: Enable USB ports
2026-09-22 15:01 [PATCH v2 0/4] arm64: dts: qcom: nord: Add USB support Bartosz Golaszewski
2026-09-22 15:01 ` [PATCH v2 1/4] arm64: dts: qcom: nord: Add the USB controller nodes Bartosz Golaszewski
2026-09-22 15:01 ` [PATCH v2 2/4] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs Bartosz Golaszewski
@ 2026-09-22 15:01 ` Bartosz Golaszewski
2026-09-25 12:56 ` Konrad Dybcio
2026-09-22 15:01 ` [PATCH v2 4/4] arm64: dts: qcom: nord-ride-embedded: " Bartosz Golaszewski
3 siblings, 1 reply; 9+ messages in thread
From: Bartosz Golaszewski @ 2026-09-22 15:01 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Abel Vesa, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Bartosz Golaszewski, Abel Vesa
From: Shawn Guo <shengchao.guo@oss.qualcomm.com>
Describe the RRD USB topology. Enable i2c9 and add the two NXP PTN3222
eUSB2 repeaters for USB_0 and USB_1, supplied from vreg_l3l_1p8 and a new
fixed 3.3 V pre-regulator, and reset through pmau0102_i GPIOs 9 and 10.
Add the onsemi FUSB15201 Type-C controller at 0x50 with its interrupt and
pinctrl state on pmau0102_i gpio8. Unlike RIDE, only port A of
the controller is wired on this board, to USB_0, so a single
usb-c-connector is described and port B is left out. USB_0 is configured
for OTG with usb-role-switch and its HS and SS endpoints are linked to
the dwc3 HS endpoint and the QMP combo PHY SS output.
USB_1 is a fixed host port feeding an on-board Genesys Logic GL3590 USB
3.1 hub. Add the HS and SS hub pair as children of USB_1, linked with
peer-hub, with the HS half reset via TLMM GPIO 170 and the SS half
additionally supplied by a fixed 1.2 V rail.
Assisted-by: LLM
Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
Co-developed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/nord-rrd.dts | 166 ++++++++++++++++++++++++++++++++++
1 file changed, 166 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/nord-rrd.dts b/arch/arm64/boot/dts/qcom/nord-rrd.dts
index c547963371b4d05fad1028655a49a9f9cb952f64..46f6913b5808a4f230d61ed6de35efa6b4addca9 100644
--- a/arch/arm64/boot/dts/qcom/nord-rrd.dts
+++ b/arch/arm64/boot/dts/qcom/nord-rrd.dts
@@ -6,6 +6,7 @@
/dts-v1/;
#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
#include "nord-embedded.dtsi"
@@ -53,6 +54,22 @@ bi_tcxo_ao_div2: bi-tcxo-ao-div2-clk {
clock-div = <2>;
};
};
+
+ vreg_per_3p3: regulator-per-3p3 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_per_3p3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ };
+
+ vreg_hub_1p2: regulator-hub-1p2 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_hub_1p2";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-always-on;
+ };
};
&apps_rsc {
@@ -377,6 +394,86 @@ rtc@32 {
};
};
+&i2c9 {
+ clock-frequency = <400000>;
+
+ status = "okay";
+
+ usb0_repeater: redriver@43 {
+ compatible = "nxp,ptn3222";
+ reg = <0x43>;
+ #phy-cells = <0>;
+ vdd1v8-supply = <&vreg_l3l_1p8>;
+ vdd3v3-supply = <&vreg_per_3p3>;
+ reset-gpios = <&pmau0102_i_gpios 9 GPIO_ACTIVE_LOW>;
+ };
+
+ usb1_repeater: redriver@4f {
+ compatible = "nxp,ptn3222";
+ reg = <0x4f>;
+ #phy-cells = <0>;
+ vdd1v8-supply = <&vreg_l3l_1p8>;
+ vdd3v3-supply = <&vreg_per_3p3>;
+ reset-gpios = <&pmau0102_i_gpios 10 GPIO_ACTIVE_LOW>;
+ };
+
+ typec@50 {
+ compatible = "onnn,fusb15201";
+ reg = <0x50>;
+ interrupts-extended = <&pmau0102_i_gpios 8 IRQ_TYPE_LEVEL_LOW>;
+
+ pinctrl-0 = <&usb_pd_int_default>;
+ pinctrl-names = "default";
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ /*
+ * Only port A of the controller is wired up on this board, to
+ * USB_0. Port B is left unconnected.
+ */
+ connector@0 {
+ compatible = "usb-c-connector";
+ reg = <0>;
+ label = "USB-C0";
+ power-role = "dual";
+ data-role = "dual";
+ try-power-role = "sink";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ usb_0_con_hs: endpoint {
+ remote-endpoint = <&usb_0_dwc3_hs>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_0_con_ss: endpoint {
+ remote-endpoint = <&usb_0_qmpphy_usb_ss_out>;
+ };
+ };
+ };
+ };
+ };
+};
+
+&pmau0102_i_gpios {
+ usb_pd_int_default: usb-pd-int-state {
+ pins = "gpio8";
+ function = "normal";
+ input-enable;
+ bias-pull-up;
+ power-source = <0>;
+ };
+};
+
&qupv3_0 {
firmware-name = "qcom/nord/qupv3fw.elf";
@@ -459,3 +556,72 @@ &ufs_mem_phy {
status = "okay";
};
+
+&usb_0 {
+ status = "okay";
+};
+
+&usb_0_dwc3_hs {
+ remote-endpoint = <&usb_0_con_hs>;
+};
+
+&usb_0_hsphy {
+ vdd-supply = <&vreg_l1h_0p9>;
+ vdda12-supply = <&vreg_l2h_1p2>;
+
+ phys = <&usb0_repeater>;
+
+ status = "okay";
+};
+
+&usb_0_qmpphy {
+ vdda-phy-supply = <&vreg_l2k_0p9>;
+ vdda-pll-supply = <&vreg_l2h_1p2>;
+
+ status = "okay";
+};
+
+&usb_0_qmpphy_usb_ss_out {
+ remote-endpoint = <&usb_0_con_ss>;
+};
+
+&usb_1 {
+ dr_mode = "host";
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ status = "okay";
+
+ hub_hs: hub@1 {
+ compatible = "usb5e3,610";
+ reg = <1>;
+ reset-gpios = <&tlmm 170 GPIO_ACTIVE_LOW>;
+ vdd-supply = <&vreg_per_3p3>;
+ peer-hub = <&hub_ss>;
+ };
+
+ hub_ss: hub@2 {
+ compatible = "usb5e3,625";
+ reg = <2>;
+ vdd-supply = <&vreg_per_3p3>;
+ vdd12-supply = <&vreg_hub_1p2>;
+ peer-hub = <&hub_hs>;
+ };
+};
+
+&usb_1_hsphy {
+ vdd-supply = <&vreg_l1h_0p9>;
+ vdda12-supply = <&vreg_l2h_1p2>;
+
+ phys = <&usb1_repeater>;
+
+ status = "okay";
+};
+
+&usb_1_qmpphy {
+ vdda-phy-supply = <&vreg_l2k_0p9>;
+ vdda-pll-supply = <&vreg_l2h_1p2>;
+
+ status = "okay";
+};
--
2.47.3
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 3/4] arm64: dts: qcom: nord-rrd: Enable USB ports
2026-09-22 15:01 ` [PATCH v2 3/4] arm64: dts: qcom: nord-rrd: Enable USB ports Bartosz Golaszewski
@ 2026-09-25 12:56 ` Konrad Dybcio
0 siblings, 0 replies; 9+ messages in thread
From: Konrad Dybcio @ 2026-09-25 12:56 UTC (permalink / raw)
To: Bartosz Golaszewski, Bjorn Andersson, Konrad Dybcio, Abel Vesa,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Abel Vesa
On 9/22/26 5:01 PM, Bartosz Golaszewski wrote:
> From: Shawn Guo <shengchao.guo@oss.qualcomm.com>
>
> Describe the RRD USB topology. Enable i2c9 and add the two NXP PTN3222
> eUSB2 repeaters for USB_0 and USB_1, supplied from vreg_l3l_1p8 and a new
> fixed 3.3 V pre-regulator, and reset through pmau0102_i GPIOs 9 and 10.
[...]
> + vreg_per_3p3: regulator-per-3p3 {
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_per_3p3";
> + regulator-min-microvolt = <3300000>;
> + regulator-max-microvolt = <3300000>;
> + regulator-always-on;
> + };
> +
> + vreg_hub_1p2: regulator-hub-1p2 {
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_hub_1p2";
> + regulator-min-microvolt = <1200000>;
> + regulator-max-microvolt = <1200000>;
> + regulator-always-on;
> + };
Please touch up the order
otherwise looks good
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 4/4] arm64: dts: qcom: nord-ride-embedded: Enable USB ports
2026-09-22 15:01 [PATCH v2 0/4] arm64: dts: qcom: nord: Add USB support Bartosz Golaszewski
` (2 preceding siblings ...)
2026-09-22 15:01 ` [PATCH v2 3/4] arm64: dts: qcom: nord-rrd: Enable USB ports Bartosz Golaszewski
@ 2026-09-22 15:01 ` Bartosz Golaszewski
2026-09-23 12:05 ` Shawn Guo
3 siblings, 1 reply; 9+ messages in thread
From: Bartosz Golaszewski @ 2026-09-22 15:01 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Abel Vesa, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shawn Guo, brgl
Cc: linux-arm-msm, devicetree, linux-kernel, Bartosz Golaszewski, Abel Vesa
From: Shawn Guo <shengchao.guo@oss.qualcomm.com>
Wire up the board specific pieces for USB ports. Enable i2c9 and add the
three NXP PTN3222 eUSB2 repeaters (one per USB port) with their 1.8 V
supply and reset GPIOs on the PMIC GPIO expanders.
Add the onsemi FUSB15201 dual port Type-C controller at 0x50, with
its interrupt and pinctrl state on pmau0102_i gpio8. Both controller
ports are wired on this board, so describe two usb-c-connector
children and cross-link their HS and SS endpoints to the dwc3 HS
endpoint and the QMP combo PHY SS output of USB_0 and USB_1. Both
controllers therefore run in OTG mode with usb-role-switch.
USB_2 has no Type-C connector, so it is configured as a fixed host
port. Its VBUS is supplied by a fixed regulator gated by
pmau0102_h gpio3, kept always-on since nothing switches it at
runtime.
Assisted-by: LLM
Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
Co-developed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/nord-ride-embedded.dts | 309 ++++++++++++++++++++++++
1 file changed, 309 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts b/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts
index 09ee525764ef9a65aa17648097038687e61a5122..ee1525b37b381120d80a76d7b8e20ab2edeca6c3 100644
--- a/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts
+++ b/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts
@@ -6,6 +6,7 @@
/dts-v1/;
#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
#include "nord-embedded.dtsi"
@@ -53,6 +54,124 @@ bi_tcxo_ao_div2: bi-tcxo-ao-div2-clk {
clock-div = <2>;
};
};
+
+ vreg_per_3p3: regulator-per-3p3 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_per_3p3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ };
+
+ usb2_vbus: regulator-usb2-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "usb2_vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&pmau0102_h_gpios 3 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ regulator-always-on;
+ };
+
+ usb2-connector {
+ compatible = "usb-a-connector";
+ label = "USB-2-Type-A";
+ power-role = "source";
+
+ vbus-supply = <&usb2_vbus>;
+
+ port {
+ usb2_con_hs: endpoint {
+ remote-endpoint = <&usb_2_dwc3_hs>;
+ };
+ };
+ };
+
+ vreg_wcn_3p3: regulator-wcn-3p3 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_wcn_3p3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&pmau0102_e_gpios 8 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+
+ vreg_wcn_core_vl_0p95: regulator-wcn-core-vl-0p95 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_wcn_core_vl_0p95";
+ regulator-min-microvolt = <950000>;
+ regulator-max-microvolt = <950000>;
+ gpio = <&pmau0102_e_gpios 6 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+
+ vreg_wcn_core_vm_1p35: regulator-wcn-core-vm-1p35 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_wcn_core_vm_1p35";
+ regulator-min-microvolt = <1350000>;
+ regulator-max-microvolt = <1350000>;
+ gpio = <&pmau0102_e_gpios 6 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+
+ vreg_wcn_core_vh_1p95: regulator-wcn-core-vh-1p95 {
+ compatible = "regulator-fixed";
+ regulator-name = "vreg_wcn_core_vh_1p95";
+ regulator-min-microvolt = <1950000>;
+ regulator-max-microvolt = <1950000>;
+ gpio = <&pmau0102_e_gpios 6 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+
+ wcn7850-pmu {
+ compatible = "qcom,wcn7850-pmu";
+
+ wlan-enable-gpios = <&pmau0102_e_gpios 10 GPIO_ACTIVE_HIGH>;
+
+ vdd-supply = <&vreg_wcn_3p3>;
+ vddio-supply = <&vreg_s3a_1p8>;
+ vddaon-supply = <&vreg_wcn_core_vl_0p95>;
+ vdddig-supply = <&vreg_wcn_core_vl_0p95>;
+ vddrfa1p2-supply = <&vreg_wcn_core_vm_1p35>;
+ vddrfa1p8-supply = <&vreg_wcn_core_vh_1p95>;
+
+ regulators {
+ vreg_pmu_rfa_cmn: ldo0 {
+ regulator-name = "vreg_pmu_rfa_cmn";
+ };
+
+ vreg_pmu_aon_0p59: ldo1 {
+ regulator-name = "vreg_pmu_aon_0p59";
+ };
+
+ vreg_pmu_wlcx_0p8: ldo2 {
+ regulator-name = "vreg_pmu_wlcx_0p8";
+ };
+
+ vreg_pmu_wlmx_0p85: ldo3 {
+ regulator-name = "vreg_pmu_wlmx_0p85";
+ };
+
+ vreg_pmu_rfa_0p8: ldo5 {
+ regulator-name = "vreg_pmu_rfa_0p8";
+ };
+
+ vreg_pmu_rfa_1p2: ldo6 {
+ regulator-name = "vreg_pmu_rfa_1p2";
+ };
+
+ vreg_pmu_rfa_1p8: ldo7 {
+ regulator-name = "vreg_pmu_rfa_1p8";
+ };
+
+ vreg_pmu_pcie_0p9: ldo8 {
+ regulator-name = "vreg_pmu_pcie_0p9";
+ };
+
+ vreg_pmu_pcie_1p8: ldo9 {
+ regulator-name = "vreg_pmu_pcie_1p8";
+ };
+ };
+ };
};
&apps_rsc {
@@ -366,6 +485,121 @@ vreg_l3l_1p8: ldo3 {
};
};
+&i2c9 {
+ clock-frequency = <400000>;
+
+ status = "okay";
+
+ usb0_repeater: redriver@43 {
+ compatible = "nxp,ptn3222";
+ reg = <0x43>;
+ #phy-cells = <0>;
+ vdd1v8-supply = <&vreg_l3l_1p8>;
+ vdd3v3-supply = <&vreg_per_3p3>;
+ reset-gpios = <&pmau0102_i_gpios 9 GPIO_ACTIVE_LOW>;
+ };
+
+ usb2_repeater: redriver@47 {
+ compatible = "nxp,ptn3222";
+ reg = <0x47>;
+ #phy-cells = <0>;
+ vdd1v8-supply = <&vreg_l3l_1p8>;
+ vdd3v3-supply = <&vreg_per_3p3>;
+ reset-gpios = <&pmau0102_l_gpios 3 GPIO_ACTIVE_LOW>;
+ };
+
+ usb1_repeater: redriver@4f {
+ compatible = "nxp,ptn3222";
+ reg = <0x4f>;
+ #phy-cells = <0>;
+ vdd1v8-supply = <&vreg_l3l_1p8>;
+ vdd3v3-supply = <&vreg_per_3p3>;
+ reset-gpios = <&pmau0102_i_gpios 10 GPIO_ACTIVE_LOW>;
+ };
+
+ typec@50 {
+ compatible = "onnn,fusb15201";
+ reg = <0x50>;
+ interrupts-extended = <&pmau0102_i_gpios 8 IRQ_TYPE_LEVEL_LOW>;
+
+ pinctrl-0 = <&usb_pd_int_default>;
+ pinctrl-names = "default";
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ connector@0 {
+ compatible = "usb-c-connector";
+ reg = <0>;
+ label = "USB-C0";
+ power-role = "dual";
+ data-role = "dual";
+ try-power-role = "sink";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ usb_0_con_hs: endpoint {
+ remote-endpoint = <&usb_0_dwc3_hs>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_0_con_ss: endpoint {
+ remote-endpoint = <&usb_0_qmpphy_usb_ss_out>;
+ };
+ };
+ };
+ };
+
+ connector@1 {
+ compatible = "usb-c-connector";
+ reg = <1>;
+ label = "USB-C1";
+ power-role = "dual";
+ data-role = "dual";
+ try-power-role = "sink";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ usb_1_con_hs: endpoint {
+ remote-endpoint = <&usb_1_dwc3_hs>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ usb_1_con_ss: endpoint {
+ remote-endpoint = <&usb_1_qmpphy_usb_ss_out>;
+ };
+ };
+ };
+ };
+ };
+};
+
+&pmau0102_i_gpios {
+ usb_pd_int_default: usb-pd-int-state {
+ pins = "gpio8";
+ function = "normal";
+ input-enable;
+ bias-pull-up;
+ power-source = <0>;
+ };
+};
+
&qupv3_0 {
firmware-name = "qcom/nord/qupv3fw.elf";
@@ -440,3 +674,78 @@ &ufs_mem_phy {
status = "okay";
};
+
+&usb_0 {
+ status = "okay";
+};
+
+&usb_0_dwc3_hs {
+ remote-endpoint = <&usb_0_con_hs>;
+};
+
+&usb_0_hsphy {
+ vdd-supply = <&vreg_l1h_0p9>;
+ vdda12-supply = <&vreg_l2h_1p2>;
+
+ phys = <&usb0_repeater>;
+
+ status = "okay";
+};
+
+&usb_0_qmpphy {
+ vdda-phy-supply = <&vreg_l2k_0p9>;
+ vdda-pll-supply = <&vreg_l2h_1p2>;
+
+ status = "okay";
+};
+
+&usb_0_qmpphy_usb_ss_out {
+ remote-endpoint = <&usb_0_con_ss>;
+};
+
+&usb_1 {
+ status = "okay";
+};
+
+&usb_1_dwc3_hs {
+ remote-endpoint = <&usb_1_con_hs>;
+};
+
+&usb_1_hsphy {
+ vdd-supply = <&vreg_l1h_0p9>;
+ vdda12-supply = <&vreg_l2h_1p2>;
+
+ phys = <&usb1_repeater>;
+
+ status = "okay";
+};
+
+&usb_1_qmpphy {
+ vdda-phy-supply = <&vreg_l2k_0p9>;
+ vdda-pll-supply = <&vreg_l2h_1p2>;
+
+ status = "okay";
+};
+
+&usb_1_qmpphy_usb_ss_out {
+ remote-endpoint = <&usb_1_con_ss>;
+};
+
+&usb_2 {
+ dr_mode = "host";
+
+ status = "okay";
+};
+
+&usb_2_dwc3_hs {
+ remote-endpoint = <&usb2_con_hs>;
+};
+
+&usb_2_hsphy {
+ vdd-supply = <&vreg_l1h_0p9>;
+ vdda12-supply = <&vreg_l2h_1p2>;
+
+ phys = <&usb2_repeater>;
+
+ status = "okay";
+};
--
2.47.3
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v2 4/4] arm64: dts: qcom: nord-ride-embedded: Enable USB ports
2026-09-22 15:01 ` [PATCH v2 4/4] arm64: dts: qcom: nord-ride-embedded: " Bartosz Golaszewski
@ 2026-09-23 12:05 ` Shawn Guo
0 siblings, 0 replies; 9+ messages in thread
From: Shawn Guo @ 2026-09-23 12:05 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bjorn Andersson, Konrad Dybcio, Abel Vesa, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, brgl, linux-arm-msm,
devicetree, linux-kernel, Abel Vesa
On Tue, Sep 22, 2026 at 05:01:10PM +0200, Bartosz Golaszewski wrote:
> From: Shawn Guo <shengchao.guo@oss.qualcomm.com>
>
> Wire up the board specific pieces for USB ports. Enable i2c9 and add the
> three NXP PTN3222 eUSB2 repeaters (one per USB port) with their 1.8 V
> supply and reset GPIOs on the PMIC GPIO expanders.
>
> Add the onsemi FUSB15201 dual port Type-C controller at 0x50, with
> its interrupt and pinctrl state on pmau0102_i gpio8. Both controller
> ports are wired on this board, so describe two usb-c-connector
> children and cross-link their HS and SS endpoints to the dwc3 HS
> endpoint and the QMP combo PHY SS output of USB_0 and USB_1. Both
> controllers therefore run in OTG mode with usb-role-switch.
>
> USB_2 has no Type-C connector, so it is configured as a fixed host
> port. Its VBUS is supplied by a fixed regulator gated by
> pmau0102_h gpio3, kept always-on since nothing switches it at
> runtime.
>
> Assisted-by: LLM
> Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
> Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
> Co-developed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> ---
> arch/arm64/boot/dts/qcom/nord-ride-embedded.dts | 309 ++++++++++++++++++++++++
> 1 file changed, 309 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts b/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts
> index 09ee525764ef9a65aa17648097038687e61a5122..ee1525b37b381120d80a76d7b8e20ab2edeca6c3 100644
> --- a/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts
> +++ b/arch/arm64/boot/dts/qcom/nord-ride-embedded.dts
> @@ -6,6 +6,7 @@
> /dts-v1/;
>
> #include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/interrupt-controller/irq.h>
> #include <dt-bindings/regulator/qcom,rpmh-regulator.h>
>
> #include "nord-embedded.dtsi"
> @@ -53,6 +54,124 @@ bi_tcxo_ao_div2: bi-tcxo-ao-div2-clk {
> clock-div = <2>;
> };
> };
> +
> + vreg_per_3p3: regulator-per-3p3 {
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_per_3p3";
> + regulator-min-microvolt = <3300000>;
> + regulator-max-microvolt = <3300000>;
> + };
> +
> + usb2_vbus: regulator-usb2-vbus {
> + compatible = "regulator-fixed";
> + regulator-name = "usb2_vbus";
> + regulator-min-microvolt = <5000000>;
> + regulator-max-microvolt = <5000000>;
> + gpio = <&pmau0102_h_gpios 3 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> + regulator-always-on;
> + };
> +
> + usb2-connector {
> + compatible = "usb-a-connector";
> + label = "USB-2-Type-A";
> + power-role = "source";
> +
> + vbus-supply = <&usb2_vbus>;
> +
> + port {
> + usb2_con_hs: endpoint {
> + remote-endpoint = <&usb_2_dwc3_hs>;
> + };
> + };
> + };
> +
> + vreg_wcn_3p3: regulator-wcn-3p3 {
Nah, it (and the following WCN regulators) doesn't belong to this patch.
Shawn
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_wcn_3p3";
> + regulator-min-microvolt = <3300000>;
> + regulator-max-microvolt = <3300000>;
> + gpio = <&pmau0102_e_gpios 8 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> + };
> +
> + vreg_wcn_core_vl_0p95: regulator-wcn-core-vl-0p95 {
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_wcn_core_vl_0p95";
> + regulator-min-microvolt = <950000>;
> + regulator-max-microvolt = <950000>;
> + gpio = <&pmau0102_e_gpios 6 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> + };
> +
> + vreg_wcn_core_vm_1p35: regulator-wcn-core-vm-1p35 {
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_wcn_core_vm_1p35";
> + regulator-min-microvolt = <1350000>;
> + regulator-max-microvolt = <1350000>;
> + gpio = <&pmau0102_e_gpios 6 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> + };
> +
> + vreg_wcn_core_vh_1p95: regulator-wcn-core-vh-1p95 {
> + compatible = "regulator-fixed";
> + regulator-name = "vreg_wcn_core_vh_1p95";
> + regulator-min-microvolt = <1950000>;
> + regulator-max-microvolt = <1950000>;
> + gpio = <&pmau0102_e_gpios 6 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> + };
> +
> + wcn7850-pmu {
> + compatible = "qcom,wcn7850-pmu";
> +
> + wlan-enable-gpios = <&pmau0102_e_gpios 10 GPIO_ACTIVE_HIGH>;
> +
> + vdd-supply = <&vreg_wcn_3p3>;
> + vddio-supply = <&vreg_s3a_1p8>;
> + vddaon-supply = <&vreg_wcn_core_vl_0p95>;
> + vdddig-supply = <&vreg_wcn_core_vl_0p95>;
> + vddrfa1p2-supply = <&vreg_wcn_core_vm_1p35>;
> + vddrfa1p8-supply = <&vreg_wcn_core_vh_1p95>;
> +
> + regulators {
> + vreg_pmu_rfa_cmn: ldo0 {
> + regulator-name = "vreg_pmu_rfa_cmn";
> + };
> +
> + vreg_pmu_aon_0p59: ldo1 {
> + regulator-name = "vreg_pmu_aon_0p59";
> + };
> +
> + vreg_pmu_wlcx_0p8: ldo2 {
> + regulator-name = "vreg_pmu_wlcx_0p8";
> + };
> +
> + vreg_pmu_wlmx_0p85: ldo3 {
> + regulator-name = "vreg_pmu_wlmx_0p85";
> + };
> +
> + vreg_pmu_rfa_0p8: ldo5 {
> + regulator-name = "vreg_pmu_rfa_0p8";
> + };
> +
> + vreg_pmu_rfa_1p2: ldo6 {
> + regulator-name = "vreg_pmu_rfa_1p2";
> + };
> +
> + vreg_pmu_rfa_1p8: ldo7 {
> + regulator-name = "vreg_pmu_rfa_1p8";
> + };
> +
> + vreg_pmu_pcie_0p9: ldo8 {
> + regulator-name = "vreg_pmu_pcie_0p9";
> + };
> +
> + vreg_pmu_pcie_1p8: ldo9 {
> + regulator-name = "vreg_pmu_pcie_1p8";
> + };
> + };
> + };
> };
>
> &apps_rsc {
> @@ -366,6 +485,121 @@ vreg_l3l_1p8: ldo3 {
> };
> };
>
> +&i2c9 {
> + clock-frequency = <400000>;
> +
> + status = "okay";
> +
> + usb0_repeater: redriver@43 {
> + compatible = "nxp,ptn3222";
> + reg = <0x43>;
> + #phy-cells = <0>;
> + vdd1v8-supply = <&vreg_l3l_1p8>;
> + vdd3v3-supply = <&vreg_per_3p3>;
> + reset-gpios = <&pmau0102_i_gpios 9 GPIO_ACTIVE_LOW>;
> + };
> +
> + usb2_repeater: redriver@47 {
> + compatible = "nxp,ptn3222";
> + reg = <0x47>;
> + #phy-cells = <0>;
> + vdd1v8-supply = <&vreg_l3l_1p8>;
> + vdd3v3-supply = <&vreg_per_3p3>;
> + reset-gpios = <&pmau0102_l_gpios 3 GPIO_ACTIVE_LOW>;
> + };
> +
> + usb1_repeater: redriver@4f {
> + compatible = "nxp,ptn3222";
> + reg = <0x4f>;
> + #phy-cells = <0>;
> + vdd1v8-supply = <&vreg_l3l_1p8>;
> + vdd3v3-supply = <&vreg_per_3p3>;
> + reset-gpios = <&pmau0102_i_gpios 10 GPIO_ACTIVE_LOW>;
> + };
> +
> + typec@50 {
> + compatible = "onnn,fusb15201";
> + reg = <0x50>;
> + interrupts-extended = <&pmau0102_i_gpios 8 IRQ_TYPE_LEVEL_LOW>;
> +
> + pinctrl-0 = <&usb_pd_int_default>;
> + pinctrl-names = "default";
> +
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + connector@0 {
> + compatible = "usb-c-connector";
> + reg = <0>;
> + label = "USB-C0";
> + power-role = "dual";
> + data-role = "dual";
> + try-power-role = "sink";
> +
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + port@0 {
> + reg = <0>;
> +
> + usb_0_con_hs: endpoint {
> + remote-endpoint = <&usb_0_dwc3_hs>;
> + };
> + };
> +
> + port@1 {
> + reg = <1>;
> +
> + usb_0_con_ss: endpoint {
> + remote-endpoint = <&usb_0_qmpphy_usb_ss_out>;
> + };
> + };
> + };
> + };
> +
> + connector@1 {
> + compatible = "usb-c-connector";
> + reg = <1>;
> + label = "USB-C1";
> + power-role = "dual";
> + data-role = "dual";
> + try-power-role = "sink";
> +
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + port@0 {
> + reg = <0>;
> +
> + usb_1_con_hs: endpoint {
> + remote-endpoint = <&usb_1_dwc3_hs>;
> + };
> + };
> +
> + port@1 {
> + reg = <1>;
> +
> + usb_1_con_ss: endpoint {
> + remote-endpoint = <&usb_1_qmpphy_usb_ss_out>;
> + };
> + };
> + };
> + };
> + };
> +};
> +
> +&pmau0102_i_gpios {
> + usb_pd_int_default: usb-pd-int-state {
> + pins = "gpio8";
> + function = "normal";
> + input-enable;
> + bias-pull-up;
> + power-source = <0>;
> + };
> +};
> +
> &qupv3_0 {
> firmware-name = "qcom/nord/qupv3fw.elf";
>
> @@ -440,3 +674,78 @@ &ufs_mem_phy {
>
> status = "okay";
> };
> +
> +&usb_0 {
> + status = "okay";
> +};
> +
> +&usb_0_dwc3_hs {
> + remote-endpoint = <&usb_0_con_hs>;
> +};
> +
> +&usb_0_hsphy {
> + vdd-supply = <&vreg_l1h_0p9>;
> + vdda12-supply = <&vreg_l2h_1p2>;
> +
> + phys = <&usb0_repeater>;
> +
> + status = "okay";
> +};
> +
> +&usb_0_qmpphy {
> + vdda-phy-supply = <&vreg_l2k_0p9>;
> + vdda-pll-supply = <&vreg_l2h_1p2>;
> +
> + status = "okay";
> +};
> +
> +&usb_0_qmpphy_usb_ss_out {
> + remote-endpoint = <&usb_0_con_ss>;
> +};
> +
> +&usb_1 {
> + status = "okay";
> +};
> +
> +&usb_1_dwc3_hs {
> + remote-endpoint = <&usb_1_con_hs>;
> +};
> +
> +&usb_1_hsphy {
> + vdd-supply = <&vreg_l1h_0p9>;
> + vdda12-supply = <&vreg_l2h_1p2>;
> +
> + phys = <&usb1_repeater>;
> +
> + status = "okay";
> +};
> +
> +&usb_1_qmpphy {
> + vdda-phy-supply = <&vreg_l2k_0p9>;
> + vdda-pll-supply = <&vreg_l2h_1p2>;
> +
> + status = "okay";
> +};
> +
> +&usb_1_qmpphy_usb_ss_out {
> + remote-endpoint = <&usb_1_con_ss>;
> +};
> +
> +&usb_2 {
> + dr_mode = "host";
> +
> + status = "okay";
> +};
> +
> +&usb_2_dwc3_hs {
> + remote-endpoint = <&usb2_con_hs>;
> +};
> +
> +&usb_2_hsphy {
> + vdd-supply = <&vreg_l1h_0p9>;
> + vdda12-supply = <&vreg_l2h_1p2>;
> +
> + phys = <&usb2_repeater>;
> +
> + status = "okay";
> +};
>
> --
> 2.47.3
>
^ permalink raw reply [flat|nested] 9+ messages in thread