linux-loongson/arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi
André Draszik 98be2d60fd arm64: dts: exynos: gs101: switch to gs101 specific reboot
gs101 (Google Pixel 6 and Pixel 6 Pro) supports cold- and warm-reboot.
Cold-reset is useful because it is more secure, e.g. wiping all RAM
contents, while the warm-reboot allows RAM contents to be retained
across the reboot, e.g. to collect potential crash information.

Add the required DT changes to switch to the gs101-specific reboot
method, which knows how to issue either reset as requested by the OS.

The PMIC plays a role in this as well, so mark it as
'system-power-controller', which in this case ensures that the device
will wake up again after a cold-reboot, ensuring the full power-cycle
is successful.

Signed-off-by: André Draszik <andre.draszik@linaro.org>
Link: https://lore.kernel.org/r/20250627-gs101-reboot3-v1-3-c3ae49657b1f@linaro.org
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
2025-06-30 08:04:29 +02:00

391 lines
8.2 KiB
Plaintext

// SPDX-License-Identifier: GPL-2.0-only
/*
* Device Tree nodes common for all GS101-based Pixel
*
* Copyright 2021-2023 Google LLC
* Copyright 2023 Linaro Ltd - <peter.griffin@linaro.org>
*/
/dts-v1/;
#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"
/ {
aliases {
serial0 = &serial_0;
};
chosen {
/* Bootloader expects bootargs specified otherwise it crashes */
bootargs = "";
stdout-path = &serial_0;
/* Use display framebuffer as setup by bootloader */
framebuffer0: framebuffer-0 {
compatible = "simple-framebuffer";
memory-region = <&cont_splash_mem>;
/* format properties to be added by actual board */
status = "disabled";
};
};
gpio-keys {
compatible = "gpio-keys";
pinctrl-0 = <&key_voldown>, <&key_volup>, <&key_power>;
pinctrl-names = "default";
button-vol-down {
label = "KEY_VOLUMEDOWN";
linux,code = <KEY_VOLUMEDOWN>;
gpios = <&gpa7 3 GPIO_ACTIVE_LOW>;
wakeup-source;
};
button-vol-up {
label = "KEY_VOLUMEUP";
linux,code = <KEY_VOLUMEUP>;
gpios = <&gpa8 1 GPIO_ACTIVE_LOW>;
wakeup-source;
};
button-power {
label = "KEY_POWER";
linux,code = <KEY_POWER>;
gpios = <&gpa10 1 GPIO_ACTIVE_LOW>;
wakeup-source;
};
};
reboot-mode {
compatible = "nvmem-reboot-mode";
nvmem-cells = <&nvmem_reboot_mode>;
nvmem-cell-names = "reboot-mode";
mode-bootloader = <0x800000fc>;
mode-charge = <0x8000000a>;
mode-dm-verity-device-corrupted = <0x80000050>;
mode-fastboot = <0x800000fa>;
mode-reboot-ab-update = <0x80000052>;
mode-recovery = <0x800000ff>;
mode-rescue = <0x800000f9>;
mode-shutdown-thermal = <0x80000051>;
mode-shutdown-thermal-battery = <0x80000051>;
};
/* TODO: Remove this once PMIC is implemented */
reg_placeholder: regulator-0 {
compatible = "regulator-fixed";
regulator-name = "placeholder_reg";
};
/* TODO: Remove this once S2MPG11 slave PMIC is implemented */
ufs_0_fixed_vcc_reg: regulator-1 {
compatible = "regulator-fixed";
regulator-name = "ufs-vcc";
gpio = <&gpp0 1 GPIO_ACTIVE_HIGH>;
regulator-boot-on;
enable-active-high;
};
reserved-memory {
cont_splash_mem: splash@fac00000 {
/* size to be updated by actual board */
reg = <0x0 0xfac00000 0x0>;
no-map;
status = "disabled";
};
};
};
&acpm_ipc {
pmic {
compatible = "samsung,s2mpg10-pmic";
interrupts-extended = <&gpa0 6 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&pmic_int>;
system-power-controller;
wakeup-source;
regulators {
};
};
};
&ext_24_5m {
clock-frequency = <24576000>;
};
&ext_200m {
clock-frequency = <200000000>;
};
&hsi2c_8 {
status = "okay";
eeprom: eeprom@50 {
compatible = "atmel,24c08";
reg = <0x50>;
};
};
&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>;
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)>;
/*
* Until bootloader is updated to set those two when
* console is enabled, we disable PD here.
*/
pd-disable;
typec-power-opmode = "default";
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>;
};
};
};
};
};
pmic@66 {
compatible = "maxim,max77759";
reg = <0x66>;
pinctrl-0 = <&if_pmic_int>;
pinctrl-names = "default";
interrupts-extended = <&gpa8 3 IRQ_TYPE_LEVEL_LOW>;
interrupt-controller;
#interrupt-cells = <2>;
gpio {
compatible = "maxim,max77759-gpio";
gpio-controller;
#gpio-cells = <2>;
/*
* "Human-readable name [SIGNAL_LABEL]" where the
* latter comes from the schematic
*/
gpio-line-names = "OTG boost [OTG_BOOST_EN]",
"max20339 IRQ [MW_OVP_INT_L]";
interrupt-controller;
#interrupt-cells = <2>;
};
nvmem-0 {
compatible = "maxim,max77759-nvmem";
nvmem-layout {
compatible = "fixed-layout";
#address-cells = <1>;
#size-cells = <1>;
nvmem_reboot_mode: reboot-mode@0 {
reg = <0x0 0x4>;
};
boot-reason@4 {
reg = <0x4 0x4>;
};
shutdown-user-flag@8 {
reg = <0x8 0x1>;
};
rsoc@a {
reg = <0xa 0x2>;
};
};
};
};
};
&pinctrl_far_alive {
key_voldown: key-voldown-pins {
samsung,pins = "gpa7-3";
samsung,pin-function = <GS101_PIN_FUNC_EINT>;
samsung,pin-pud = <GS101_PIN_PULL_NONE>;
samsung,pin-drv = <GS101_PIN_DRV_2_5_MA>;
};
key_volup: key-volup-pins {
samsung,pins = "gpa8-1";
samsung,pin-function = <GS101_PIN_FUNC_EINT>;
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>;
};
if_pmic_int: if-pmic-int-pins {
samsung,pins = "gpa8-3";
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 {
pmic_int: pmic-int-pins {
samsung,pins = "gpa0-6";
samsung,pin-function = <GS101_PIN_FUNC_EINT>;
samsung,pin-pud = <GS101_PIN_PULL_NONE>;
};
key_power: key-power-pins {
samsung,pins = "gpa10-1";
samsung,pin-function = <GS101_PIN_FUNC_EINT>;
samsung,pin-pud = <GS101_PIN_PULL_NONE>;
samsung,pin-drv = <GS101_PIN_DRV_2_5_MA>;
};
};
&serial_0 {
status = "okay";
};
&ufs_0 {
status = "okay";
vcc-supply = <&ufs_0_fixed_vcc_reg>;
};
&ufs_0_phy {
status = "okay";
};
&usbdrd31 {
vdd10-supply = <&reg_placeholder>;
vdd33-supply = <&reg_placeholder>;
status = "okay";
};
&usbdrd31_dwc3 {
dr_mode = "otg";
usb-role-switch;
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>;
vddh-usb20-supply = <&reg_placeholder>;
vdd33-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 {
samsung,clkreq-on; /* needed for UART mode */
status = "okay";
};
&usi8 {
samsung,mode = <USI_MODE_I2C>;
status = "okay";
};
&usi12 {
samsung,mode = <USI_MODE_I2C>;
status = "okay";
};
&watchdog_cl0 {
timeout-sec = <30>;
status = "okay";
};