blob: 3a3790a52a2ce05b9053675f5953962cce671136 [file] [log] [blame]
// SPDX-License-Identifier: BSD-3-Clause
/*
* Common Board Device Tree for
* Microsoft Mobile MSM8994 Octagon Platforms
*
* Copyright (c) 2020, Konrad Dybcio
* Copyright (c) 2020, Gustave Monce <gustave.monce@outlook.com>
*/
#include "pm8994.dtsi"
#include "pmi8994.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/gpio-keys.h>
#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
/*
* Delete all generic (msm8994.dtsi) reserved
* memory mappings which are different in this device.
*/
/delete-node/ &adsp_mem;
/delete-node/ &audio_mem;
/delete-node/ &cont_splash_mem;
/delete-node/ &mba_mem;
/delete-node/ &mpss_mem;
/delete-node/ &peripheral_region;
/delete-node/ &rmtfs_mem;
/delete-node/ &smem_mem;
/ {
/*
* Most Lumia 950/XL users use GRUB to load their kernels,
* hence there is no need for msm-id and friends.
*/
/*
* This enables graphical output via bootloader-enabled display.
* acpi=no is required due to WP platforms having ACPI support, but
* only for Windows-based OSes.
*/
chosen {
bootargs = "earlycon=efifb console=efifb acpi=no";
#address-cells = <2>;
#size-cells = <2>;
ranges;
};
clocks {
compatible = "simple-bus";
divclk4: divclk4 {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <32768>;
clock-output-names = "divclk4";
pinctrl-names = "default";
pinctrl-0 = <&divclk4_pin_a>;
};
};
gpio-keys {
compatible = "gpio-keys";
input-name = "gpio-keys";
autorepeat;
volupkey {
label = "Volume Up";
gpios = <&pm8994_gpios 3 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
linux,code = <KEY_VOLUMEUP>;
wakeup-source;
debounce-interval = <15>;
};
camsnapkey {
label = "Camera Snapshot";
gpios = <&pm8994_gpios 4 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
linux,code = <KEY_CAMERA>;
wakeup-source;
debounce-interval = <15>;
};
camfocuskey {
label = "Camera Focus";
gpios = <&pm8994_gpios 5 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
linux,code = <KEY_VOLUMEUP>;
wakeup-source;
debounce-interval = <15>;
};
};
gpio-hall-sensor {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&hall_front_default &hall_back_default>;
label = "GPIO Hall Effect Sensor";
hall-front-sensor {
label = "Hall Effect Front Sensor";
gpios = <&tlmm 42 GPIO_ACTIVE_HIGH>;
linux,input-type = <EV_SW>;
linux,code = <SW_LID>;
linux,can-disable;
};
hall-back-sensor {
label = "Hall Effect Back Sensor";
gpios = <&tlmm 75 GPIO_ACTIVE_HIGH>;
linux,input-type = <EV_SW>;
linux,code = <SW_MACHINE_COVER>;
linux,can-disable;
};
};
reserved-memory {
/*
* This device being a WP platform has a very different
* memory layout than other Android based devices.
* This memory layout is directly copied from the original
* device UEFI firmware, and adapted based on observations
* using JTAG for the Qualcomm Peripheral Image regions.
*/
uefi_mem: memory@200000 {
reg = <0 0x200000 0 0x100000>;
no-map;
};
mppark_mem: memory@300000 {
reg = <0 0x300000 0 0x80000>;
no-map;
};
fbpt_mem: memory@380000 {
reg = <0 0x380000 0 0x1000>;
no-map;
};
dbg2_mem: memory@381000 {
reg = <0 0x381000 0 0x4000>;
no-map;
};
capsule_mem: memory@385000 {
reg = <0 0x385000 0 0x1000>;
no-map;
};
tpmctrl_mem: memory@386000 {
reg = <0 0x386000 0 0x3000>;
no-map;
};
uefiinfo_mem: memory@389000 {
reg = <0 0x389000 0 0x1000>;
no-map;
};
reset_mem: memory@389000 {
reg = <0 0x389000 0 0x1000>;
no-map;
};
resuncached_mem: memory@38e000 {
reg = <0 0x38e000 0 0x72000>;
no-map;
};
disp_mem: memory@400000 {
reg = <0 0x400000 0 0x800000>;
no-map;
};
uefistack_mem: memory@c00000 {
reg = <0 0xc00000 0 0x40000>;
no-map;
};
cpuvect_mem: memory@c40000 {
reg = <0 0xc40000 0 0x10000>;
no-map;
};
rescached_mem: memory@400000 {
reg = <0 0xc50000 0 0xb0000>;
no-map;
};
tzapps_mem: memory@6500000 {
reg = <0 0x6500000 0 0x500000>;
no-map;
};
smem_mem: memory@6a00000 {
reg = <0 0x6a00000 0 0x200000>;
no-map;
};
hyp_mem: memory@6c00000 {
reg = <0 0x6c00000 0 0x100000>;
no-map;
};
tz_mem: memory@6d00000 {
reg = <0 0x6d00000 0 0x160000>;
no-map;
};
rfsa_adsp_mem: memory@6e60000 {
reg = <0 0x6e60000 0 0x10000>;
no-map;
};
rfsa_mpss_mem: memory@6e70000 {
compatible = "qcom,rmtfs-mem";
reg = <0 0x6e70000 0 0x10000>;
no-map;
qcom,client-id = <1>;
};
/*
* Value obtained from the device original ACPI DSDT table
* MPSS_EFS / SBL
*/
mba_mem: memory@6e80000 {
reg = <0 0x6e80000 0 0x180000>;
no-map;
};
/*
* Peripheral Image loader region begin!
* The region reserved for pil is 0x7000000-0xef00000
*/
mpss_mem: memory@7000000 {
reg = <0 0x7000000 0 0x5a00000>;
no-map;
};
adsp_mem: memory@ca00000 {
reg = <0 0xca00000 0 0x1800000>;
no-map;
};
venus_mem: memory@e200000 {
reg = <0 0xe200000 0 0x500000>;
no-map;
};
pil_metadata_mem: memory@e700000 {
reg = <0 0xe700000 0 0x4000>;
no-map;
};
memory@e704000 {
reg = <0 0xe704000 0 0x7fc000>;
no-map;
};
/* Peripheral Image loader region end */
cnss_mem: memory@ef00000 {
reg = <0 0xef00000 0 0x300000>;
no-map;
};
};
};
&blsp1_i2c1 {
status = "okay";
rmi4-i2c-dev@4b {
compatible = "syna,rmi4-i2c";
reg = <0x4b>;
#address-cells = <1>;
#size-cells = <0>;
interrupt-parent = <&tlmm>;
interrupts = <77 IRQ_TYPE_EDGE_FALLING>;
rmi4-f01@1 {
reg = <0x01>;
syna,nosleep-mode = <1>;
};
rmi4-f12@12 {
reg = <0x12>;
syna,sensor-type = <1>;
syna,clip-x-low = <0>;
syna,clip-x-high = <1440>;
syna,clip-y-low = <0>;
syna,clip-y-high = <2560>;
};
};
};
&blsp1_i2c2 {
status = "okay";
/*
* This device uses the Texas Instruments TAS2553, however the TAS2552 driver
* seems to work here. In the future a proper driver might need to
* be written for this device.
*/
tas2553: tas2553@40 {
compatible = "ti,tas2552";
reg = <0x40>;
vbat-supply = <&vph_pwr>;
iovdd-supply = <&vreg_s4a_1p8>;
avdd-supply = <&vreg_s4a_1p8>;
enable-gpio = <&pm8994_gpios 12 GPIO_ACTIVE_HIGH>;
};
};
&blsp1_i2c5 {
status = "okay";
ak09912: magnetometer@c {
compatible = "asahi-kasei,ak09912";
reg = <0xc>;
interrupt-parent = <&tlmm>;
interrupts = <26 IRQ_TYPE_EDGE_RISING>;
vdd-supply = <&vreg_l18a_2p85>;
vid-supply = <&vreg_lvs2a_1p8>;
};
zpa2326: barometer@5c {
compatible = "murata,zpa2326";
reg = <0x5c>;
interrupt-parent = <&tlmm>;
interrupts = <74 IRQ_TYPE_EDGE_RISING>;
vdd-supply = <&vreg_lvs2a_1p8>;
};
mpu6050: accelerometer@68 {
compatible = "invensense,mpu6500";
reg = <0x68>;
interrupt-parent = <&tlmm>;
interrupts = <64 IRQ_TYPE_EDGE_RISING>;
vdd-supply = <&vreg_lvs2a_1p8>;
vddio-supply = <&vreg_lvs2a_1p8>;
};
};
&blsp1_i2c6 {
status = "okay";
pn547: pn547@28 {
compatible = "nxp,pn544-i2c";
reg = <0x28>;
interrupt-parent = <&tlmm>;
interrupts = <29 IRQ_TYPE_EDGE_RISING>;
enable-gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;
firmware-gpios = <&tlmm 94 GPIO_ACTIVE_HIGH>;
};
};
&blsp1_uart2 {
status = "okay";
};
&blsp2_i2c1 {
status = "okay";
sideinteraction: ad7147_captouch@2c {
compatible = "ad,ad7147_captouch";
reg = <0x2c>;
pinctrl-names = "default", "sleep";
pinctrl-0 = <&grip_default>;
pinctrl-1 = <&grip_sleep>;
interrupts = <&tlmm 96 IRQ_TYPE_EDGE_FALLING>;
button_num = <8>;
touchpad_num = <0>;
wheel_num = <0>;
slider_num = <0>;
vcc-supply = <&vreg_l18a_2p85>;
};
/*
* The QPDS-T900/QPDS-T930 is a customized part built for Nokia
* by Avago. It is very similar to the Avago APDS-9930 with some
* minor differences. In the future a proper driver might need to
* be written for this device. For now this works fine.
*/
qpdst900: qpdst900@39 {
compatible = "avago,apds9930";
reg = <0x39>;
interrupt-parent = <&tlmm>;
interrupts = <40 IRQ_TYPE_EDGE_FALLING>;
};
};
&blsp2_i2c5 {
status = "okay";
fm_radio: si4705@11 {
compatible = "silabs,si470x";
reg = <0x11>;
interrupt-parent = <&tlmm>;
interrupts = <9 IRQ_TYPE_EDGE_FALLING>;
reset-gpios = <&tlmm 93 GPIO_ACTIVE_HIGH>;
};
vreg_lpddr_1p1: fan53526a@6c {
compatible = "fcs,fan53526";
reg = <0x6c>;
regulator-min-microvolt = <1100000>;
regulator-max-microvolt = <1100000>;
vin-supply = <&vph_pwr>;
fcs,suspend-voltage-selector = <1>;
regulator-always-on; /* Turning off DDR power doesn't sound good. */
};
/* ANX7816 HDMI bridge (needs MDSS HDMI) */
};
&blsp2_spi4 {
status = "okay";
/*
* This device is a Lattice UC120 USB-C PD PHY.
* It is actually a Lattice iCE40 FPGA pre-programmed by
* the device firmware with a specific bitstream
* enabling USB Type C PHY functionality.
* Communication is done via a proprietary protocol over SPI.
*
* TODO: Once a proper driver is available, replace this.
*/
uc120: ice5lp2k@0 {
compatible = "lattice,ice40-fpga-mgr";
reg = <0>;
spi-max-frequency = <5000000>;
cdone-gpios = <&tlmm 95 GPIO_ACTIVE_HIGH>;
reset-gpios = <&pmi8994_gpios 4 GPIO_ACTIVE_LOW>;
};
};
&blsp2_uart2 {
status = "okay";
qca6174_bt: bluetooth {
compatible = "qcom,qca6174-bt";
enable-gpios = <&pm8994_gpios 19 GPIO_ACTIVE_HIGH>;
clocks = <&divclk4>;
};
};
&pm8994_gpios {
bt_en_gpios: bt_en_gpios {
pinconf {
pins = "gpio19";
function = PMIC_GPIO_FUNC_NORMAL;
output-low;
power-source = <PM8994_GPIO_S4>;
qcom,drive-strength = <PMIC_GPIO_STRENGTH_LOW>;
bias-pull-down;
};
};
divclk4_pin_a: divclk4 {
pinconf {
pins = "gpio18";
function = PMIC_GPIO_FUNC_FUNC2;
power-source = <PM8994_GPIO_S4>;
bias-disable;
};
};
};
&pm8994_pon {
pwrkey {
compatible = "qcom,pm8941-pwrkey";
interrupts = <0 8 0 IRQ_TYPE_EDGE_BOTH>;
debounce = <15625>;
linux,code = <KEY_POWER>;
};
volwnkey {
compatible = "qcom,pm8941-resin";
interrupts = <0 8 1 IRQ_TYPE_EDGE_BOTH>;
debounce = <15625>;
linux,code = <KEY_VOLUMEDOWN>;
};
};
&pmi8994_gpios {
pinctrl-0 = <&hd3ss460_pol &hd3ss460_amsel &hd3ss460_en>;
pinctrl-names = "default";
/*
* This device uses a TI HD3SS460 Type-C MUX
* As this device has no driver currently,
* the configuration for USB Face Up is set-up here.
*
* TODO: remove once a driver is available
* TODO: add VBUS GPIO 5
*/
hd3ss460_pol: pol_low {
pins = "gpio8";
drive-strength = <3>;
bias-pull-down;
};
hd3ss460_amsel: amsel_high {
pins = "gpio9";
drive-strength = <1>;
bias-pull-up;
};
hd3ss460_en: en_high {
pins = "gpio10";
drive-strength = <1>;
bias-pull-up;
};
};
&pmi8994_spmi_regulators {
vdd_gfx: s2@1700 {
reg = <0x1700 0x100>;
regulator-min-microvolt = <980000>;
regulator-max-microvolt = <980000>;
};
};
&rpm_requests {
/* These values were taken from the original firmware ACPI tables */
pm8994_regulators: pm8994-regulators {
compatible = "qcom,rpm-pm8994-regulators";
vdd_s1-supply = <&vph_pwr>;
vdd_s2-supply = <&vph_pwr>;
vdd_s3-supply = <&vph_pwr>;
vdd_s4-supply = <&vph_pwr>;
vdd_s5-supply = <&vph_pwr>;
vdd_s6-supply = <&vph_pwr>;
vdd_s7-supply = <&vph_pwr>;
vdd_s8-supply = <&vph_pwr>;
vdd_s9-supply = <&vph_pwr>;
vdd_s10-supply = <&vph_pwr>;
vdd_s11-supply = <&vph_pwr>;
vdd_s12-supply = <&vph_pwr>;
vdd_l1-supply = <&vreg_s1b_1p0>;
vdd_l2_l26_l28-supply = <&vreg_s3a_1p3>;
vdd_l3_l11-supply = <&vreg_s3a_1p3>;
vdd_l4_l27_l31-supply = <&vreg_s3a_1p3>;
vdd_l5_l7-supply = <&vreg_s5a_2p15>;
vdd_l6_l12_l32-supply = <&vreg_s5a_2p15>;
vdd_l8_l16_l30-supply = <&vph_pwr>;
vdd_l9_l10_l18_l22-supply = <&vph_pwr_bbyp>;
vdd_l13_l19_l23_l24-supply = <&vph_pwr_bbyp>;
vdd_l14_l15-supply = <&vreg_s5a_2p15>;
vdd_l17_l29-supply = <&vph_pwr_bbyp>;
vdd_l20_l21-supply = <&vph_pwr_bbyp>;
vdd_l25-supply = <&vreg_s5a_2p15>;
vdd_lvs1_2-supply = <&vreg_s4a_1p8>;
/* S1, S2, S6 and S12 are managed by RPMPD */
vreg_s3a_1p3: s3 {
regulator-min-microvolt = <1300000>;
regulator-max-microvolt = <1300000>;
regulator-allow-set-load;
regulator-system-load = <300000>;
};
vreg_s4a_1p8: s4 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-allow-set-load;
regulator-always-on;
regulator-system-load = <325000>;
};
vreg_s5a_2p15: s5 {
regulator-min-microvolt = <2150000>;
regulator-max-microvolt = <2150000>;
regulator-allow-set-load;
regulator-system-load = <325000>;
};
vreg_s7a_1p0: s7 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>;
};
/*
* S8 - SPMI-managed VDD_APC0
* S9, S10 and S11 (the main one) - SPMI-managed VDD_APC1
*/
vreg_l1a_1p0: l1 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>;
};
vreg_l2a_1p25: l2 {
regulator-min-microvolt = <1250000>;
regulator-max-microvolt = <1250000>;
regulator-allow-set-load;
regulator-system-load = <4160>;
};
vreg_l3a_1p2: l3 {
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <80000>;
};
vreg_l4a_1p225: l4 {
regulator-min-microvolt = <1225000>;
regulator-max-microvolt = <1225000>;
};
/* L5 is inaccessible from RPM */
vreg_l6a_1p8: l6 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-allow-set-load;
regulator-system-load = <1000>;
};
/* L7 is inaccessible from RPM */
vreg_l8a_1p8: l8 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
vreg_l9a_1p8: l9 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
vreg_l10a_1p8: l10 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
vreg_l11a_1p2: l11 {
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <35000>;
};
vreg_l12a_1p8: l12 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <50000>;
};
vreg_l13a_2p95: l13 {
regulator-min-microvolt = <1850000>;
regulator-max-microvolt = <2950000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <22000>;
};
vreg_l14a_1p8: l14 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <52000>;
};
vreg_l15a_1p8: l15 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
vreg_l16a_2p7: l16 {
regulator-min-microvolt = <2700000>;
regulator-max-microvolt = <2700000>;
};
vreg_l17a_2p7: l17 {
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <300000>;
};
vreg_l18a_2p85: l18 {
regulator-min-microvolt = <2850000>;
regulator-max-microvolt = <2850000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <600000>;
};
vreg_l19a_3p3: l19 {
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <500000>;
};
vreg_l20a_2p95: l20 {
regulator-min-microvolt = <2950000>;
regulator-max-microvolt = <2950000>;
regulator-always-on;
regulator-boot-on;
regulator-allow-set-load;
regulator-system-load = <570000>;
};
vreg_l21a_2p95: l21 {
regulator-min-microvolt = <2950000>;
regulator-max-microvolt = <2950000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <800000>;
};
vreg_l22a_3p0: l22 {
regulator-min-microvolt = <3000000>;
regulator-max-microvolt = <3000000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <150000>;
};
vreg_l23a_2p8: l23 {
regulator-min-microvolt = <2850000>;
regulator-max-microvolt = <2850000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <80000>;
};
vreg_l24a_3p075: l24 {
regulator-min-microvolt = <3075000>;
regulator-max-microvolt = <3150000>;
regulator-allow-set-load;
regulator-system-load = <5800>;
};
vreg_l25a_1p1: l25 {
regulator-min-microvolt = <1150000>;
regulator-max-microvolt = <1150000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <80000>;
};
vreg_l26a_1p0: l26 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>;
};
vreg_l27a_1p05: l27 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <500000>;
};
vreg_l28a_1p0: l28 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <26000>;
};
vreg_l29a_2p8: l29 {
regulator-min-microvolt = <2850000>;
regulator-max-microvolt = <2850000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <80000>;
};
vreg_l30a_1p8: l30 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <2500>;
};
vreg_l31a_1p2: l31 {
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-allow-set-load;
regulator-system-load = <600000>;
};
vreg_l32a_1p8: l32 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
vreg_lvs1a_1p8: lvs1 { };
vreg_lvs2a_1p8: lvs2 { };
};
pmi8994_regulators: pmi8994-regulators {
compatible = "qcom,rpm-pmi8994-regulators";
vdd_s1-supply = <&vph_pwr>;
vdd_bst_byp-supply = <&vph_pwr>;
vreg_s1b_1p0: s1 {
regulator-min-microvolt = <1025000>;
regulator-max-microvolt = <1025000>;
};
/* S2 & S3 - VDD_GFX */
vph_pwr_bbyp: boost-bypass {
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
};
};
&sdhc1 {
status = "okay";
/*
* This device is shipped with HS400 capabable eMMCs
* However various brands have been used in various product batches,
* including a Samsung eMMC (BGND3R) which features a quirk with HS400.
* Set the speed to HS200 as a safety measure.
*/
mmc-hs200-1_8v;
};
&sdhc2 {
status = "okay";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on>;
pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>;
vmmc-supply = <&vreg_l21a_2p95>;
vqmmc-supply = <&vreg_l13a_2p95>;
cd-gpios = <&pm8994_gpios 8 GPIO_ACTIVE_LOW>;
};
&tlmm {
grip_default: grip-default {
pins = "gpio39";
function = "gpio";
drive-strength = <6>;
bias-pull-down;
};
grip_sleep: grip-sleep {
pins = "gpio39";
function = "gpio";
drive-strength = <2>;
bias-pull-down;
};
hall_front_default: hall-front-default {
pins = "gpio42";
function = "gpio";
drive-strength = <2>;
bias-disable;
};
hall_back_default: hall-back-default {
pins = "gpio75";
function = "gpio";
drive-strength = <2>;
bias-disable;
};
};