Merge "USB: gadget: support for dynamic read of usb composition"
diff --git a/Documentation/devicetree/bindings/input/qti-haptics.txt b/Documentation/devicetree/bindings/input/qti-haptics.txt
index b3daa49..0f6cb20 100644
--- a/Documentation/devicetree/bindings/input/qti-haptics.txt
+++ b/Documentation/devicetree/bindings/input/qti-haptics.txt
@@ -86,6 +86,12 @@
haptics module through VDD_HAP pin. This is only needed if VDD_HAP
is supplied from an external boost regulator instead of VPH_PWR.
+- qcom,haptics-ext-pin-twm
+ Usage: optional
+ Value type: <empty>
+ Definition: A boolean property which configures haptics into external-pin
+ control during TWM entry.
+
Following properties are specific only when LRA actuator is used:
- qcom,lra-resonance-sig-shape
diff --git a/Documentation/devicetree/bindings/leds/leds-msm-gpio-flash.txt b/Documentation/devicetree/bindings/leds/leds-msm-gpio-flash.txt
new file mode 100644
index 0000000..cbce64d
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-msm-gpio-flash.txt
@@ -0,0 +1,57 @@
+Qualcomm GPIO Flash Leds
+
+Qualcomm GPIO flash LEDs driver is used for
+controlling flash LEDs that are connected with 2 GPIOs. The 2 GPIOs are name
+flash_en and flash now.
+
+
+The flash LEDs has torch mode and flash mode. The flash mode is used for camera.
+The torch mode is used for torch.
+
+
+Required properties for each node:
+- compatible : should be "qcom,leds-gpio-flash"
+- qcom,flash-en : the GPIO pin number of flash-en function
+- qcom,flash-now : the GPIO pin number of flash-now function
+- linux,name : name of the led that is used in led framework
+- linux,default-trigger : name of the led trigger event
+- qcom,op-seq : GPIO config name
+- clocks : A list of clk correspondence with the gpio pinfunc,
+ it is an optional property, it is needed when the flash need use clk
+ waveform to driver, and rcg clk is also optional, it is needed when
+ the used clk can't configure the duty cycle, we use the parent clk to
+ configure the duty cycle.
+- clock-names : Names of the clocks in 1-1 correspondence with the
+ "clocks" property.
+- qcom,duty-cycle : It is used to configure the duty cycle in clk mode.
+- qcom,clk-freq : Frequence of clk
+- qcom,torch-seq-val: GPIO config value for torch mode
+- qcom,flash-seq-val: GPIO config value for flash mode
+- pinctrl-names : pinctrl name
+- pinctrl-0 : default gpio stats
+
+No other optional properties for it.
+
+Example:
+
+ flashlight {
+ compatible = "leds-gpio-flash";
+ status = "okay";
+ pinctrl-names = "flash_default";
+ pinctrl-0 = <&flash_default>;
+ qcom,flash-en = <&msmgpio 31 0>;
+ qcom,flash-now = <&msmgpio 32 0>;
+ qcom,op-seq = "flash_en", "flash_now";
+ clocks = <&clock_gcc clk_camss_gp0_clk>,
+ <&clock_gcc clk_camss_gp0_clk_src>,
+ <&clock_gcc clk_camss_gp1_clk>,
+ <&clock_gcc clk_camss_gp1_clk_src>;
+ clock-names = "flash_en_clk", "flash_en_duty_cycle_clk",
+ "flash_now_clk", "flash_now_duty_cycle_clk";
+ qcom,duty-cycle = <40 30>;
+ qcom,clk-freq = <150000 150000>;
+ qcom,torch-seq-val = <1, 0>;
+ qcom,flash-seq-val = <0, 1>;
+ linux,name = "flashlight";
+ linux,default-trigger = "flashlight-trigger";
+ };
diff --git a/Documentation/devicetree/bindings/media/video/msm-camera-flash.txt b/Documentation/devicetree/bindings/media/video/msm-camera-flash.txt
index 970dae2..ec2e451 100644
--- a/Documentation/devicetree/bindings/media/video/msm-camera-flash.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-camera-flash.txt
@@ -142,3 +142,11 @@
"CAM_TORCH";
status = "ok";
};
+
+led_flash0: qcom,camera-led-flash {
+ cell-index = <0>;
+ compatible = "qcom,camera-led-flash";
+ qcom,flash-type = <3>;
+ qcom,flash-source = <&flash_BC847>;
+ qcom,torch-source = <&flash_BC847>;
+ };
diff --git a/Documentation/devicetree/bindings/sound/tfa98xx.txt b/Documentation/devicetree/bindings/sound/tfa98xx.txt
new file mode 100644
index 0000000..8cf30f4
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/tfa98xx.txt
@@ -0,0 +1,26 @@
+TFA9898 SmartpA
+
+Required properties:
+
+ - compatible : "nxp,tfa98xx"
+
+ - reg : I2C address of the device
+
+ - reset-gpio : gpio used for HW reset
+
+ - dvdd-supply : Power supply for PA's dvdd
+
+ - dvdd-voltage : Minimum and maximum voltage in uV to set for power supply
+
+ - dvdd-current : dvdd's max current in uA
+
+Examples:
+
+ i2c_smartpa@34 {
+ compatible = "nxp,tfa98xx;
+ reg = <0x34>;
+ reset-gpio = <&tlmm 68 0>;
+ dvdd-supply = <&pm660_l9>;
+ dvdd-voltage = <1800000 1800000>;
+ dvdd-current = <15000>;
+ };
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 1369444..9117e86 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -33,6 +33,10 @@
# Never generate .eh_frame
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
+ifeq ($(cc-name),clang)
+KBUILD_CFLAGS += -Wno-vectorizer-no-neon
+endif
+
# This should work on most of the modern platforms
KBUILD_DEFCONFIG := multi_v7_defconfig
ifeq ($(COMPILER),clang)
diff --git a/arch/arm/boot/dts/qcom/sa415m-cdp.dtsi b/arch/arm/boot/dts/qcom/sa415m-cdp.dtsi
new file mode 100644
index 0000000..b58de1a
--- /dev/null
+++ b/arch/arm/boot/dts/qcom/sa415m-cdp.dtsi
@@ -0,0 +1,31 @@
+/* Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "sdxpoorwills-cdp.dtsi"
+
+&qcom_seecom {
+ status = "okay";
+};
+
+&thermal_zones {
+ mdm-core-step {
+ trips {
+ mdm-step-trip-0 {
+ temperature = <105000>;
+ };
+
+ mdm-step-trip-1 {
+ temperature = <115000>;
+ };
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/qcom/sa415m-v2-cdp.dts b/arch/arm/boot/dts/qcom/sa415m-v2-cdp.dts
index c8b7891..610075b 100644
--- a/arch/arm/boot/dts/qcom/sa415m-v2-cdp.dts
+++ b/arch/arm/boot/dts/qcom/sa415m-v2-cdp.dts
@@ -1,4 +1,4 @@
-/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2019,2020 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -12,7 +12,7 @@
/dts-v1/;
-#include "sdxpoorwills-cdp.dtsi"
+#include "sa415m-cdp.dtsi"
#include "sdxpoorwills-v2.dtsi"
#include "sdxpoorwills-display.dtsi"
#include "qpic-panel-ili-hvga.dtsi"
diff --git a/arch/arm/configs/msm8909-perf_defconfig b/arch/arm/configs/msm8909-perf_defconfig
index 4ad91f3..fa5174e 100755
--- a/arch/arm/configs/msm8909-perf_defconfig
+++ b/arch/arm/configs/msm8909-perf_defconfig
@@ -252,6 +252,7 @@
CONFIG_CLD_HL_SDIO_CORE=y
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
CONFIG_INPUT_JOYSTICK=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_INPUT_MISC=y
@@ -335,6 +336,8 @@
CONFIG_FB=y
CONFIG_FB_MSM=y
CONFIG_FB_MSM_MDSS=y
+CONFIG_FB_MSM_MDSS_WRITEBACK=y
+CONFIG_FB_MSM_MDSS_SPI_PANEL=y
CONFIG_FB_MSM_MDSS_DSI_CTRL_STATUS=y
CONFIG_FB_MSM_MDSS_MDP3=y
CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y
@@ -451,6 +454,7 @@
CONFIG_MSM_TZ_LOG=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_SECURITY=y
+CONFIG_FANOTIFY=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
CONFIG_FUSE_FS=y
diff --git a/arch/arm/configs/msm8909_defconfig b/arch/arm/configs/msm8909_defconfig
index 61e623d..0775891 100644
--- a/arch/arm/configs/msm8909_defconfig
+++ b/arch/arm/configs/msm8909_defconfig
@@ -267,6 +267,7 @@
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_EVBUG=y
CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
# CONFIG_INPUT_MOUSE is not set
CONFIG_INPUT_JOYSTICK=y
CONFIG_JOYSTICK_XPAD=y
@@ -359,6 +360,8 @@
CONFIG_FB_VIRTUAL=y
CONFIG_FB_MSM=y
CONFIG_FB_MSM_MDSS=y
+CONFIG_FB_MSM_MDSS_WRITEBACK=y
+CONFIG_FB_MSM_MDSS_SPI_PANEL=y
CONFIG_FB_MSM_MDSS_DSI_CTRL_STATUS=y
CONFIG_FB_MSM_MDSS_MDP3=y
CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y
@@ -393,6 +396,7 @@
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y
+CONFIG_USB_SERIAL_DEBUG=y
CONFIG_USB_EHSET_TEST_FIXTURE=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_DEBUG_FILES=y
@@ -500,6 +504,7 @@
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT3_FS=y
CONFIG_EXT4_FS_SECURITY=y
+CONFIG_FANOTIFY=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_PRINT_QUOTA_WARNING is not set
diff --git a/arch/arm/configs/sa415m-perf_defconfig b/arch/arm/configs/sa415m-perf_defconfig
index af520d9..ce8c8b0 100644
--- a/arch/arm/configs/sa415m-perf_defconfig
+++ b/arch/arm/configs/sa415m-perf_defconfig
@@ -415,6 +415,7 @@
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDER_IPC_32BIT=y
+CONFIG_MSM_TZ_LOG=y
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_UBIFS_FS=y
diff --git a/arch/arm/configs/sdm429-bg-perf_defconfig b/arch/arm/configs/sdm429-bg-perf_defconfig
index c18dadf..957a90f 100644
--- a/arch/arm/configs/sdm429-bg-perf_defconfig
+++ b/arch/arm/configs/sdm429-bg-perf_defconfig
@@ -236,6 +236,7 @@
CONFIG_DM_VERITY_FEC=y
CONFIG_NETDEVICES=y
CONFIG_DUMMY=y
+CONFIG_IFB=y
CONFIG_TUN=y
# CONFIG_NET_VENDOR_AMAZON is not set
# CONFIG_NET_CADENCE is not set
diff --git a/arch/arm/configs/sdm429-bg_defconfig b/arch/arm/configs/sdm429-bg_defconfig
index f7f2a4c..3a0ee72 100644
--- a/arch/arm/configs/sdm429-bg_defconfig
+++ b/arch/arm/configs/sdm429-bg_defconfig
@@ -243,6 +243,7 @@
CONFIG_DM_VERITY_FEC=y
CONFIG_NETDEVICES=y
CONFIG_DUMMY=y
+CONFIG_IFB=y
CONFIG_TUN=y
# CONFIG_NET_VENDOR_AMAZON is not set
# CONFIG_NET_CADENCE is not set
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
index 813fc44..f344fd3 100644
--- a/arch/arm/mm/ioremap.c
+++ b/arch/arm/mm/ioremap.c
@@ -119,10 +119,17 @@
do {
seq = init_mm.context.vmalloc_seq;
+#ifdef CONFIG_ENABLE_VMALLOC_SAVING
+ memcpy(pgd_offset(mm, PAGE_OFFSET),
+ pgd_offset_k(PAGE_OFFSET),
+ sizeof(pgd_t) * (pgd_index(VMALLOC_END) -
+ pgd_index(PAGE_OFFSET)));
+#else
memcpy(pgd_offset(mm, VMALLOC_START),
pgd_offset_k(VMALLOC_START),
sizeof(pgd_t) * (pgd_index(VMALLOC_END) -
pgd_index(VMALLOC_START)));
+#endif
mm->context.vmalloc_seq = seq;
} while (seq != init_mm.context.vmalloc_seq);
}
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 9bf3a41..a9df306 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -606,8 +606,8 @@
apq8009-lat-v1.0.dtb \
sdw3100-msm8909w-1gb-wtp.dtb \
sdw2500-apq8009w-wtp.dtb \
- sdw2500-msm8909w-wtp.dtb
-
+ sdw2500-msm8909w-wtp.dtb \
+ msm8905-qrd-skub_qseev4.dtb
dtb-$(CONFIG_ARCH_SDM450) += sdm450-rcm.dtb \
sdm450-cdp.dtb \
diff --git a/arch/arm64/boot/dts/qcom/batterydata-qrd-skua-4v35-2000mah.dtsi b/arch/arm64/boot/dts/qcom/batterydata-qrd-skua-4v35-2000mah.dtsi
new file mode 100644
index 0000000..c6bd343
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/batterydata-qrd-skua-4v35-2000mah.dtsi
@@ -0,0 +1,122 @@
+/* Copyright (c) 2014, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+qcom,qrd-skua-4v35-2000mAh-data {
+ qcom,battery-type = "qrd_skua_4v35_2000mAh";
+ qcom,batt-id-kohm = <200>;
+ qcom,chg-term-ua = <100000>;
+ qcom,default-rbatt-mohm = <146>;
+ qcom,fcc-mah = <2000>;
+ qcom,max-voltage-uv = <4350000>;
+ qcom,rbatt-capacitive-mohm = <50>;
+ qcom,v-cutoff-uv = <3400000>;
+ qcom,flat-ocv-threshold-uv = <3800000>;
+
+ qcom,fcc-temp-lut {
+ qcom,lut-col-legend = <(-20) 0 25 40 60>;
+ qcom,lut-data = <2064 2067 2067 2066 2063>;
+ };
+
+ qcom,ibat-acc-lut {
+ qcom,lut-col-legend = <(-20) 0 25>;
+ qcom,lut-row-legend = <0 250 500 1000>;
+ qcom,lut-data = <2022 2046 2046>,
+ <1151 1962 2024>,
+ <680 1864 2008>,
+ <51 1548 1970>;
+ };
+
+ qcom,rbatt-sf-lut {
+ qcom,lut-col-legend = <(-20) 0 25 40 60>;
+ qcom,lut-row-legend = <100 95 90 85 80>,
+ <75 70 65 60 55>,
+ <50 45 40 35 30>,
+ <25 20 16 13 11>,
+ <10 9 8 7 6>,
+ <5 4 3 2 1>,
+ <0>;
+ qcom,lut-data = <1355 273 100 81 74>,
+ <1352 273 100 81 74>,
+ <1268 280 102 83 75>,
+ <1197 286 106 85 76>,
+ <1143 285 110 87 78>,
+ <1109 281 116 90 79>,
+ <1090 272 124 94 82>,
+ <1080 269 134 100 85>,
+ <1077 267 133 108 91>,
+ <1079 266 111 100 90>,
+ <1090 266 101 83 76>,
+ <1116 267 101 84 77>,
+ <1156 268 103 86 79>,
+ <1205 270 103 88 83>,
+ <1266 274 106 88 82>,
+ <1337 276 108 87 78>,
+ <1431 276 107 85 79>,
+ <1560 284 104 84 78>,
+ <1680 293 99 81 75>,
+ <2078 306 99 81 77>,
+ <2438 318 100 83 78>,
+ <2875 333 102 85 80>,
+ <3411 354 104 87 81>,
+ <4092 392 108 89 84>,
+ <5118 448 116 92 86>,
+ <6939 551 121 95 85>,
+ <10433 791 120 90 81>,
+ <17054 1280 121 93 84>,
+ <29375 2077 133 101 92>,
+ <52518 3457 173 135 133>,
+ <230352 176376 150360 117059 92159>;
+ };
+
+ qcom,pc-temp-ocv-lut {
+ qcom,lut-col-legend = <(-20) 0 25 40 60>;
+ qcom,lut-row-legend = <100 95 90 85 80>,
+ <75 70 65 60 55>,
+ <50 45 40 35 30>,
+ <25 20 16 13 11>,
+ <10 9 8 7 6>,
+ <5 4 3 2 1>,
+ <0>;
+ qcom,lut-data = <4328 4328 4322 4318 4310>,
+ <4234 4252 4252 4250 4245>,
+ <4164 4191 4193 4191 4186>,
+ <4098 4132 4137 4135 4131>,
+ <4036 4074 4084 4082 4078>,
+ <3980 4019 4035 4033 4029>,
+ <3932 3967 3990 3989 3985>,
+ <3891 3923 3950 3950 3945>,
+ <3856 3886 3909 3912 3909>,
+ <3825 3855 3862 3868 3867>,
+ <3800 3828 3829 3829 3826>,
+ <3782 3805 3807 3806 3804>,
+ <3768 3786 3789 3789 3786>,
+ <3753 3770 3775 3774 3772>,
+ <3737 3757 3764 3761 3755>,
+ <3718 3740 3753 3746 3734>,
+ <3695 3719 3733 3725 3712>,
+ <3671 3702 3705 3698 3684>,
+ <3650 3691 3677 3668 3656>,
+ <3630 3681 3670 3662 3651>,
+ <3619 3676 3668 3660 3649>,
+ <3605 3670 3665 3658 3647>,
+ <3590 3664 3662 3655 3644>,
+ <3573 3655 3658 3651 3641>,
+ <3553 3643 3652 3647 3635>,
+ <3529 3622 3639 3632 3618>,
+ <3498 3590 3605 3595 3576>,
+ <3460 3543 3547 3535 3519>,
+ <3401 3476 3467 3455 3443>,
+ <3306 3368 3347 3336 3313>,
+ <3000 3000 3000 3000 3000>;
+ };
+};
+
diff --git a/arch/arm64/boot/dts/qcom/batterydata-qrd-skub-4v2-2000mah.dtsi b/arch/arm64/boot/dts/qcom/batterydata-qrd-skub-4v2-2000mah.dtsi
new file mode 100644
index 0000000..3e41288
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/batterydata-qrd-skub-4v2-2000mah.dtsi
@@ -0,0 +1,118 @@
+/* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+qcom,8905-batterydata {
+ qcom,battery-type = "qrd_skub_4v2_2000mAh";
+ qcom,batt-id-kohm = <0>;
+ qcom,chg-term-ua = <100000>;
+ qcom,default-rbatt-mohm = <158>;
+ qcom,fcc-mah = <2000>;
+ qcom,max-voltage-uv = <4200000>;
+ qcom,rbatt-capacitive-mohm = <50>;
+ qcom,v-cutoff-uv = <3400000>;
+
+ qcom,fcc-temp-lut {
+ qcom,lut-col-legend = <(-20) 0 25 40 60>;
+ qcom,lut-data = <2017 2014 2015 2013 2007>;
+ };
+
+ qcom,ibat-acc-lut {
+ qcom,lut-col-legend = <(-20) 0 25>;
+ qcom,lut-row-legend = <0 250 500 1000>;
+ qcom,lut-data = <1976 1974 1974>,
+ <67 1611 1967>,
+ <6 1154 1927>,
+ <6 630 1804>;
+ };
+
+ qcom,pc-temp-ocv-lut {
+ qcom,lut-col-legend = <(-20) 0 25 40 60>;
+ qcom,lut-row-legend = <100 95 90 85 80>,
+ <75 70 65 60 55>,
+ <50 45 40 35 30>,
+ <25 20 16 13 11>,
+ <10 9 8 7 6>,
+ <5 4 3 2 1>,
+ <0>;
+ qcom,lut-data = <4179 4172 4168 4165 4159>,
+ <4085 4103 4107 4106 4103>,
+ <4015 4059 4062 4060 4057>,
+ <3950 4001 4017 4019 4016>,
+ <3906 3959 3981 3981 3978>,
+ <3864 3922 3948 3947 3945>,
+ <3826 3887 3918 3917 3914>,
+ <3809 3857 3889 3890 3887>,
+ <3798 3830 3847 3857 3856>,
+ <3787 3805 3820 3819 3818>,
+ <3776 3790 3800 3801 3799>,
+ <3766 3780 3787 3787 3785>,
+ <3755 3772 3776 3776 3774>,
+ <3743 3764 3769 3768 3765>,
+ <3732 3754 3762 3758 3751>,
+ <3717 3739 3749 3741 3728>,
+ <3700 3717 3731 3723 3710>,
+ <3680 3702 3707 3700 3688>,
+ <3662 3691 3687 3681 3668>,
+ <3648 3683 3678 3673 3662>,
+ <3639 3678 3676 3671 3661>,
+ <3629 3673 3673 3669 3659>,
+ <3615 3667 3670 3667 3657>,
+ <3600 3659 3666 3663 3652>,
+ <3581 3647 3656 3651 3638>,
+ <3557 3624 3628 3622 3606>,
+ <3525 3587 3582 3575 3558>,
+ <3476 3530 3520 3513 3497>,
+ <3399 3448 3440 3432 3416>,
+ <3271 3320 3319 3311 3292>,
+ <3000 3000 3000 3000 3000>;
+ };
+
+ qcom,rbatt-sf-lut {
+ qcom,lut-col-legend = <(-20) 0 25 40 60>;
+ qcom,lut-row-legend = <100 95 90 85 80>,
+ <75 70 65 60 55>,
+ <50 45 40 35 30>,
+ <25 20 16 13 11>,
+ <10 9 8 7 6>,
+ <5 4 3 2 1>;
+ qcom,lut-data = <1274 296 100 79 70>,
+ <1274 296 100 79 70>,
+ <1195 321 105 81 71>,
+ <1134 313 109 84 73>,
+ <1117 317 116 87 75>,
+ <1108 316 123 90 77>,
+ <1102 312 132 96 80>,
+ <1131 311 137 104 85>,
+ <1172 310 114 103 89>,
+ <1215 306 105 81 73>,
+ <1257 320 104 81 71>,
+ <1304 348 106 83 74>,
+ <1352 384 106 85 76>,
+ <1406 422 112 88 78>,
+ <1471 460 117 88 77>,
+ <1546 499 120 84 72>,
+ <1645 541 124 86 73>,
+ <1790 600 126 87 73>,
+ <2091 660 128 87 73>,
+ <2167 679 127 86 73>,
+ <2329 690 130 87 74>,
+ <2623 722 134 89 75>,
+ <3022 764 140 93 77>,
+ <3564 817 149 96 79>,
+ <4335 880 157 98 78>,
+ <5564 956 160 97 77>,
+ <7560 1065 169 99 79>,
+ <11352 1228 192 105 82>,
+ <19407 1734 232 116 88>,
+ <38753 3324 311 141 104>;
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm-pm8909-rpm-regulator.dtsi b/arch/arm64/boot/dts/qcom/msm-pm8909-rpm-regulator.dtsi
new file mode 100644
index 0000000..624ed2c
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm-pm8909-rpm-regulator.dtsi
@@ -0,0 +1,317 @@
+/* Copyright (c) 2014, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&rpm_bus {
+ rpm-regulator-smpa1 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "smpa";
+ qcom,resource-id = <1>;
+ qcom,regulator-type = <1>;
+ qcom,hpm-min-load = <100000>;
+ status = "disabled";
+
+ regulator-s1 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_s1";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-smpa2 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "smpa";
+ qcom,resource-id = <2>;
+ qcom,regulator-type = <1>;
+ qcom,hpm-min-load = <100000>;
+ status = "disabled";
+
+ regulator-s2 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_s2";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa1 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <1>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l1 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l1";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa2 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <2>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l2 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l2";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa3 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <3>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l3 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l3";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa4 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <4>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l4 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l4";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa5 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <5>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l5 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l5";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa6 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <6>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l6 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l6";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa7 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <7>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l7 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l7";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa8 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <8>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l8 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l8";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa9 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <9>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l9 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l9";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa10 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <10>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l10 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l10";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa11 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <11>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l11 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l11";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa12 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <12>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l12 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l12";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa13 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <13>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <5000>;
+ status = "disabled";
+
+ regulator-l13 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l13";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa14 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <14>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <5000>;
+ status = "disabled";
+
+ regulator-l14 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l14";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa15 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <15>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <5000>;
+ status = "disabled";
+
+ regulator-l15 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l15";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa17 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <17>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l17 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l17";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+
+ rpm-regulator-ldoa18 {
+ compatible = "qcom,rpm-smd-regulator-resource";
+ qcom,resource-name = "ldoa";
+ qcom,resource-id = <18>;
+ qcom,regulator-type = <0>;
+ qcom,hpm-min-load = <10000>;
+ status = "disabled";
+
+ regulator-l18 {
+ compatible = "qcom,rpm-smd-regulator";
+ regulator-name = "pm8909_l18";
+ qcom,set = <3>;
+ status = "disabled";
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm-pm8909.dtsi b/arch/arm64/boot/dts/qcom/msm-pm8909.dtsi
new file mode 100644
index 0000000..ecbcbf3
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm-pm8909.dtsi
@@ -0,0 +1,571 @@
+/* Copyright (c) 2014-2015, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&spmi_bus {
+
+ qcom,pm8909@0 {
+ spmi-slave-container;
+ reg = <0x0>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ pm8909_revid: qcom,revid@100 {
+ compatible = "qcom,qpnp-revid";
+ reg = <0x100 0x100>;
+ };
+
+ pm8909_pon: qcom,power-on@800 {
+ compatible = "qcom,qpnp-power-on";
+ reg = <0x800 0x100>;
+ interrupts = <0x0 0x8 0x0>,
+ <0x0 0x8 0x1>;
+ interrupt-names = "kpdpwr", "resin";
+ qcom,pon-dbc-delay = <15625>;
+ qcom,system-reset;
+ qcom,clear-warm-reset;
+ qcom,store-hard-reset-reason;
+
+ qcom,pon_1 {
+ qcom,pon-type = <0>;
+ qcom,support-reset = <1>;
+ qcom,pull-up = <1>;
+ qcom,s1-timer = <10256>;
+ qcom,s2-timer = <2000>;
+ qcom,s2-type = <1>;
+ linux,code = <116>;
+ };
+
+ qcom,pon_2 {
+ qcom,pon-type = <1>;
+ qcom,pull-up = <1>;
+ linux,code = <114>;
+ };
+ };
+
+ pm8909_mpps: mpps {
+ compatible = "qcom,qpnp-pin";
+ spmi-dev-container;
+ gpio-controller;
+ #gpio-cells = <2>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ label = "pm8909-mpp";
+
+ mpp@a000 {
+ reg = <0xa000 0x100>;
+ qcom,pin-num = <1>;
+ };
+
+ mpp@a100 {
+ reg = <0xa100 0x100>;
+ qcom,pin-num = <2>;
+ };
+
+ mpp@a200 {
+ reg = <0xa200 0x100>;
+ qcom,pin-num = <3>;
+ };
+
+ mpp@a300 {
+ reg = <0xa300 0x100>;
+ qcom,pin-num = <4>;
+ };
+ };
+
+ pm8909_gpios: gpios {
+ compatible = "qcom,qpnp-pin";
+ spmi-dev-container;
+ gpio-controller;
+ #gpio-cells = <2>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ label = "pm8909-gpio";
+
+ gpio@c000 {
+ reg = <0xc000 0x100>;
+ qcom,pin-num = <1>;
+ };
+
+ gpio@c100 {
+ reg = <0xc100 0x100>;
+ qcom,pin-num = <2>;
+ };
+
+ gpio@c200 {
+ reg = <0xc200 0x100>;
+ qcom,pin-num = <3>;
+ };
+
+ gpio@c300 {
+ reg = <0xc300 0x100>;
+ qcom,pin-num = <4>;
+ };
+ };
+
+ pm8909_vadc: vadc@3100 {
+ compatible = "qcom,qpnp-vadc";
+ reg = <0x3100 0x100>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0x0 0x31 0x0>;
+ interrupt-names = "eoc-int-en-set";
+ qcom,adc-bit-resolution = <15>;
+ qcom,adc-vdd-reference = <1800>;
+ qcom,vadc-poll-eoc;
+ qcom,pmic-revid = <&pm8909_revid>;
+
+ chan@8 {
+ label = "die_temp";
+ reg = <8>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <3>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@9 {
+ label = "ref_625mv";
+ reg = <9>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@a {
+ label = "ref_1250v";
+ reg = <0xa>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+ };
+
+ pm8909_adc_tm: vadc@3400 {
+ compatible = "qcom,qpnp-adc-tm";
+ reg = <0x3400 0x100>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0x0 0x34 0x0>,
+ <0x0 0x34 0x3>,
+ <0x0 0x34 0x4>;
+ interrupt-names = "eoc-int-en-set",
+ "high-thr-en-set",
+ "low-thr-en-set";
+ qcom,adc-bit-resolution = <15>;
+ qcom,adc-vdd-reference = <1800>;
+ qcom,adc_tm-vadc = <&pm8909_vadc>;
+ };
+
+ pm8909_rtc: qcom,pm8909_rtc {
+ spmi-dev-container;
+ compatible = "qcom,qpnp-rtc";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ qcom,qpnp-rtc-write = <0>;
+ qcom,qpnp-rtc-alarm-pwrup = <0>;
+
+ qcom,pm8909_rtc_rw@6000 {
+ reg = <0x6000 0x100>;
+ };
+ qcom,pm8909_rtc_alarm@6100 {
+ reg = <0x6100 0x100>;
+ interrupts = <0x0 0x61 0x1>;
+ };
+ };
+
+ qcom,leds@a300 {
+ compatible = "qcom,leds-qpnp";
+ reg = <0xa300 0x100>;
+ label = "mpp";
+ };
+
+ pm8909_chg: qcom,charger {
+ spmi-dev-container;
+ compatible = "qcom,qpnp-linear-charger";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ qcom,vddmax-mv = <4200>;
+ qcom,vddsafe-mv = <4200>;
+ qcom,vinmin-mv = <4308>;
+ qcom,ibatsafe-ma = <1440>;
+ qcom,thermal-mitigation = <1440 720 630 0>;
+ qcom,cool-bat-decidegc = <100>;
+ qcom,warm-bat-decidegc = <450>;
+ qcom,cool-bat-mv = <4100>;
+ qcom,warm-bat-mv = <4100>;
+ qcom,ibatmax-warm-ma = <360>;
+ qcom,ibatmax-cool-ma = <360>;
+ qcom,batt-hot-percentage = <25>;
+ qcom,batt-cold-percentage = <80>;
+ qcom,tchg-mins = <232>;
+ qcom,chg-vadc = <&pm8909_vadc>;
+ qcom,chg-adc_tm = <&pm8909_adc_tm>;
+
+ status = "disabled";
+
+ qcom,chgr@1000 {
+ reg = <0x1000 0x100>;
+ interrupts = <0x0 0x10 0x7>,
+ <0x0 0x10 0x6>,
+ <0x0 0x10 0x5>,
+ <0x0 0x10 0x0>;
+ interrupt-names = "chg-done",
+ "chg-failed",
+ "fast-chg-on",
+ "vbat-det-lo";
+ };
+
+ qcom,bat-if@1200 {
+ reg = <0x1200 0x100>;
+ interrupts = <0x0 0x12 0x1>,
+ <0x0 0x12 0x0>;
+ interrupt-names = "bat-temp-ok",
+ "batt-pres";
+ };
+
+ qcom,usb-chgpth@1300 {
+ reg = <0x1300 0x100>;
+ interrupts = <0 0x13 0x4>,
+ <0 0x13 0x2>,
+ <0 0x13 0x1>;
+ interrupt-names = "usb-over-temp",
+ "chg-gone",
+ "usbin-valid";
+ };
+
+ qcom,chg-misc@1600 {
+ reg = <0x1600 0x100>;
+ };
+ };
+
+ pm8909_tz: qcom,temp-alarm@2400 {
+ compatible = "qcom,qpnp-temp-alarm";
+ reg = <0x2400 0x100>;
+ interrupts = <0x0 0x24 0x0>;
+ label = "pm8909_tz";
+ qcom,channel-num = <8>;
+ qcom,threshold-set = <0>;
+ qcom,temp_alarm-vadc = <&pm8909_vadc>;
+ };
+
+ pm8909_bms: qcom,vmbms {
+ spmi-dev-container;
+ compatible = "qcom,qpnp-vm-bms";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ status = "disabled";
+
+ qcom,v-cutoff-uv = <3400000>;
+ qcom,max-voltage-uv = <4200000>;
+ qcom,r-conn-mohm = <0>;
+ qcom,shutdown-soc-valid-limit = <100>;
+ qcom,low-soc-calculate-soc-threshold = <15>;
+ qcom,low-voltage-calculate-soc-ms = <1000>;
+ qcom,low-soc-calculate-soc-ms = <5000>;
+ qcom,calculate-soc-ms = <20000>;
+ qcom,volatge-soc-timeout-ms = <60000>;
+ qcom,low-voltage-threshold = <3450000>;
+ qcom,s3-ocv-tolerence-uv = <1200>;
+ qcom,s2-fifo-length = <5>;
+ qcom,low-soc-fifo-length = <2>;
+ qcom,bms-vadc = <&pm8909_vadc>;
+ qcom,bms-adc_tm = <&pm8909_adc_tm>;
+ qcom,pmic-revid = <&pm8909_revid>;
+
+ qcom,force-s3-on-suspend;
+ qcom,force-s2-in-charging;
+ qcom,report-charger-eoc;
+ qcom,resume-soc = <99>;
+
+ qcom,batt-pres-status@1208 {
+ reg = <0x1208 0x1>;
+ };
+
+ qcom,qpnp-chg-pres@1008 {
+ reg = <0x1008 0x1>;
+ };
+
+ qcom,vm-bms@4000 {
+ reg = <0x4000 0x100>;
+ interrupts = <0x0 0x40 0x0>,
+ <0x0 0x40 0x3>,
+ <0x0 0x40 0x4>,
+ <0x0 0x40 0x5>;
+
+ interrupt-names = "leave_cv",
+ "ocv_thr",
+ "fifo_update_done",
+ "fsm_state_change";
+ };
+ };
+ };
+
+ qcom,pm8909@1 {
+ spmi-slave-container;
+ reg = <0x1>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ regulator@1400 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_s1";
+ spmi-dev-container;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0x1400 0x300>;
+ status = "disabled";
+
+ qcom,ctl@1400 {
+ reg = <0x1400 0x100>;
+ };
+ qcom,ps@1500 {
+ reg = <0x1500 0x100>;
+ };
+ qcom,freq@1600 {
+ reg = <0x1600 0x100>;
+ };
+ };
+
+ regulator@1700 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_s2";
+ spmi-dev-container;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0x1700 0x300>;
+ status = "disabled";
+
+ qcom,ctl@1700 {
+ reg = <0x1700 0x100>;
+ };
+ qcom,ps@1800 {
+ reg = <0x1800 0x100>;
+ };
+ qcom,freq@1900 {
+ reg = <0x1900 0x100>;
+ };
+ };
+
+ regulator@4000 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l1";
+ reg = <0x4000 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4100 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l2";
+ reg = <0x4100 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4200 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l3";
+ reg = <0x4200 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4300 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l4";
+ reg = <0x4300 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4400 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l5";
+ reg = <0x4400 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4500 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l6";
+ reg = <0x4500 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4600 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l7";
+ reg = <0x4600 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4700 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l8";
+ reg = <0x4700 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4800 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l9";
+ reg = <0x4800 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4900 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l10";
+ reg = <0x4900 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4a00 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l11";
+ reg = <0x4a00 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4b00 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l12";
+ reg = <0x4b00 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4c00 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l13";
+ reg = <0x4c00 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4d00 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l14";
+ reg = <0x4d00 0x100>;
+ status = "disabled";
+ };
+
+ regulator@4e00 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l15";
+ reg = <0x4e00 0x100>;
+ status = "disabled";
+ };
+
+ regulator@5000 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l17";
+ reg = <0x5000 0x100>;
+ status = "disabled";
+ };
+
+ regulator@5100 {
+ compatible = "qcom,qpnp-regulator";
+ regulator-name = "8909_l18";
+ reg = <0x5100 0x100>;
+ status = "disabled";
+ };
+
+ pm8909_vib: qcom,vibrator@c000 {
+ compatible = "qcom,qpnp-vibrator";
+ reg = <0xc000 0x100>;
+ label = "vibrator";
+ status = "disabled";
+ };
+
+ pm8909_conga_dig: 8909_wcd_codec@f000 {
+ compatible = "qcom,msm8x16_wcd_codec";
+ reg = <0xf000 0x100>;
+ interrupt-parent = <&spmi_bus>;
+ interrupts = <0x1 0xf0 0x0>,
+ <0x1 0xf0 0x1>,
+ <0x1 0xf0 0x2>,
+ <0x1 0xf0 0x3>,
+ <0x1 0xf0 0x4>,
+ <0x1 0xf0 0x5>,
+ <0x1 0xf0 0x6>,
+ <0x1 0xf0 0x7>;
+ interrupt-names = "spk_cnp_int",
+ "spk_clip_int",
+ "spk_ocp_int",
+ "ins_rem_det1",
+ "but_rel_det",
+ "but_press_det",
+ "ins_rem_det",
+ "mbhc_int";
+
+ cdc-vdda-cp-supply = <&pm8909_s2>;
+ qcom,cdc-vdda-cp-voltage = <1800000 2200000>;
+ qcom,cdc-vdda-cp-current = <500000>;
+
+ cdc-vdda-h-supply = <&pm8909_l5>;
+ qcom,cdc-vdda-h-voltage = <1800000 1800000>;
+ qcom,cdc-vdda-h-current = <10000>;
+
+ cdc-vdd-px-supply = <&pm8909_l5>;
+ qcom,cdc-vdd-px-voltage = <1800000 1800000>;
+ qcom,cdc-vdd-px-current = <5000>;
+
+ cdc-vdd-pa-supply = <&pm8909_s2>;
+ qcom,cdc-vdd-pa-voltage = <1800000 2200000>;
+ qcom,cdc-vdd-pa-current = <260000>;
+
+ cdc-vdd-mic-bias-supply = <&pm8909_l13>;
+ qcom,cdc-vdd-mic-bias-voltage = <3075000 3075000>;
+ qcom,cdc-vdd-mic-bias-current = <5000>;
+
+ qcom,cdc-mclk-clk-rate = <9600000>;
+
+ qcom,cdc-static-supplies = "cdc-vdda-h",
+ "cdc-vdd-px",
+ "cdc-vdd-pa",
+ "cdc-vdda-cp";
+
+ qcom,cdc-on-demand-supplies = "cdc-vdd-mic-bias";
+ };
+
+ pm8909_conga_analog: 8909_wcd_codec@f100 {
+ compatible = "qcom,msm8x16_wcd_codec";
+ reg = <0xf100 0x100>;
+ interrupt-parent = <&spmi_bus>;
+ interrupts = <0x1 0xf1 0x0>,
+ <0x1 0xf1 0x1>,
+ <0x1 0xf1 0x2>,
+ <0x1 0xf1 0x3>,
+ <0x1 0xf1 0x4>,
+ <0x1 0xf1 0x5>;
+ interrupt-names = "ear_ocp_int",
+ "hphr_ocp_int",
+ "hphl_ocp_det",
+ "ear_cnp_int",
+ "hphr_cnp_int",
+ "hphl_cnp_int";
+ };
+
+ pm8909_pwm: pwm@bc00 {
+ compatible = "qcom,qpnp-pwm";
+ reg = <0xbc00 0x100>;
+ reg-names = "qpnp-lpg-channel-base";
+ qcom,channel-id = <0>;
+ qcom,supported-sizes = <6>, <9>;
+ #pwm-cells = <2>;
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-256mb-memory.dtsi b/arch/arm64/boot/dts/qcom/msm8905-256mb-memory.dtsi
new file mode 100644
index 0000000..49147e4
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-256mb-memory.dtsi
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&modem_adsp_mem {
+ reg = <0x0 0x88000000 0x0 0x03c00000>;
+};
+
+&peripheral_mem {
+ reg = <0x0 0x8bc00000 0x0 0x0300000>;
+};
+
+&venus_qseecom_mem {
+ reg = <0 0 0 0x800000>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-512mb-memory.dtsi b/arch/arm64/boot/dts/qcom/msm8905-512mb-memory.dtsi
new file mode 100644
index 0000000..5bd3e2e
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-512mb-memory.dtsi
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&modem_adsp_mem {
+ reg = <0x0 0x88000000 0x0 0x05000000>;
+};
+
+&peripheral_mem {
+ reg = <0x0 0x8D000000 0x0 0x0500000>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-512mb-memory_qseev4.dtsi b/arch/arm64/boot/dts/qcom/msm8905-512mb-memory_qseev4.dtsi
new file mode 100644
index 0000000..0d6f6a4
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-512mb-memory_qseev4.dtsi
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&external_image_mem {
+ reg = <0x0 0x87900000 0x0 0x700000>;
+};
+
+&modem_adsp_mem {
+ reg = <0x0 0x88000000 0x0 0x5000000>;
+};
+
+&peripheral_mem {
+ reg = <0x0 0x8D000000 0x0 0x0500000>;
+};
+
+&reserved_mem {
+ secure_display_memory: secure_region {
+ linux,reserve-contiguous-region;
+ reg = <0 0 0 0x400000>;
+ label = "secure_display_mem";
+ };
+};
+
+&qcom_seecom {
+ reg = <0x87900000 0x300000>;
+};
+
+&mdss_dsi{
+ vdda-supply = <&pm8909_l2>;
+ vddio-supply = <&pm8909_l6>;
+ qcom,mdss_dsi_ctrl0@1ac8000 {
+ vdd-supply = <&pm8909_l17>;
+ vddio-supply = <&pm8909_l6>;
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-camera-sensor-sku3.dtsi b/arch/arm64/boot/dts/qcom/msm8905-camera-sensor-sku3.dtsi
new file mode 100644
index 0000000..7ef0064
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-camera-sensor-sku3.dtsi
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+&msm_gpio {
+ BC847_pins {
+ pins = "gpio0";
+ qcom,num-grp-pins = <1>;
+ qcom,pin-func = <0>;
+ label = "BC847_pins";
+ BC847_default: en_default {
+ drive-strength = <2>;
+ bias-pull-down;
+ };
+ };
+};
+
+&soc {
+ flash_BC847:flashlight {
+ compatible = "qcom,leds-gpio-flash";
+ status = "okay";
+ pinctrl-names = "flash_default";
+ pinctrl-0 = <&BC847_default>;
+ qcom,flash-en = <&pm8909_gpios 4 0>;
+ qcom,flash-now = <&msm_gpio 0 0>;
+ qcom,op-seq = "flash_en", "flash_now";
+ qcom,torch-seq-val = <1 0>;
+ qcom,flash-seq-val = <1 0>;
+ linux,name = "flashlight";
+ linux,default-trigger = "flashlight-trigger";
+ };
+ led_flash0: qcom,camera-led-flash {
+ cell-index = <0>;
+ compatible = "qcom,camera-led-flash";
+ qcom,flash-type = <3>;
+ qcom,flash-source = <&flash_BC847>;
+ qcom,torch-source = <&flash_BC847>;
+ };
+};
+
+&i2c_3 {
+
+ actuator0: qcom,actuator@0 {
+ cell-index = <0>;
+ reg = <0x3>;
+ compatible = "qcom,actuator";
+ qcom,cci-master = <0>;
+ cam_vaf-supply = <&pm8909_l8>;
+ qcom,cam-vreg-name = "cam_vaf";
+ qcom,cam-vreg-type = <0>;
+ qcom,cam-vreg-min-voltage = <2850000>;
+ qcom,cam-vreg-max-voltage = <2900000>;
+ qcom,cam-vreg-op-mode = <80000>;
+ };
+
+ eeprom0: qcom,eeprom@6d{
+ cell-index = <0>;
+ reg = <0x6d>;
+ qcom,eeprom-name = "sunrise_pc0fe";
+ compatible = "qcom,eeprom";
+ qcom,slave-addr = <0x6d>;
+ qcom,cci-master = <0>;
+
+ qcom,num-blocks = <10>;
+ qcom,page0 = <1 0x0100 2 0x01 1 1>;
+ qcom,poll0 = <0 0x0 2 0 1 1>;
+ qcom,mem0 = <0 0x0 2 0 1 0>;
+ qcom,page1 = <1 0x5002 2 0xa8 1 1>;
+ qcom,poll1 = <0 0x0 2 0 1 1>;
+ qcom,mem1 = <0 0x0 2 0 1 0>;
+ qcom,page2 = <1 0x3d84 2 0xc0 1 1>;
+ qcom,poll2 = <0 0x0 2 0 1 1>;
+ qcom,mem2 = <0 0x0 2 0 1 0>;
+ qcom,page3 = <1 0x3d88 2 0x70 1 1>;
+ qcom,poll3 = <0 0x0 2 0 1 1>;
+ qcom,mem3 = <0 0x3d00 2 0 1 0>;
+ qcom,page4 = <1 0x3d89 2 0x10 1 1>;
+ qcom,poll4 = <0 0x0 2 0 1 1>;
+ qcom,mem4 = <0 0x3d00 2 0 1 0>;
+ qcom,page5 = <1 0x3d8a 2 0x70 1 1>;
+ qcom,poll5 = <0 0x0 2 0 1 1>;
+ qcom,mem5 = <0 0x3d00 2 0 1 0>;
+ qcom,page6 = <1 0x3d8b 2 0x29 1 1>;
+ qcom,poll6 = <0 0x0 2 0 1 1>;
+ qcom,mem6 = <0 0x3d00 2 0 1 0>;
+ qcom,page7 = <1 0x3d81 2 0x01 1 5>;
+ qcom,poll7 = <0 0x0 2 0 1 1>;
+ qcom,mem7 = <26 0x7010 2 0 1 1>;
+ qcom,page8 = <1 0x5002 2 0xaa 1 1>;
+ qcom,poll8 = <0 0x0 2 0 1 1>;
+ qcom,mem8 = <0 0x0 2 0 1 0>;
+ qcom,page9 = <1 0x0100 2 0x00 1 1>;
+ qcom,poll9 = <0 0x0 2 0 1 1>;
+ qcom,mem9 = <0 0x0 2 0 1 0>;
+
+ cam_vdig-supply = <&pm8909_l2>;
+ cam_vana-supply = <&pm8909_l17>;
+ cam_vio-supply = <&pm8909_l6>;
+ cam_vaf-supply = <&pm8909_l8>;
+ qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana",
+ "cam_vaf";
+ qcom,cam-vreg-type = <0 1 0 0>;
+ qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>;
+ qcom,cam-vreg-max-voltage = <1200000 0 2850000 2900000>;
+ qcom,cam-vreg-op-mode = <200000 0 80000 100000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk0_default
+ &cam_sensor_rear_default>;
+ pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
+ gpios = <&msm_gpio 26 0>,
+ <&msm_gpio 35 0>,
+ <&msm_gpio 34 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK",
+ "CAM_RESET1",
+ "CAM_STANDBY";
+
+ qcom,cam-power-seq-type = "sensor_vreg",
+ "sensor_vreg", "sensor_vreg",
+ "sensor_gpio", "sensor_gpio",
+ "sensor_clk";
+ qcom,cam-power-seq-val = "cam_vio",
+ "cam_vana", "cam_vdig",
+ "sensor_gpio_reset",
+ "sensor_gpio_standby",
+ "sensor_cam_mclk" ;
+ qcom,cam-power-seq-cfg-val = <1 1 1 1 1 24000000>;
+ qcom,cam-power-seq-delay = <10 10 10 10 10 5>;
+
+ clocks = <&clock_gcc clk_mclk0_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk0_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ };
+
+ qcom,camera@0 {
+ cell-index = <0>;
+ compatible = "qcom,camera";
+ reg = <0x2>;
+ qcom,special-support-sensors="ov5670_30010a3", "gc2365";
+ qcom,eeprom-src = <&eeprom0>;
+ qcom,csiphy-sd-index = <0>;
+ qcom,csid-sd-index = <0>;
+ qcom,mount-angle = <90>;
+ qcom,actuator-src = <&actuator0>;
+ qcom,led-flash-src = <&led_flash0>;
+ cam_vana-supply = <&pm8909_l17>;
+ cam_vio-supply = <&pm8909_l6>;
+ cam_vaf-supply = <&pm8909_l8>;
+ qcom,cam-vreg-name = "cam_vio", "cam_vana",
+ "cam_vaf";
+ qcom,cam-vreg-type = <1 0 0>;
+ qcom,cam-vreg-min-voltage = <0 2800000 2850000>;
+ qcom,cam-vreg-max-voltage = <0 2850000 2900000>;
+ qcom,cam-vreg-op-mode = <0 80000 100000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk0_default
+ &cam_sensor_rear_default>;
+ pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
+ gpios = <&msm_gpio 26 0>,
+ <&msm_gpio 35 0>,
+ <&msm_gpio 34 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK",
+ "CAM_RESET1",
+ "CAM_STANDBY";
+ qcom,sensor-position = <0>;
+ qcom,sensor-mode = <0>;
+ qcom,cci-master = <0>;
+ status = "ok";
+ clocks = <&clock_gcc clk_mclk0_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk0_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ };
+
+ qcom,camera@1 {
+ cell-index = <1>;
+ compatible = "qcom,camera";
+ reg = <0x1>;
+ qcom,special-support-sensors="ov2680_cht852b", "gc030a";
+ qcom,csiphy-sd-index = <0>;
+ qcom,csid-sd-index = <0>;
+ qcom,mount-angle = <90>;
+ cam_vana-supply = <&pm8909_l17>;
+ cam_vio-supply = <&pm8909_l6>;
+ qcom,cam-vreg-name = "cam_vio", "cam_vana";
+ qcom,cam-vreg-type = <1 0>;
+ qcom,cam-vreg-min-voltage = <0 2800000>;
+ qcom,cam-vreg-max-voltage = <0 2850000>;
+ qcom,cam-vreg-op-mode = <0 80000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 =
+ <&cam_sensor_mclk1_default &cam_sensor_front_default>;
+ pinctrl-1 = <&cam_sensor_mclk1_sleep &cam_sensor_front_sleep>;
+ gpios = <&msm_gpio 27 0>,
+ <&msm_gpio 28 0>,
+ <&msm_gpio 33 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK",
+ "CAM_RESET",
+ "CAM_STANDBY";
+ qcom,cci-master = <0>;
+ status = "ok";
+ clocks = <&clock_gcc clk_mclk1_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk1_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-camera-sensor-skub.dtsi b/arch/arm64/boot/dts/qcom/msm8905-camera-sensor-skub.dtsi
new file mode 100644
index 0000000..699b8c1
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-camera-sensor-skub.dtsi
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2018, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+&msm_gpio {
+ SY7807_pins {
+ pins = "gpio32";
+ qcom,num-grp-pins = <1>;
+ qcom,pin-func = <2>;
+ label = "SY7807_pins";
+ SY7807_default: en_default {
+ drive-strength = <2>;
+ bias-pull-down;
+ };
+ };
+};
+
+&soc {
+ flash_SY7807:flashlight {
+ compatible = "qcom,leds-gpio-flash";
+ status = "okay";
+ pinctrl-names = "flash_default";
+ pinctrl-0 = <&SY7807_default>;
+ qcom,flash-en = <&pm8909_gpios 4 0>;
+ qcom,flash-now = <&msm_gpio 32 0>;
+ clocks = <&clock_gcc clk_gcc_camss_gp1_clk>,
+ <&clock_gcc clk_camss_gp1_clk_src>;
+ clock-names = "flash_now_clk", "flash_now_duty_cycle_clk";
+ qcom,op-seq = "flash_en", "flash_now";
+ qcom,torch-seq-val = <1 0>;
+ qcom,flash-seq-val = <0 1>;
+ qcom,duty-cycle = <0 30>;
+ qcom,clk-freq = <0 150000>;
+ linux,name = "flashlight";
+ linux,default-trigger = "flashlight-trigger";
+ };
+ led_flash0: qcom,camera-led-flash {
+ cell-index = <0>;
+ compatible = "qcom,camera-led-flash";
+ qcom,flash-type = <3>;
+ qcom,flash-source = <&flash_SY7807>;
+ qcom,torch-source = <&flash_SY7807>;
+ };
+};
+
+&i2c_3 {
+
+ actuator0: qcom,actuator@0 {
+ cell-index = <0>;
+ reg = <0x3>;
+ compatible = "qcom,actuator";
+ qcom,cci-master = <0>;
+ cam_vaf-supply = <&pm8909_l8>;
+ qcom,cam-vreg-name = "cam_vaf";
+ qcom,cam-vreg-type = <0>;
+ qcom,cam-vreg-min-voltage = <2850000>;
+ qcom,cam-vreg-max-voltage = <2900000>;
+ qcom,cam-vreg-op-mode = <80000>;
+ };
+
+ eeprom0: qcom,eeprom@6d{
+ cell-index = <0>;
+ reg = <0x6d>;
+ qcom,eeprom-name = "sunrise_pc0fe";
+ compatible = "qcom,eeprom";
+ qcom,slave-addr = <0x6d>;
+ qcom,cci-master = <0>;
+
+ qcom,num-blocks = <10>;
+ qcom,page0 = <1 0x0100 2 0x01 1 1>;
+ qcom,poll0 = <0 0x0 2 0 1 1>;
+ qcom,mem0 = <0 0x0 2 0 1 0>;
+ qcom,page1 = <1 0x5002 2 0xa8 1 1>;
+ qcom,poll1 = <0 0x0 2 0 1 1>;
+ qcom,mem1 = <0 0x0 2 0 1 0>;
+ qcom,page2 = <1 0x3d84 2 0xc0 1 1>;
+ qcom,poll2 = <0 0x0 2 0 1 1>;
+ qcom,mem2 = <0 0x0 2 0 1 0>;
+ qcom,page3 = <1 0x3d88 2 0x70 1 1>;
+ qcom,poll3 = <0 0x0 2 0 1 1>;
+ qcom,mem3 = <0 0x3d00 2 0 1 0>;
+ qcom,page4 = <1 0x3d89 2 0x10 1 1>;
+ qcom,poll4 = <0 0x0 2 0 1 1>;
+ qcom,mem4 = <0 0x3d00 2 0 1 0>;
+ qcom,page5 = <1 0x3d8a 2 0x70 1 1>;
+ qcom,poll5 = <0 0x0 2 0 1 1>;
+ qcom,mem5 = <0 0x3d00 2 0 1 0>;
+ qcom,page6 = <1 0x3d8b 2 0x29 1 1>;
+ qcom,poll6 = <0 0x0 2 0 1 1>;
+ qcom,mem6 = <0 0x3d00 2 0 1 0>;
+ qcom,page7 = <1 0x3d81 2 0x01 1 5>;
+ qcom,poll7 = <0 0x0 2 0 1 1>;
+ qcom,mem7 = <26 0x7010 2 0 1 1>;
+ qcom,page8 = <1 0x5002 2 0xaa 1 1>;
+ qcom,poll8 = <0 0x0 2 0 1 1>;
+ qcom,mem8 = <0 0x0 2 0 1 0>;
+ qcom,page9 = <1 0x0100 2 0x00 1 1>;
+ qcom,poll9 = <0 0x0 2 0 1 1>;
+ qcom,mem9 = <0 0x0 2 0 1 0>;
+
+ cam_vdig-supply = <&pm8909_l2>;
+ cam_vana-supply = <&pm8909_l17>;
+ cam_vio-supply = <&pm8909_l6>;
+ cam_vaf-supply = <&pm8909_l8>;
+ qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana",
+ "cam_vaf";
+ qcom,cam-vreg-type = <0 0 0 0>;
+ qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>;
+ qcom,cam-vreg-max-voltage = <1200000 1800000 2850000 2900000>;
+ qcom,cam-vreg-op-mode = <200000 0 80000 100000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk0_default
+ &cam_sensor_rear_default>;
+ pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
+ gpios = <&msm_gpio 26 0>,
+ <&msm_gpio 35 0>,
+ <&msm_gpio 34 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK",
+ "CAM_RESET1",
+ "CAM_STANDBY";
+
+ qcom,cam-power-seq-type = "sensor_vreg",
+ "sensor_vreg", "sensor_vreg",
+ "sensor_gpio", "sensor_gpio",
+ "sensor_clk";
+ qcom,cam-power-seq-val = "cam_vio",
+ "cam_vana", "cam_vdig",
+ "sensor_gpio_reset",
+ "sensor_gpio_standby",
+ "sensor_cam_mclk" ;
+ qcom,cam-power-seq-cfg-val = <1 1 1 1 1 24000000>;
+ qcom,cam-power-seq-delay = <10 10 10 10 10 5>;
+
+ clocks = <&clock_gcc clk_mclk0_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk0_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ };
+
+ qcom,camera@0 {
+ cell-index = <0>;
+ compatible = "qcom,camera";
+ reg = <0x2>;
+ qcom,special-support-sensors="ov5670_30010a3", "gc2365";
+ qcom,eeprom-src = <&eeprom0>;
+ qcom,csiphy-sd-index = <0>;
+ qcom,csid-sd-index = <0>;
+ qcom,mount-angle = <90>;
+ qcom,actuator-src = <&actuator0>;
+ qcom,led-flash-src = <&led_flash0>;
+ cam_vana-supply = <&pm8909_l17>;
+ cam_vio-supply = <&pm8909_l6>;
+ cam_vaf-supply = <&pm8909_l8>;
+ qcom,cam-vreg-name = "cam_vio", "cam_vana",
+ "cam_vaf";
+ qcom,cam-vreg-type = <0 0 0>;
+ qcom,cam-vreg-min-voltage = <1800000 2800000 2850000>;
+ qcom,cam-vreg-max-voltage = <1800000 2850000 2900000>;
+ qcom,cam-vreg-op-mode = <0 80000 100000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk0_default
+ &cam_sensor_rear_default>;
+ pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
+ gpios = <&msm_gpio 26 0>,
+ <&msm_gpio 35 0>,
+ <&msm_gpio 34 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK",
+ "CAM_RESET1",
+ "CAM_STANDBY";
+ qcom,sensor-position = <0>;
+ qcom,sensor-mode = <0>;
+ qcom,cci-master = <0>;
+ status = "ok";
+ clocks = <&clock_gcc clk_mclk0_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk0_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ };
+
+ qcom,camera@1 {
+ cell-index = <1>;
+ compatible = "qcom,camera";
+ reg = <0x1>;
+ qcom,special-support-sensors="ov2680_cht852b", "gc030a";
+ qcom,csiphy-sd-index = <0>;
+ qcom,csid-sd-index = <0>;
+ qcom,mount-angle = <90>;
+ cam_vana-supply = <&pm8909_l17>;
+ cam_vio-supply = <&pm8909_l6>;
+ qcom,cam-vreg-name = "cam_vio", "cam_vana";
+ qcom,cam-vreg-type = <0 0>;
+ qcom,cam-vreg-min-voltage = <1800000 2800000>;
+ qcom,cam-vreg-max-voltage = <1800000 2850000>;
+ qcom,cam-vreg-op-mode = <0 80000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 =
+ <&cam_sensor_mclk1_default &cam_sensor_front_default>;
+ pinctrl-1 = <&cam_sensor_mclk1_sleep &cam_sensor_front_sleep>;
+ gpios = <&msm_gpio 27 0>,
+ <&msm_gpio 28 0>,
+ <&msm_gpio 33 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK",
+ "CAM_RESET",
+ "CAM_STANDBY";
+ qcom,cci-master = <0>;
+ status = "ok";
+ clocks = <&clock_gcc clk_mclk1_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk1_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-qrd-sku3.dts b/arch/arm64/boot/dts/qcom/msm8905-qrd-sku3.dts
new file mode 100644
index 0000000..e35762e
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-qrd-sku3.dts
@@ -0,0 +1,21 @@
+/* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+
+#include "msm8905-qrd-sku3.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM8905 QRD SKU3";
+ compatible = "qcom,msm8909-qrd", "qcom,msm8909", "qcom,qrd";
+ qcom,board-id = <0x11000b 0x200>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-qrd-sku3.dtsi b/arch/arm64/boot/dts/qcom/msm8905-qrd-sku3.dtsi
new file mode 100644
index 0000000..6368955
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-qrd-sku3.dtsi
@@ -0,0 +1,282 @@
+/* Copyright (c) 2017-2018, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "msm8909-qrd.dtsi"
+#include "msm8905.dtsi"
+#include "msm8905-256mb-memory.dtsi"
+#include "msm8905-camera-sensor-sku3.dtsi"
+
+&soc {
+ sound {
+ compatible = "qcom,msm8x16-audio-codec";
+ qcom,model = "msm8909-sku3-snd-card";
+ qcom,msm-snd-card-id = <0>;
+ qcom,msm-codec-type = "internal";
+ qcom,msm-ext-pa = "primary";
+ qcom,msm-mclk-freq = <9600000>;
+ qcom,msm-mbhc-hphl-swh = <1>;
+ qcom,msm-mbhc-gnd-swh = <0>;
+ qcom,msm-hs-micbias-type = "internal";
+ qcom,msm-micbias1-ext-cap;
+ qcom,msm-micbias2-ext-cap;
+ qcom,audio-routing =
+ "RX_BIAS", "MCLK",
+ "SPK_RX_BIAS", "MCLK",
+ "INT_LDO_H", "MCLK",
+ "MIC BIAS Internal1", "Handset Mic",
+ "MIC BIAS Internal2", "Headset Mic",
+ "AMIC1", "MIC BIAS Internal1",
+ "AMIC2", "MIC BIAS Internal2";
+ pinctrl-names = "cdc_lines_act",
+ "cdc_lines_sus";
+ pinctrl-0 = <&cdc_pdm_lines_act>;
+ pinctrl-1 = <&cdc_pdm_lines_sus>;
+ asoc-platform = <&pcm0>, <&pcm1>, <&voip>, <&voice>,
+ <&loopback>, <&compress>, <&hostless>,
+ <&afe>, <&lsm>, <&routing>, <&lpa>,
+ <&voice_svc>;
+ asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1",
+ "msm-voip-dsp", "msm-pcm-voice",
+ "msm-pcm-loopback", "msm-compress-dsp",
+ "msm-pcm-hostless", "msm-pcm-afe",
+ "msm-lsm-client", "msm-pcm-routing",
+ "msm-pcm-lpa", "msm-voice-svc";
+ asoc-cpu = <&dai_pri_auxpcm>, <&dai_hdmi>,
+ <&dai_mi2s0>, <&dai_mi2s1>,
+ <&dai_mi2s2>, <&dai_mi2s3>,
+ <&sb_0_rx>, <&sb_0_tx>,
+ <&sb_1_rx>, <&sb_1_tx>,
+ <&sb_3_rx>, <&sb_3_tx>,
+ <&sb_4_rx>, <&sb_4_tx>,
+ <&bt_sco_rx>, <&bt_sco_tx>, <&bt_a2dp_rx>,
+ <&int_fm_rx>, <&int_fm_tx>,
+ <&afe_pcm_rx>, <&afe_pcm_tx>,
+ <&afe_proxy_rx>, <&afe_proxy_tx>,
+ <&incall_record_rx>, <&incall_record_tx>,
+ <&incall_music_rx>, <&incall_music_2_rx>;
+ asoc-cpu-names = "msm-dai-q6-auxpcm.1", "msm-dai-q6-hdmi.8",
+ "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1",
+ "msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3",
+ "msm-dai-q6-dev.16384", "msm-dai-q6-dev.16385",
+ "msm-dai-q6-dev.16386", "msm-dai-q6-dev.16387",
+ "msm-dai-q6-dev.16390", "msm-dai-q6-dev.16391",
+ "msm-dai-q6-dev.16392", "msm-dai-q6-dev.16393",
+ "msm-dai-q6-dev.12288", "msm-dai-q6-dev.12289",
+ "msm-dai-q6-dev.12290",
+ "msm-dai-q6-dev.12292", "msm-dai-q6-dev.12293",
+ "msm-dai-q6-dev.224", "msm-dai-q6-dev.225",
+ "msm-dai-q6-dev.241", "msm-dai-q6-dev.240",
+ "msm-dai-q6-dev.32771", "msm-dai-q6-dev.32772",
+ "msm-dai-q6-dev.32773", "msm-dai-q6-dev.32770";
+ asoc-codec = <&stub_codec>, <&pm8909_conga_dig>;
+ asoc-codec-names = "msm-stub-codec.1", "tombak_codec";
+ };
+
+ spi@78b9000 { /* BLSP1 QUP5 */
+ status = "okay";
+ qcom,mdss_spi_client {
+ reg = <0>;
+ compatible = "qcom,mdss-spi-client";
+ label = "MDSS SPI QUP5 CLIENT";
+ spi-max-frequency = <50000000>;
+ };
+ };
+
+ i2c@78b9000 {/* BLSP1 QUP5 */
+ status = "disabled";
+ };
+
+ mdss_spi: qcom,mdss_spi {
+ compatible = "qcom,mdss-spi-display";
+ label = "mdss spi panel";
+
+ qcom,mdss-fb-map = <&mdss_fb0>;
+ qcom,mdss-mdp = <&mdss_mdp>;
+ vdd-supply = <&pm8909_l17>;
+ vddio-supply = <&pm8909_l6>;
+
+ qcom,panel-supply-entries {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ qcom,panel-supply-entry@0 {
+ reg = <0>;
+ qcom,supply-name = "vdd";
+ qcom,supply-min-voltage = <2850000>;
+ qcom,supply-max-voltage = <2850000>;
+ qcom,supply-enable-load = <100000>;
+ qcom,supply-disable-load = <100>;
+ };
+
+ qcom,panel-supply-entry@1 {
+ reg = <1>;
+ qcom,supply-name = "vddio";
+ qcom,supply-min-voltage = <1800000>;
+ qcom,supply-max-voltage = <1800000>;
+ qcom,supply-enable-load = <100000>;
+ qcom,supply-disable-load = <100>;
+ };
+ };
+ };
+
+ matrix_keypad: matrix_keypad@0 {
+ compatible = "gpio-matrix-keypad";
+ input-name = "matrix_keypad";
+ debounce-delay-ms = <5>;
+ col-scan-delay-us = <2>;
+ pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
+ pinctrl-0 = <&gpio_key_active>;
+ pinctrl-1 = <&gpio_key_suspend>;
+
+ row-gpios = <&msm_gpio 97 0
+ &msm_gpio 96 0
+ &msm_gpio 95 0
+ &msm_gpio 94 0>;
+
+ col-gpios = <&msm_gpio 52 0
+ &msm_gpio 56 0
+ &msm_gpio 7 0
+ &msm_gpio 99 0
+ &msm_gpio 6 0>;
+ linux,keymap = <0x000000e7 /* (0,0) KEY_DIAL */
+ 0x00010004 /* (1,0) KEY_3 */
+ 0x00020007 /* (2,0) KEY_6 */
+ 0x0003000a /* (3,0) KEY_9 */
+ 0x0004020b /* (4,0) KEY_NUMERIC_POUND */
+
+ 0x01000069 /* (0,1) KEY_LEFT */
+ 0x01010003 /* (1,1) KEY_2 */
+ 0x01020006 /* (2,1) KEY_5 */
+ 0x01030009 /* (3,1) KEY_8 */
+ 0x0104000b /* (4,1) KEY_0 */
+
+ 0x0200008b /* (0,2) KEY_MENU */
+ 0x02010002 /* (1,2) KEY_1 */
+ 0x02020005 /* (2,2) KEY_4 */
+ 0x02030008 /* (3,2) KEY_7 */
+ 0x0204020a /* (4,2) KEY_NUMERIC_STAR */
+
+ 0x03000160 /* (0,3) KEY_OK */
+ 0x0301006a /* (1,3) KEY_RIGHT */
+ 0x0302009e /* (3,3) KEY_BACK */
+ 0x03030067 /* (3,3) KEY_UP */
+ 0x0304006c>; /* (3,4) KEY_DOWN */
+
+ };
+};
+
+#include "spi-panel-st7789v2-qvga-cmd.dtsi"
+
+&mdss_mdp {
+ qcom,mdss-pref-prim-intf = "spi";
+};
+
+&spi_st7789v2_qvga_cmd {
+ qcom,mdss-spi-bl-pmic-control-type = "bl_ctrl_pwm";
+ qcom,mdss-spi-bl-pmic-pwm-frequency = <100>;
+ qcom,mdss-spi-bl-pmic-bank-select = <0>;
+ qcom,mdss-spi-pwm-gpio = <&pm8909_mpps 2 0>;
+ qcom,cont-splash-enabled;
+};
+
+&msm_gpio {
+ pmx_mdss_te {
+ mdss_te_active: mdss_te_active {
+ mux {
+ pins = "gpio24";
+ };
+ config {
+ pins = "gpio24";
+ };
+ };
+ mdss_te_suspend: mdss_te_suspend {
+ mux {
+ pins = "gpio24";
+ };
+ config {
+ pins = "gpio24";
+ };
+ };
+ };
+};
+
+&mdss_spi {
+ qcom,spi-pref-prim-pan = <&spi_st7789v2_qvga_cmd>;
+ pinctrl-names = "mdss_default", "mdss_sleep";
+ pinctrl-0 = <&mdss_te_active>;
+ pinctrl-1 = <&mdss_te_suspend>;
+
+ qcom,platform-te-gpio = <&msm_gpio 24 0>;
+ qcom,platform-reset-gpio = <&msm_gpio 25 0>;
+ qcom,platform-spi-dc-gpio = <&msm_gpio 110 0>;
+};
+
+&qnand_1 {
+ status = "ok";
+};
+
+&pm8909_chg {
+ qcom,vddmax-mv = <4350>;
+ qcom,vddsafe-mv = <4380>;
+ qcom,vinmin-mv = <4470>;
+ qcom,batt-hot-percentage = <35>;
+ qcom,batt-cold-percentage = <70>;
+ qcom,tchg-mins = <360>;
+ qcom,chgr-led-support;
+ qcom,disable-vbatdet-based-recharge;
+ status = "okay";
+};
+
+/ {
+ qrd_batterydata: qcom,battery-data {
+ /* This need to be updated according to new battery */
+ qcom,rpull-up-kohm = <100>;
+ qcom,vref-batt-therm = <1800000>;
+
+ /* This need tobe updated according to new battery */
+ #include "batterydata-qrd-skua-4v35-2000mah.dtsi"
+ };
+};
+
+&pm8909_bms {
+ status = "okay";
+ qcom,force-bms-active-on-charger;
+ qcom,battery-data = <&qrd_batterydata>;
+};
+
+&pm8909_vib {
+ status = "okay";
+ qcom,vib-timeout-ms = <15000>;
+ qcom,vib-vtg-level-mV = <3100>;
+};
+
+&sdc2_cd_on {
+ /delete-property/ bias-pull-up;
+ bias-pull-down;
+};
+
+&sdc2_cd_off {
+ /delete-property/ bias-disable;
+ bias-pull-down;
+};
+
+&sdhc_2 {
+ qcom,nonhotplug;
+ interrupts = <0 1>;
+ interrupt-map = <0 &intc 0 125 0
+ 1 &intc 0 221 0>;
+ interrupt-names = "hc_irq", "pwr_irq";
+ /delete-property/ cd-gpios;
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on>;
+ pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-qrd-skub.dts b/arch/arm64/boot/dts/qcom/msm8905-qrd-skub.dts
new file mode 100644
index 0000000..a5272f2
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-qrd-skub.dts
@@ -0,0 +1,23 @@
+/* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+
+#include "msm8905-qrd-skub.dtsi"
+#include "msm8905-512mb-memory.dtsi"
+#include "msm8909-gpu-qhd.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM8905 QRD SKUB";
+ compatible = "qcom,msm8909-qrd", "qcom,msm8909", "qcom,qrd";
+ qcom,board-id = <0x1000b 0x100>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-qrd-skub.dtsi b/arch/arm64/boot/dts/qcom/msm8905-qrd-skub.dtsi
new file mode 100644
index 0000000..01e48d4
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-qrd-skub.dtsi
@@ -0,0 +1,423 @@
+/* Copyright (c) 2017-2018, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "msm8909-qrd.dtsi"
+#include "msm8905.dtsi"
+#include "msm8905-camera-sensor-skub.dtsi"
+
+&soc {
+ matrix_keypad: matrix_keypad@0 {
+ compatible = "gpio-matrix-keypad";
+ input-name = "matrix_keypad";
+ debounce-delay-ms = <5>;
+ col-scan-delay-us = <2>;
+ pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
+ pinctrl-0 = <&gpio_key_active>;
+ pinctrl-1 = <&gpio_key_suspend>;
+
+ row-gpios = <&msm_gpio 97 0
+ &msm_gpio 96 0
+ &msm_gpio 95 0
+ &msm_gpio 94 0>;
+
+ col-gpios = <&msm_gpio 52 0
+ &msm_gpio 56 0
+ &msm_gpio 7 0
+ &msm_gpio 99 0
+ &msm_gpio 6 0>;
+ linux,keymap = <0x000000e7 /* (0,0) KEY_DIAL */
+ 0x00010004 /* (1,0) KEY_3 */
+ 0x00020007 /* (2,0) KEY_6 */
+ 0x0003000A /* (3,0) KEY_9 */
+ 0x0004020b /* (4,0) KEY_NUMERIC_POUND */
+
+ 0x01000069 /* (0,1) KEY_LEFT */
+ 0x01010003 /* (1,1) KEY_2 */
+ 0x01020006 /* (2,1) KEY_5 */
+ 0x01030009 /* (3,1) KEY_8 */
+ 0x0104000b /* (4,1) KEY_0 */
+
+ 0x0200008b /* (0,2) KEY_MENU */
+ 0x02010002 /* (1,2) KEY_1 */
+ 0x02020005 /* (2,2) KEY_4 */
+ 0x02030008 /* (3,2) KEY_7 */
+ 0x0204020a /* (4,2) KEY_NUMERIC_STAR */
+
+ 0x03000160 /* (0,3) KEY_OK */
+ 0x0301006A /* (1,3) KEY_RIGHT */
+ 0x0302009e>; /* (3,3) KEY_BACK */
+
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+ input-name = "gpio-keys";
+ pinctrl-names =
+ "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
+ pinctrl-0 = <&gpio_key_active>;
+ pinctrl-1 = <&gpio_key_suspend>;
+
+ vol_up {
+ label = "volume_up";
+ gpios = <&msm_gpio 90 0x1>;
+ linux,input-type = <1>;
+ linux,code = <103>;
+ gpio-key,wakeup;
+ debounce-interval = <15>;
+ };
+ };
+};
+
+&msm_gpio {
+ tlmm_gpio_key {
+ qcom,pin-func = <0>;
+ qcom,num-grp-pins = <5>;
+ label = "tlmm_gpio_key";
+ gpio_key_active: gpio_key_active {
+ mux {
+ pins = "gpio52", "gpio56", "gpio7",
+ "gpio99", "gpio6";
+ drive-strength = <2>;
+ bias-pull-up;
+ };
+ };
+ gpio_key_suspend: gpio_key_suspend {
+ mux {
+ pins = "gpio52", "gpio56", "gpio7",
+ "gpio99", "gpio6";
+ drive-strength = <2>;
+ bias-pull-up;
+ };
+ };
+ };
+};
+
+&spmi_bus {
+ qcom,pm8909@0 {
+ pm8909_pon: qcom,power-on@800 {
+ compatible = "qcom,qpnp-power-on";
+ reg = <0x800 0x100>;
+ interrupts = <0x0 0x8 0x0>,
+ <0x0 0x8 0x1>;
+ interrupt-names = "kpdpwr", "resin";
+ qcom,pon-dbc-delay = <15625>;
+ qcom,system-reset;
+ qcom,clear-warm-reset;
+
+ qcom,pon_2 {
+ qcom,pon-type = <1>;
+ qcom,pull-up = <1>;
+ linux,code = <108>;
+ };
+ };
+ };
+};
+&pm8909_vadc {
+ chan@30 {
+ qcom,scale-function = <6>;
+ };
+};
+
+&spmi_bus {
+ qcom,pm8909@0 {
+ qcom,leds@c000 {
+ compatible = "qcom,leds-qpnp";
+ reg = <0xc000 0x100>;
+ status = "okay";
+ qcom,led_gpio_1 {
+ label = "gpio";
+ linux,name = "button-backlight";
+ qcom,max-current = <40>;
+ qcom,id = <8>;
+ linux,default-trigger = "none";
+ qcom,default-state = "on";
+ qcom,turn-off-delay-ms = <1000>;
+ qcom,source-sel = <1>;
+ qcom,mode-ctrl = <0x10>;
+ qcom,vin-ctrl = <0x02>;
+ };
+ };
+ };
+};
+
+&pm8909_chg {
+ qcom,cool-bat-mv = <4000>;
+ qcom,warm-bat-mv = <4000>;
+ qcom,ibatmax-warm-ma = <500>;
+ qcom,ibatmax-cool-ma = <500>;
+ qcom,batt-hot-percentage = <35>;
+ qcom,batt-cold-percentage = <70>;
+ qcom,chgr-led-support;
+ status = "okay";
+};
+
+/ {
+ qrd_batterydata: qcom,battery-data {
+ qcom,rpull-up-kohm = <0>;
+ qcom,vref-batt-therm = <1800000>;
+
+ #include "batterydata-qrd-skub-4v2-2000mah.dtsi"
+ };
+};
+
+&pm8909_bms {
+ status = "okay";
+ qcom,resume-soc = <95>;
+ qcom,use-reported-soc;
+ qcom,force-bms-active-on-charger;
+ qcom,battery-data = <&qrd_batterydata>;
+};
+
+&sdhc_2 {
+ qcom,nonremovable;
+ interrupts = <0 1>;
+ interrupt-map = <0 &intc 0 125 0
+ 1 &intc 0 221 0>;
+ interrupt-names = "hc_irq", "pwr_irq";
+ /delete-property/ cd-gpios;
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on>;
+ pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>;
+};
+
+&pm8909_mpps {
+ mpp@a300 { /* MPP 4 */
+ /* CASE_THERM config */
+ qcom,mode = <4>; /* AIN input */
+ qcom,invert = <1>; /* Enable MPP */
+ qcom,ain-route = <3>; /* AMUX 8 */
+ qcom,master-en = <1>;
+ qcom,src-sel = <0>; /* Function constant */
+ };
+};
+
+&pm8909_vadc {
+ chan@30 {
+ qcom,scale-function = <12>;
+ };
+
+ chan@13 {
+ label = "case_therm";
+ reg = <0x13>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <2>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <0>;
+ qcom,vadc-thermal-node;
+ };
+};
+
+&soc {
+ sound {
+ compatible = "qcom,msm8x16-audio-codec";
+ qcom,model = "msm8909-skub-snd-card";
+ qcom,msm-snd-card-id = <0>;
+ qcom,msm-codec-type = "internal";
+ qcom,msm-ext-pa = "primary";
+ qcom,msm-mclk-freq = <9600000>;
+ qcom,msm-mbhc-hphl-swh = <1>;
+ qcom,msm-mbhc-gnd-swh = <0>;
+ qcom,msm-hs-micbias-type = "internal";
+ qcom,msm-micbias1-ext-cap;
+ qcom,msm-micbias2-ext-cap;
+ qcom,audio-routing =
+ "RX_BIAS", "MCLK",
+ "SPK_RX_BIAS", "MCLK",
+ "INT_LDO_H", "MCLK",
+ "MIC BIAS Internal1", "Handset Mic",
+ "MIC BIAS Internal2", "Headset Mic",
+ "AMIC1", "MIC BIAS Internal1",
+ "AMIC2", "MIC BIAS Internal2";
+ pinctrl-names = "cdc_lines_act",
+ "cdc_lines_sus";
+ pinctrl-0 = <&cdc_pdm_lines_act>;
+ pinctrl-1 = <&cdc_pdm_lines_sus>;
+ asoc-platform = <&pcm0>, <&pcm1>, <&voip>, <&voice>,
+ <&loopback>, <&compress>, <&hostless>,
+ <&afe>, <&lsm>, <&routing>, <&lpa>,
+ <&voice_svc>;
+ asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1",
+ "msm-voip-dsp", "msm-pcm-voice",
+ "msm-pcm-loopback", "msm-compress-dsp",
+ "msm-pcm-hostless", "msm-pcm-afe",
+ "msm-lsm-client", "msm-pcm-routing",
+ "msm-pcm-lpa", "msm-voice-svc";
+ asoc-cpu = <&dai_pri_auxpcm>, <&dai_hdmi>,
+ <&dai_mi2s0>, <&dai_mi2s1>,
+ <&dai_mi2s2>, <&dai_mi2s3>,
+ <&sb_0_rx>, <&sb_0_tx>,
+ <&sb_1_rx>, <&sb_1_tx>,
+ <&sb_3_rx>, <&sb_3_tx>,
+ <&sb_4_rx>, <&sb_4_tx>,
+ <&bt_sco_rx>, <&bt_sco_tx>,
+ <&bt_a2dp_rx>, <&int_fm_rx>, <&int_fm_tx>,
+ <&afe_pcm_rx>, <&afe_pcm_tx>,
+ <&afe_proxy_rx>, <&afe_proxy_tx>,
+ <&incall_record_rx>, <&incall_record_tx>,
+ <&incall_music_rx>, <&incall_music_2_rx>;
+ asoc-cpu-names = "msm-dai-q6-auxpcm.1", "msm-dai-q6-hdmi.8",
+ "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1",
+ "msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3",
+ "msm-dai-q6-dev.16384", "msm-dai-q6-dev.16385",
+ "msm-dai-q6-dev.16386", "msm-dai-q6-dev.16387",
+ "msm-dai-q6-dev.16390", "msm-dai-q6-dev.16391",
+ "msm-dai-q6-dev.16392", "msm-dai-q6-dev.16393",
+ "msm-dai-q6-dev.12288", "msm-dai-q6-dev.12289",
+ "msm-dai-q6-dev.12290",
+ "msm-dai-q6-dev.12292", "msm-dai-q6-dev.12293",
+ "msm-dai-q6-dev.224", "msm-dai-q6-dev.225",
+ "msm-dai-q6-dev.241", "msm-dai-q6-dev.240",
+ "msm-dai-q6-dev.32771", "msm-dai-q6-dev.32772",
+ "msm-dai-q6-dev.32773", "msm-dai-q6-dev.32770";
+ asoc-codec = <&stub_codec>, <&pm8909_conga_dig>;
+ asoc-codec-names = "msm-stub-codec.1", "tombak_codec";
+ };
+
+ spi@78b9000 { /* BLSP1 QUP5 */
+ status = "okay";
+ qcom,shared;
+ mdss_spi_client {
+ reg = <0>;
+ compatible = "qcom,mdss-spi-client";
+ label = "MDSS SPI QUP5 CLIENT";
+ spi-max-frequency = <50000000>;
+ };
+ };
+ i2c@78b9000 {/* BLSP1 QUP5 */
+ status = "disabled";
+ };
+
+ mdss_spi: qcom,mdss_spi {
+ compatible = "qcom,mdss-spi-display";
+ label = "mdss spi panel";
+
+ qcom,mdss-fb-map = <&mdss_fb0>;
+ qcom,mdss-mdp = <&mdss_mdp>;
+ vdd-supply = <&pm8909_l17>;
+ vddio-supply = <&pm8909_l6>;
+
+ qcom,panel-supply-entries {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ qcom,panel-supply-entry@0 {
+ reg = <0>;
+ qcom,supply-name = "vdd";
+ qcom,supply-min-voltage = <2850000>;
+ qcom,supply-max-voltage = <2850000>;
+ qcom,supply-enable-load = <100000>;
+ qcom,supply-disable-load = <100>;
+ };
+
+ qcom,panel-supply-entry@1 {
+ reg = <1>;
+ qcom,supply-name = "vddio";
+ qcom,supply-min-voltage = <1800000>;
+ qcom,supply-max-voltage = <1800000>;
+ qcom,supply-enable-load = <100000>;
+ qcom,supply-disable-load = <100>;
+ };
+ };
+ };
+};
+
+&pm8909_mpps {
+ mpp@a100 { /* MPP 2 */
+ /* Backlight PWM */
+ qcom,mode = <1>; /* Digital output */
+ qcom,invert = <0>; /* Disable invert */
+ qcom,src-sel = <4>; /* DTEST1 */
+ qcom,vin-sel = <0>; /* VPH_PWR */
+ qcom,master-en = <1>; /* Enable MPP */
+ };
+};
+
+#include "spi-panel-gc9305-qvga-cmd.dtsi"
+
+&mdss_mdp {
+ qcom,mdss-pref-prim-intf = "spi";
+};
+
+&spi_gc9305_qvga_cmd {
+ qcom,mdss-spi-bl-pmic-control-type = "bl_ctrl_pwm";
+ qcom,mdss-spi-bl-pmic-pwm-frequency = <100>;
+ qcom,mdss-spi-bl-pmic-bank-select = <0>;
+ qcom,mdss-spi-pwm-gpio = <&pm8909_mpps 2 0>;
+ qcom,cont-splash-enabled;
+};
+
+&msm_gpio {
+ pmx_mdss_te {
+ mdss_te_active: mdss_te_active {
+ mux {
+ pins = "gpio24";
+ };
+ config {
+ pins = "gpio24";
+ };
+ };
+ mdss_te_suspend: mdss_te_suspend {
+ mux {
+ pins = "gpio24";
+ };
+ config {
+ pins = "gpio24";
+ };
+ };
+ };
+};
+
+&mdss_spi {
+ qcom,spi-pref-prim-pan = <&spi_gc9305_qvga_cmd>;
+ pinctrl-names = "mdss_default", "mdss_sleep";
+ pinctrl-0 = <&mdss_te_active>;
+ pinctrl-1 = <&mdss_te_suspend>;
+
+ qcom,platform-te-gpio = <&msm_gpio 24 0>;
+ qcom,platform-reset-gpio = <&msm_gpio 25 0>;
+ qcom,platform-spi-dc-gpio = <&msm_gpio 110 0>;
+};
+
+&pm8909_gpios {
+ /* GPIO 2 (NFC_CLK_REQ) */
+ gpio@c100 {
+ qcom,mode = <0>;
+ qcom,vin-sel = <1>;
+ qcom,src-sel = <0>;
+ qcom,master-en = <1>;
+ status = "okay";
+ };
+};
+
+&i2c_2 {
+ status = "okay";
+ nq@28 {
+ compatible = "qcom,nq-nci";
+ reg = <0x28>;
+ qcom,nq-irq = <&msm_gpio 21 0x00>;
+ qcom,nq-ven = <&msm_gpio 20 0x00>;
+ qcom,nq-firm = <&msm_gpio 23 0x00>;
+ qcom,nq-clkreq = <&pm8909_gpios 2 0x00>;
+ qcom,nq-esepwr = <&msm_gpio 31 0x00>;
+ interrupt-parent = <&msm_gpio>;
+ qcom,clk-src = "BBCLK2";
+ interrupts = <21 0>;
+ interrupt-names = "nfc_irq";
+ pinctrl-names = "nfc_active", "nfc_suspend";
+ pinctrl-0 = <&nfc_int_active &nfc_disable_active>;
+ pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>;
+ clocks = <&clock_rpm clk_bb_clk2_pin>;
+ clock-names = "ref_clk";
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905-qrd-skub_qseev4.dts b/arch/arm64/boot/dts/qcom/msm8905-qrd-skub_qseev4.dts
new file mode 100644
index 0000000..36532ed
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905-qrd-skub_qseev4.dts
@@ -0,0 +1,23 @@
+/* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+
+#include "msm8905-qrd-skub.dtsi"
+#include "msm8905-512mb-memory_qseev4.dtsi"
+#include "msm8909-gpu-qhd.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM8905 QRD SKUB QSEEV4";
+ compatible = "qcom,msm8909-qrd", "qcom,msm8909", "qcom,qrd";
+ qcom,board-id = <0x1010b 0x100>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8905.dtsi b/arch/arm64/boot/dts/qcom/msm8905.dtsi
new file mode 100644
index 0000000..2d2b502
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8905.dtsi
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2017-2018, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM8905";
+ qcom,msm-id = <331 0>;
+};
+
+&msm_gpu {
+ /* Disable GPU snapshot dumping */
+ qcom,snapshot-size = <0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8909-gpu-qhd.dtsi b/arch/arm64/boot/dts/qcom/msm8909-gpu-qhd.dtsi
new file mode 100644
index 0000000..da26415
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8909-gpu-qhd.dtsi
@@ -0,0 +1,38 @@
+/* Copyright (c) 2014,2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&msm_gpu {
+ /delete-property/qcom,gpu-speed-config;
+ /delete-node/qcom,gpu-speed-config@1;
+
+ /* Power levels */
+ qcom,gpu-pwrlevels {
+
+ qcom,gpu-pwrlevel@0 {
+ reg = <0>;
+ qcom,gpu-freq = <307200000>;
+ qcom,bus-freq = <3>;
+ };
+
+ qcom,gpu-pwrlevel@1 {
+ reg = <1>;
+ qcom,gpu-freq = <200000000>;
+ qcom,bus-freq = <1>;
+ };
+
+ qcom,gpu-pwrlevel@2 {
+ reg = <2>;
+ qcom,gpu-freq = <19200000>;
+ qcom,bus-freq = <0>;
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8909-pm8909-pm.dtsi b/arch/arm64/boot/dts/qcom/msm8909-pm8909-pm.dtsi
new file mode 100644
index 0000000..69aca05
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8909-pm8909-pm.dtsi
@@ -0,0 +1,427 @@
+/* Copyright (c) 2014-2015, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&soc {
+ qcom,spm@b089000 {
+ compatible = "qcom,spm-v2";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0xb089000 0x1000>;
+ qcom,name = "cpu0";
+ qcom,cpu = <&CPU0>;
+ qcom,saw2-ver-reg = <0xfd0>;
+ qcom,saw2-cfg = <0x01>;
+ qcom,saw2-spm-dly= <0x3c102800>;
+ qcom,saw2-spm-ctl = <0xe>;
+ qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
+ qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ };
+
+ qcom,spm@b099000 {
+ compatible = "qcom,spm-v2";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0xb099000 0x1000>;
+ qcom,name = "cpu1";
+ qcom,cpu = <&CPU1>;
+ qcom,core-id = <1>;
+ qcom,saw2-ver-reg = <0xfd0>;
+ qcom,saw2-cfg = <0x01>;
+ qcom,saw2-spm-dly= <0x3c102800>;
+ qcom,saw2-spm-ctl = <0xe>;
+ qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
+ qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ };
+
+ qcom,spm@b0a9000 {
+ compatible = "qcom,spm-v2";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0xb0a9000 0x1000>;
+ qcom,name = "cpu2";
+ qcom,cpu = <&CPU2>;
+ qcom,core-id = <2>;
+ qcom,saw2-ver-reg = <0xfd0>;
+ qcom,saw2-cfg = <0x01>;
+ qcom,saw2-spm-dly= <0x3c102800>;
+ qcom,saw2-spm-ctl = <0xe>;
+ qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
+ qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ };
+
+ qcom,spm@b0b9000 {
+ compatible = "qcom,spm-v2";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0xb0b9000 0x1000>;
+ qcom,name = "cpu3";
+ qcom,cpu = <&CPU3>;
+ qcom,core-id = <3>;
+ qcom,saw2-ver-reg = <0xfd0>;
+ qcom,saw2-cfg = <0x01>;
+ qcom,saw2-spm-dly= <0x3c102800>;
+ qcom,saw2-spm-ctl = <0xe>;
+ qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
+ qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 76 76
+ 0b 94 5b 80 10 26 30 0f];
+ };
+
+ qcom,spm@0xb012000 {
+ compatible = "qcom,spm-v2";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0xb012000 0x1000>;
+ qcom,name = "system-l2";
+ qcom,saw2-ver-reg = <0xfd0>;
+ qcom,saw2-cfg = <0x14>;
+ qcom,saw2-spm-dly= <0x3c102800>;
+ qcom,saw2-spm-ctl = <0xe>;
+ qcom,saw2-spm-cmd-ret = [00 03 00 0f];
+ qcom,saw2-spm-cmd-gdhs = [00 20 32 6b c0 e0 d0 42 03 50
+ 4e 02 02 d0 e0 c0 22 6b 02 32 50 0f];
+ qcom,saw2-spm-cmd-pc = [00 32 b0 10 e0 d0 6b c0 42 f0
+ 07 b0 50 4e 02 02 c0 d0 12 e0 6b 02 32
+ 50 f0 0f]; /*APC_L2RAM_OFF */
+ };
+
+ qcom,lpm-levels {
+ compatible = "qcom,lpm-levels";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ qcom,pm-cluster@0 {
+ reg = <0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ label = "system";
+ qcom,spm-device-names = "l2";
+ qcom,default-level = <0>;
+
+ qcom,pm-cluster-level@0 {
+ reg = <0>;
+ label = "l2-cache-active";
+ qcom,spm-l2-mode = "active";
+ qcom,latency-us = <270>;
+ qcom,ss-power = <455>;
+ qcom,energy-overhead = <250621>;
+ qcom,time-overhead = <500>;
+ };
+
+ qcom,pm-cluster-level@1{
+ reg = <1>;
+ label = "l2-gdhs";
+ qcom,spm-l2-mode = "gdhs";
+ qcom,latency-us = <500>;
+ qcom,ss-power = <427>;
+ qcom,energy-overhead = <431578>;
+ qcom,time-overhead = <900>;
+ qcom,min-child-idx = <1>;
+ };
+
+ qcom,pm-cluster-level@2{
+ reg = <2>;
+ label = "l2-pc";
+ qcom,spm-l2-mode = "pc";
+ qcom,latency-us = <10800>;
+ qcom,ss-power = <400>;
+ qcom,energy-overhead = <760239>;
+ qcom,time-overhead = <1500>;
+ qcom,min-child-idx = <2>;
+ qcom,notify-rpm;
+ };
+
+
+ qcom,pm-cpu {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ qcom,pm-cpu-level@0{
+ reg = <0>;
+ qcom,spm-cpu-mode = "wfi";
+ qcom,latency-us = <1>;
+ qcom,ss-power = <473>;
+ qcom,energy-overhead = <100000>;
+ qcom,time-overhead = <50>;
+ };
+
+ qcom,pm-cpu-level@1 {
+ reg = <1>;
+ qcom,spm-cpu-mode = "standalone_pc";
+ qcom,latency-us = <240>;
+ qcom,ss-power = <467>;
+ qcom,energy-overhead = <202781>;
+ qcom,time-overhead = <420>;
+ qcom,use-broadcast-timer;
+ };
+
+ qcom,pm-cpu-level@2 {
+ reg = <2>;
+ qcom,spm-cpu-mode = "pc";
+ qcom,latency-us = <270>;
+ qcom,ss-power = <455>;
+ qcom,energy-overhead = <250621>;
+ qcom,time-overhead = <500>;
+ qcom,use-broadcast-timer;
+ };
+ };
+ };
+ };
+
+ qcom,lpm-workarounds {
+ compatible = "qcom,lpm-workarounds";
+ qcom,lpm-wa-skip-l2-spm;
+ };
+
+ qcom,mpm@601d0 {
+ compatible = "qcom,mpm-v2";
+ reg = <0x601d0 0x1000>, /* MSM_RPM_MPM_BASE 4K */
+ <0xb011008 0x4>;
+ reg-names = "vmpm", "ipc";
+ interrupts = <0 171 1>;
+ clocks = <&clock_rpm clk_xo_lpm_clk>;
+ clock-names = "xo";
+ qcom,ipc-bit-offset = <1>;
+ qcom,gic-parent = <&intc>;
+ qcom,gic-map = <2 216>, /* tsens_upper_lower_int */
+ <48 168>, /* usb_phy_id_irq */
+ <50 172>, /* usb1_hs_async_wakeup_irq */
+ <53 104>, /* mdss_irq */
+ <62 222>, /* ee0_krait_hlos_spmi_periph_irq */
+ <0xff 18>, /* APC_qgicQTmrSecPhysIrptReq */
+ <0xff 19>, /* APC_qgicQTmrNonSecPhysIrptReq */
+ <0xff 20>, /* qgicQTmrVirtIrptReq */
+ <0xff 35>, /* WDT_barkInt */
+ <0xff 39>, /* arch_mem_timer */
+ <0xff 40>, /* qtmr_phy_irq[0] */
+ <0xff 47>, /* rbif_irq[0] */
+ <0xff 56>, /* q6_wdog_expired_irq */
+ <0xff 57>, /* mss_to_apps_irq(0) */
+ <0xff 58>, /* mss_to_apps_irq(1) */
+ <0xff 59>, /* mss_to_apps_irq(2) */
+ <0xff 60>, /* mss_to_apps_irq(3) */
+ <0xff 61>, /* mss_a2_bam_irq */
+ <0xff 65>, /* o_gc_sys_irq[0] */
+ <0xff 70>, /* smmu_bus_intr[0] */
+ <0xff 73>, /* smmu_bus_intr[1] */
+ <0xff 74>, /* smmu_bus_intr[2] */
+ <0xff 75>, /* smmu_bus_intr[3] */
+ <0xff 77>, /* smmu_bus_intr[4] */
+ <0xff 78>, /* smmu_bus_intr[5] */
+ <0xff 79>, /* smmu_bus_intr[6] */
+ <0xff 80>, /* smmu_bus_intr[7] */
+ <0xff 94>, /* smmu_bus_intr[8] */
+ <0xff 96>, /* smmu_bus_intr[9] */
+ <0xff 97>, /* smmu_bus_intr[10] */
+ <0xff 98>, /* smmu_bus_intr[11] */
+ <0xff 101>, /* smmu_bus_intr[13] */
+ <0xff 102>, /* smmu_bus_intr[14] */
+ <0xff 105>, /* msm_iommu_global_cfg_irq */
+ <0xff 107>, /* msm_iommu_global_cfg_irq */
+ <0xff 114>, /* qdsd_intr_out */
+ <0xff 131>, /* qup_irq */
+ <0xff 133>, /* smmu_bus_intr[29] */
+ <0xff 134>, /* smmu_bus_intr[30] */
+ <0xff 135>, /* smmu_bus_intr[31] */
+ <0xff 136>, /* smmu_bus_intr[32] */
+ <0xff 137>, /* smmu_bus_intr[33] */
+ <0xff 138>, /* smmu_bus_intr[34] */
+ <0xff 140>, /* uart_dm_intr */
+ <0xff 141>, /* smmu_bus_intr[35] */
+ <0xff 142>, /* smmu_bus_intr[36] */
+ <0xff 143>, /* smmu_bus_intr[37] */
+ <0xff 144>, /* smmu_bus_intr[38] */
+ <0xff 145>, /* smmu_bus_intr[39] */
+ <0xff 146>, /* smmu_bus_intr[40] */
+ <0xff 147>, /* smmu_bus_intr[41] */
+ <0xff 148>, /* smmu_bus_intr[42] */
+ <0xff 149>, /* smmu_bus_intr[43] */
+ <0xff 150>, /* smmu_bus_intr[44] */
+ <0xff 151>, /* smmu_bus_intr[45] */
+ <0xff 152>, /* smmu_bus_intr[46] */
+ <0xff 153>, /* smmu_bus_intr[47] */
+ <0xff 154>, /* smmu_bus_intr[48] */
+ <0xff 155>, /* sdc1_irq(0) */
+ <0xff 157>, /* sdc2_irq(0) */
+ <0xff 166>, /* usb_hs_irq */
+ <0xff 170>, /* sdc1_pwr_cmd_irq */
+ <0xff 173>, /* o_wcss_apss_smd_hi */
+ <0xff 174>, /* o_wcss_apss_smd_med */
+ <0xff 175>, /* o_wcss_apss_smd_low */
+ <0xff 176>, /* o_wcss_apss_smsm_irq */
+ <0xff 177>, /* o_wcss_apss_wlan_data_xfer_done */
+ <0xff 178>, /* o_wcss_apss_wlan_rx_data_avail */
+ <0xff 179>, /* o_wcss_apss_asic_intr */
+ <0xff 181>, /* o_wcss_apss_wdog_bite_and_reset_rdy */
+ <0xff 182>, /* smmu_bus_intr[58] */
+ <0xff 183>, /* smmu_bus_intr[59] */
+ <0xff 184>, /* smmu_bus_intr[60] */
+ <0xff 188>, /* lpass_irq_out_apcs(0) */
+ <0xff 189>, /* lpass_irq_out_apcs(1) */
+ <0xff 190>, /* lpass_irq_out_apcs(2) */
+ <0xff 191>, /* lpass_irq_out_apcs(3) */
+ <0xff 192>, /* lpass_irq_out_apcs(4) */
+ <0xff 193>, /* lpass_irq_out_apcs(5) */
+ <0xff 194>, /* lpass_irq_out_apcs(6) */
+ <0xff 195>, /* lpass_irq_out_apcs(7) */
+ <0xff 196>, /* lpass_irq_out_apcs(8) */
+ <0xff 197>, /* lpass_irq_out_apcs(9) */
+ <0xff 198>, /* coresight-tmc-etr interrupt */
+ <0xff 200>, /* rpm_ipc(4) */
+ <0xff 201>, /* rpm_ipc(5) */
+ <0xff 202>, /* rpm_ipc(6) */
+ <0xff 203>, /* rpm_ipc(7) */
+ <0xff 204>, /* rpm_ipc(24) */
+ <0xff 205>, /* rpm_ipc(25) */
+ <0xff 206>, /* rpm_ipc(26) */
+ <0xff 207>, /* rpm_ipc(27) */
+ <0xff 215>, /* o_bimc_intr */
+ <0xff 224>, /* spdm_realtime_irq(1) */
+ <0xff 239>, /* crypto_bam_irq[1]*/
+ <0xff 240>, /* summary_irq_kpss */
+ <0xff 253>, /* sdc2_pwr_cmd_irq */
+ <0xff 255>, /* smmu_bus_intr[49] */
+ <0xff 256>, /* smmu_bus_intr[50] */
+ <0xff 257>, /* smmu_bus_intr[51] */
+ <0xff 260>, /* smmu_bus_intr[52] */
+ <0xff 261>, /* smmu_bus_intr[53] */
+ <0xff 262>, /* smmu_bus_intr[54] */
+ <0xff 263>, /* smmu_bus_intr[55] */
+ <0xff 264>, /* smmu_bus_intr[56] */
+ <0xff 265>, /* smmu_bus_intr[57] */
+ <0xff 269>, /* rpm_wdog_expired_irq */
+ <0xff 270>, /* blsp1_bam_irq[0] */
+ <0xff 272>, /* smmu_bus_intr[17] */
+ <0xff 273>, /* smmu_bus_intr[18] */
+ <0xff 274>, /* smmu_bus_intr[19] */
+ <0xff 275>, /* rpm_ipc(30) */
+ <0xff 276>, /* rpm_ipc(31) */
+ <0xff 277>, /* smmu_bus_intr[20] */
+ <0xff 278>, /* smmu_bus_intr[21] */
+ <0xff 279>, /* smmu_bus_intr[22] */
+ <0xff 280>, /* smmu_bus_intr[23] */
+ <0xff 281>, /* smmu_bus_intr[24] */
+ <0xff 282>, /* smmu_bus_intr[25] */
+ <0xff 283>, /* smmu_bus_intr[26] */
+ <0xff 284>, /* smmu_bus_intr[27] */
+ <0xff 285>; /* smmu_bus_intr[28] */
+
+ qcom,gpio-parent = <&msm_gpio>;
+ qcom,gpio-map = <3 65 >,
+ <4 5>,
+ <5 11>,
+ <6 12>,
+ <7 64>,
+ <8 58>,
+ <9 50>,
+ <10 13>,
+ <11 49>,
+ <12 20>,
+ <13 21>,
+ <14 25>,
+ <15 46>,
+ <16 45>,
+ <17 28>,
+ <18 44>,
+ <19 31>,
+ <20 43>,
+ <21 42>,
+ <22 34>,
+ <23 35>,
+ <24 36>,
+ <25 37>,
+ <26 38>,
+ <27 39>,
+ <28 40>,
+ <29 41>,
+ <30 90>,
+ <32 91>,
+ <33 92>,
+ <34 94>,
+ <35 95>,
+ <36 96>,
+ <37 97>,
+ <38 98>,
+ <39 110>,
+ <40 111>,
+ <41 112>,
+ <42 105>,
+ <43 107>,
+ <50 47>,
+ <51 48>;
+ };
+
+
+ qcom,pm@8600664 {
+ compatible = "qcom,pm";
+ reg = <0x8600664 0x40>;
+ clocks = <&clock_cpu clk_a7ssmux>,
+ <&clock_cpu clk_a7ssmux>,
+ <&clock_cpu clk_a7ssmux>,
+ <&clock_cpu clk_a7ssmux>;
+ clock-names = "cpu0_clk", "cpu1_clk",
+ "cpu2_clk", "cpu3_clk";
+ qcom,pc-mode = "tz_l2_int";
+ qcom,use-sync-timer;
+ qcom,synced-clocks;
+ qcom,tz-flushes-cache;
+ };
+
+ qcom,cpu-sleep-status@b088008{
+ compatible = "qcom,cpu-sleep-status";
+ reg = <0xb088008 0x100>;
+ qcom,cpu-alias-addr = <0x10000>;
+ qcom,sleep-status-mask= <0x80000>;
+ };
+
+ qcom,rpm-log@29dc00 {
+ compatible = "qcom,rpm-log";
+ reg = <0x29dc00 0x4000>;
+ qcom,rpm-addr-phys = <0x200000>;
+ qcom,offset-version = <4>;
+ qcom,offset-page-buffer-addr = <36>;
+ qcom,offset-log-len = <40>;
+ qcom,offset-log-len-mask = <44>;
+ qcom,offset-page-indices = <56>;
+ };
+
+ qcom,rpm-stats@29dba0 {
+ compatible = "qcom,rpm-stats";
+ reg = <0x29dba0 0x1000>;
+ reg-names = "phys_addr_base";
+ qcom,sleep-stats-version = <2>;
+ };
+
+ qcom,rpm-master-stats@60150 {
+ compatible = "qcom,rpm-master-stats";
+ reg = <0x60150 0x2030>;
+ qcom,masters = "APSS", "MPSS", "PRONTO";
+ qcom,master-stats-version = <2>;
+ qcom,master-offset = <4096>;
+ };
+
+ qcom,rpm-rbcpr-stats@0x200000 {
+ compatible = "qcom,rpmrbcpr-stats";
+ reg = <0x200000 0x1000>;
+ qcom,start-offset = <0x90010>;
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8909-pm8909.dtsi b/arch/arm64/boot/dts/qcom/msm8909-pm8909.dtsi
new file mode 100644
index 0000000..ad620e1
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8909-pm8909.dtsi
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2014-2015, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "msm-pm8909-rpm-regulator.dtsi"
+#include "msm-pm8909.dtsi"
+#include "msm8909-regulator.dtsi"
+
+/ {
+ qcom,pmic-id = <0x1000D 0x0 0x0 0x0>;
+};
+
+&pm8909_vadc {
+ chan@0 {
+ label = "usb_in";
+ reg = <0>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <7>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@2 {
+ label = "ireg_fb";
+ reg = <2>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <6>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@5 {
+ label = "vcoin";
+ reg = <5>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <1>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@6 {
+ label = "vbat_sns";
+ reg = <6>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <1>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@7 {
+ label = "vph_pwr";
+ reg = <7>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <1>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@b {
+ label = "chg_temp";
+ reg = <0xb>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <3>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@30 {
+ label = "batt_therm";
+ reg = <0x30>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <1>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@31 {
+ label = "batt_id";
+ reg = <0x31>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <0>;
+ };
+
+ chan@36 {
+ label = "pa_therm0";
+ reg = <0x36>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <2>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <0>;
+ qcom,vadc-thermal-node;
+ };
+
+ chan@32 {
+ label = "xo_therm";
+ reg = <0x32>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <4>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <0>;
+ qcom,vadc-thermal-node;
+ };
+
+ chan@3c {
+ label = "xo_therm_buf";
+ reg = <0x3c>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <4>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <0>;
+ qcom,vadc-thermal-node;
+ };
+};
+
+&pm8909_adc_tm {
+ /* Channel Node */
+ chan@30 {
+ label = "batt_therm";
+ reg = <0x30>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <0>;
+ qcom,calibration-type = "ratiometric";
+ qcom,scale-function = <1>;
+ qcom,hw-settle-time = <2>;
+ qcom,fast-avg-setup = <3>;
+ qcom,btm-channel-number = <0x48>;
+ };
+
+ chan@6 {
+ label = "vbat_sns";
+ reg = <0x6>;
+ qcom,decimation = <0>;
+ qcom,pre-div-channel-scaling = <1>;
+ qcom,calibration-type = "absolute";
+ qcom,scale-function = <0>;
+ qcom,hw-settle-time = <0>;
+ qcom,fast-avg-setup = <3>;
+ qcom,btm-channel-number = <0x68>;
+ };
+};
+
+#include "msm8909-pm8909-pm.dtsi"
diff --git a/arch/arm64/boot/dts/qcom/msm8909-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8909-qrd.dtsi
new file mode 100644
index 0000000..2ab9a8e
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8909-qrd.dtsi
@@ -0,0 +1,151 @@
+/* Copyright (c) 2014, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "msm8909.dtsi"
+#include "msm8909-pm8909.dtsi"
+#include "msm8909-pinctrl.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM8909 QRD";
+ compatible = "qcom,msm8909-qrd", "qcom,msm8909", "qcom,qrd";
+};
+
+&blsp1_uart1 {
+ status = "ok";
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart_console_sleep>;
+};
+
+&qcom_rng {
+ status = "okay";
+};
+
+&qcom_crypto {
+ status = "okay";
+};
+
+&qcom_cedev {
+ status = "okay";
+};
+
+&qcom_seecom {
+ status = "okay";
+};
+
+&qcom_tzlog {
+ status = "okay";
+};
+
+&soc {
+ gpio_keys {
+ compatible = "gpio-keys";
+ input-name = "gpio-keys";
+ pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
+ pinctrl-0 = <&gpio_key_active>;
+ pinctrl-1 = <&gpio_key_suspend>;
+
+ vol_up {
+ label = "volume_up";
+ gpios = <&msm_gpio 90 0x1>;
+ linux,input-type = <1>;
+ linux,code = <115>;
+ gpio-key,wakeup;
+ debounce-interval = <15>;
+ };
+ };
+};
+
+&sdhc_1 {
+ vdd-supply = <&pm8909_l8>;
+ qcom,vdd-voltage-level = <2900000 2900000>;
+ qcom,vdd-current-level = <200 400000>;
+
+ vdd-io-supply = <&pm8909_l5>;
+ qcom,vdd-io-always-on;
+ qcom,vdd-io-lpm-sup;
+ qcom,vdd-io-voltage-level = <1800000 1800000>;
+ qcom,vdd-io-current-level = <200 60000>;
+
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on>;
+ pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off>;
+
+ qcom,bus-speed-mode = "HS200_1p8v", "DDR_1p8v";
+ qcom,nonremovable;
+
+ status = "ok";
+};
+
+&sdhc_2 {
+ #address-cells = <0>;
+ interrupt-parent = <&sdhc_2>;
+ interrupts = <0 1 2>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0xffffffff>;
+ interrupt-map = <0 &intc 0 125 0
+ 1 &intc 0 221 0
+ 2 &msm_gpio 38 0>;
+ interrupt-names = "hc_irq", "pwr_irq", "status_irq";
+ cd-gpios = <&msm_gpio 38 0x1>;
+
+ vdd-supply = <&pm8909_l11>;
+ qcom,vdd-voltage-level = <1800000 2950000>;
+ qcom,vdd-current-level = <15000 400000>;
+
+ vdd-io-supply = <&pm8909_l12>;
+ qcom,vdd-io-voltage-level = <1800000 2950000>;
+ qcom,vdd-io-current-level = <200 50000>;
+
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>;
+ pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>;
+
+ status = "ok";
+};
+
+&spmi_bus {
+ qcom,pm8909@1 {
+ qcom,vibrator@c000 {
+ status = "okay";
+ qcom,vib-timeout-ms = <15000>;
+ qcom,vib-vtg-level-mV = <3100>;
+ };
+ };
+};
+
+/* CoreSight */
+&tpiu {
+ pinctrl-names = "sdcard", "trace", "swduart",
+ "swdtrc", "jtag", "spmi";
+ /* NIDnT */
+ pinctrl-0 = <&qdsd_clk_sdcard &qdsd_cmd_sdcard
+ &qdsd_data0_sdcard &qdsd_data1_sdcard
+ &qdsd_data2_sdcard &qdsd_data3_sdcard>;
+ pinctrl-1 = <&qdsd_clk_trace &qdsd_cmd_trace
+ &qdsd_data0_trace &qdsd_data1_trace
+ &qdsd_data2_trace &qdsd_data3_trace>;
+ pinctrl-2 = <&qdsd_cmd_swduart &qdsd_data0_swduart
+ &qdsd_data1_swduart &qdsd_data2_swduart
+ &qdsd_data3_swduart>;
+ pinctrl-3 = <&qdsd_clk_swdtrc &qdsd_cmd_swdtrc
+ &qdsd_data0_swdtrc &qdsd_data1_swdtrc
+ &qdsd_data2_swdtrc &qdsd_data3_swdtrc>;
+ pinctrl-4 = <&qdsd_cmd_jtag &qdsd_data0_jtag
+ &qdsd_data1_jtag &qdsd_data2_jtag
+ &qdsd_data3_jtag>;
+ pinctrl-5 = <&qdsd_clk_spmi &qdsd_cmd_spmi
+ &qdsd_data0_spmi &qdsd_data3_spmi>;
+};
+
+&android_usb {
+ qcom,android-usb-cdrom;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi
index 0c61f71..c77608d 100644
--- a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -14,12 +14,12 @@
&int_codec {
compatible = "qcom,msm8952-dig-asoc-snd";
status = "okay";
- qcom,model = "sdm429-qrd-snd-card";
+ qcom,model = "sdm429w-snd-card";
qcom,msm-ext-pa = "quaternary";
/delete-property/ qcom,split-a2dp;
asoc-wsa-codec-names;
asoc-wsa-codec-prefixes;
- ext_pa_aw8896;
+ ext_pa_tfa98xx;
qcom,audio-routing =
"CDC_CONN", "MCLK",
"QUAT_MI2S_RX", "DIGITAL_REGULATOR",
@@ -53,6 +53,42 @@
/delete-property/qcom,pri-mi2s-gpios;
/delete-property/qcom,cdc-us-eu-gpios;
+ asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>,
+ <&loopback>, <&compress>, <&hostless>,
+ <&afe>, <&lsm>, <&routing>, <&pcm_noirq>;
+ asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1",
+ "msm-pcm-dsp.2", "msm-voip-dsp",
+ "msm-pcm-voice", "msm-pcm-loopback",
+ "msm-compress-dsp", "msm-pcm-hostless",
+ "msm-pcm-afe", "msm-lsm-client",
+ "msm-pcm-routing", "msm-pcm-dsp-noirq";
+ asoc-cpu = <&dai_pri_auxpcm>,
+ <&dai_mi2s0>, <&dai_mi2s1>,
+ <&dai_mi2s2>, <&dai_mi2s3>,
+ <&dai_mi2s4>, <&dai_mi2s5>,
+ <&sb_0_rx>, <&sb_0_tx>, <&sb_1_rx>, <&sb_1_tx>,
+ <&sb_3_rx>, <&sb_3_tx>, <&sb_4_rx>, <&sb_4_tx>,
+ <&bt_sco_rx>, <&bt_sco_tx>,
+ <&int_fm_rx>, <&int_fm_tx>,
+ <&afe_pcm_rx>, <&afe_pcm_tx>,
+ <&afe_proxy_rx>, <&afe_proxy_tx>,
+ <&incall_record_rx>, <&incall_record_tx>,
+ <&incall_music_rx>, <&incall_music_2_rx>;
+
+ asoc-cpu-names = "msm-dai-q6-auxpcm.1",
+ "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1",
+ "msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3",
+ "msm-dai-q6-mi2s.4", "msm-dai-q6-mi2s.6",
+ "msm-dai-q6-dev.16384", "msmdai-q6-dev.16385",
+ "msm-dai-q6-dev.16386", "msm-dai-q6-dev.16387",
+ "msm-dai-q6-dev.16390", "msm-dai-q6-dev.16391",
+ "msm-dai-q6-dev.16392", "msm-dai-q6-dev.16393",
+ "msm-dai-q6-dev.12288", "msm-dai-q6-dev.12289",
+ "msm-dai-q6-dev.12292", "msm-dai-q6-dev.12293",
+ "msm-dai-q6-dev.224", "msm-dai-q6-dev.225",
+ "msm-dai-q6-dev.241", "msm-dai-q6-dev.240",
+ "msm-dai-q6-dev.32771", "msm-dai-q6-dev.32772",
+ "msm-dai-q6-dev.32773", "msm-dai-q6-dev.32770";
asoc-codec = <&stub_codec>, <&msm_dig_codec>, <&ext_smart_pa>;
asoc-codec-names = "msm-stub-codec.1", "msm-dig-codec", "ext-smart-pa";
};
@@ -148,9 +184,9 @@
};
&i2c_2 {
- ext_smart_pa: aw8896_smartpa@34 {
+ ext_smart_pa: nxp_smartpa@34 {
status = "okay";
- compatible = "awinic,aw8896_smartpa";
+ compatible = "nxp,tfa98xx";
reg = <0x34>;
reset-gpio = <&tlmm 68 0>;
irq-gpio = <&tlmm 73 0>;
diff --git a/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi b/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi
index 7c389ff..bb73889 100644
--- a/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019, 2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -30,3 +30,6 @@
qcom,fg-disable-in-twm;
};
+&pm660_haptics {
+ qcom,haptics-ext-pin-twm;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm670.dtsi b/arch/arm64/boot/dts/qcom/sdm670.dtsi
index 7dddef5..d7b1b06 100644
--- a/arch/arm64/boot/dts/qcom/sdm670.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1415,6 +1415,11 @@
qcom,dump-id = <0xec>;
};
+ fcm {
+ qcom,dump-size = <0x8400>;
+ qcom,dump-id = <0xee>;
+ };
+
rpm_sw {
qcom,dump-size = <0x28000>;
qcom,dump-id = <0xea>;
diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2.1-mtp.dts b/arch/arm64/boot/dts/qcom/sdm845-v2.1-mtp.dts
index 9b1ae80..444ce98 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-v2.1-mtp.dts
+++ b/arch/arm64/boot/dts/qcom/sdm845-v2.1-mtp.dts
@@ -1,4 +1,4 @@
-/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -23,3 +23,89 @@
compatible = "qcom,sdm845-mtp", "qcom,sdm845", "qcom,mtp";
qcom,board-id = <8 0>;
};
+
+&tlmm {
+ sdc2_wlan_gpio_on: sdc2_wlan_gpio_on {
+ mux {
+ pins = "gpio11";
+ function = "gpio";
+ };
+ config {
+ pins = "gpio11";
+ drive-strength = <10>;
+ bias-pull-up;
+ output-high;
+ };
+ };
+
+ sdc2_wlan_gpio_off: sdc2_wlan_gpio_off {
+ mux {
+ pins = "gpio11";
+ function = "gpio";
+ };
+ config {
+ pins = "gpio11";
+ drive-strength = <2>;
+ bias-disable;
+ output-low;
+ };
+ };
+};
+
+&sdhc_2 {
+ /delete-property/cd-gpios;
+ #address-cells = <0>;
+ interrupt-parent = <&sdhc_2>;
+ interrupts = <0 1 2>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0xffffffff>;
+ interrupt-map = <0 &intc 0 204 0
+ 1 &intc 0 222 0
+ 2 &tlmm 11 0>;
+ interrupt-names = "hc_irq", "pwr_irq", "sdiowakeup_irq";
+
+ vdd-supply = <&pm8998_l23>;
+ qcom,vdd-voltage-level = <3200000 3300000>;
+ vdd-io-supply = <&pm8998_s4>;
+ qcom,vdd-io-voltage-level = <1800000 1800000>;
+ qcom,vdd-current-level = <15000 400000>;
+ qcom,vdd-io-current-level = <200 50000>;
+ qcom,clk-rates = <400000 25000000 50000000>;
+ qcom,bus-speed-mode = "SDR12";
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on
+ &sdc2_wlan_gpio_on>;
+ pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off
+ &sdc2_wlan_gpio_off>;
+ qcom,nonremovable;
+ qcom,core_3_0v_support;
+ status = "ok";
+};
+
+&pm8998_l6 {
+ regulator-boot-on;
+ regulator-always-on;
+};
+
+&pm8998_l23 {
+ regulator-boot-on;
+ regulator-always-on;
+};
+
+&soc {
+ qcom,cnss-sdio {
+ compatible = "qcom,cnss_sdio";
+ reg = <0x87a00000 0x200000>;
+ reg-names = "ramdump";
+ subsys-name = "AR6320";
+ qcom,wlan-ramdump-dynamic = <0x200000>;
+ qcom,msm-bus,name = "msm-cnss";
+ qcom,msm-bus,num-cases = <4>;
+ qcom,msm-bus,num-paths = <1>;
+ qcom,msm-bus,vectors-KBps =
+ <79 512 0 0>, /* No vote */
+ <79 512 6250 200000>, /* 50 Mbps */
+ <79 512 25000 200000>, /* 200 Mbps */
+ <79 512 2048000 4096000>; /* MAX */
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/spi-panel-gc9305-qvga-cmd.dtsi b/arch/arm64/boot/dts/qcom/spi-panel-gc9305-qvga-cmd.dtsi
new file mode 100644
index 0000000..a3c58b9
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/spi-panel-gc9305-qvga-cmd.dtsi
@@ -0,0 +1,71 @@
+/* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&mdss_mdp {
+ spi_gc9305_qvga_cmd: qcom,mdss_spi_gc9305_qvga_cmd {
+ qcom,mdss-spi-panel-name = "gc9305 qvga command mode spi panel";
+ qcom,mdss-spi-panel-destination = "display_1";
+ qcom,mdss-spi-panel-controller = <&mdss_spi>;
+ qcom,mdss-spi-panel-framerate = <30>;
+ qcom,mdss-spi-panel-width = <240>;
+ qcom,mdss-spi-panel-height = <320>;
+ qcom,mdss-spi-h-front-porch = <79>;
+ qcom,mdss-spi-h-back-porch = <59>;
+ qcom,mdss-spi-h-pulse-width = <60>;
+ qcom,mdss-spi-v-back-porch = <10>;
+ qcom,mdss-spi-v-front-porch = <7>;
+ qcom,mdss-spi-v-pulse-width = <2>;
+ qcom,mdss-spi-h-left-border = <0>;
+ qcom,mdss-spi-h-right-border = <0>;
+ qcom,mdss-spi-v-top-border = <0>;
+ qcom,mdss-spi-v-bottom-border = <0>;
+ qcom,mdss-spi-bpp = <16>;
+ qcom,mdss-spi-on-command = [00 01 FE
+ 00 01 EF
+ 00 02 36 48
+ 00 02 3A 05
+ 00 02 35 00
+ 00 03 44 00 14
+ 00 03 A4 44 44
+ 00 03 A5 42 42
+ 00 03 AA 88 88
+ 00 03 E8 12 40
+ 00 03 E3 01 10
+ 00 02 FF 61
+ 00 02 AC 00
+ 00 03 A6 2A 2A
+ 00 03 A7 2B 2B
+ 00 03 A8 18 18
+ 00 03 A9 2A 2A
+ 00 02 AD 33
+ 00 02 AF 55
+ 00 02 AE 2B
+ 00 05 2A 00 00 00 EF
+ 00 05 2B 00 00 01 3F
+ 00 01 2C
+ 00 07 F0 02 02 00 08 0C 10
+ 00 07 F1 01 00 00 14 1D 0E
+ 00 07 F2 10 09 37 04 04 48
+ 00 07 F3 10 0B 3F 05 05 4E
+ 00 07 F4 0D 19 17 1D 1E 0F
+ 00 07 F5 06 12 13 1A 1B 0F
+ 78 01 11
+ 00 01 29
+ 00 01 2C];
+ qcom,mdss-spi-off-command = [20 01 28
+ 20 01 10];
+ qcom,mdss-spi-bl-min-level = <1>;
+ qcom,mdss-spi-bl-max-level = <4095>;
+ qcom,mdss-spi-bl-pmic-control-type = "bl_ctrl_wled";
+ qcom,mdss-spi-reset-sequence = <1 20>, <0 1>, <1 20>;
+ };
+};
diff --git a/drivers/bluetooth/bluetooth-power.c b/drivers/bluetooth/bluetooth-power.c
index b3ec52c..81e8e2d 100644
--- a/drivers/bluetooth/bluetooth-power.c
+++ b/drivers/bluetooth/bluetooth-power.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013-2019 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2009-2010, 2013-2020 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -29,7 +29,7 @@
#include <linux/clk.h>
#include <linux/of_device.h>
-#if defined(CONFIG_CNSS)
+#if defined(CONFIG_CNSS_PCI)
#include <net/cnss.h>
#endif
@@ -373,7 +373,7 @@
.set_block = bluetooth_toggle_radio,
};
-#if defined(CONFIG_CNSS) && defined(CONFIG_CLD_LL_CORE)
+#if defined(CONFIG_CNSS_PCI)
static ssize_t enable_extldo(struct device *dev, struct device_attribute *attr,
char *buf)
{
diff --git a/drivers/bus/mhi/core/mhi_main.c b/drivers/bus/mhi/core/mhi_main.c
index 82a5081..66cb2a9 100644
--- a/drivers/bus/mhi/core/mhi_main.c
+++ b/drivers/bus/mhi/core/mhi_main.c
@@ -1113,7 +1113,7 @@
chan = MHI_TRE_GET_CMD_CHID(cmd_pkt);
if (chan >= mhi_cntrl->max_chan) {
MHI_ERR("invalid channel id %u\n", chan);
- break;
+ goto del_ring_el;
}
mhi_chan = &mhi_cntrl->mhi_chan[chan];
write_lock_bh(&mhi_chan->lock);
@@ -1122,6 +1122,7 @@
write_unlock_bh(&mhi_chan->lock);
}
+del_ring_el:
mhi_del_ring_element(mhi_cntrl, mhi_ring);
}
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 5ba527a..a5deca6 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2763,6 +2763,7 @@
#define VENDOR_BLOCK 0x03
#define SPEAKER_BLOCK 0x04
#define HDR_STATIC_METADATA_EXTENDED_DATA_BLOCK 0x06
+#define COLORIMETRY_EXTENDED_DATA_BLOCK 0x05
#define EXTENDED_TAG 0x07
#define VIDEO_CAPABILITY_BLOCK 0x07
#define Y420_VIDEO_DATA_BLOCK 0x0E
@@ -3602,11 +3603,15 @@
(db[2] & (BIT(3) | BIT(2))) >> 2;
connector->ce_scan_info =
db[2] & (BIT(1) | BIT(0));
+ connector->rgb_qs = db[2] & BIT(6);
+ connector->yuv_qs = db[2] & BIT(7);
DRM_DEBUG_KMS("Scan Info (pt|it|ce): (%d|%d|%d)",
(int) connector->pt_scan_info,
(int) connector->it_scan_info,
(int) connector->ce_scan_info);
+ DRM_DEBUG_KMS("rgb_quant_range_select %d", connector->rgb_qs);
+ DRM_DEBUG_KMS("ycc_quant_range_select %d", connector->yuv_qs);
}
static bool drm_edid_is_luminance_value_present(
@@ -3662,6 +3667,49 @@
DRM_DEBUG_KMS("min luminance %d\n", connector->hdr_min_luminance);
}
+/**
+ * drm_extract_colorimetry_db - Parse the HDMI colorimetry extended block
+ * @connector: connector corresponding to the HDMI sink
+ * @db: start of the HDMI colorimetry extended block
+ *
+ * Parses the HDMI colorimetry block to extract sink info for @connector.
+ */
+static void
+drm_extract_colorimetry_db(struct drm_connector *connector, const u8 *db)
+{
+
+ if (!db) {
+ DRM_ERROR("invalid db\n");
+ return;
+ }
+
+ if (db[2] & BIT(0))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_xvYCC_601;
+
+ if (db[2] & BIT(1))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_xvYCC_709;
+
+ if (db[2] & BIT(2))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_sYCC_601;
+
+ if (db[2] & BIT(3))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_ADBYCC_601;
+
+ if (db[2] & BIT(4))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_ADB_RGB;
+
+ if (db[2] & BIT(5))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_CYCC;
+
+ if (db[2] & BIT(6))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_YCC;
+
+ if (db[2] & BIT(7))
+ connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_RGB;
+
+ DRM_DEBUG_KMS("colorimetry fmt 0x%x\n", connector->color_enc_fmt);
+}
+
/*
* drm_hdmi_extract_extended_blk_info - Parse the HDMI extended tag blocks
* @connector: connector corresponding to the HDMI sink
@@ -3694,6 +3742,10 @@
case HDR_STATIC_METADATA_EXTENDED_DATA_BLOCK:
drm_extract_hdr_db(connector, db);
break;
+ case COLORIMETRY_EXTENDED_DATA_BLOCK:
+ drm_extract_colorimetry_db(connector,
+ db);
+ break;
default:
break;
}
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
index f5f6853..efd6a77 100644
--- a/drivers/gpu/drm/msm/msm_kms.h
+++ b/drivers/gpu/drm/msm/msm_kms.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -41,6 +41,25 @@
/* Request to switch the bit clk */
#define MSM_MODE_FLAG_SEAMLESS_DYN_CLK (1<<4)
+/*
+ * We need setting some flags in bridge, and using them in encoder. Add them in
+ * private_flags would be better for use. DRM_MODE_FLAG_SUPPORTS_RGB/YUV are
+ * flags that indicating the SINK supported color formats read from EDID. While,
+ * these flags defined here indicate the best color/bit depth foramt we choosed
+ * that would be better for display. For example the best mode display like:
+ * RGB+RGB_DC,YUV+YUV_DC, RGB,YUV. And we could not set RGB and YUV format at
+ * the same time. And also RGB_DC only set when RGB format is set,the same for
+ * YUV_DC.
+ */
+/* Enable RGB444 30 bit deep color */
+#define MSM_MODE_FLAG_RGB444_DC_ENABLE (1<<5)
+/* Enable YUV420 30 bit deep color */
+#define MSM_MODE_FLAG_YUV420_DC_ENABLE (1<<6)
+/* Choose RGB444 format to display */
+#define MSM_MODE_FLAG_COLOR_FORMAT_RGB444 (1<<7)
+/* Choose YUV420 format to display */
+#define MSM_MODE_FLAG_COLOR_FORMAT_YCBCR420 (1<<8)
+
/* As there are different display controller blocks depending on the
* snapdragon version, the kms support is split out and the appropriate
* implementation is loaded at runtime. The kms module is responsible
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
index 2e12e31..4a39c6c 100644
--- a/drivers/input/keyboard/matrix_keypad.c
+++ b/drivers/input/keyboard/matrix_keypad.c
@@ -121,7 +121,7 @@
const unsigned short *keycodes = input_dev->keycode;
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
uint32_t new_state[MATRIX_MAX_COLS];
- int row, col, code;
+ int row, col, code, count_state = 0;
/* de-activate all columns for scanning */
activate_all_cols(pdata, false);
@@ -131,15 +131,26 @@
/* assert each column and read the row status out */
for (col = 0; col < pdata->num_col_gpios; col++) {
- activate_col(pdata, col, true);
-
- for (row = 0; row < pdata->num_row_gpios; row++)
+ for (row = 0; row < pdata->num_row_gpios; row++) {
+ activate_col(pdata, col, true);
new_state[col] |=
row_asserted(pdata, row) ? (1 << row) : 0;
-
+ gpio_direction_output(pdata->col_gpios[col], 0);
+ new_state[col] &=
+ row_asserted(pdata, row) ? ~(1 << row) : ~(0);
+ }
+ if (new_state[col])
+ count_state++;
activate_col(pdata, col, false);
+ for (row = 0; row < pdata->num_row_gpios; row++) {
+ gpio_direction_output(pdata->row_gpios[row], 0);
+ gpio_direction_input(pdata->row_gpios[row]);
+ }
}
+ if (count_state == 5)
+ goto out;
+
for (col = 0; col < pdata->num_col_gpios; col++) {
uint32_t bits_changed;
@@ -162,6 +173,7 @@
memcpy(keypad->last_key_state, new_state, sizeof(new_state));
+out:
activate_all_cols(pdata, true);
/* Enable IRQs again */
@@ -434,6 +446,8 @@
if (of_get_property(np, "gpio-activelow", NULL))
pdata->active_low = true;
+ pdata->name = of_get_property(np, "input-name", NULL);
+
of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms);
of_property_read_u32(np, "col-scan-delay-us",
&pdata->col_scan_delay_us);
@@ -499,7 +513,6 @@
err = -ENOMEM;
goto err_free_mem;
}
-
keypad->input_dev = input_dev;
keypad->pdata = pdata;
keypad->row_shift = get_count_order(pdata->num_col_gpios);
@@ -507,7 +520,7 @@
INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
spin_lock_init(&keypad->lock);
- input_dev->name = pdev->name;
+ input_dev->name = pdata->name ? : pdev->name;
input_dev->id.bustype = BUS_HOST;
input_dev->dev.parent = &pdev->dev;
input_dev->open = matrix_keypad_start;
diff --git a/drivers/input/misc/qti-haptics.c b/drivers/input/misc/qti-haptics.c
index 459faf9..27ce7cf 100644
--- a/drivers/input/misc/qti-haptics.c
+++ b/drivers/input/misc/qti-haptics.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018, 2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -24,6 +24,7 @@
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/pwm.h>
+#include <linux/qpnp/qpnp-misc.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
@@ -173,6 +174,7 @@
#define HAP_PLAY_BIT BIT(7)
#define REG_HAP_SEC_ACCESS 0xD0
+#define REG_HAP_PERPH_RESET_CTL3 0xDA
struct qti_hap_effect {
int id;
@@ -222,6 +224,7 @@
struct hrtimer stop_timer;
struct hrtimer hap_disable_timer;
struct dentry *hap_debugfs;
+ struct notifier_block twm_nb;
spinlock_t bus_lock;
ktime_t last_sc_time;
int play_irq;
@@ -232,6 +235,20 @@
bool perm_disable;
bool play_irq_en;
bool vdd_enabled;
+ bool twm_state;
+ bool haptics_ext_pin_twm;
+};
+
+struct hap_addr_val {
+ u16 addr;
+ u8 value;
+};
+
+static struct hap_addr_val twm_ext_cfg[] = {
+ {REG_HAP_PLAY, 0x00}, /* Stop playing haptics waveform */
+ {REG_HAP_PERPH_RESET_CTL3, 0x0D}, /* Disable SHUTDOWN1_RB reset */
+ {REG_HAP_SEL, 0x01}, /* Configure for external-pin mode */
+ {REG_HAP_EN_CTL1, 0x80}, /* Enable haptics driver */
};
static int wf_repeat[8] = {1, 2, 4, 8, 16, 32, 64, 128};
@@ -1036,6 +1053,24 @@
qti_haptics_config_vmax(chip, play->vmax_mv);
}
+static int qti_haptics_twm_config(struct qti_hap_chip *chip)
+{
+ int rc, i;
+
+ for (i = 0; i < ARRAY_SIZE(twm_ext_cfg); i++) {
+ rc = qti_haptics_write(chip, twm_ext_cfg[i].addr,
+ &twm_ext_cfg[i].value, 1);
+ if (rc < 0) {
+ dev_err(chip->dev, "Haptics TWM config failed, rc=%d\n",
+ rc);
+ return rc;
+ }
+ }
+ pr_debug("Enabled haptics for TWM mode\n");
+
+ return 0;
+}
+
static int qti_haptics_hw_init(struct qti_hap_chip *chip)
{
struct qti_hap_config *config = &chip->config;
@@ -1183,6 +1218,21 @@
effect->brake_en = (val != 0);
}
+static int twm_notifier_cb(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct qti_hap_chip *chip = container_of(nb,
+ struct qti_hap_chip, twm_nb);
+
+ if (action != PMIC_TWM_CLEAR &&
+ action != PMIC_TWM_ENABLE)
+ pr_debug("Unsupported option %lu\n", action);
+ else
+ chip->twm_state = (u8)action;
+
+ return NOTIFY_OK;
+}
+
static int qti_haptics_parse_dt(struct qti_hap_chip *chip)
{
struct qti_hap_config *config = &chip->config;
@@ -1243,6 +1293,9 @@
config->play_rate_us = (tmp >= HAP_PLAY_RATE_US_MAX) ?
HAP_PLAY_RATE_US_MAX : tmp;
+ chip->haptics_ext_pin_twm = of_property_read_bool(node,
+ "qcom,haptics-ext-pin-twm");
+
if (of_find_property(node, "qcom,external-waveform-source", NULL)) {
if (!of_property_read_string(node,
"qcom,external-waveform-source", &str)) {
@@ -1898,6 +1951,11 @@
return rc;
}
+ chip->twm_nb.notifier_call = twm_notifier_cb;
+ rc = qpnp_misc_twm_notifier_register(&chip->twm_nb);
+ if (rc < 0)
+ pr_err("Failed to register twm_notifier_cb rc=%d\n", rc);
+
hrtimer_init(&chip->stop_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
chip->stop_timer.function = qti_hap_stop_timer;
hrtimer_init(&chip->hap_disable_timer, CLOCK_MONOTONIC,
@@ -1948,6 +2006,7 @@
destroy_ff:
input_ff_destroy(chip->input_dev);
+ qpnp_misc_twm_notifier_unregister(&chip->twm_nb);
return rc;
}
@@ -1959,6 +2018,7 @@
debugfs_remove_recursive(chip->hap_debugfs);
#endif
input_ff_destroy(chip->input_dev);
+ qpnp_misc_twm_notifier_unregister(&chip->twm_nb);
dev_set_drvdata(chip->dev, NULL);
return 0;
@@ -1982,6 +2042,12 @@
}
chip->vdd_enabled = false;
}
+
+ if (chip->twm_state == PMIC_TWM_ENABLE && chip->haptics_ext_pin_twm) {
+ rc = qti_haptics_twm_config(chip);
+ if (rc < 0)
+ pr_err("Haptics TWM config failed rc=%d\n", rc);
+ }
}
static const struct of_device_id haptics_match_table[] = {
diff --git a/drivers/media/platform/msm/camera/cam_core/cam_context.c b/drivers/media/platform/msm/camera/cam_core/cam_context.c
index 8a3dbba..36c2fb0 100644
--- a/drivers/media/platform/msm/camera/cam_core/cam_context.c
+++ b/drivers/media/platform/msm/camera/cam_core/cam_context.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -500,7 +500,12 @@
void cam_context_putref(struct cam_context *ctx)
{
- kref_put(&ctx->refcount, cam_node_put_ctxt_to_free_list);
+ if (atomic_read(&(ctx->refcount.refcount)))
+ kref_put(&ctx->refcount, cam_node_put_ctxt_to_free_list);
+ else
+ WARN(1, "ctx %s %d state %d devhdl %X\n", ctx->dev_name,
+ ctx->ctx_id, ctx->state, ctx->dev_hdl);
+
CAM_DBG(CAM_CORE,
"ctx device hdl %ld, ref count %d, dev_name %s",
ctx->dev_hdl, atomic_read(&(ctx->refcount.refcount)),
diff --git a/drivers/media/platform/msm/camera/cam_sync/cam_sync.c b/drivers/media/platform/msm/camera/cam_sync/cam_sync.c
index c9e6e5f..26224b4 100644
--- a/drivers/media/platform/msm/camera/cam_sync/cam_sync.c
+++ b/drivers/media/platform/msm/camera/cam_sync/cam_sync.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -156,7 +156,7 @@
"Error: accessing an uninitialized sync obj = %d",
sync_obj);
spin_unlock_bh(&sync_dev->row_spinlocks[sync_obj]);
- return -EINVAL;
+ return 0;
}
CAM_DBG(CAM_SYNC, "deregistered callback for sync object:%d",
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
index 5d48c7b..63ae9d1 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -890,6 +890,9 @@
ms_res->src_info[i]->dual_hw_ms_info.index);
}
}
+ /* the number of frames that are dropped */
+ vfe_dev->isp_page->dual_cam_drop =
+ frame_id - (src_info->frame_id + 1);
ms_res->active_src_mask |= (1 << src_info->dual_hw_ms_info.index);
src_info->frame_id = frame_id;
src_info->dual_hw_ms_info.sync_state = MSM_ISP_DUAL_CAM_SYNC;
@@ -927,6 +930,8 @@
src_info->dual_hw_ms_info.index)) {
pr_err_ratelimited("Frame out of sync on vfe %d\n",
vfe_dev->pdev->id);
+ /* Notify to do reconfig at SW sync drop*/
+ vfe_dev->isp_page->dual_cam_drop_detected = 1;
/*
* set this isp as async mode to force
*it sync again at the next sof
@@ -2304,8 +2309,8 @@
MSM_ISP_BUFFER_STATE_PUT_BUF;
buf->buf_debug.put_state_last ^= 1;
rc = vfe_dev->buf_mgr->ops->buf_done(vfe_dev->buf_mgr,
- buf->bufq_handle, buf->buf_idx, time_stamp,
- frame_id, stream_info->runtime_output_format);
+ buf->bufq_handle, buf->buf_idx, time_stamp,
+ frame_id, stream_info->runtime_output_format);
if (rc == -EFAULT) {
msm_isp_halt_send_error(vfe_dev,
ISP_EVENT_BUF_FATAL_ERROR);
diff --git a/drivers/net/can/spi/qti-can.c b/drivers/net/can/spi/qti-can.c
index 6c688ed..fdc6188 100644
--- a/drivers/net/can/spi/qti-can.c
+++ b/drivers/net/can/spi/qti-can.c
@@ -46,6 +46,8 @@
#define DRIVER_MODE_AMB 2
#define QUERY_FIRMWARE_TIMEOUT_MS 300
#define EUPGRADE 140
+#define TIME_OFFSET_MAX_THD 5
+#define TIME_OFFSET_MIN_THD -5
struct qti_can {
struct net_device **netdev;
@@ -290,6 +292,9 @@
struct net_device *netdev;
int i;
struct device *dev;
+ s64 ts_offset_corrected;
+ static u16 buff_frames_disc_cntr;
+ static u8 disp_disc_cntr = 1;
dev = &priv_data->spidev->dev;
if (frame->can_if >= priv_data->max_can_channels) {
@@ -314,14 +319,31 @@
for (i = 0; i < cf->can_dlc; i++)
cf->data[i] = frame->data[i];
- nsec = ms_to_ktime(le64_to_cpu(frame->ts)
- + priv_data->time_diff);
- skt = skb_hwtstamps(skb);
- skt->hwtstamp = nsec;
- skb->tstamp = nsec;
- netif_rx(skb);
- LOGDI("hwtstamp: %lld\n", ktime_to_ms(skt->hwtstamp));
- netdev->stats.rx_packets++;
+ ts_offset_corrected = le64_to_cpu(frame->ts)
+ + priv_data->time_diff;
+
+ /* CAN frames which are received before SOC powers up are discarded */
+ if (ts_offset_corrected > 0) {
+ if (disp_disc_cntr == 1) {
+ dev_info(&priv_data->spidev->dev,
+ "No of buff frames discarded is %lld\n",
+ buff_frames_disc_cntr);
+ disp_disc_cntr = 0;
+ }
+
+ nsec = ms_to_ktime(ts_offset_corrected);
+ skt = skb_hwtstamps(skb);
+ skt->hwtstamp = nsec;
+ skb->tstamp = nsec;
+
+ netif_rx(skb);
+
+ LOGDI("hwtstamp: %lld\n", ktime_to_ms(skt->hwtstamp));
+ netdev->stats.rx_packets++;
+ } else {
+ buff_frames_disc_cntr++;
+ dev_kfree_skb(skb);
+ }
}
static void qti_can_receive_property(struct qti_can *priv_data,
@@ -370,6 +392,9 @@
int ret = 0;
u64 mstime;
ktime_t ktime_now;
+ static s64 prev_time_diff;
+ static u8 first_offset_est = 1;
+ s64 offset_variation = 0;
LOGDI("<%x %2d [%d]\n", resp->cmd, resp->len, resp->seq);
if (resp->cmd == CMD_CAN_RECEIVE_FRAME) {
@@ -437,6 +462,32 @@
mstime = ktime_to_ms(ktime_now);
priv_data->time_diff = mstime -
(le64_to_cpu(time_data->time));
+
+ if (first_offset_est == 1) {
+ prev_time_diff = priv_data->time_diff;
+ first_offset_est = 0;
+ }
+
+ offset_variation = priv_data->time_diff -
+ prev_time_diff;
+
+ if ((offset_variation > TIME_OFFSET_MAX_THD) ||
+ (offset_variation < TIME_OFFSET_MIN_THD)) {
+ dev_info(&priv_data->spidev->dev,
+ "Off Exceeded: Curr off is %lld\n",
+ priv_data->time_diff);
+ dev_info(&priv_data->spidev->dev,
+ "Prev off is %lld\n",
+ prev_time_diff);
+ /* Set curr off to prev off if */
+ /* variation is beyond threshold */
+ priv_data->time_diff = prev_time_diff;
+
+ } else {
+ /* Set prev off to curr off if */
+ /* variation is within threshold */
+ prev_time_diff = priv_data->time_diff;
+ }
}
exit:
diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c
index c38f1be..03e20005 100644
--- a/drivers/platform/msm/gsi/gsi.c
+++ b/drivers/platform/msm/gsi/gsi.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -944,6 +944,9 @@
__gsi_config_gen_irq(props->ee, ~0,
~GSI_EE_n_CNTXT_GSI_IRQ_CLR_GSI_BREAK_POINT_BMSK);
+ gsi_ctx->shared_ch_info.ch_id = gsi_ctx->max_ch;
+ gsi_ctx->shared_ch_info.evchid = gsi_ctx->max_ev;
+
gsi_writel(props->intr, gsi_ctx->base +
GSI_EE_n_CNTXT_INTSET_OFFS(gsi_ctx->per.ee));
@@ -1801,7 +1804,8 @@
if (atomic_read(
&gsi_ctx->evtr[props->evt_ring_hdl].chan_ref_cnt) &&
- gsi_ctx->evtr[props->evt_ring_hdl].props.exclusive) {
+ gsi_ctx->evtr[props->evt_ring_hdl].props.exclusive &&
+ !props->common_evt_ring) {
GSIERR("evt ring=%lu exclusively used by chan_hdl=%p\n",
props->evt_ring_hdl, chan_hdl);
return -GSI_STATUS_UNSUPPORTED_OP;
@@ -1870,6 +1874,10 @@
ctx->user_data = user_data;
*chan_hdl = props->ch_id;
ctx->allocated = true;
+ if ((props->evt_ring_hdl != ~0) && props->common_evt_ring) {
+ gsi_ctx->shared_ch_info.ch_id = props->ch_id;
+ gsi_ctx->shared_ch_info.evchid = props->evt_ring_hdl;
+ }
ctx->stats.dp.last_timestamp = jiffies_to_msecs(jiffies);
atomic_inc(&gsi_ctx->num_chan);
@@ -2375,6 +2383,11 @@
atomic_dec(&ctx->evtr->chan_ref_cnt);
atomic_dec(&gsi_ctx->num_chan);
+ if (gsi_ctx->shared_ch_info.ch_id == chan_hdl) {
+ gsi_ctx->shared_ch_info.ch_id = gsi_ctx->max_ch;
+ gsi_ctx->shared_ch_info.evchid = gsi_ctx->max_ev;
+ }
+
return GSI_STATUS_SUCCESS;
}
EXPORT_SYMBOL(gsi_dealloc_channel);
@@ -2751,6 +2764,7 @@
int gsi_config_channel_mode(unsigned long chan_hdl, enum gsi_chan_mode mode)
{
struct gsi_chan_ctx *ctx;
+ struct gsi_chan_ctx *shared_ch_ctx;
enum gsi_chan_mode curr;
unsigned long flags;
@@ -2793,13 +2807,39 @@
mode == GSI_CHAN_MODE_POLL) {
__gsi_config_ieob_irq(gsi_ctx->per.ee, 1 << ctx->evtr->id, 0);
atomic_set(&ctx->poll_mode, mode);
+ if ((ctx->props.common_evt_ring) &&
+ (gsi_ctx->shared_ch_info.ch_id == chan_hdl)) {
+ atomic_set(&ctx->evtr->chan->poll_mode, mode);
+ } else if ((ctx->props.common_evt_ring) &&
+ gsi_ctx->shared_ch_info.evchid ==
+ ctx->evtr->id) {
+ shared_ch_ctx =
+ &gsi_ctx->chan[gsi_ctx->shared_ch_info.ch_id];
+ if (shared_ch_ctx != NULL)
+ atomic_set(&shared_ch_ctx->poll_mode, mode);
+ }
+ GSIDBG("set gsi_ctx evtr_id %d to %d mode\n",
+ ctx->evtr->id, mode);
ctx->stats.callback_to_poll++;
}
if (curr == GSI_CHAN_MODE_POLL &&
mode == GSI_CHAN_MODE_CALLBACK) {
atomic_set(&ctx->poll_mode, mode);
+ if ((ctx->props.common_evt_ring) &&
+ (gsi_ctx->shared_ch_info.ch_id == chan_hdl)) {
+ atomic_set(&ctx->evtr->chan->poll_mode, mode);
+ } else if ((ctx->props.common_evt_ring) &&
+ gsi_ctx->shared_ch_info.evchid ==
+ ctx->evtr->id) {
+ shared_ch_ctx =
+ &gsi_ctx->chan[gsi_ctx->shared_ch_info.ch_id];
+ if (shared_ch_ctx != NULL)
+ atomic_set(&shared_ch_ctx->poll_mode, mode);
+ }
__gsi_config_ieob_irq(gsi_ctx->per.ee, 1 << ctx->evtr->id, ~0);
+ GSIDBG("set gsi_ctx evtr_id %d to %d mode\n",
+ ctx->evtr->id, mode);
ctx->stats.poll_to_callback++;
}
spin_unlock_irqrestore(&gsi_ctx->slock, flags);
diff --git a/drivers/platform/msm/gsi/gsi.h b/drivers/platform/msm/gsi/gsi.h
index 4a3f4ec..9bc7be9 100644
--- a/drivers/platform/msm/gsi/gsi.h
+++ b/drivers/platform/msm/gsi/gsi.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -190,6 +190,11 @@
unsigned long halt_channel;
};
+struct gsi_shared_chan_info {
+ uint8_t ch_id;
+ uint8_t evchid;
+};
+
struct gsi_ctx {
void __iomem *base;
struct device *dev;
@@ -213,6 +218,8 @@
struct completion gen_ee_cmd_compl;
void *ipc_logbuf;
void *ipc_logbuf_low;
+ struct gsi_shared_chan_info shared_ch_info;
+
/*
* The following used only on emulation systems.
*/
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c
index 2564cd5..da6be7e 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -42,7 +42,6 @@
#include <asm/cacheflush.h>
#ifdef CONFIG_ARM64
-
/* Outer caches unsupported on ARM64 platforms */
#define outer_flush_range(x, y)
#define __cpuc_flush_dcache_area __flush_dcache_area
@@ -637,6 +636,37 @@
pair_info[i].producer_pipe_num = -1;
pair_info[i].ep_id = -1;
}
+ ep_index = ipa3_get_ep_mapping(IPA_CLIENT_USB2_PROD);
+
+ if ((ep_index != -1) && ipa3_ctx->ep[ep_index].valid) {
+ pair_info[ep_info->num_ep_pairs].consumer_pipe_num = ep_index;
+ ep_index = ipa3_get_ep_mapping(IPA_CLIENT_USB2_CONS);
+ if ((ep_index != -1) && (ipa3_ctx->ep[ep_index].valid)) {
+ pair_info[ep_info->num_ep_pairs].producer_pipe_num =
+ ep_index;
+ pair_info[ep_info->num_ep_pairs].ep_id =
+ IPA_USB1_EP_ID;
+
+ IPADBG("ep_pair_info consumer_pipe_num %d",
+ pair_info[ep_info->num_ep_pairs].
+ consumer_pipe_num);
+ IPADBG(" producer_pipe_num %d ep_id %d\n",
+ pair_info[ep_info->num_ep_pairs].
+ producer_pipe_num,
+ pair_info[ep_info->num_ep_pairs].ep_id);
+ ep_info->num_ep_pairs++;
+ } else {
+ pair_info[ep_info->num_ep_pairs].consumer_pipe_num = -1;
+ IPADBG("ep_pair_info consumer_pipe_num %d",
+ pair_info[ep_info->num_ep_pairs].
+ consumer_pipe_num);
+ IPADBG(" producer_pipe_num %d ep_id %d\n",
+ pair_info[ep_info->num_ep_pairs].
+ producer_pipe_num,
+ pair_info[ep_info->num_ep_pairs].ep_id);
+ }
+ }
+
ep_index = ipa3_get_ep_mapping(IPA_CLIENT_USB_PROD);
@@ -669,36 +699,6 @@
}
}
- ep_index = ipa3_get_ep_mapping(IPA_CLIENT_USB2_PROD);
-
- if ((ep_index != -1) && ipa3_ctx->ep[ep_index].valid) {
- pair_info[ep_info->num_ep_pairs].consumer_pipe_num = ep_index;
- ep_index = ipa3_get_ep_mapping(IPA_CLIENT_USB2_CONS);
- if ((ep_index != -1) && (ipa3_ctx->ep[ep_index].valid)) {
- pair_info[ep_info->num_ep_pairs].producer_pipe_num =
- ep_index;
- pair_info[ep_info->num_ep_pairs].ep_id =
- IPA_USB1_EP_ID;
-
- IPADBG("ep_pair_info consumer_pipe_num %d",
- pair_info[ep_info->num_ep_pairs].
- consumer_pipe_num);
- IPADBG(" producer_pipe_num %d ep_id %d\n",
- pair_info[ep_info->num_ep_pairs].
- producer_pipe_num,
- pair_info[ep_info->num_ep_pairs].ep_id);
- ep_info->num_ep_pairs++;
- } else {
- pair_info[ep_info->num_ep_pairs].consumer_pipe_num = -1;
- IPADBG("ep_pair_info consumer_pipe_num %d",
- pair_info[ep_info->num_ep_pairs].
- consumer_pipe_num);
- IPADBG(" producer_pipe_num %d ep_id %d\n",
- pair_info[ep_info->num_ep_pairs].
- producer_pipe_num,
- pair_info[ep_info->num_ep_pairs].ep_id);
- }
- }
}
static void ipa3_get_pcie_ep_info(
@@ -715,16 +715,16 @@
pair_info[i].ep_id = -1;
}
- ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI_PROD);
+ ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI2_PROD);
if ((ep_index != -1) && ipa3_ctx->ep[ep_index].valid) {
pair_info[ep_info->num_ep_pairs].consumer_pipe_num = ep_index;
- ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI_CONS);
+ ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI2_CONS);
if ((ep_index != -1) && (ipa3_ctx->ep[ep_index].valid)) {
pair_info[ep_info->num_ep_pairs].producer_pipe_num =
ep_index;
pair_info[ep_info->num_ep_pairs].ep_id =
- IPA_PCIE0_EP_ID;
+ IPA_PCIE1_EP_ID;
IPADBG("ep_pair_info consumer_pipe_num %d",
pair_info[ep_info->num_ep_pairs].
@@ -746,16 +746,16 @@
}
}
- ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI2_PROD);
+ ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI_PROD);
if ((ep_index != -1) && ipa3_ctx->ep[ep_index].valid) {
pair_info[ep_info->num_ep_pairs].consumer_pipe_num = ep_index;
- ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI2_CONS);
+ ep_index = ipa3_get_ep_mapping(IPA_CLIENT_MHI_CONS);
if ((ep_index != -1) && (ipa3_ctx->ep[ep_index].valid)) {
pair_info[ep_info->num_ep_pairs].producer_pipe_num =
ep_index;
pair_info[ep_info->num_ep_pairs].ep_id =
- IPA_PCIE1_EP_ID;
+ IPA_PCIE0_EP_ID;
IPADBG("ep_pair_info consumer_pipe_num %d",
pair_info[ep_info->num_ep_pairs].
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c
index c9c6281..3a7b25d 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -102,11 +102,14 @@
struct ipa3_tx_pkt_wrapper *tx_pkt,
struct ipahal_imm_cmd_pyld **tag_pyld_ret);
static int ipa_poll_gsi_pkt(struct ipa3_sys_context *sys,
- struct ipa_mem_buffer *mem_info);
+ struct ipa_mem_buffer *mem_info,
+ struct gsi_chan_xfer_notify *xfer_notify);
static unsigned long tag_to_pointer_wa(uint64_t tag);
static uint64_t pointer_to_tag_wa(struct ipa3_tx_pkt_wrapper *tx_pkt);
static u32 ipa_adjust_ra_buff_base_sz(u32 aggr_byte_limit);
+static bool ipa_update_common_evt_ring(enum ipa_client_type src,
+ enum ipa_client_type dst);
static void ipa3_wq_write_done_common(struct ipa3_sys_context *sys,
struct ipa3_tx_pkt_wrapper *tx_pkt)
@@ -710,20 +713,24 @@
int ret;
int cnt = 0;
struct ipa_mem_buffer mem_info = { 0 };
+ struct gsi_chan_xfer_notify notify;
+ memset(¬ify, 0, sizeof(struct gsi_chan_xfer_notify));
while ((in_poll_state ? atomic_read(&sys->curr_polling_state) :
!atomic_read(&sys->curr_polling_state))) {
if (cnt && !process_all)
break;
- ret = ipa_poll_gsi_pkt(sys, &mem_info);
+ ret = ipa_poll_gsi_pkt(sys, &mem_info, ¬ify);
if (ret)
break;
if (IPA_CLIENT_IS_MEMCPY_DMA_CONS(sys->ep->client))
ipa3_dma_memcpy_notify(sys, &mem_info);
else if (IPA_CLIENT_IS_WLAN_CONS(sys->ep->client))
- ipa3_wlan_wq_rx_common(sys, mem_info.size);
+ ipa3_wlan_wq_rx_common(
+ (struct ipa3_sys_context *)(notify.chan_user_data),
+ mem_info.size);
else
ipa3_wq_rx_common(sys, mem_info.size);
@@ -738,6 +745,8 @@
static void ipa3_rx_switch_to_intr_mode(struct ipa3_sys_context *sys)
{
int ret;
+ u32 wlan_ep_idx;
+ struct ipa3_ep_context *wlan_ep;
if (!atomic_read(&sys->curr_polling_state)) {
IPAERR("already in intr mode\n");
@@ -751,6 +760,16 @@
IPAERR("Failed to switch to intr mode.\n");
goto fail;
}
+ if (IPA_CLIENT_IS_WLAN_CONS(sys->ep->client)) {
+ wlan_ep_idx = ipa3_get_ep_mapping(
+ ((sys->ep->client == IPA_CLIENT_WLAN2_CONS) ?
+ IPA_CLIENT_WLAN3_CONS : IPA_CLIENT_WLAN2_CONS));
+ if (wlan_ep_idx != IPA_EP_NOT_ALLOCATED &&
+ ipa3_ctx->ep[wlan_ep_idx].valid == 1) {
+ wlan_ep = &ipa3_ctx->ep[wlan_ep_idx];
+ atomic_set(&wlan_ep->sys->curr_polling_state, 0);
+ }
+ }
return;
fail:
@@ -1182,6 +1201,12 @@
ipa3_ctx->gsi_evt_comm_ring_rem +=
ep->gsi_mem_info.chan_ring_len;
} else if (ep->gsi_evt_ring_hdl != ~0) {
+ /* common event ring is used for WLAN2/WLAN3 pipes */
+ if (IPA_IS_4_0_AUTO_CONFIG() &&
+ ep->client == IPA_CLIENT_WLAN2_CONS) {
+ /* Skip resetting the channel. */
+ goto teardown;
+ }
result = gsi_reset_evt_ring(ep->gsi_evt_ring_hdl);
if (result != GSI_STATUS_SUCCESS) {
IPAERR("Failed to reset evt ring: %d.\n",
@@ -1201,6 +1226,8 @@
return result;
}
}
+
+teardown:
if (ep->sys->repl_wq)
flush_workqueue(ep->sys->repl_wq);
if (IPA_CLIENT_IS_CONS(ep->client))
@@ -3412,8 +3439,21 @@
void __ipa_gsi_irq_rx_scedule_poll(struct ipa3_sys_context *sys)
{
bool clk_off;
+ u32 wlan_ep_idx;
+ struct ipa3_ep_context *wlan_ep;
atomic_set(&sys->curr_polling_state, 1);
+ if (IPA_CLIENT_IS_WLAN_CONS(sys->ep->client)) {
+ wlan_ep_idx = ipa3_get_ep_mapping(
+ ((sys->ep->client == IPA_CLIENT_WLAN2_CONS) ?
+ IPA_CLIENT_WLAN3_CONS : IPA_CLIENT_WLAN2_CONS));
+ if (wlan_ep_idx != IPA_EP_NOT_ALLOCATED &&
+ ipa3_ctx->ep[wlan_ep_idx].valid == 1) {
+ wlan_ep = &ipa3_ctx->ep[wlan_ep_idx];
+ /* Set the polling state. */
+ atomic_set(&wlan_ep->sys->curr_polling_state, 1);
+ }
+ }
ipa3_inc_acquire_wakelock();
/*
@@ -3463,11 +3503,7 @@
struct ipa3_rx_pkt_wrapper, link);
rx_pkt_rcvd = (struct ipa3_rx_pkt_wrapper *)notify->xfer_user_data;
- if (rx_pkt_expected != rx_pkt_rcvd) {
- IPAERR("Pkt was not filled in head of rx buffer.\n");
- WARN_ON(1);
- return;
- }
+ sys->ep->xfer_notify = *notify;
sys->ep->bytes_xfered_valid = true;
sys->ep->bytes_xfered = notify->bytes_xfered;
sys->ep->phys_base = rx_pkt_rcvd->data.dma_addr;
@@ -3534,6 +3570,26 @@
}
}
+static bool ipa_update_common_evt_ring(enum ipa_client_type src,
+ enum ipa_client_type dst)
+{
+ u32 src_ep_idx, dst_ep_idx;
+
+ src_ep_idx = ipa3_get_ep_mapping(src);
+ dst_ep_idx = ipa3_get_ep_mapping(dst);
+ if (src_ep_idx != IPA_EP_NOT_ALLOCATED &&
+ ipa3_ctx->ep[src_ep_idx].valid == 1 &&
+ dst_ep_idx != IPA_EP_NOT_ALLOCATED &&
+ ipa3_ctx->ep[dst_ep_idx].valid == 1) {
+ /* copy event ring handle */
+ ipa3_ctx->ep[dst_ep_idx].gsi_evt_ring_hdl =
+ ipa3_ctx->ep[src_ep_idx].gsi_evt_ring_hdl;
+ return true;
+ }
+ return false;
+}
+
+
int ipa3_alloc_common_event_ring(void)
{
struct gsi_evt_ring_props gsi_evt_ring_props;
@@ -3611,6 +3667,13 @@
ep->gsi_evt_ring_hdl = ipa3_ctx->gsi_evt_comm_hdl;
} else if (ep->sys->policy != IPA_POLICY_NOINTR_MODE ||
IPA_CLIENT_IS_CONS(ep->client)) {
+ /* Use common event ring in auto config for WLAN2/WLAN3 pipes */
+ if (IPA_IS_4_0_AUTO_CONFIG() &&
+ (ep->client == IPA_CLIENT_WLAN3_CONS) &&
+ ipa_update_common_evt_ring(IPA_CLIENT_WLAN2_CONS,
+ ep->client)) {
+ goto setup_channel;
+ }
gsi_evt_ring_props.intf = GSI_EVT_CHTYPE_GPI_EV;
gsi_evt_ring_props.intr = GSI_INTR_IRQ;
gsi_evt_ring_props.re_size =
@@ -3623,6 +3686,14 @@
*/
gsi_evt_ring_props.ring_len = 2 * in->desc_fifo_sz;
+ /* In Auto config, common event ring is used for WLAN sys pipes.
+ * Double the event ring size.
+ */
+ if (IPA_IS_4_0_AUTO_CONFIG() &&
+ IPA_CLIENT_IS_WLAN_CONS(ep->client))
+ gsi_evt_ring_props.ring_len =
+ 2 * gsi_evt_ring_props.ring_len;
+
gsi_evt_ring_props.ring_base_vaddr =
dma_alloc_coherent(ipa3_ctx->pdev,
gsi_evt_ring_props.ring_len,
@@ -3659,6 +3730,7 @@
goto fail_alloc_evt_ring;
}
+setup_channel:
memset(&gsi_channel_props, 0, sizeof(gsi_channel_props));
gsi_channel_props.prot = GSI_CHAN_PROT_GPI;
if (IPA_CLIENT_IS_PROD(ep->client)) {
@@ -3731,6 +3803,12 @@
gsi_channel_props.xfer_cb = ipa_gsi_irq_rx_notify_cb;
if (IPA_CLIENT_IS_MEMCPY_DMA_CONS(ep->client))
gsi_channel_props.xfer_cb = ipa_dma_gsi_irq_rx_notify_cb;
+
+ /* In Auto config, common event ring is used for WLAN sys pipes.*/
+ if (IPA_IS_4_0_AUTO_CONFIG() &&
+ IPA_CLIENT_IS_WLAN_CONS(ep->client))
+ gsi_channel_props.common_evt_ring = true;
+
result = gsi_alloc_channel(&gsi_channel_props, ipa3_ctx->gsi_dev_hdl,
&ep->gsi_chan_hdl);
if (result != GSI_STATUS_SUCCESS)
@@ -3814,21 +3892,22 @@
}
static int ipa_poll_gsi_pkt(struct ipa3_sys_context *sys,
- struct ipa_mem_buffer *mem_info)
+ struct ipa_mem_buffer *mem_info,
+ struct gsi_chan_xfer_notify *xfer_notify)
{
int ret;
- struct gsi_chan_xfer_notify xfer_notify;
struct ipa3_rx_pkt_wrapper *rx_pkt;
if (sys->ep->bytes_xfered_valid) {
mem_info->phys_base = sys->ep->phys_base;
mem_info->size = (u32)sys->ep->bytes_xfered;
sys->ep->bytes_xfered_valid = false;
+ *xfer_notify = sys->ep->xfer_notify;
return GSI_STATUS_SUCCESS;
}
ret = gsi_poll_channel(sys->ep->gsi_chan_hdl,
- &xfer_notify);
+ xfer_notify);
if (ret == GSI_STATUS_POLL_EMPTY)
return ret;
else if (ret != GSI_STATUS_SUCCESS) {
@@ -3837,9 +3916,9 @@
}
rx_pkt = (struct ipa3_rx_pkt_wrapper *)
- xfer_notify.xfer_user_data;
+ (xfer_notify->xfer_user_data);
mem_info->phys_base = rx_pkt->data.dma_addr;
- mem_info->size = xfer_notify.bytes_xfered;
+ mem_info->size = xfer_notify->bytes_xfered;
return ret;
}
@@ -3861,6 +3940,7 @@
struct ipa_mem_buffer mem_info = {0};
static int total_cnt;
struct ipa_active_client_logging_info log;
+ struct gsi_chan_xfer_notify notify;
IPA_ACTIVE_CLIENTS_PREP_SPECIAL(log, "NAPI");
@@ -3869,14 +3949,14 @@
IPAERR("bad parm 0x%x\n", clnt_hdl);
return cnt;
}
-
+ memset(¬ify, 0, sizeof(struct gsi_chan_xfer_notify));
ep = &ipa3_ctx->ep[clnt_hdl];
while (cnt < weight &&
atomic_read(&ep->sys->curr_polling_state)) {
atomic_set(&ipa3_ctx->transport_pm.eot_activity, 1);
- ret = ipa_poll_gsi_pkt(ep->sys, &mem_info);
+ ret = ipa_poll_gsi_pkt(ep->sys, &mem_info, ¬ify);
if (ret)
break;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
index c876938..277b637 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -385,6 +385,10 @@
#define IPA_TZ_UNLOCK_ATTRIBUTE 0x0C0311
#define TZ_MEM_PROTECT_REGION_ID 0x10
+#define IPA_IS_4_0_AUTO_CONFIG() \
+ ((ipa3_ctx->ipa_hw_type == IPA_HW_v4_0) && \
+ (ipa3_ctx->ipa_config_is_auto))
+
struct ipa3_active_client_htable_entry {
struct hlist_node list;
char id_string[IPA3_ACTIVE_CLIENTS_LOG_NAME_LEN];
@@ -728,6 +732,7 @@
* @gsi_evt_ring_hdl: EP's GSI channel event ring handle
* @gsi_mem_info: EP's GSI channel rings info
* @chan_scratch: EP's GSI channel scratch info
+ * @xfer_notify: transfer element
* @cfg: EP cionfiguration
* @dst_pipe_index: destination pipe index
* @rt_tbl_idx: routing table index
@@ -752,6 +757,7 @@
unsigned long gsi_evt_ring_hdl;
struct ipa_gsi_ep_mem_info gsi_mem_info;
union __packed gsi_channel_scratch chan_scratch;
+ struct gsi_chan_xfer_notify xfer_notify;
bool bytes_xfered_valid;
u16 bytes_xfered;
dma_addr_t phys_base;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c
index d41cdb7..246012d 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2019,2020 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -548,7 +548,7 @@
mutex_lock(&ipa3_ctx->msg_lock);
list_add_tail(&msg->link, &ipa3_ctx->msg_list);
/* support for softap client event cache */
- if (wlan_msg_process(meta, buff))
+ if (buff != NULL && wlan_msg_process(meta, buff))
IPAERR("wlan_msg_process failed\n");
/* unlock only after process */
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c
index 95925a0..1d19e00 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -25,6 +25,8 @@
#include "ipa_qmi_service.h"
+#include <soc/qcom/boot_stats.h>
+
#define IPA_Q6_SVC_VERS 1
#define IPA_A5_SVC_VERS 1
#define Q6_QMI_COMPLETION_TIMEOUT (60*HZ)
@@ -606,6 +608,9 @@
&resp_desc, &resp, sizeof(resp),
QMI_SEND_REQ_TIMEOUT_MS);
pr_info("QMI_IPA_INIT_MODEM_DRIVER_REQ_V01 response received\n");
+
+ place_marker("M - QMI ready for commands");
+
return ipa3_check_qmi_response(rc,
QMI_IPA_INIT_MODEM_DRIVER_REQ_V01, resp.resp.result,
resp.resp.error, "ipa_init_modem_driver_resp_msg_v01");
diff --git a/drivers/power/supply/qcom/battery.c b/drivers/power/supply/qcom/battery.c
index 14f179b..dab79fe 100644
--- a/drivers/power/supply/qcom/battery.c
+++ b/drivers/power/supply/qcom/battery.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018,2019 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1606,6 +1606,12 @@
if (!chip->pl_ws)
goto cleanup;
+ INIT_DELAYED_WORK(&chip->status_change_work, status_change_work);
+ INIT_WORK(&chip->pl_taper_work, pl_taper_work);
+ INIT_WORK(&chip->pl_disable_forever_work, pl_disable_forever_work);
+ INIT_DELAYED_WORK(&chip->pl_awake_work, pl_awake_work);
+ INIT_DELAYED_WORK(&chip->fcc_stepper_work, fcc_stepper_work);
+
chip->fcc_votable = create_votable("FCC", VOTE_MIN,
pl_fcc_vote_callback,
chip);
@@ -1660,12 +1666,6 @@
vote(chip->pl_disable_votable, PL_INDIRECT_VOTER, true, 0);
- INIT_DELAYED_WORK(&chip->status_change_work, status_change_work);
- INIT_WORK(&chip->pl_taper_work, pl_taper_work);
- INIT_WORK(&chip->pl_disable_forever_work, pl_disable_forever_work);
- INIT_DELAYED_WORK(&chip->pl_awake_work, pl_awake_work);
- INIT_DELAYED_WORK(&chip->fcc_stepper_work, fcc_stepper_work);
-
rc = pl_register_notifier(chip);
if (rc < 0) {
pr_err("Couldn't register psy notifier rc = %d\n", rc);
diff --git a/drivers/power/supply/qcom/qpnp-fg-gen3.c b/drivers/power/supply/qcom/qpnp-fg-gen3.c
index 97f04d2..42bbc4c 100644
--- a/drivers/power/supply/qcom/qpnp-fg-gen3.c
+++ b/drivers/power/supply/qcom/qpnp-fg-gen3.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -3698,15 +3698,18 @@
{
int rc, ibatt_avg, msoc, full_soc, act_cap_mah, divisor;
+ mutex_lock(&chip->ttf.lock);
rc = fg_circ_buf_median(&chip->ttf.ibatt, &ibatt_avg);
if (rc < 0) {
/* try to get instantaneous current */
rc = fg_get_battery_current(chip, &ibatt_avg);
if (rc < 0) {
pr_err("failed to get battery current, rc=%d\n", rc);
+ mutex_unlock(&chip->ttf.lock);
return rc;
}
}
+ mutex_unlock(&chip->ttf.lock);
ibatt_avg /= MILLI_UNIT;
/* clamp ibatt_avg to 100mA */
diff --git a/drivers/soc/qcom/bgcom_interface.c b/drivers/soc/qcom/bgcom_interface.c
index 91f6fed..9c1abcf 100644
--- a/drivers/soc/qcom/bgcom_interface.c
+++ b/drivers/soc/qcom/bgcom_interface.c
@@ -69,6 +69,10 @@
struct bgdaemon_priv {
struct bgdaemon_regulator rgltr;
enum ldo_task ldo_action;
+ void *pil_h;
+ bool pending_bg_twm_wear_load;
+ struct workqueue_struct *bgdaemon_wq;
+ struct work_struct bgdaemon_load_twm_bg_work;
};
struct bg_event {
@@ -120,6 +124,20 @@
return kobject_uevent_env(&dev_ret->kobj, KOBJ_CHANGE, envp);
}
+static void bgcom_load_twm_bg_work(struct work_struct *work)
+{
+ if (dev->pil_h) {
+ pr_err("bg-wear is already loaded\n");
+ subsystem_put(dev->pil_h);
+ dev->pil_h = NULL;
+ } else {
+ dev->pil_h = subsystem_get_with_fwname("bg-wear",
+ "bg-twm-wear");
+ if (!dev->pil_h)
+ pr_err("failed to load bg-twm-wear\n");
+ }
+}
+
static int bgdaemon_configure_regulators(bool state)
{
int retval;
@@ -146,6 +164,7 @@
}
return retval;
}
+
static int bgdaemon_init_regulators(struct device *pdev)
{
int rc;
@@ -398,8 +417,35 @@
bg_app_running = true;
ret = 0;
break;
+ case BG_WEAR_LOAD:
+ ret = 0;
+ if (dev->pil_h) {
+ pr_err("bg-wear is already loaded\n");
+ ret = -EFAULT;
+ break;
+ }
+
+ dev->pil_h = subsystem_get_with_fwname("bg-wear", "bg-wear");
+ if (!dev->pil_h) {
+ pr_err("failed to load bg-wear\n");
+ ret = -EFAULT;
+ }
+ break;
+ case BG_WEAR_TWM_LOAD:
+ dev->pending_bg_twm_wear_load = true;
+ queue_work(dev->bgdaemon_wq, &dev->bgdaemon_load_twm_bg_work);
+ ret = 0;
+ break;
+ case BG_WEAR_UNLOAD:
+ if (dev->pil_h) {
+ subsystem_put(dev->pil_h);
+ dev->pil_h = NULL;
+ }
+ ret = 0;
+ break;
default:
ret = -ENOIOCTLCMD;
+ break;
}
return ret;
}
@@ -521,7 +567,19 @@
if (platform_driver_register(&bg_daemon_driver))
pr_err("%s: failed to register bg-daemon register\n", __func__);
+ dev->bgdaemon_wq =
+ create_singlethread_workqueue("bgdaemon-work-queue");
+ if (!dev->bgdaemon_wq) {
+ pr_err("Failed to init BG-DAEMON work-queue\n");
+ goto free_wq;
+ }
+ INIT_WORK(&dev->bgdaemon_load_twm_bg_work, bgcom_load_twm_bg_work);
+
return 0;
+
+free_wq:
+ destroy_workqueue(dev->bgdaemon_wq);
+ return -EFAULT;
}
static void __exit exit_bg_com_dev(void)
@@ -556,6 +614,12 @@
case SUBSYS_AFTER_SHUTDOWN:
/* Add sleep for SPI Bus to release*/
msleep(SLEEP_FOR_SPI_BUS);
+ if (dev->pending_bg_twm_wear_load) {
+ /* Load bg-twm-wear */
+ dev->pending_bg_twm_wear_load = false;
+ queue_work(dev->bgdaemon_wq,
+ &dev->bgdaemon_load_twm_bg_work);
+ }
break;
case SUBSYS_AFTER_POWERUP:
bge.e_type = BG_AFTER_POWER_UP;
@@ -596,6 +660,7 @@
}
return NOTIFY_DONE;
}
+
static int ssr_adsp_cb(struct notifier_block *this,
unsigned long opcode, void *data)
{
diff --git a/drivers/soc/qcom/bgcom_spi.c b/drivers/soc/qcom/bgcom_spi.c
index 59d74c5..a6a176a 100644
--- a/drivers/soc/qcom/bgcom_spi.c
+++ b/drivers/soc/qcom/bgcom_spi.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -49,7 +49,7 @@
#define HED_EVENT_DATA_STRT_LEN (0x05)
#define CMA_BFFR_POOL_SIZE (128*1024)
-#define MAX_RETRY 500
+#define MAX_RETRY 100
enum bgcom_state {
/*BGCOM Staus ready*/
@@ -849,7 +849,7 @@
bg_spi->bg_state = BGCOM_STATE_ACTIVE;
break;
}
- udelay(10);
+ udelay(1000);
++retry;
} while (retry < MAX_RETRY);
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c
index 1d5284e..c5bfec0 100644
--- a/drivers/soc/qcom/peripheral-loader.c
+++ b/drivers/soc/qcom/peripheral-loader.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2010-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -44,6 +44,7 @@
#include <trace/events/trace_msm_pil_event.h>
#include "peripheral-loader.h"
+#include <soc/qcom/boot_stats.h>
#define pil_err(desc, fmt, ...) \
dev_err(desc->dev, "%s: " fmt, desc->name, ##__VA_ARGS__)
@@ -724,7 +725,7 @@
if (ret)
return ret;
-
+ place_marker("M - Modem Image Start Loading");
pil_info(desc, "loading from %pa to %pa\n", &priv->region_start,
&priv->region_end);
@@ -1193,6 +1194,7 @@
}
trace_pil_event("reset_done", desc);
pil_info(desc, "Brought out of reset\n");
+ place_marker("M - Modem out of reset");
desc->modem_ssr = false;
err_auth_and_reset:
if (ret && desc->subsys_vmid > 0) {
diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
index 5af176b..c58eae8 100644
--- a/drivers/staging/android/ashmem.c
+++ b/drivers/staging/android/ashmem.c
@@ -370,8 +370,23 @@
_calc_vm_trans(prot, PROT_EXEC, VM_MAYEXEC);
}
+static int ashmem_vmfile_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ /* do not allow to mmap ashmem backing shmem file directly */
+ return -EPERM;
+}
+
+static unsigned long
+ashmem_vmfile_get_unmapped_area(struct file *file, unsigned long addr,
+ unsigned long len, unsigned long pgoff,
+ unsigned long flags)
+{
+ return current->mm->get_unmapped_area(file, addr, len, pgoff, flags);
+}
+
static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
{
+ static struct file_operations vmfile_fops;
struct ashmem_area *asma = file->private_data;
int ret = 0;
@@ -412,6 +427,19 @@
}
vmfile->f_mode |= FMODE_LSEEK;
asma->file = vmfile;
+ /*
+ * override mmap operation of the vmfile so that it can't be
+ * remapped which would lead to creation of a new vma with no
+ * asma permission checks. Have to override get_unmapped_area
+ * as well to prevent VM_BUG_ON check for f_ops modification.
+ */
+ if (!vmfile_fops.mmap) {
+ vmfile_fops = *vmfile->f_op;
+ vmfile_fops.mmap = ashmem_vmfile_mmap;
+ vmfile_fops.get_unmapped_area =
+ ashmem_vmfile_get_unmapped_area;
+ }
+ vmfile->f_op = &vmfile_fops;
}
get_file(asma->file);
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 1a7ebc5..92127ab 100755
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -18,6 +18,8 @@
#include <function/u_ncm.h>
#endif
+#include <soc/qcom/boot_stats.h>
+
#ifdef CONFIG_USB_CONFIGFS_F_ACC
extern int acc_ctrlrequest(struct usb_composite_dev *cdev,
const struct usb_ctrlrequest *ctrl);
@@ -1458,6 +1460,7 @@
kobject_uevent_env(&gi->dev->kobj,
KOBJ_CHANGE, configured);
pr_info("%s: sent uevent %s\n", __func__, configured[0]);
+ place_marker("M - USB enumeration complete");
uevent_sent = true;
}
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index a5db4a6..356fa56 100755
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -873,7 +873,21 @@
static int f2fs_drop_inode(struct inode *inode)
{
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
int ret;
+
+ /*
+ * during filesystem shutdown, if checkpoint is disabled,
+ * drop useless meta/node dirty pages.
+ */
+ if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+ if (inode->i_ino == F2FS_NODE_INO(sbi) ||
+ inode->i_ino == F2FS_META_INO(sbi)) {
+ trace_f2fs_drop_inode(inode, 1);
+ return 1;
+ }
+ }
+
/*
* This is to avoid a deadlock condition like below.
* writeback_single_inode(inode)
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c
index 586d593..3af4472 100644
--- a/fs/ubifs/recovery.c
+++ b/fs/ubifs/recovery.c
@@ -442,7 +442,6 @@
{
int empty_offs, pad_len;
- lnum = lnum;
dbg_rcvry("cleaning corruption at %d:%d", lnum, *offs);
ubifs_assert(!(*offs & 7));
diff --git a/fs/ubifs/scan.c b/fs/ubifs/scan.c
index aab8734..16f03d9 100644
--- a/fs/ubifs/scan.c
+++ b/fs/ubifs/scan.c
@@ -175,7 +175,6 @@
void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
int lnum, int offs)
{
- lnum = lnum;
dbg_scan("stop scanning LEB %d at offset %d", lnum, offs);
ubifs_assert(offs % c->min_io_size == 0);
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 9a5114d..961156a 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -542,12 +542,15 @@
* @pt_scan_info: PT scan info obtained from the VCDB of EDID
* @it_scan_info: IT scan info obtained from the VCDB of EDID
* @ce_scan_info: CE scan info obtained from the VCDB of EDID
+ * @color_enc_fmt: Colorimetry encoding formats of sink
* @hdr_eotf: Electro optical transfer function obtained from HDR block
* @hdr_metadata_type_one: Metadata type one obtained from HDR block
* @hdr_max_luminance: desired max luminance obtained from HDR block
* @hdr_avg_luminance: desired avg luminance obtained from HDR block
* @hdr_min_luminance: desired min luminance obtained from HDR block
* @hdr_supported: does the sink support HDR content
+ * @rgb_qs: does the sink declare RGB selectable quantization range
+ * @yuv_qs: does the sink declare YCC selectable quantization range
* @edid_corrupt: indicates whether the last read EDID was corrupt
* @debugfs_entry: debugfs directory for this connector
* @state: current atomic state for this connector
@@ -703,12 +706,15 @@
u8 pt_scan_info;
u8 it_scan_info;
u8 ce_scan_info;
+ u8 color_enc_fmt;
u32 hdr_eotf;
bool hdr_metadata_type_one;
u32 hdr_max_luminance;
u32 hdr_avg_luminance;
u32 hdr_min_luminance;
bool hdr_supported;
+ bool rgb_qs;
+ bool yuv_qs;
/* Flag for raw EDID header corruption - used in Displayport
* compliance testing - * Displayport Link CTS Core 1.2 rev1.1 4.2.2.6
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 1bcf8f7..b5c134a 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -217,6 +217,15 @@
#define DRM_EDID_YCBCR420_DC_36 (1 << 1)
#define DRM_EDID_YCBCR420_DC_30 (1 << 0)
+#define DRM_EDID_COLORIMETRY_xvYCC_601 (1 << 0)
+#define DRM_EDID_COLORIMETRY_xvYCC_709 (1 << 1)
+#define DRM_EDID_COLORIMETRY_sYCC_601 (1 << 2)
+#define DRM_EDID_COLORIMETRY_ADBYCC_601 (1 << 3)
+#define DRM_EDID_COLORIMETRY_ADB_RGB (1 << 4)
+#define DRM_EDID_COLORIMETRY_BT2020_CYCC (1 << 5)
+#define DRM_EDID_COLORIMETRY_BT2020_YCC (1 << 6)
+#define DRM_EDID_COLORIMETRY_BT2020_RGB (1 << 7)
+
/* ELD Header Block */
#define DRM_ELD_HEADER_BLOCK_SIZE 4
diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h
index 27e06ac..ed39560 100644
--- a/include/linux/input/matrix_keypad.h
+++ b/include/linux/input/matrix_keypad.h
@@ -73,6 +73,7 @@
bool active_low;
bool wakeup;
bool no_autorepeat;
+ const char *name; /* input device name */
};
int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
diff --git a/include/linux/msm_gsi.h b/include/linux/msm_gsi.h
index 79e7daa..0b85d3b 100644
--- a/include/linux/msm_gsi.h
+++ b/include/linux/msm_gsi.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -352,7 +352,7 @@
*
* @err_cb: error notification callback
* @chan_user_data: cookie used for notifications
- *
+ * @common_evt_ring: Boolean indicating common event ring.
* All the callbacks are in interrupt context
*
*/
@@ -373,6 +373,7 @@
void (*xfer_cb)(struct gsi_chan_xfer_notify *notify);
void (*err_cb)(struct gsi_chan_err_notify *notify);
void *chan_user_data;
+ bool common_evt_ring;
};
enum gsi_xfer_flag {
diff --git a/include/uapi/linux/bgcom_interface.h b/include/uapi/linux/bgcom_interface.h
index 904ec69..b2ac56d 100644
--- a/include/uapi/linux/bgcom_interface.h
+++ b/include/uapi/linux/bgcom_interface.h
@@ -22,6 +22,9 @@
#define BGCOM_TWM_EXIT 8
#define BGCOM_BG_APP_RUNNING 9
#define BGCOM_ADSP_DOWN2_BG 10
+#define BGCOM_BG_WEAR_LOAD 11
+#define BGCOM_BG_WEAR_TWM_LOAD 12
+#define BGCOM_BG_WEAR_UNLOAD 13
#define EXCHANGE_CODE 'V'
struct bg_ui_data {
@@ -34,6 +37,8 @@
enum bg_event_type {
BG_BEFORE_POWER_DOWN = 1,
+ BG_AFTER_POWER_DOWN,
+ BG_BEFORE_POWER_UP,
BG_AFTER_POWER_UP,
MODEM_BEFORE_POWER_DOWN,
MODEM_AFTER_POWER_UP,
@@ -71,6 +76,15 @@
#define BG_MODEM_DOWN2_BG_DONE \
_IOWR(EXCHANGE_CODE, BGCOM_MODEM_DOWN2_BG, \
struct bg_ui_data)
+#define BG_WEAR_LOAD \
+ _IOWR(EXCHANGE_CODE, BGCOM_BG_WEAR_LOAD, \
+ struct bg_ui_data)
+#define BG_WEAR_TWM_LOAD \
+ _IOWR(EXCHANGE_CODE, BGCOM_BG_WEAR_TWM_LOAD, \
+ struct bg_ui_data)
+#define BG_WEAR_UNLOAD \
+ _IOWR(EXCHANGE_CODE, BGCOM_BG_WEAR_UNLOAD, \
+ struct bg_ui_data)
#define BG_ADSP_DOWN2_BG_DONE \
_IOWR(EXCHANGE_CODE, BGCOM_ADSP_DOWN2_BG, \
struct bg_ui_data)
diff --git a/include/uapi/media/msmb_isp.h b/include/uapi/media/msmb_isp.h
index 271a731..cd1c63b 100644
--- a/include/uapi/media/msmb_isp.h
+++ b/include/uapi/media/msmb_isp.h
@@ -34,6 +34,8 @@
uint32_t kernel_sofid;
uint32_t drop_reconfig;
uint32_t vfeid;
+ uint32_t dual_cam_drop_detected;
+ uint32_t dual_cam_drop;
};
enum ISP_START_PIXEL_PATTERN {
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 430140e..e2f1d27 100755
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1350,7 +1350,7 @@
extern struct static_key sched_feat_keys[__SCHED_FEAT_NR];
#define sched_feat(x) (static_branch_##x(&sched_feat_keys[__SCHED_FEAT_##x]))
#else /* !(SCHED_DEBUG && HAVE_JUMP_LABEL) */
-#define sched_feat(x) (sysctl_sched_features & (1UL << __SCHED_FEAT_##x))
+#define sched_feat(x) !!(sysctl_sched_features & (1UL << __SCHED_FEAT_##x))
#endif /* SCHED_DEBUG && HAVE_JUMP_LABEL */
extern struct static_key_false sched_numa_balancing;
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 454f73f..e5a221f 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -2332,9 +2332,10 @@
return ret;
}
-static int ethtool_get_per_queue_coalesce(struct net_device *dev,
- void __user *useraddr,
- struct ethtool_per_queue_op *per_queue_opt)
+static noinline_for_stack
+int ethtool_get_per_queue_coalesce(struct net_device *dev,
+ void __user *useraddr,
+ struct ethtool_per_queue_op *per_queue_opt)
{
u32 bit;
int ret;
@@ -2364,9 +2365,10 @@
return 0;
}
-static int ethtool_set_per_queue_coalesce(struct net_device *dev,
- void __user *useraddr,
- struct ethtool_per_queue_op *per_queue_opt)
+static noinline_for_stack
+int ethtool_set_per_queue_coalesce(struct net_device *dev,
+ void __user *useraddr,
+ struct ethtool_per_queue_op *per_queue_opt)
{
u32 bit;
int i, ret = 0;
diff --git a/security/apparmor/crypto.c b/security/apparmor/crypto.c
index b75dab0..4c2ee49 100644
--- a/security/apparmor/crypto.c
+++ b/security/apparmor/crypto.c
@@ -32,10 +32,7 @@
int aa_calc_profile_hash(struct aa_profile *profile, u32 version, void *start,
size_t len)
{
- struct {
- struct shash_desc shash;
- char ctx[crypto_shash_descsize(apparmor_tfm)];
- } desc;
+ SHASH_DESC_ON_STACK(desc, apparmor_tfm);
int error = -ENOMEM;
u32 le32_version = cpu_to_le32(version);
@@ -49,19 +46,19 @@
if (!profile->hash)
goto fail;
- desc.shash.tfm = apparmor_tfm;
- desc.shash.flags = 0;
+ desc->tfm = apparmor_tfm;
+ desc->flags = 0;
- error = crypto_shash_init(&desc.shash);
+ error = crypto_shash_init(desc);
if (error)
goto fail;
- error = crypto_shash_update(&desc.shash, (u8 *) &le32_version, 4);
+ error = crypto_shash_update(desc, (u8 *) &le32_version, 4);
if (error)
goto fail;
- error = crypto_shash_update(&desc.shash, (u8 *) start, len);
+ error = crypto_shash_update(desc, (u8 *) start, len);
if (error)
goto fail;
- error = crypto_shash_final(&desc.shash, profile->hash);
+ error = crypto_shash_final(desc, profile->hash);
if (error)
goto fail;