[PATCH RFC] arm64: dts: qcom: qcs6490-rb3gen2: Enable uPD720201 and GL3590
From: Bjorn Andersson
Date: Thu Feb 12 2026 - 15:44:03 EST
The QCS6490 Rb3Gen2 has a Renesas μPD720201 XHCI controller hanging off
the TC9563 PCIe switch, on this a Genesys Logic GL3590 USB hub provides
two USB Type-A ports and an ASIX AX88179 USB 3.0 Gigabit Ethernet
interface.
The Renesas chip is powered by two regulators controlled through PM7250B
GPIOs 1 and 4, and the power/reset pin is pulled down by PM8350C GPIO 4.
The Genesys chip power is always-on, but the reset pin is controlled
through TLMM GPIO 162.
Describe the Renesas chip on the PCIe bus, with supplies and reset, to
allow it to be brought out of reset and discovered. Then describe the
two peers of the USB hub, with its reset GPIO, to allow this to be
brought out of reset.
The USB Type-A connectors are not described, as they are in no regard
controlled by the operating system.
Signed-off-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxxxxxxxx>
---
Posting this as a RFC, because it doesn't work without some hacks in the
PCI pwrctrl code. It depends on Neil's work for μPD720201 pwrctrl [1],
on the GL3590 work by Swati and Krisha [2], and my regulator fix [3].
With these three dependencies, the hacks in drivers/pci/pwrctrl/core.c,
and firmware for the μPD720201, the primary ethernet lights up.
Then in pci_pwrctrl_create_device() we assume that anything in a PCI
device node, with either a -supply or port/ports property, should be a
platform_device. When the USB bus(es) of the μPD720201 shows up, it
again registers this platform_device. It seems that
of_platform_device_create() saves us and does an early exit, but by
"accident".
__pci_pwrctrl_power_on_device() and __pci_pwrctrl_power_off_device() on
the other hand, they happily pick up the non-NULL drvdata, which is of
type struct onboard_dev, to call the power_on() and power_off() methods.
It's not clear to me why the whole board resets at this point, but I
don't think we can assume that any random platform_device we find at any
level below the PCIe bus has a drvdata of type struct pci_pwrctrl...
[1] https://lore.kernel.org/all/20260206-topic-sm8650-ayaneo-pocket-s2-base-v3-0-5b79c5d61a03@xxxxxxxxxx/
[2] https://lore.kernel.org/all/20260122092852.887624-1-swati.agarwal@xxxxxxxxxxxxxxxx/
[3] https://lore.kernel.org/linux-arm-msm/177091226767.237262.6699917364293122804.b4-ty@xxxxxxxxxx/T/#t
---
arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts | 94 ++++++++++++++++++++++++++++
1 file changed, 94 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts b/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
index e3d2f01881ae05f17796f9c97f10b53cea50daff..e8d3588e67d0386150258d0bc28b4c6200920067 100644
--- a/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
+++ b/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
@@ -262,6 +262,28 @@ active-config0 {
};
};
+ vreg_pcie0_1p05: regulator-pcie0-1p05v {
+ compatible = "regulator-fixed";
+ regulator-name = "PCIE0_1.05V";
+ gpio = <&pm7250b_gpios 4 GPIO_ACTIVE_HIGH>;
+ regulator-min-microvolt = <1050000>;
+ regulator-max-microvolt = <1050000>;
+ enable-active-high;
+ pinctrl-0 = <&upd_pwr_en2_state>;
+ pinctrl-names = "default";
+ };
+
+ vreg_pcie0_3p3: regulator-pcie0-3p3v-dual {
+ compatible = "regulator-fixed";
+ regulator-name = "PCIE0_3.3V_Dual";
+ gpio = <&pm7250b_gpios 1 GPIO_ACTIVE_HIGH>;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ enable-active-high;
+ pinctrl-0 = <&upd_pwr_en1_state>;
+ pinctrl-names = "default";
+ };
+
vdd_ntn_0p9: regulator-vdd-ntn-0p9 {
compatible = "regulator-fixed";
regulator-name = "VDD_NTN_0P9";
@@ -870,6 +892,41 @@ pcie@2,0 {
device_type = "pci";
ranges;
bus-range = <0x4 0xff>;
+
+ /* Renesas μPD720201 PCIe USB3.0 Host Controller */
+ usb-controller@0,0 {
+ compatible = "pci1912,0014";
+ reg = <0x40000 0x0 0x0 0x0 0x0>;
+
+ avdd33-supply = <&vreg_pcie0_3p3>;
+ vdd10-supply = <&vreg_pcie0_1p05>;
+ vdd33-supply = <&vreg_pcie0_3p3>;
+
+ pinctrl-0 = <&upd_hub_rst_state>;
+ pinctrl-names = "default";
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ /* Genesys Logic GL3590 USB Hub Controller */
+ gl3590_2_0: hub@1 {
+ compatible = "usb5e3,610";
+ reg = <1>;
+ reset-gpios = <&tlmm 162 GPIO_ACTIVE_HIGH>;
+
+ pinctrl-0 = <&usb_hub_reset_state>;
+ pinctrl-names = "default";
+
+ peer-hub = <&gl3590_3_0>;
+ };
+
+ gl3590_3_0: hub@2 {
+ compatible = "usb5e3,625";
+ reg = <2>;
+
+ peer-hub = <&gl3590_2_0>;
+ };
+ };
};
pcie@3,0 {
@@ -1198,6 +1255,17 @@ ntn_1p8_en: ntn-1p8-en-state {
power-source = <0>;
};
+ upd_hub_rst_state: upd-hub-rst-state {
+ pins = "gpio4";
+ function = "normal";
+
+ bias-disable;
+ input-disable;
+ output-enable;
+ output-high;
+ power-source = <0>;
+ };
+
tc9563_resx_n: tc9563-resx-state {
pins = "gpio1";
function = "normal";
@@ -1378,6 +1446,15 @@ &edp_hot_plug_det {
};
&pm7250b_gpios {
+ upd_pwr_en1_state: upd-pwr-en1-state {
+ pins = "gpio1";
+ function = "normal";
+
+ output-enable;
+ input-disable;
+ power-source = <0>;
+ };
+
lt9611_rst_pin: lt9611-rst-state {
pins = "gpio2";
function = "normal";
@@ -1386,6 +1463,15 @@ lt9611_rst_pin: lt9611-rst-state {
input-disable;
power-source = <0>;
};
+
+ upd_pwr_en2_state: upd-pwr-en2-state {
+ pins = "gpio4";
+ function = "normal";
+
+ output-enable;
+ input-disable;
+ power-source = <0>;
+ };
};
&sdc2_clk {
@@ -1431,6 +1517,14 @@ sd_cd: sd-cd-state {
function = "gpio";
bias-pull-up;
};
+
+ usb_hub_reset_state: usb-hub-reset-state {
+ pins = "gpio162";
+ function = "gpio";
+
+ drive-strength = <2>;
+ bias-disable;
+ };
};
&lpass_audiocc {
---
base-commit: fd9678829d6dd0c10fde080b536abf4b1121c346
change-id: 20260212-rb3gen2-upd-gl3590-d110dd722e1b
Best regards,
--
Bjorn Andersson <bjorn.andersson@xxxxxxxxxxxxxxxx>