]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
arm64: dts: rockchip: add usb typec host support to rk3588-jaguar
authorHeiko Stuebner <heiko.stuebner@cherry.de>
Fri, 28 Feb 2025 15:08:53 +0000 (16:08 +0100)
committerHeiko Stuebner <heiko@sntech.de>
Fri, 28 Feb 2025 21:42:46 +0000 (22:42 +0100)
Jaguar has two type-c ports connected to fusb302 controllers that can
work both in host and device mode and can also run in display-port
altmode.

While these ports can work in dual-role data mode, they do not support
powering the device itself as power-sink. This causes issues because
the current infrastructure does not cope well with dual-role data
without dual-role power.

So add the necessary nodes for the type-c controllers as well as enable
the relevant core usb nodes. So far host modes works reliably, but
device-mode does not. So devicemode needs more investigation.

Signed-off-by: Heiko Stuebner <heiko.stuebner@cherry.de>
Tested-by: Quentin Schulz <quentin.schulz@cherry.de>
Reviewed-by: Quentin Schulz <quentin.schulz@cherry.de>
Link: https://lore.kernel.org/r/20250228150853.329175-1-heiko@sntech.de
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts

index 2975fbb08dfebe635d4cf9697d8986f065e99757..952ea4e73b1555531d69c0e6fb869a6bbd41dc2c 100644 (file)
                };
        };
 
+       typec-portc@22 {
+               compatible = "fcs,fusb302";
+               reg = <0x22>;
+               interrupt-parent = <&gpio4>;
+               interrupts = <RK_PA3 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&cc_int1>;
+               vbus-supply = <&vcc_5v0_usb_c1>;
+
+               connector {
+                       compatible = "usb-c-connector";
+                       data-role = "dual";
+                       label = "USBC-1 P11";
+                       power-role = "source";
+                       self-powered;
+                       source-pdos =
+                               <PDO_FIXED(5000, 1500, PDO_FIXED_DATA_SWAP | PDO_FIXED_USB_COMM)>;
+                       vbus-supply = <&vcc_5v0_usb_c1>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+
+                                       usbc0_hs: endpoint {
+                                               remote-endpoint = <&usb_host0_xhci_drd_sw>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+
+                                       usbc0_ss: endpoint {
+                                               remote-endpoint = <&usbdp_phy0_typec_ss>;
+                                       };
+                               };
+
+                               port@2 {
+                                       reg = <2>;
+
+                                       usbc0_sbu: endpoint {
+                                               remote-endpoint = <&usbdp_phy0_typec_sbu>;
+                                       };
+                               };
+                       };
+               };
+       };
+
        vdd_npu_s0: regulator@42 {
                compatible = "rockchip,rk8602";
                reg = <0x42>;
        pinctrl-0 = <&i2c8m2_xfer>;
        status = "okay";
 
+       typec-portc@22 {
+               compatible = "fcs,fusb302";
+               reg = <0x22>;
+               interrupt-parent = <&gpio4>;
+               interrupts = <RK_PA4 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&cc_int2>;
+               vbus-supply = <&vcc_5v0_usb_c2>;
+
+               connector {
+                       compatible = "usb-c-connector";
+                       data-role = "dual";
+                       label = "USBC-2 P12";
+                       power-role = "source";
+                       self-powered;
+                       source-pdos =
+                               <PDO_FIXED(5000, 1500, PDO_FIXED_DATA_SWAP | PDO_FIXED_USB_COMM)>;
+                       vbus-supply = <&vcc_5v0_usb_c2>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+
+                                       usbc1_hs: endpoint {
+                                               remote-endpoint = <&usb_host1_xhci_drd_sw>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+
+                                       usbc1_ss: endpoint {
+                                               remote-endpoint = <&usbdp_phy1_typec_ss>;
+                                       };
+                               };
+
+                               port@2 {
+                                       reg = <2>;
+
+                                       usbc1_sbu: endpoint {
+                                               remote-endpoint = <&usbdp_phy1_typec_sbu>;
+                                       };
+                               };
+                       };
+               };
+       };
+
        vdd_cpu_big0_s0: regulator@42 {
                compatible = "rockchip,rk8602";
                reg = <0x42>;
                        rockchip,pins = <0 RK_PC7 12 &pcfg_pull_none>;
                };
        };
+
+       usb3 {
+               cc_int1: cc-int1 {
+                       rockchip,pins = <4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               cc_int2: cc-int2 {
+                       rockchip,pins = <4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               typec0_sbu_dc_pins: typec0-sbu-dc-pins {
+                       rockchip,pins = <4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>,
+                                       <1 RK_PC3 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+
+               typec1_sbu_dc_pins: typec1-sbu-dc-pins {
+                       rockchip,pins = <0 RK_PD4 RK_FUNC_GPIO &pcfg_pull_down>,
+                                       <1 RK_PB5 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+       };
 };
 
 &saradc {
        status = "okay";
 };
 
+/* USB-C P11 connector */
+&u2phy0 {
+       status = "okay";
+};
+
+&u2phy0_otg {
+       status = "okay";
+};
+
+/* USB-C P12 connector */
+&u2phy1 {
+       status = "okay";
+};
+
+&u2phy1_otg {
+       status = "okay";
+};
+
 &u2phy2 {
        status = "okay";
 };
        status = "okay";
 };
 
+/* Type-C on P11 */
+&usbdp_phy0 {
+       orientation-switch;
+       pinctrl-names = "default";
+       pinctrl-0 = <&typec0_sbu_dc_pins>;
+       sbu1-dc-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>; /* Q7_USB_C0_SBU1_DC */
+       sbu2-dc-gpios = <&gpio1 RK_PC3 GPIO_ACTIVE_HIGH>; /* Q7_USB_C0_SBU2_DC */
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               usbdp_phy0_typec_ss: endpoint@0 {
+                       reg = <0>;
+                       remote-endpoint = <&usbc0_ss>;
+               };
+
+               usbdp_phy0_typec_sbu: endpoint@1 {
+                       reg = <1>;
+                       remote-endpoint = <&usbc0_sbu>;
+               };
+       };
+};
+
+/* Type-C on P12 */
+&usbdp_phy1 {
+       orientation-switch;
+       pinctrl-names = "default";
+       pinctrl-0 = <&typec1_sbu_dc_pins>;
+       sbu1-dc-gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; /* Q7_USB_C1_SBU1_DC */
+       sbu2-dc-gpios = <&gpio1 RK_PB5 GPIO_ACTIVE_HIGH>; /* Q7_USB_C1_SBU2_DC */
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               usbdp_phy1_typec_ss: endpoint@0 {
+                       reg = <0>;
+                       remote-endpoint = <&usbc1_ss>;
+               };
+
+               usbdp_phy1_typec_sbu: endpoint@1 {
+                       reg = <1>;
+                       remote-endpoint = <&usbc1_sbu>;
+               };
+       };
+};
+
 /* host0 on P10 USB-A */
 &usb_host0_ehci {
        status = "okay";
        status = "okay";
 };
 
+/* host0 on P11 USB-C */
+&usb_host0_xhci {
+       usb-role-switch;
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               usb_host0_xhci_drd_sw: endpoint {
+                       remote-endpoint = <&usbc0_hs>;
+               };
+       };
+};
+
+/* host1 on P12 USB-C */
+&usb_host1_xhci {
+       usb-role-switch;
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               usb_host1_xhci_drd_sw: endpoint {
+                       remote-endpoint = <&usbc1_hs>;
+               };
+       };
+};
+
 /* host1 on M.2 E-key */
 &usb_host1_ehci {
        status = "okay";