From: Shawn Guo <shengchao.guo@oss.qualcomm.com>
To: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konradybcio@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Bartosz Golaszewski <brgl@kernel.org>,
Krishna Kurapati <krishna.kurapati@oss.qualcomm.com>,
devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-kernel@vger.kernel.org,
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>,
Shawn Guo <shengchao.guo@oss.qualcomm.com>
Subject: [PATCH 3/5] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs
Date: Fri, 11 Sep 2026 22:20:38 +0800 [thread overview]
Message-ID: <20260911142040.100263-4-shengchao.guo@oss.qualcomm.com> (raw)
In-Reply-To: <20260911142040.100263-1-shengchao.guo@oss.qualcomm.com>
From: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
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>
Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/nord-embedded.dtsi | 307 +++++++++++++++++++-
1 file changed, 305 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/nord-embedded.dtsi b/arch/arm64/boot/dts/qcom/nord-embedded.dtsi
index c7ac2e66632e..84ce57a07361 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,162 @@ 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>;
+
+ /* Same as usb_0_qmpphy above. */
+ 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 +1007,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 +2038,149 @@ 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";
+};
--
2.43.0
next prev parent reply other threads:[~2026-09-11 14:21 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-11 14:20 [PATCH 0/5] arm64: dts: qcom: nord: Add USB support Shawn Guo
2026-09-11 14:20 ` [PATCH 1/5] arm64: dts: qcom: nord-embedded: Fix i2c9/i2c10 pin functions Shawn Guo
2026-09-12 15:34 ` Abel Vesa
2026-09-14 2:16 ` Shawn Guo
2026-09-14 3:15 ` Shawn Guo
2026-09-11 14:20 ` [PATCH 2/5] arm64: dts: qcom: nord: Add the USB controller nodes Shawn Guo
2026-09-12 15:32 ` Abel Vesa
2026-09-14 8:33 ` Konrad Dybcio
2026-09-16 14:39 ` Shawn Guo
2026-09-11 14:20 ` Shawn Guo [this message]
2026-09-12 15:32 ` [PATCH 3/5] arm64: dts: qcom: nord-embedded: Add USB resources and PHYs Abel Vesa
2026-09-14 8:58 ` Konrad Dybcio
2026-09-16 14:56 ` Shawn Guo
2026-09-11 14:20 ` [PATCH 4/5] arm64: dts: qcom: nord-rrd: Enable USB ports Shawn Guo
2026-09-12 15:26 ` Abel Vesa
2026-09-14 8:53 ` Konrad Dybcio
2026-09-11 14:20 ` [PATCH 5/5] arm64: dts: qcom: nord-ride-embedded: " Shawn Guo
2026-09-12 15:25 ` Abel Vesa
2026-09-14 8:55 ` Konrad Dybcio
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=20260911142040.100263-4-shengchao.guo@oss.qualcomm.com \
--to=shengchao.guo@oss.qualcomm.com \
--cc=andersson@kernel.org \
--cc=bartosz.golaszewski@oss.qualcomm.com \
--cc=brgl@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=konradybcio@kernel.org \
--cc=krishna.kurapati@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®