// SPDX-License-Identifier: (GPL-2.0+ OR MIT) /* * Google Herobrine baseboard device tree source * * The set of things in this file is a bit loosely defined. It's roughly * defined as the set of things that the child boards happen to have in * common. Since all of the child boards started from the same original * design this is hopefully a large set of things but as more derivatives * appear things may "bubble down" out of this file. For things that are * part of the reference design but might not exist on child nodes we will * follow the lead of the SoC dtsi files and leave their status as "disabled". * * Copyright 2022 Google LLC. */ #include <dt-bindings/input/gpio-keys.h> #include <dt-bindings/input/input.h> #include <dt-bindings/leds/common.h> #include "sc7280-qcard.dtsi" #include "sc7280-chrome-common.dtsi" / { chosen { stdout-path = "serial0:115200n8"; }; /* * FIXED REGULATORS * * Sort order: * 1. parents above children. * 2. higher voltage above lower voltage. * 3. alphabetically by node name. */ /* This is the top level supply and variable voltage */ ppvar_sys: ppvar-sys-regulator { compatible = "regulator-fixed"; regulator-name = "ppvar_sys"; regulator-always-on; regulator-boot-on; }; /* This divides ppvar_sys by 2, so voltage is variable */ src_vph_pwr: src-vph-pwr-regulator { compatible = "regulator-fixed"; regulator-name = "src_vph_pwr"; /* EC turns on with switchcap_on; always on for AP */ regulator-always-on; regulator-boot-on; vin-supply = <&ppvar_sys>; }; pp5000_s5: pp5000-s5-regulator { compatible = "regulator-fixed"; regulator-name = "pp5000_s5"; /* EC turns on with en_pp5000_s5; always on for AP */ regulator-always-on; regulator-boot-on; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; vin-supply = <&ppvar_sys>; }; pp3300_z1: pp3300-z1-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_z1"; /* EC turns on with en_pp3300_z1; always on for AP */ regulator-always-on; regulator-boot-on; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; vin-supply = <&ppvar_sys>; }; pp3300_codec: pp3300-codec-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_codec"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; gpio = <&tlmm 105 GPIO_ACTIVE_HIGH>; enable-active-high; pinctrl-names = "default"; pinctrl-0 = <&en_pp3300_codec>; vin-supply = <&pp3300_z1>; status = "disabled"; }; pp3300_left_in_mlb: pp3300-left-in-mlb-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_left_in_mlb"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; gpio = <&tlmm 80 GPIO_ACTIVE_HIGH>; enable-active-high; pinctrl-names = "default"; pinctrl-0 = <&en_pp3300_dx_edp>; regulator-enable-ramp-delay = <3000>; /* * eDP panel specs nearly always have a spec that says you * shouldn't turn them off an on again without waiting 500ms. * Add this as a board constraint since this rail is shared * between the panel and touchscreen. */ off-on-delay-us = <500000>; /* * Stat the regulator on. This has the advantage of starting * the slow process of powering the panel on as soon as we * probe the regulator. It also avoids tripping the * off-on-delay immediately on every bootup. */ regulator-boot-on; vin-supply = <&pp3300_z1>; }; pp3300_mcu_fp: pp3300_fp_ls: pp3300_fp_mcu: pp3300-fp-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_fp"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-boot-on; regulator-always-on; /* * WARNING: it is intentional that GPIO 77 isn't listed here. * The userspace script for updating the fingerprint firmware * needs to control the FP regulators during a FW update, * hence the signal can't be owned by the kernel regulator. */ pinctrl-names = "default"; pinctrl-0 = <&en_fp_rails>; vin-supply = <&pp3300_z1>; status = "disabled"; }; pp3300_hub: pp3300-hub-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_hub"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; /* The BIOS leaves this regulator on */ regulator-boot-on; gpio = <&tlmm 157 GPIO_ACTIVE_HIGH>; enable-active-high; pinctrl-names = "default"; pinctrl-0 = <&hub_en>; vin-supply = <&pp3300_z1>; }; pp3300_tp: pp3300-tp-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_tp"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; /* AP turns on with PP1800_L18B_S0; always on for AP */ regulator-always-on; regulator-boot-on; vin-supply = <&pp3300_z1>; }; pp3300_ssd: pp3300-ssd-regulator { compatible = "regulator-fixed"; regulator-name = "pp3300_ssd"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; gpio = <&tlmm 51 GPIO_ACTIVE_HIGH>; enable-active-high; pinctrl-names = "default"; pinctrl-0 = <&ssd_en>; /* * The bootloaer may have left PCIe configured. Powering this * off while the PCIe clocks are still running isn't great, * so it's better to default to this regulator being on. */ regulator-boot-on; vin-supply = <&pp3300_z1>; }; pp2850_vcm_wf_cam: pp2850-vcm-wf-cam-regulator { compatible = "regulator-fixed"; regulator-name = "pp2850_vcm_wf_cam"; regulator-min-microvolt = <2850000>; regulator-max-microvolt = <2850000>; gpio = <&tlmm 119 GPIO_ACTIVE_HIGH>; enable-active-high; pinctrl-names = "default"; pinctrl-0 = <&wf_cam_en>; vin-supply = <&pp3300_z1>; status = "disabled"; }; pp2850_wf_cam: pp2850-wf-cam-regulator { compatible = "regulator-fixed"; regulator-name = "pp2850_wf_cam"; regulator-min-microvolt = <2850000>; regulator-max-microvolt = <2850000>; gpio = <&tlmm 119 GPIO_ACTIVE_HIGH>; enable-active-high; /* * The pinconf can only be referenced once so we put it on the * first regulator and comment it out here. * * pinctrl-names = "default"; * pinctrl-0 = <&wf_cam_en>; */ vin-supply = <&pp3300_z1>; status = "disabled"; }; pp1800_fp: pp1800-fp-regulator { compatible = "regulator-fixed"; regulator-name = "pp1800_fp"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-boot-on; regulator-always-on; /* * WARNING: it is intentional that GPIO 77 isn't listed here. * The userspace script for updating the fingerprint firmware * needs to control the FP regulators during a FW update, * hence the signal can't be owned by the kernel regulator. */ pinctrl-names = "default"; pinctrl-0 = <&en_fp_rails>; vin-supply = <&pp1800_l18b_s0>; status = "disabled"; }; pp1800_wf_cam: pp1800-wf-cam-regulator { compatible = "regulator-fixed"; regulator-name = "pp1800_wf_cam"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; gpio = <&tlmm 119 GPIO_ACTIVE_HIGH>; enable-active-high; /* * The pinconf can only be referenced once so we put it on the * first regulator and comment it out here. * * pinctrl-names = "default"; * pinctrl-0 = <&wf_cam_en>; */ vin-supply = <&vreg_l19b_s0>; status = "disabled"; }; pp1200_wf_cam: pp1200-wf-cam-regulator { compatible = "regulator-fixed"; regulator-name = "pp1200_wf_cam"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; gpio = <&tlmm 119 GPIO_ACTIVE_HIGH>; enable-active-high; /* * The pinconf can only be referenced once so we put it on the * first regulator and comment it out here. * * pinctrl-names = "default"; * pinctrl-0 = <&wf_cam_en>; */ vin-supply = <&pp3300_z1>; status = "disabled"; }; /* BOARD-SPECIFIC TOP LEVEL NODES */ max98360a: audio-codec-0 { compatible = "maxim,max98360a"; pinctrl-names = "default"; pinctrl-0 = <&_en>; sdmode-gpios = <&tlmm 63 GPIO_ACTIVE_HIGH>; #sound-dai-cells = <0>; }; pwmleds: pwmleds { compatible = "pwm-leds"; status = "disabled"; keyboard_backlight: led-0 { label = "cros_ec::kbd_backlight"; function = LED_FUNCTION_KBD_BACKLIGHT; pwms = <&cros_ec_pwm 0>; max-brightness = <1023>; }; }; }; /* * ADJUSTMENTS TO QCARD REGULATORS * * Mostly this is just board-local names for regulators that come from * Qcard, but this also has some minor regulator overrides. * * Names are only listed here if regulators go somewhere other than a * testpoint. */ /* From Qcard to our board; ordered by PMIC-ID / rail number */ pp1256_s8b: &vreg_s8b_1p256 {}; pp1800_l18b_s0: &vreg_l18b_1p8 {}; pp1800_l18b: &vreg_l18b_1p8 {}; vreg_l19b_s0: &vreg_l19b_1p8 {}; pp1800_alc5682: &vreg_l2c_1p8 {}; pp1800_l2c: &vreg_l2c_1p8 {}; vreg_l4c: &vreg_l4c_1p8_3p0 {}; ppvar_l6c: &vreg_l6c_2p96 {}; pp3000_l7c: &vreg_l7c_3p0 {}; pp1800_prox: &vreg_l8c_1p8 {}; pp1800_l8c: &vreg_l8c_1p8 {}; pp2950_l9c: &vreg_l9c_2p96 {}; pp1800_lcm: &vreg_l12c_1p8 {}; pp1800_mipi: &vreg_l12c_1p8 {}; pp1800_l12c: &vreg_l12c_1p8 {}; pp3300_lcm: &vreg_l13c_3p0 {}; pp3300_mipi: &vreg_l13c_3p0 {}; pp3300_l13c: &vreg_l13c_3p0 {}; /* From our board to Qcard; ordered same as node definition above */ vreg_edp_bl: &ppvar_sys {}; ts_avdd: &pp3300_left_in_mlb {}; vreg_edp_3p3: &pp3300_left_in_mlb {}; /* Regulator overrides from Qcard */ /* * Herobrine boards only use l2c to power an external audio codec (like * alc5682) and we want that to be at 1.8V, not at some slightly lower voltage. */ &vreg_l2c_1p8 { regulator-min-microvolt = <1800000>; }; /* ADDITIONS TO NODES DEFINED IN PARENT DEVICE TREE FILES */ &edp_panel { /* Our board provides power to the qcard for the eDP panel. */ power-supply = <&vreg_edp_3p3>; }; ap_sar_sensor_i2c: &i2c1 { clock-frequency = <400000>; status = "disabled"; ap_sar_sensor0: proximity@28 { compatible = "semtech,sx9324"; reg = <0x28>; #io-channel-cells = <1>; pinctrl-names = "default"; pinctrl-0 = <&sar0_irq_odl>; interrupt-parent = <&tlmm>; interrupts = <141 IRQ_TYPE_LEVEL_LOW>; vdd-supply = <&pp1800_prox>; label = "proximity-wifi_cellular-0"; status = "disabled"; }; ap_sar_sensor1: proximity@2c { compatible = "semtech,sx9324"; reg = <0x2c>; #io-channel-cells = <1>; pinctrl-names = "default"; pinctrl-0 = <&sar1_irq_odl>; interrupt-parent = <&tlmm>; interrupts = <140 IRQ_TYPE_LEVEL_LOW>; vdd-supply = <&pp1800_prox>; label = "proximity-wifi_cellular-1"; status = "disabled"; }; }; ap_i2c_tpm: &i2c14 { status = "okay"; clock-frequency = <400000>; tpm@50 { compatible = "google,cr50"; reg = <0x50>; pinctrl-names = "default"; pinctrl-0 = <&gsc_ap_int_odl>; interrupt-parent = <&tlmm>; interrupts = <104 IRQ_TYPE_EDGE_RISING>; }; }; &mdss { status = "okay"; }; &mdss_dp { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&dp_hot_plug_det>; }; &mdss_dp_out { data-lanes = <0 1>; link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000>; }; /* NVMe drive, enabled on a per-board basis */ &pcie1 { pinctrl-names = "default"; pinctrl-0 = <&pcie1_clkreq_n>, <&ssd_rst_l>, <&pe_wake_odl>; perst-gpios = <&tlmm 2 GPIO_ACTIVE_LOW>; vddpe-3v3-supply = <&pp3300_ssd>; }; &pm8350c_pwm { status = "okay"; }; &pm8350c_pwm_backlight { status = "okay"; /* Our board provides power to the qcard for the backlight */ power-supply = <&vreg_edp_bl>; }; &pmk8350_rtc { status = "disabled"; }; &qupv3_id_0 { status = "okay"; }; &qupv3_id_1 { status = "okay"; }; /* SD Card, enabled on a per-board basis */ &sdhc_2 { pinctrl-0 = <&sdc2_clk>, <&sdc2_cmd>, <&sdc2_data>, <&sd_cd_odl>; pinctrl-1 = <&sdc2_clk_sleep>, <&sdc2_cmd_sleep>, <&sdc2_data_sleep>, <&sd_cd_odl>; vmmc-supply = <&pp2950_l9c>; vqmmc-supply = <&ppvar_l6c>; cd-gpios = <&tlmm 91 GPIO_ACTIVE_LOW>; }; &spi_flash { spi-max-frequency = <50000000>; }; /* Fingerprint, enabled on a per-board basis */ ap_spi_fp: &spi9 { pinctrl-0 = <&qup_spi9_data_clk>, <&qup_spi9_cs_gpio_init_high>, <&qup_spi9_cs_gpio>; cs-gpios = <&tlmm 39 GPIO_ACTIVE_LOW>; cros_ec_fp: ec@0 { compatible = "google,cros-ec-fp", "google,cros-ec-spi"; reg = <0>; interrupt-parent = <&tlmm>; interrupts = <61 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&fp_to_ap_irq_l>, <&fp_rst_l>, <&fpmcu_boot0>; boot0-gpios = <&tlmm 68 GPIO_ACTIVE_HIGH>; reset-gpios = <&tlmm 78 GPIO_ACTIVE_LOW>; spi-max-frequency = <3000000>; vdd-supply = <&pp3300_fp_mcu>; }; }; ap_ec_spi: &spi10 { status = "okay"; pinctrl-0 = <&qup_spi10_data_clk>, <&qup_spi10_cs_gpio_init_high>, <&qup_spi10_cs_gpio>; cs-gpios = <&tlmm 43 GPIO_ACTIVE_LOW>; cros_ec: ec@0 { compatible = "google,cros-ec-spi"; reg = <0>; interrupt-parent = <&tlmm>; interrupts = <18 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&ap_ec_int_l>; spi-max-frequency = <3000000>; cros_ec_pwm: pwm { compatible = "google,cros-ec-pwm"; #pwm-cells = <1>; }; i2c_tunnel: i2c-tunnel { compatible = "google,cros-ec-i2c-tunnel"; google,remote-bus = <0>; #address-cells = <1>; #size-cells = <0>; }; typec { compatible = "google,cros-ec-typec"; #address-cells = <1>; #size-cells = <0>; usb_c0: connector@0 { compatible = "usb-c-connector"; reg = <0>; label = "left"; power-role = "dual"; data-role = "host"; try-power-role = "source"; }; usb_c1: connector@1 { compatible = "usb-c-connector"; reg = <1>; label = "right"; power-role = "dual"; data-role = "host"; try-power-role = "source"; }; }; }; }; #include <arm/cros-ec-keyboard.dtsi> #include <arm/cros-ec-sbs.dtsi> &keyboard_controller { function-row-physmap = < MATRIX_KEY(0x00, 0x02, 0) /* T1 */ MATRIX_KEY(0x03, 0x02, 0) /* T2 */ MATRIX_KEY(0x02, 0x02, 0) /* T3 */ MATRIX_KEY(0x01, 0x02, 0) /* T4 */ MATRIX_KEY(0x03, 0x04, 0) /* T5 */ MATRIX_KEY(0x02, 0x04, 0) /* T6 */ MATRIX_KEY(0x01, 0x04, 0) /* T7 */ MATRIX_KEY(0x02, 0x09, 0) /* T8 */ MATRIX_KEY(0x01, 0x09, 0) /* T9 */ MATRIX_KEY(0x00, 0x04, 0) /* T10 */ >; linux,keymap = < MATRIX_KEY(0x00, 0x02, KEY_BACK) MATRIX_KEY(0x03, 0x02, KEY_REFRESH) MATRIX_KEY(0x02, 0x02, KEY_ZOOM) MATRIX_KEY(0x01, 0x02, KEY_SCALE) MATRIX_KEY(0x03, 0x04, KEY_SYSRQ) MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN) MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP) MATRIX_KEY(0x02, 0x09, KEY_MUTE) MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN) MATRIX_KEY(0x00, 0x04, KEY_VOLUMEUP) CROS_STD_MAIN_KEYMAP >; }; &usb_1 { status = "okay"; }; &usb_1_dwc3 { dr_mode = "host"; #address-cells = <1>; #size-cells = <0>; /* 2.x hub on port 1 */ usb_hub_2_x: hub@1 { compatible = "usbbda,5411"; reg = <1>; vdd-supply = <&pp3300_hub>; peer-hub = <&usb_hub_3_x>; }; /* 3.x hub on port 2 */ usb_hub_3_x: hub@2 { compatible = "usbbda,411"; reg = <2>; vdd-supply = <&pp3300_hub>; peer-hub = <&usb_hub_2_x>; }; }; &usb_1_hsphy { status = "okay"; qcom,hs-rise-fall-time-bp = <0>; qcom,squelch-detector-bp = <(-2090)>; qcom,hs-disconnect-bp = <1743>; qcom,hs-amplitude-bp = <1780>; qcom,hs-crossover-voltage-microvolt = <(-31000)>; qcom,hs-output-impedance-micro-ohms = <2600000>; }; &usb_1_qmpphy { status = "okay"; }; /* PINCTRL - ADDITIONS TO NODES IN PARENT DEVICE TREE FILES */ &dp_hot_plug_det { bias-disable; }; &mi2s1_data0 { drive-strength = <6>; bias-disable; }; &mi2s1_sclk { drive-strength = <6>; bias-disable; }; &mi2s1_ws { drive-strength = <6>; bias-disable; }; &pcie1_clkreq_n { bias-pull-up; drive-strength = <2>; }; &qspi_cs0 { bias-disable; /* External pullup */ drive-strength = <8>; }; &qspi_clk { bias-pull-down; /* No external pulls */ drive-strength = <8>; }; &qspi_data0 { bias-pull-down; /* No external pulls */ drive-strength = <8>; }; &qspi_data1 { bias-disable; /* External pulldown */ drive-strength = <8>; }; /* For ap_tp_i2c */ &qup_i2c0_data_clk { /* Has external pull */ bias-disable; drive-strength = <2>; }; /* For ap_i2c_tpm */ &qup_i2c14_data_clk { /* Has external pull */ bias-disable; drive-strength = <2>; }; /* For ap_spi_fp */ &qup_spi9_data_clk { bias-disable; drive-strength = <2>; }; /* For ap_spi_fp */ &qup_spi9_cs_gpio { bias-disable; drive-strength = <2>; }; /* For ap_ec_spi */ &qup_spi10_data_clk { bias-disable; drive-strength = <2>; }; /* For ap_ec_spi */ &qup_spi10_cs_gpio { bias-disable; drive-strength = <2>; }; /* For uart_dbg */ &qup_uart5_rx { bias-pull-up; }; /* For uart_dbg */ &qup_uart5_tx { bias-disable; drive-strength = <2>; }; &sdc2_clk { bias-disable; drive-strength = <16>; }; &sdc2_cmd { bias-pull-up; drive-strength = <10>; }; &sdc2_data { bias-pull-up; drive-strength = <10>; }; /* PINCTRL - board-specific pinctrl */ &pm7325_gpios { /* * On a quick glance it might look like KYPD_VOL_UP_N is used, but * that only passes through to a debug connector and not to the actual * volume up key. */ status = "disabled"; /* No GPIOs are connected */ }; &pmk8350_gpios { status = "disabled"; /* No GPIOs are connected */ }; &tlmm { /* pinctrl settings for pins that have no real owners. */ pinctrl-names = "default"; pinctrl-0 = <&bios_flash_wp_od>; amp_en: amp-en-state { pins = "gpio63"; function = "gpio"; bias-disable; drive-strength = <2>; }; ap_ec_int_l: ap-ec-int-l-state { pins = "gpio18"; function = "gpio"; bias-pull-up; }; bios_flash_wp_od: bios-flash-wp-od-state { pins = "gpio16"; function = "gpio"; /* Has external pull */ bias-disable; }; en_fp_rails: en-fp-rails-state { pins = "gpio77"; function = "gpio"; bias-disable; drive-strength = <2>; output-high; }; en_pp3300_codec: en-pp3300-codec-state { pins = "gpio105"; function = "gpio"; bias-disable; drive-strength = <2>; }; en_pp3300_dx_edp: en-pp3300-dx-edp-state { pins = "gpio80"; function = "gpio"; bias-disable; drive-strength = <2>; }; fp_rst_l: fp-rst-l-state { pins = "gpio78"; function = "gpio"; bias-disable; drive-strength = <2>; }; fp_to_ap_irq_l: fp-to-ap-irq-l-state { pins = "gpio61"; function = "gpio"; /* Has external pullup */ bias-disable; }; fpmcu_boot0: fpmcu-boot0-state { pins = "gpio68"; function = "gpio"; bias-disable; }; gsc_ap_int_odl: gsc-ap-int-odl-state { pins = "gpio104"; function = "gpio"; bias-pull-up; }; hp_irq: hp-irq-state { pins = "gpio101"; function = "gpio"; bias-pull-up; }; hub_en: hub-en-state { pins = "gpio157"; function = "gpio"; bias-disable; drive-strength = <2>; }; pe_wake_odl: pe-wake-odl-state { pins = "gpio3"; function = "gpio"; /* Has external pull */ bias-disable; drive-strength = <2>; }; /* For ap_spi_fp */ qup_spi9_cs_gpio_init_high: qup-spi9-cs-gpio-init-high-state { pins = "gpio39"; function = "gpio"; output-high; }; /* For ap_ec_spi */ qup_spi10_cs_gpio_init_high: qup-spi10-cs-gpio-init-high-state { pins = "gpio43"; function = "gpio"; output-high; }; sar0_irq_odl: sar0-irq-odl-state { pins = "gpio141"; function = "gpio"; bias-pull-up; }; sar1_irq_odl: sar1-irq-odl-state { pins = "gpio140"; function = "gpio"; bias-pull-up; }; sd_cd_odl: sd-cd-odl-state { pins = "gpio91"; function = "gpio"; bias-pull-up; }; ssd_en: ssd-en-state { pins = "gpio51"; function = "gpio"; bias-disable; drive-strength = <2>; }; ssd_rst_l: ssd-rst-l-state { pins = "gpio2"; function = "gpio"; bias-disable; drive-strength = <2>; output-low; }; tp_int_odl: tp-int-odl-state { pins = "gpio7"; function = "gpio"; /* Has external pullup */ bias-disable; }; wf_cam_en: wf-cam-en-state { pins = "gpio119"; function = "gpio"; /* Has external pulldown */ bias-disable; drive-strength = <2>; }; };