]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
arm64: dts: exynos: gs101-oriole: enable Maxim max77759 TCPCi
authorAndré Draszik <andre.draszik@linaro.org>
Tue, 3 Dec 2024 12:40:27 +0000 (12:40 +0000)
committerKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Sun, 29 Dec 2024 09:58:22 +0000 (10:58 +0100)
On Pixel 6 (and Pro), a max77759 companion PMIC for USB Type-C
applications is used, which contains four functional blocks (at
distinct I2C addresses):
  * top (including GPIO)
  * charger
  * fuel gauge
  * TCPCi

While in the same package, TCPCi and Fuel Gauge have separate I2C
addresses, interrupt lines and interrupt status registers and can be
treated independently.

The TCPCi is required to detect and handle connector orientation in
Pixel's USB PHY driver, and to configure the USB controller's role
(host vs device).

This change adds the TCPCi part as it can be independent and doesn't
need a top-level MFD.

Signed-off-by: André Draszik <andre.draszik@linaro.org>
Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
Tested-by: Peter Griffin <peter.griffin@linaro.org>
Link: https://lore.kernel.org/r/20241203-gs101-phy-lanes-orientation-dts-v2-4-1412783a6b01@linaro.org
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
arch/arm64/boot/dts/exynos/google/gs101-oriole.dts

index 387fb779bd29ea3812331a7951f03b181c5fe659..a5cbf1e10c7b986809fd9f835e40c56f96fe743e 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/usb/pd.h>
 #include "gs101-pinctrl.h"
 #include "gs101.dtsi"
 
 &hsi2c_12 {
        status = "okay";
        /* TODO: add the devices once drivers exist */
+
+       usb-typec@25 {
+               compatible = "maxim,max77759-tcpci", "maxim,max33359";
+               reg = <0x25>;
+               interrupts-extended = <&gpa8 2 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-0 = <&typec_int>;
+               pinctrl-names = "default";
+
+               connector {
+                       compatible = "usb-c-connector";
+                       label = "USB-C";
+                       data-role = "dual";
+                       power-role = "dual";
+                       self-powered;
+                       try-power-role = "sink";
+                       op-sink-microwatt = <2600000>;
+                       new-source-frs-typec-current = <FRS_5V_1P5A>;
+                       slow-charger-loop;
+                       /*
+                        * max77759 operating in reverse boost mode (0xA) can
+                        * source up to 1.5A while extboost can only do ~1A.
+                        * Since extboost is the primary path, advertise 900mA.
+                        */
+                       source-pdos = <PDO_FIXED(5000, 900,
+                                                (PDO_FIXED_SUSPEND
+                                                 | PDO_FIXED_USB_COMM
+                                                 | PDO_FIXED_DATA_SWAP
+                                                 | PDO_FIXED_DUAL_ROLE))>;
+                       sink-pdos = <PDO_FIXED(5000, 3000,
+                                              (PDO_FIXED_DATA_SWAP
+                                               | PDO_FIXED_USB_COMM
+                                               | PDO_FIXED_HIGHER_CAP
+                                               | PDO_FIXED_DUAL_ROLE))
+                                    PDO_FIXED(9000, 2200, 0)
+                                    PDO_PPS_APDO(5000, 11000, 3000)>;
+                       sink-vdos = <VDO_IDH(1, 1, IDH_PTYPE_PERIPH, 0,
+                                            IDH_PTYPE_DFP_HOST, 2, 0x18d1)
+                                    VDO_CERT(0x0)
+                                    VDO_PRODUCT(0x4ee1, 0x0)
+                                    VDO_UFP(UFP_VDO_VER1_2,
+                                            (DEV_USB2_CAPABLE
+                                             | DEV_USB3_CAPABLE),
+                                            UFP_RECEPTACLE, 0,
+                                            AMA_VCONN_NOT_REQ, 0,
+                                            UFP_ALTMODE_NOT_SUPP,
+                                            UFP_USB32_GEN1)
+                                    /* padding */ 0
+                                    VDO_DFP(DFP_VDO_VER1_1,
+                                            (HOST_USB2_CAPABLE
+                                             | HOST_USB3_CAPABLE),
+                                            DFP_RECEPTACLE, 0)>;
+                       sink-vdos-v1 = <VDO_IDH(1, 1, IDH_PTYPE_PERIPH, 0,
+                                               0, 0, 0x18d1)
+                                       VDO_CERT(0x0)
+                                       VDO_PRODUCT(0x4ee1, 0x0)>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+
+                                       usbc0_orien_sw: endpoint {
+                                               remote-endpoint = <&usbdrd31_phy_orien_switch>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+
+                                       usbc0_role_sw: endpoint {
+                                               remote-endpoint = <&usbdrd31_dwc3_role_switch>;
+                                       };
+                               };
+                       };
+               };
+       };
 };
 
 &pinctrl_far_alive {
                samsung,pin-pud = <GS101_PIN_PULL_NONE>;
                samsung,pin-drv = <GS101_PIN_DRV_2_5_MA>;
        };
+
+       typec_int: typec-int-pins {
+               samsung,pins = "gpa8-2";
+               samsung,pin-function = <GS101_PIN_FUNC_EINT>;
+               samsung,pin-pud = <GS101_PIN_PULL_UP>;
+               samsung,pin-drv = <GS101_PIN_DRV_2_5_MA>;
+       };
 };
 
 &pinctrl_gpio_alive {
        role-switch-default-mode = "peripheral";
        maximum-speed = "super-speed-plus";
        status = "okay";
+
+       port {
+               usbdrd31_dwc3_role_switch: endpoint {
+                       remote-endpoint = <&usbc0_role_sw>;
+               };
+       };
 };
 
 &usbdrd31_phy {
+       orientation-switch;
        /* TODO: Update these once PMIC is implemented */
        pll-supply = <&reg_placeholder>;
        dvdd-usb20-supply = <&reg_placeholder>;
        vdda-usbdp-supply = <&reg_placeholder>;
        vddh-usbdp-supply = <&reg_placeholder>;
        status = "okay";
+
+       port {
+               usbdrd31_phy_orien_switch: endpoint {
+                       remote-endpoint = <&usbc0_orien_sw>;
+               };
+       };
 };
 
 &usi_uart {