aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-01-23 23:07:37 -0800
committerLinux Build Service Account <lnxbuild@localhost>2019-01-23 23:07:37 -0800
commit8c873f417a683c8f447df8bf0165f5b61a80795f (patch)
treec3e3ecd32473d4298d3042aff6bda77eb62075cc
parent84fc364bc3d370b6e7d05cf6760246cafd453dea (diff)
parentadf55fdfff6953c88f9e43175352a9ca6ae95b67 (diff)
Merge adf55fdfff6953c88f9e43175352a9ca6ae95b67 on remote branchLA.UM.7.8.r3-00900-SDM710.0
Change-Id: I74fe015fb17068ac936e714623dba73ba0e678d2
-rw-r--r--Documentation/devicetree/bindings/arm/msm/msm.txt1
-rw-r--r--Documentation/devicetree/bindings/input/touchscreen/maxim-sti.txt48
-rw-r--r--arch/arm/configs/msm8909w-perf_defconfig1
-rw-r--r--arch/arm/configs/msm8909w_defconfig1
-rw-r--r--arch/arm64/boot/dts/qcom/Makefile5
-rw-r--r--arch/arm64/boot/dts/qcom/msm8909.dtsi9
-rw-r--r--arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi2
-rw-r--r--arch/arm64/boot/dts/qcom/msm8917.dtsi7
-rw-r--r--arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi277
-rw-r--r--arch/arm64/boot/dts/qcom/msm8940-cdp-overlay.dts24
-rw-r--r--arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi2
-rw-r--r--arch/arm64/boot/dts/qcom/qm215-pm8916.dtsi5
-rw-r--r--arch/arm64/boot/dts/qcom/qm215-regulator.dtsi4
-rw-r--r--arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi2
-rw-r--r--drivers/clk/msm/clock-gcc-8952.c2
-rw-r--r--drivers/clk/msm/clock-local2.c6
-rw-r--r--drivers/hwmon/qpnp-adc-common.c108
-rw-r--r--drivers/hwmon/qpnp-adc-voltage.c1
-rw-r--r--drivers/md/dm-crypt.c18
-rw-r--r--drivers/media/platform/msm/camera_v2/msm.c6
-rw-r--r--drivers/nfc/nq-nci.c5
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h10
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/ipa_utils.c2
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c3
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c4
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h10
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_utils.c2
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c7
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c2
-rw-r--r--drivers/power/supply/power_supply_sysfs.c1
-rw-r--r--drivers/power/supply/qcom/qpnp-linear-charger.c28
-rw-r--r--drivers/power/supply/qcom/qpnp-qg.c30
-rw-r--r--drivers/power/supply/qcom/qpnp-smb5.c3
-rw-r--r--drivers/power/supply/qcom/qpnp-vm-bms.c10
-rw-r--r--drivers/power/supply/qcom/smb5-lib.c165
-rw-r--r--drivers/power/supply/qcom/smb5-lib.h6
-rw-r--r--fs/crypto/bio.c2
-rw-r--r--fs/ext4/ext4.h3
-rw-r--r--fs/ext4/inode.c15
-rw-r--r--fs/ext4/page-io.c5
-rw-r--r--fs/ext4/readpage.c3
-rw-r--r--fs/f2fs/data.c8
-rw-r--r--include/linux/blk_types.h4
-rw-r--r--include/linux/power_supply.h1
-rw-r--r--include/linux/qpnp/qpnp-adc.h26
-rw-r--r--include/net/cnss2.h7
46 files changed, 817 insertions, 74 deletions
diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt
index ab58089ad2cc..771ca5a937af 100644
--- a/Documentation/devicetree/bindings/arm/msm/msm.txt
+++ b/Documentation/devicetree/bindings/arm/msm/msm.txt
@@ -283,6 +283,7 @@ compatible = "qcom,msm8917-rumi"
compatible = "qcom,msm8917-qrd"
compatible = "qcom,msm8917-qrd-sku5"
compatible = "qcom,msm8940-mtp"
+compatible = "qcom,msm8940-cdp"
compatible = "qcom,msm8926-cdp"
compatible = "qcom,msm8926-mtp"
compatible = "qcom,msm8926-qrd"
diff --git a/Documentation/devicetree/bindings/input/touchscreen/maxim-sti.txt b/Documentation/devicetree/bindings/input/touchscreen/maxim-sti.txt
new file mode 100644
index 000000000000..c0f29f20b5da
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/maxim-sti.txt
@@ -0,0 +1,48 @@
+Maxim STI touch controller:
+
+Required properties:
+- spi-max-frequency: Maximum SPI frequency supported by the controller.
+- avdd-supply: analog power supply.
+- dvdd-supply: digial power supply.
+- maxim_sti,irq-gpio: irq gpio.
+- maxim_sti,reset-gpio: reset gpio.
+- maxim_sti,touch_fusion: path to touch_fusion daemon.
+- maxim_sti,config_file: path to config file.
+- maxim_sti,fw_name: name of firmware file.
+
+Optional properties:
+ - pinctrl-names : this should be defined if a target uses pinctrl framework.
+ See "pinctrl" in documentation/devicetree/bindings/pinctrl/msm-pinctrl.txt.
+ It should specify the names of the configs that pinctrl can install in driver.
+ Following are the pinctrl configs that can be installed:
+ "pmx_ts_active" : active configuration of pins. This should specify active
+ config defined in pin groups of interrupt and reset gpios.
+ "pmx_ts_suspend" : disabled configuration of pins. This should specify sleep
+ config defined in pin groups of interrupt and reset gpios.
+ - maxim_sti,mt_type_b_enabled : Boolean type. This should be used to enable type B multitouch protocol.
+Example:
+
+&spi_13 { /* BLSP1 QUP3 */
+ status = "ok";
+ maxim_sti@0 {
+ compatible = "maxim,maxim_sti";
+ reg = <0>;
+ interrupt-parent = <&msm_gpio>;
+ interrupts = <65 0>;
+ spi-max-frequency = <16000000>;
+ avdd-supply = <&pm8950_l17>;
+ dvdd-supply = <&pm8950_l6>;
+ spi-supply = <&pm8950_l5>;
+ maxim_sti,irq-gpio = <&msm_gpio 65 0x00>;
+ maxim_sti,reset-gpio = <&msm_gpio 64 0x00>;
+ maxim_sti,touch_fusion = "/vendor/bin/touch_fusion";
+ maxim_sti,config_file = "/vendor/firmware/touch_fusion_panel_id_0x%04x.cfg";
+ maxim_sti,fw_name = "maxim_fp35.bin";
+ maxim_sti,mt_type_b_enabled;
+ pinctrl-names = "pmx_ts_active","pmx_ts_suspend","pmx_ts_release";
+ pinctrl-0 = <&ts_int_active &ts_reset_active>;
+ pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
+ pinctrl-2 = <&ts_release>;
+ };
+};
+
diff --git a/arch/arm/configs/msm8909w-perf_defconfig b/arch/arm/configs/msm8909w-perf_defconfig
index eb19d10ba94e..e32da5f73d90 100644
--- a/arch/arm/configs/msm8909w-perf_defconfig
+++ b/arch/arm/configs/msm8909w-perf_defconfig
@@ -456,7 +456,6 @@ CONFIG_PWM=y
CONFIG_QTI_MPM=y
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
-CONFIG_ANDROID_BINDER_IPC_32BIT=y
CONFIG_STM=y
CONFIG_SENSORS_SSC=y
CONFIG_MSM_TZ_LOG=y
diff --git a/arch/arm/configs/msm8909w_defconfig b/arch/arm/configs/msm8909w_defconfig
index 8f72493b6bb3..b54a44c5b255 100644
--- a/arch/arm/configs/msm8909w_defconfig
+++ b/arch/arm/configs/msm8909w_defconfig
@@ -452,7 +452,6 @@ CONFIG_PWM=y
CONFIG_QTI_MPM=y
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
-CONFIG_ANDROID_BINDER_IPC_32BIT=y
CONFIG_SENSORS_SSC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_EXT4_FS=y
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 4320f5036419..3081c77e350c 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -336,6 +336,7 @@ endif
ifeq ($(CONFIG_BUILD_ARM64_DT_OVERLAY),y)
dtbo-$(CONFIG_ARCH_MSM8940) += msm8940-mtp-overlay.dtbo
+dtbo-$(CONFIG_ARCH_MSM8940) += msm8940-cdp-overlay.dtbo
dtbo-$(CONFIG_ARCH_MSM8917) += msm8917-mtp-overlay.dtbo \
msm8917-qrd-overlay.dtbo \
@@ -391,6 +392,10 @@ msm8940-mtp-overlay.dtbo-base := msm8940-pmi8950.dtb \
msm8940-pmi8937.dtb \
msm8940-pmi8940.dtb
+msm8940-cdp-overlay.dtbo-base := msm8940-pmi8950.dtb \
+ msm8940-pmi8937.dtb \
+ msm8940-pmi8940.dtb
+
msm8917-mtp-overlay.dtbo-base := msm8917-pmi8950.dtb \
msm8917-pmi8937.dtb \
msm8917-pmi8940.dtb
diff --git a/arch/arm64/boot/dts/qcom/msm8909.dtsi b/arch/arm64/boot/dts/qcom/msm8909.dtsi
index a4e64fb86eeb..5b65d328988c 100644
--- a/arch/arm64/boot/dts/qcom/msm8909.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8909.dtsi
@@ -150,15 +150,6 @@
fsmgr_flags = "wait,verify";
status = "ok";
};
- system_fstab: system {
- compatible = "android,system";
- dev =
- "/dev/block/platform/soc/7824900.sdhci/by-name/system";
- type = "ext4";
- mnt_flags = "ro,barrier=1,discard";
- fsmgr_flags = "wait,verify";
- status = "ok";
- };
};
};
};
diff --git a/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi
index 5c63ed376376..7c0d323f9d54 100644
--- a/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi
@@ -120,7 +120,7 @@
gpio_keys {
compatible = "gpio-keys";
- input-name = "gpio-keys";
+ label = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&gpio_key_active>;
diff --git a/arch/arm64/boot/dts/qcom/msm8917.dtsi b/arch/arm64/boot/dts/qcom/msm8917.dtsi
index 5898ae53b458..0c4726f7d454 100644
--- a/arch/arm64/boot/dts/qcom/msm8917.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8917.dtsi
@@ -537,6 +537,12 @@
< 1401000000 4>,
< 1497600000 5>;
+ qcom,speed2-bin-v0-c1 =
+ < 0 0>,
+ < 960000000 1>,
+ < 1094400000 2>,
+ < 1209600000 3>;
+
qcom,speed3-bin-v0-c1 =
< 0 0>,
< 960000000 1>,
@@ -559,6 +565,7 @@
qcom,cpufreq-table =
< 960000 >,
< 1094400 >,
+ < 1209600 >,
< 1248000 >,
< 1305600 >,
< 1401000 >,
diff --git a/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi b/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi
new file mode 100644
index 000000000000..46e480ed7f11
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi
@@ -0,0 +1,277 @@
+/*
+ * Copyright (c) 2015-2016, 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
+ * 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 <dt-bindings/clock/msm-clocks-8952.h>
+
+&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>;
+
+ camera_focus {
+ label = "camera_focus";
+ gpios = <&tlmm 128 0x1>;
+ linux,input-type = <1>;
+ linux,code = <0x210>;
+ debounce-interval = <15>;
+ };
+
+ camera_snapshot {
+ label = "camera_snapshot";
+ gpios = <&tlmm 127 0x1>;
+ linux,input-type = <1>;
+ linux,code = <0x2fe>;
+ debounce-interval = <15>;
+ };
+
+ vol_up {
+ label = "volume_up";
+ gpios = <&tlmm 91 0x1>;
+ linux,input-type = <1>;
+ linux,code = <115>;
+ debounce-interval = <15>;
+ };
+
+ home {
+ label = "home";
+ gpios = <&tlmm 86 0x1>;
+ linux,input-type = <1>;
+ linux,code = <102>;
+ debounce-interval = <15>;
+ };
+ };
+
+ hbtp {
+ compatible = "qcom,hbtp-input";
+ vcc_dig-supply = <&pm8937_l5>;
+ qcom,dig-load = <15000>;
+ qcom,dig-vtg-min = <1800000>;
+ qcom,dig-vtg-max = <1800000>;
+ };
+};
+
+&tlmm {
+ tlmm_gpio_key {
+ gpio_key_active: gpio_key_active {
+ mux {
+ pins = "gpio86", "gpio91", "gpio127", "gpio128";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio86", "gpio91", "gpio127", "gpio128";
+ };
+ };
+
+ gpio_key_suspend: gpio_key_suspend {
+ mux {
+ pins = "gpio86", "gpio91", "gpio127", "gpio128";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio86", "gpio91", "gpio127", "gpio128";
+ };
+ };
+ };
+};
+
+&blsp1_uart2 {
+ status = "ok";
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart_console_active>;
+};
+
+&pmi_haptic{
+ qcom,wave-play-rate-us = <4165>;
+ qcom,lra-auto-res-mode="qwd";
+ qcom,lra-high-z="opt1";
+ qcom,lra-res-cal-period = <4>;
+ qcom,correct-lra-drive-freq;
+ qcom,misc-trim-error-rc19p2-clk-reg-present;
+};
+
+&sdhc_1 {
+ /* device core power supply */
+ vdd-supply = <&pm8937_l8>;
+ qcom,vdd-voltage-level = <2900000 2900000>;
+ qcom,vdd-current-level = <200 570000>;
+
+ /* device communication power supply */
+ vdd-io-supply = <&pm8937_l5>;
+ qcom,vdd-io-always-on;
+ qcom,vdd-io-lpm-sup;
+ qcom,vdd-io-voltage-level = <1800000 1800000>;
+ qcom,vdd-io-current-level = <200 325000>;
+
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>;
+ pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>;
+
+ qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000
+ 384000000>;
+ qcom,nonremovable;
+ qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v";
+
+ status = "ok";
+};
+
+&sdhc_2 {
+ /* device core power supply */
+ vdd-supply = <&pm8937_l11>;
+ qcom,vdd-voltage-level = <2950000 2950000>;
+ qcom,vdd-current-level = <15000 800000>;
+
+ /* device communication power supply */
+ vdd-io-supply = <&pm8937_l12>;
+ qcom,vdd-io-voltage-level = <1800000 2950000>;
+ qcom,vdd-io-current-level = <200 22000>;
+
+ 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>;
+
+ #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 &tlmm 67 0>;
+ interrupt-names = "hc_irq", "pwr_irq", "status_irq";
+ cd-gpios = <&tlmm 67 0x1>;
+
+ qcom,clk-rates = <400000 20000000 25000000 50000000 100000000
+ 200000000>;
+ qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104";
+
+ status = "ok";
+
+};
+
+&pm8937_gpios {
+ gpio@c400 {
+ qcom,mode = <0>;
+ qcom,output-type = <0>;
+ qcom,pull = <0>;
+ qcom,vin-sel = <2>;
+ qcom,out-strength = <3>;
+ qcom,src-sel = <0>;
+ qcom,master-en = <1>;
+ status = "okay";
+ };
+};
+
+&spi_3 { /* BLSP1 QUP3 */
+ maxim_sti@0 {
+ status = "disabled";
+ compatible = "maxim,maxim_sti";
+ reg = <0>;
+ interrupt-parent = <&tlmm>;
+ interrupts = <65 0>;
+ spi-max-frequency = <16000000>;
+ avdd-supply = <&pm8937_l10>;
+ dvdd-supply = <&pm8937_l5>;
+ maxim_sti,irq-gpio = <&tlmm 65 0x00>;
+ maxim_sti,reset-gpio = <&tlmm 64 0x00>;
+ maxim_sti,touch_fusion = "/vendor/bin/touch_fusion";
+ maxim_sti,config_file = "/etc/firmware/qtc800s.cfg";
+ maxim_sti,fw_name = "qtc800s.bin";
+ pinctrl-names = "pmx_ts_active","pmx_ts_suspend",
+ "pmx_ts_release";
+ pinctrl-0 = <&ts_int_active &ts_reset_active>;
+ pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
+ pinctrl-2 = <&ts_release>;
+ };
+};
+
+&i2c_5 { /* BLSP2 QUP1 */
+ nq@28 {
+ compatible = "qcom,nq-nci";
+ reg = <0x28>;
+ qcom,nq-irq = <&tlmm 17 0x00>;
+ qcom,nq-ven = <&tlmm 16 0x00>;
+ qcom,nq-firm = <&tlmm 130 0x00>;
+ qcom,nq-clkreq = <&pm8937_gpios 5 0x00>;
+ interrupt-parent = <&tlmm>;
+ qcom,clk-src = "BBCLK2";
+ interrupts = <17 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_gcc clk_bb_clk2_pin>;
+ clock-names = "ref_clk";
+ };
+};
+
+#include "msm8937-mdss-panels.dtsi"
+
+&mdss_mdp {
+ qcom,mdss-pref-prim-intf = "dsi";
+};
+
+&mdss_dsi {
+ hw-config = "dual_dsi";
+};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_truly_1080_vid>;
+ pinctrl-names = "mdss_default", "mdss_sleep";
+ pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
+ pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
+
+ qcom,platform-te-gpio = <&tlmm 24 0>;
+ qcom,platform-enable-gpio = <&tlmm 99 0>;
+ qcom,platform-reset-gpio = <&tlmm 60 0>;
+ qcom,platform-bklight-en-gpio = <&tlmm 98 0>;
+};
+
+&mdss_dsi1 {
+ qcom,dsi-pref-prim-pan = <&dsi_adv7533_1080p>;
+ pinctrl-names = "mdss_default", "mdss_sleep";
+ pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
+ pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
+ qcom,bridge-index = <0>;
+
+ qcom,pluggable;
+ qcom,platform-te-gpio = <&tlmm 24 0>;
+ qcom,platform-enable-gpio = <&tlmm 99 0>;
+ qcom,platform-reset-gpio = <&tlmm 60 0>;
+ qcom,platform-bklight-en-gpio = <&tlmm 98 0>;
+};
+
+&dsi_truly_1080_vid {
+ qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
+ qcom,mdss-dsi-pan-enable-dynamic-fps;
+ qcom,mdss-dsi-min-refresh-rate = <48>;
+ qcom,mdss-dsi-max-refresh-rate = <60>;
+ qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp";
+};
+
+&dsi_truly_1080_cmd {
+ qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
+ qcom,ulps-enabled;
+ qcom,partial-update-enabled;
+ qcom,panel-roi-alignment = <2 2 4 2 1080 2>;
+};
+
+&dsi_truly_720_vid {
+ qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
+ qcom,mdss-dsi-pan-enable-dynamic-fps;
+ qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp";
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8940-cdp-overlay.dts b/arch/arm64/boot/dts/qcom/msm8940-cdp-overlay.dts
new file mode 100644
index 000000000000..141ef6c73587
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8940-cdp-overlay.dts
@@ -0,0 +1,24 @@
+/*
+ * 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
+ * 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/;
+/plugin/;
+
+#include "msm8937-cdp.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM8940-PMI8950 CDP";
+ compatible = "qcom,msm8940-cdp", "qcom,msm8940", "qcom,cdp";
+ qcom,board-id= <1 0>;
+ qcom,msm-id = <313 0x0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi
index 1f0ad88cbf2d..50dea911f9a6 100644
--- a/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi
@@ -27,7 +27,7 @@
gpio_keys {
compatible = "gpio-keys";
- input-name = "gpio-keys";
+ label = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&gpio_key_active>;
diff --git a/arch/arm64/boot/dts/qcom/qm215-pm8916.dtsi b/arch/arm64/boot/dts/qcom/qm215-pm8916.dtsi
index 619a0196731e..6b08005014ee 100644
--- a/arch/arm64/boot/dts/qcom/qm215-pm8916.dtsi
+++ b/arch/arm64/boot/dts/qcom/qm215-pm8916.dtsi
@@ -88,7 +88,8 @@
};
qcom,wcnss-wlan@a000000 {
- /delete-property/ qcom,wcnss-adc_tm;
+ /delete-property/ qcom,has-vsys-adc-channel;
+ qcom,wcnss-adc_tm = <&pm8916_adc_tm>;
qcom,pronto-vddmx-supply = <&pm8916_l2_level_ao>;
qcom,pronto-vddcx-supply = <&pm8916_s1_level>;
qcom,pronto-vddpx-supply = <&pm8916_l7>;
@@ -301,7 +302,7 @@
qcom,decimation = <0>;
qcom,pre-div-channel-scaling = <0>;
qcom,calibration-type = "ratiometric";
- qcom,scale-function = <22>;
+ qcom,scale-function = <26>;
qcom,hw-settle-time = <0xb>;
qcom,fast-avg-setup = <0>;
};
diff --git a/arch/arm64/boot/dts/qcom/qm215-regulator.dtsi b/arch/arm64/boot/dts/qcom/qm215-regulator.dtsi
index 6f6d301e9b23..a6dc66a7621e 100644
--- a/arch/arm64/boot/dts/qcom/qm215-regulator.dtsi
+++ b/arch/arm64/boot/dts/qcom/qm215-regulator.dtsi
@@ -64,7 +64,6 @@
pm8916_s3: regulator-s3 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1448000>;
- qcom,init-voltage = <1000000>;
status = "okay";
};
};
@@ -93,9 +92,8 @@
rpm-regulator-ldoa2 {
status = "okay";
pm8916_l2: regulator-l2 {
- regulator-min-microvolt = <944000>;
+ regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1088000>;
- qcom,init-voltage = <944000>;
status = "okay";
};
diff --git a/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi b/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi
index 20562d1afc4a..4da0e524e9cb 100644
--- a/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi
@@ -127,7 +127,7 @@
&soc {
gpio_keys {
compatible = "gpio-keys";
- input-name = "gpio-keys";
+ label = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&gpio_key_active>;
diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c
index 06f095c50f49..71f0ea6fb746 100644
--- a/drivers/clk/msm/clock-gcc-8952.c
+++ b/drivers/clk/msm/clock-gcc-8952.c
@@ -843,6 +843,7 @@ static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8917[] = {
F_SLEW( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0),
F_SLEW( 465000000, 930000000, gpll3, 1, 0, 0),
F_SLEW( 484800000, 969600000, gpll3, 1, 0, 0),
+ F_SLEW( 500000000, 1000000000, gpll3, 1, 0, 0),
F_SLEW( 523200000, 1046400000, gpll3, 1, 0, 0),
F_SLEW( 550000000, 1100000000, gpll3, 1, 0, 0),
F_SLEW( 598000000, 1196000000, gpll3, 1, 0, 0),
@@ -864,6 +865,7 @@ static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8917_650MHz[] = {
F_SLEW( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0),
F_SLEW( 465000000, 930000000, gpll3, 1, 0, 0),
F_SLEW( 484800000, 969600000, gpll3, 1, 0, 0),
+ F_SLEW( 500000000, 1000000000, gpll3, 1, 0, 0),
F_SLEW( 523200000, 1046400000, gpll3, 1, 0, 0),
F_SLEW( 550000000, 1100000000, gpll3, 1, 0, 0),
F_SLEW( 598000000, 1196000000, gpll3, 1, 0, 0),
diff --git a/drivers/clk/msm/clock-local2.c b/drivers/clk/msm/clock-local2.c
index f200d0bc99ea..eaaa5ab9ad00 100644
--- a/drivers/clk/msm/clock-local2.c
+++ b/drivers/clk/msm/clock-local2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2018, 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
@@ -1486,8 +1486,8 @@ static int set_rate_pixel(struct clk *clk, unsigned long rate)
{
struct rcg_clk *rcg = to_rcg_clk(clk);
struct clk_freq_tbl *pixel_freq = rcg->current_freq;
- int frac_num[] = {3, 2, 4, 1};
- int frac_den[] = {8, 9, 9, 1};
+ int frac_num[] = {1, 3, 2, 4};
+ int frac_den[] = {1, 8, 9, 9};
int delta = 100000;
int i, rc;
diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c
index c5653feac14a..555e95c01380 100644
--- a/drivers/hwmon/qpnp-adc-common.c
+++ b/drivers/hwmon/qpnp-adc-common.c
@@ -752,6 +752,61 @@ static const struct qpnp_vadc_map_pt adcmap_batt_therm_qrd[] = {
};
/* Voltage to temperature */
+static const struct qpnp_vadc_map_pt adcmap_batt_therm_qrd_215[] = {
+ {1575, -200},
+ {1549, -180},
+ {1522, -160},
+ {1493, -140},
+ {1463, -120},
+ {1431, -100},
+ {1398, -80},
+ {1364, -60},
+ {1329, -40},
+ {1294, -20},
+ {1258, 0},
+ {1222, 20},
+ {1187, 40},
+ {1151, 60},
+ {1116, 80},
+ {1082, 100},
+ {1049, 120},
+ {1016, 140},
+ {985, 160},
+ {955, 180},
+ {926, 200},
+ {899, 220},
+ {873, 240},
+ {849, 260},
+ {825, 280},
+ {804, 300},
+ {783, 320},
+ {764, 340},
+ {746, 360},
+ {729, 380},
+ {714, 400},
+ {699, 420},
+ {686, 440},
+ {673, 460},
+ {662, 480},
+ {651, 500},
+ {641, 520},
+ {632, 540},
+ {623, 560},
+ {615, 580},
+ {608, 600},
+ {601, 620},
+ {595, 640},
+ {589, 660},
+ {583, 680},
+ {578, 700},
+ {574, 720},
+ {569, 740},
+ {565, 760},
+ {562, 780},
+ {558, 800}
+};
+
+/* Voltage to temperature */
static const struct qpnp_vadc_map_pt adcmap_batt_therm_pu30[] = {
{1842, -400},
{1838, -380},
@@ -1263,19 +1318,6 @@ int32_t qpnp_adc_batt_therm_qrd(struct qpnp_vadc_chip *chip,
qpnp_adc_map_voltage_temp(adcmap_batt_therm_qrd,
ARRAY_SIZE(adcmap_batt_therm_qrd),
batt_thm_voltage, &adc_chan_result->physical);
- } else {
-
- qpnp_adc_scale_with_calib_param(adc_code,
- adc_properties, chan_properties, &batt_thm_voltage);
-
- adc_chan_result->measurement = batt_thm_voltage;
-
- return qpnp_adc_map_voltage_temp(
- adcmap_batt_therm_qrd,
- ARRAY_SIZE(adcmap_batt_therm_qrd),
- batt_thm_voltage,
- &adc_chan_result->physical);
-
}
return 0;
}
@@ -1337,6 +1379,34 @@ int32_t qpnp_adc_batt_therm_pu400(struct qpnp_vadc_chip *chip,
}
EXPORT_SYMBOL(qpnp_adc_batt_therm_pu400);
+int32_t qpnp_adc_batt_therm_qrd_215(struct qpnp_vadc_chip *chip,
+ int32_t adc_code,
+ const struct qpnp_adc_properties *adc_properties,
+ const struct qpnp_vadc_chan_properties *chan_properties,
+ struct qpnp_vadc_result *adc_chan_result)
+{
+ int64_t batt_thm_voltage = 0;
+
+ if (!chan_properties || !chan_properties->offset_gain_numerator ||
+ !chan_properties->offset_gain_denominator || !adc_properties
+ || !adc_chan_result)
+ return -EINVAL;
+
+ qpnp_adc_scale_with_calib_param(adc_code,
+ adc_properties, chan_properties, &batt_thm_voltage);
+
+ adc_chan_result->measurement = batt_thm_voltage;
+
+ return qpnp_adc_map_voltage_temp(
+ adcmap_batt_therm_qrd_215,
+ ARRAY_SIZE(adcmap_batt_therm_qrd_215),
+ batt_thm_voltage,
+ &adc_chan_result->physical);
+
+ return 0;
+}
+EXPORT_SYMBOL(qpnp_adc_batt_therm_qrd_215);
+
int32_t qpnp_adc_scale_batt_therm(struct qpnp_vadc_chip *chip,
int32_t adc_code,
const struct qpnp_adc_properties *adc_properties,
@@ -2182,9 +2252,9 @@ int32_t qpnp_adc_qrd_215_btm_scaler(struct qpnp_vadc_chip *chip,
pr_debug("warm_temp:%d and cool_temp:%d\n", param->high_temp,
param->low_temp);
- rc = qpnp_adc_map_voltage_temp(
- adcmap_batt_therm_qrd,
- ARRAY_SIZE(adcmap_batt_therm_qrd),
+ rc = qpnp_adc_map_temp_voltage(
+ adcmap_batt_therm_qrd_215,
+ ARRAY_SIZE(adcmap_batt_therm_qrd_215),
(param->low_temp),
&low_output);
if (rc) {
@@ -2197,9 +2267,9 @@ int32_t qpnp_adc_qrd_215_btm_scaler(struct qpnp_vadc_chip *chip,
low_output = div64_s64(low_output, btm_param.adc_vref);
low_output += btm_param.adc_gnd;
- rc = qpnp_adc_map_voltage_temp(
- adcmap_batt_therm_qrd,
- ARRAY_SIZE(adcmap_batt_therm_qrd),
+ rc = qpnp_adc_map_temp_voltage(
+ adcmap_batt_therm_qrd_215,
+ ARRAY_SIZE(adcmap_batt_therm_qrd_215),
(param->high_temp),
&high_output);
if (rc) {
diff --git a/drivers/hwmon/qpnp-adc-voltage.c b/drivers/hwmon/qpnp-adc-voltage.c
index 53996708a1e3..2d1cb6e39951 100644
--- a/drivers/hwmon/qpnp-adc-voltage.c
+++ b/drivers/hwmon/qpnp-adc-voltage.c
@@ -232,6 +232,7 @@ static struct qpnp_vadc_scale_fn vadc_scale_fn[] = {
[SCALE_SMB1390_DIE_TEMP] = {qpnp_adc_scale_die_temp_1390},
[SCALE_BATT_THERM_TEMP_PU30] = {qpnp_adc_batt_therm_pu30},
[SCALE_BATT_THERM_TEMP_PU400] = {qpnp_adc_batt_therm_pu400},
+ [SCALE_BATT_THERM_TEMP_QRD_215] = {qpnp_adc_batt_therm_qrd_215}
};
static struct qpnp_vadc_rscale_fn adc_vadc_rscale_fn[] = {
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 7a5b75fd39d6..a4ac5f69d7f4 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -113,7 +113,8 @@ struct iv_tcw_private {
* and encrypts / decrypts at the same time.
*/
enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID,
- DM_CRYPT_SAME_CPU, DM_CRYPT_NO_OFFLOAD };
+ DM_CRYPT_SAME_CPU, DM_CRYPT_NO_OFFLOAD,
+ DM_CRYPT_ENCRYPT_OVERRIDE };
/*
* The fields in here must be read only after initialization.
@@ -1858,6 +1859,9 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
else if (!strcasecmp(opt_string, "submit_from_crypt_cpus"))
set_bit(DM_CRYPT_NO_OFFLOAD, &cc->flags);
+ else if (!strcasecmp(opt_string, "allow_encrypt_override"))
+ set_bit(DM_CRYPT_ENCRYPT_OVERRIDE, &cc->flags);
+
else {
ti->error = "Invalid feature arguments";
goto bad;
@@ -1918,12 +1922,15 @@ static int crypt_map(struct dm_target *ti, struct bio *bio)
struct crypt_config *cc = ti->private;
/*
- * If bio is REQ_PREFLUSH or REQ_OP_DISCARD, just bypass crypt queues.
+ * If bio is REQ_PREFLUSH, REQ_NOENCRYPT, or REQ_OP_DISCARD,
+ * just bypass crypt queues.
* - for REQ_PREFLUSH device-mapper core ensures that no IO is in-flight
* - for REQ_OP_DISCARD caller must use flush if IO ordering matters
*/
- if (unlikely(bio->bi_opf & REQ_PREFLUSH ||
- bio_op(bio) == REQ_OP_DISCARD)) {
+ if (unlikely(bio->bi_opf & REQ_PREFLUSH) ||
+ (unlikely(bio->bi_opf & REQ_NOENCRYPT) &&
+ test_bit(DM_CRYPT_ENCRYPT_OVERRIDE, &cc->flags)) ||
+ bio_op(bio) == REQ_OP_DISCARD) {
bio->bi_bdev = cc->dev->bdev;
if (bio_sectors(bio))
bio->bi_iter.bi_sector = cc->start +
@@ -1978,6 +1985,7 @@ static void crypt_status(struct dm_target *ti, status_type_t type,
num_feature_args += !!ti->num_discard_bios;
num_feature_args += test_bit(DM_CRYPT_SAME_CPU, &cc->flags);
num_feature_args += test_bit(DM_CRYPT_NO_OFFLOAD, &cc->flags);
+ num_feature_args += test_bit(DM_CRYPT_ENCRYPT_OVERRIDE, &cc->flags);
if (num_feature_args) {
DMEMIT(" %d", num_feature_args);
if (ti->num_discard_bios)
@@ -1986,6 +1994,8 @@ static void crypt_status(struct dm_target *ti, status_type_t type,
DMEMIT(" same_cpu_crypt");
if (test_bit(DM_CRYPT_NO_OFFLOAD, &cc->flags))
DMEMIT(" submit_from_crypt_cpus");
+ if (test_bit(DM_CRYPT_ENCRYPT_OVERRIDE, &cc->flags))
+ DMEMIT(" allow_encrypt_override");
}
break;
diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c
index d52d8bc4b96a..6e71254c9ef8 100644
--- a/drivers/media/platform/msm/camera_v2/msm.c
+++ b/drivers/media/platform/msm/camera_v2/msm.c
@@ -37,6 +37,7 @@ static struct list_head ordered_sd_list;
static struct mutex ordered_sd_mtx;
static struct mutex v4l2_event_mtx;
+static atomic_t qos_add_request_done = ATOMIC_INIT(0);
static struct pm_qos_request msm_v4l2_pm_qos_request;
static struct msm_queue_head *msm_session_q;
@@ -223,9 +224,11 @@ static inline int __msm_queue_find_command_ack_q(void *d1, void *d2)
return (ack->stream_id == *(unsigned int *)d2) ? 1 : 0;
}
-static void msm_pm_qos_add_request(void)
+static inline void msm_pm_qos_add_request(void)
{
pr_info("%s: add request", __func__);
+ if (atomic_cmpxchg(&qos_add_request_done, 0, 1))
+ return;
pm_qos_add_request(&msm_v4l2_pm_qos_request, PM_QOS_CPU_DMA_LATENCY,
PM_QOS_DEFAULT_VALUE);
}
@@ -239,6 +242,7 @@ static void msm_pm_qos_remove_request(void)
void msm_pm_qos_update_request(int val)
{
pr_info("%s: update request %d", __func__, val);
+ msm_pm_qos_add_request();
pm_qos_update_request(&msm_v4l2_pm_qos_request, val);
}
diff --git a/drivers/nfc/nq-nci.c b/drivers/nfc/nq-nci.c
index 0280d42d2208..148890c2857a 100644
--- a/drivers/nfc/nq-nci.c
+++ b/drivers/nfc/nq-nci.c
@@ -653,6 +653,7 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev)
{
int ret = 0;
+ int gpio_retry_count = 0;
unsigned char raw_nci_reset_cmd[] = {0x20, 0x00, 0x01, 0x00};
unsigned char raw_nci_init_cmd[] = {0x20, 0x01, 0x00};
unsigned char nci_init_rsp[28];
@@ -660,6 +661,7 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev)
unsigned char init_rsp_len = 0;
unsigned int enable_gpio = nqx_dev->en_gpio;
+reset_enable_gpio:
/* making sure that the NFCC starts in a clean state. */
gpio_set_value(enable_gpio, 0);/* ULPM: Disable */
/* hardware dependent delay */
@@ -685,6 +687,9 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev)
if (ret < 0) {
dev_err(&client->dev,
"%s: - i2c_master_recv Error\n", __func__);
+ gpio_retry_count = gpio_retry_count + 1;
+ if (gpio_retry_count < MAX_RETRY_COUNT)
+ goto reset_enable_gpio;
goto err_nfcc_hw_check;
}
ret = nqx_standby_write(nqx_dev, raw_nci_init_cmd,
diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h b/drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h
index 98f5574b28ea..f60a4c75fd17 100644
--- a/drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h
+++ b/drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h
@@ -55,6 +55,16 @@
DEV_NAME " %s:%d " fmt, ## args); \
} while (0)
+#define IPAWANERR_RL(fmt, args...) \
+ do { \
+ pr_err_ratelimited_ipa(DEV_NAME " %s:%d " fmt, __func__,\
+ __LINE__, ## args); \
+ IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
+ DEV_NAME " %s:%d " fmt, ## args); \
+ IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
+ DEV_NAME " %s:%d " fmt, ## args); \
+ } while (0)
+
#define IPAWANINFO(fmt, args...) \
do { \
pr_info(DEV_NAME " %s:%d " fmt, __func__, __LINE__, ## args); \
diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c
index 681b009a7128..d68fe31f2a2b 100644
--- a/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c
+++ b/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c
@@ -903,7 +903,7 @@ int ipa2_get_wlan_stats(struct ipa_get_wdi_sap_stats *wdi_sap_stats)
ipa_ctx->uc_wdi_ctx.stats_notify(IPA_GET_WDI_SAP_STATS,
wdi_sap_stats);
} else {
- IPAERR("uc_wdi_ctx.stats_notify not registered\n");
+ IPAERR_RL("uc_wdi_ctx.stats_notify not registered\n");
return -EFAULT;
}
return 0;
diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c
index e7abbe9410fa..2db59b9e0602 100644
--- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c
@@ -3055,7 +3055,8 @@ int rmnet_ipa_query_tethering_stats_all(
rc = rmnet_ipa_query_tethering_stats_wifi(
&tether_stats, data->reset_stats);
if (rc) {
- IPAWANERR("wlan WAN_IOC_QUERY_TETHER_STATS failed\n");
+ IPAWANERR_RL(
+ "wlan WAN_IOC_QUERY_TETHER_STATS failed\n");
return rc;
}
data->tx_bytes = tether_stats.ipv4_tx_bytes
diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c
index 0c1cabf77f92..904bcde696d3 100644
--- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c
+++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2015, 2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2015, 2018, 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
@@ -162,7 +162,7 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
}
if (rmnet_ipa_poll_tethering_stats(
(struct wan_ioctl_poll_tethering_stats *)param)) {
- IPAWANERR("WAN_IOCTL_POLL_TETHERING_STATS failed\n");
+ IPAWANERR_RL("WAN_IOCTL_POLL_TETHERING_STATS failed\n");
retval = -EFAULT;
break;
}
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h
index 3210a7034566..7f3814d4b236 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h
@@ -59,6 +59,16 @@
DEV_NAME " %s:%d " fmt, ## args); \
} while (0)
+#define IPAWANERR_RL(fmt, args...) \
+ do { \
+ pr_err_ratelimited_ipa(DEV_NAME " %s:%d " fmt, __func__,\
+ __LINE__, ## args); \
+ IPA_IPC_LOGGING(ipa_get_ipc_logbuf(), \
+ DEV_NAME " %s:%d " fmt, ## args); \
+ IPA_IPC_LOGGING(ipa_get_ipc_logbuf_low(), \
+ DEV_NAME " %s:%d " fmt, ## args); \
+ } while (0)
+
#define IPAWANINFO(fmt, args...) \
do { \
pr_info(DEV_NAME " %s:%d " fmt, __func__,\
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
index b7a561eed663..92fa1ecc4864 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
@@ -2267,7 +2267,7 @@ int ipa3_get_wlan_stats(struct ipa_get_wdi_sap_stats *wdi_sap_stats)
ipa3_ctx->uc_wdi_ctx.stats_notify(IPA_GET_WDI_SAP_STATS,
wdi_sap_stats);
} else {
- IPAERR("uc_wdi_ctx.stats_notify NULL\n");
+ IPAERR_RL("uc_wdi_ctx.stats_notify NULL\n");
return -EFAULT;
}
return 0;
diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
index c3ed1ae1f2a3..c7a7f6becd88 100644
--- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
@@ -3128,7 +3128,7 @@ static int rmnet_ipa3_query_tethering_stats_wifi(
rc = ipa3_get_wlan_stats(sap_stats);
if (rc) {
- IPAWANERR("can't get ipa3_get_wlan_stats\n");
+ IPAWANERR_RL("can't get ipa3_get_wlan_stats\n");
kfree(sap_stats);
return rc;
} else if (data == NULL) {
@@ -3461,7 +3461,7 @@ int rmnet_ipa3_query_tethering_stats(struct wan_ioctl_query_tether_stats *data,
return rc;
}
} else {
- IPAWANDBG_LOW(" query modem-backhaul stats\n");
+ IPAWANDBG_LOW("query modem-backhaul stats\n");
rc = rmnet_ipa3_query_tethering_stats_modem(
data, false);
if (rc) {
@@ -3495,7 +3495,8 @@ int rmnet_ipa3_query_tethering_stats_all(
rc = rmnet_ipa3_query_tethering_stats_wifi(
&tether_stats, data->reset_stats);
if (rc) {
- IPAWANERR("wlan WAN_IOC_QUERY_TETHER_STATS failed\n");
+ IPAWANERR_RL(
+ "wlan WAN_IOC_QUERY_TETHER_STATS failed\n");
return rc;
}
data->tx_bytes = tether_stats.ipv4_tx_bytes
diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c
index 929242a5e268..d7ef2af07413 100644
--- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c
+++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c
@@ -227,7 +227,7 @@ static long ipa3_wan_ioctl(struct file *filp,
}
if (rmnet_ipa3_poll_tethering_stats(
(struct wan_ioctl_poll_tethering_stats *)param)) {
- IPAWANERR("WAN_IOCTL_POLL_TETHERING_STATS failed\n");
+ IPAWANERR_RL("WAN_IOCTL_POLL_TETHERING_STATS failed\n");
retval = -EFAULT;
break;
}
diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c
index a0b9bca138b3..07715b7bee8e 100644
--- a/drivers/power/supply/power_supply_sysfs.c
+++ b/drivers/power/supply/power_supply_sysfs.c
@@ -340,6 +340,7 @@ static struct device_attribute power_supply_attrs[] = {
POWER_SUPPLY_ATTR(soh),
POWER_SUPPLY_ATTR(qc_opti_disable),
POWER_SUPPLY_ATTR(fcc_stepper_enable),
+ POWER_SUPPLY_ATTR(cc_soc),
/* Local extensions of type int64_t */
POWER_SUPPLY_ATTR(charge_counter_ext),
/* Properties of type `const char *' */
diff --git a/drivers/power/supply/qcom/qpnp-linear-charger.c b/drivers/power/supply/qcom/qpnp-linear-charger.c
index 6e3158ae88d2..515ea35b5e5a 100644
--- a/drivers/power/supply/qcom/qpnp-linear-charger.c
+++ b/drivers/power/supply/qcom/qpnp-linear-charger.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2015, 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2015, 2017-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
@@ -414,6 +414,7 @@ struct qpnp_lbc_chip {
struct qpnp_adc_tm_chip *adc_tm_dev;
struct led_classdev led_cdev;
struct dentry *debug_root;
+ struct work_struct debug_board_work;
/* parallel-chg params */
struct power_supply *parallel_psy;
@@ -1496,7 +1497,7 @@ static int qpnp_lbc_configure_jeita(struct qpnp_lbc_chip *chip,
return -EINVAL;
}
- if (chip->cfg_use_fake_battery)
+ if (chip->cfg_use_fake_battery || chip->debug_board)
return 0;
mutex_lock(&chip->jeita_configure_lock);
@@ -1550,6 +1551,22 @@ mutex_unlock:
return rc;
}
+static void qpnp_lbc_debug_board_work_fn(struct work_struct *work)
+{
+ struct qpnp_lbc_chip *chip = container_of(work, struct qpnp_lbc_chip,
+ debug_board_work);
+ int rc = 0;
+
+ if (chip->adc_param.channel == LR_MUX1_BATT_THERM
+ && chip->debug_board) {
+ pr_debug("Disable adc-tm notifications for debug board\n");
+ rc = qpnp_adc_tm_disable_chan_meas(chip->adc_tm_dev,
+ &chip->adc_param);
+ if (rc < 0)
+ pr_err("failed to disable tm %d\n", rc);
+ }
+}
+
static int qpnp_batt_property_is_writeable(struct power_supply *psy,
enum power_supply_property psp)
{
@@ -1663,6 +1680,7 @@ static int qpnp_batt_power_set_property(struct power_supply *psy,
break;
case POWER_SUPPLY_PROP_DEBUG_BATTERY:
chip->debug_board = val->intval;
+ schedule_work(&chip->debug_board_work);
rc = qpnp_lbc_charger_enable(chip, DEBUG_BOARD,
!(val->intval));
break;
@@ -2679,6 +2697,9 @@ static irqreturn_t qpnp_lbc_batt_pres_irq_handler(int irq, void *_chip)
struct qpnp_lbc_chip *chip = _chip;
int batt_present;
+ if (chip->debug_board)
+ return IRQ_HANDLED;
+
batt_present = qpnp_lbc_is_batt_present(chip);
pr_debug("batt-pres triggered: %d\n", batt_present);
@@ -3343,7 +3364,7 @@ static int qpnp_lbc_main_probe(struct platform_device *pdev)
alarm_init(&chip->vddtrim_alarm, ALARM_REALTIME, vddtrim_callback);
INIT_DELAYED_WORK(&chip->collapsible_detection_work,
qpnp_lbc_collapsible_detection_work);
-
+ INIT_WORK(&chip->debug_board_work, qpnp_lbc_debug_board_work_fn);
/* Get all device-tree properties */
rc = qpnp_charger_read_dt_props(chip);
if (rc) {
@@ -3553,6 +3574,7 @@ static int qpnp_lbc_remove(struct platform_device *pdev)
alarm_cancel(&chip->vddtrim_alarm);
cancel_work_sync(&chip->vddtrim_work);
}
+ cancel_work_sync(&chip->debug_board_work);
cancel_delayed_work_sync(&chip->collapsible_detection_work);
debugfs_remove_recursive(chip->debug_root);
if (chip->bat_if_base)
diff --git a/drivers/power/supply/qcom/qpnp-qg.c b/drivers/power/supply/qcom/qpnp-qg.c
index fa1cd64689c6..44abb71b7e83 100644
--- a/drivers/power/supply/qcom/qpnp-qg.c
+++ b/drivers/power/supply/qcom/qpnp-qg.c
@@ -1061,10 +1061,6 @@ static void process_udata_work(struct work_struct *work)
pr_err("Failed to update SDAM params, rc=%d\n", rc);
}
- if (chip->udata.param[QG_CHARGE_COUNTER].valid)
- chip->charge_counter_uah =
- chip->udata.param[QG_CHARGE_COUNTER].data;
-
if (chip->udata.param[QG_ESR].valid)
chip->esr_last = chip->udata.param[QG_ESR].data;
@@ -1545,6 +1541,26 @@ static int qg_get_battery_capacity(struct qpnp_qg *chip, int *soc)
return 0;
}
+static int qg_get_charge_counter(struct qpnp_qg *chip, int *charge_counter)
+{
+ int rc, cc_soc = 0;
+ int64_t temp = 0;
+
+ rc = qg_get_learned_capacity(chip, &temp);
+ if (rc < 0 || !temp)
+ rc = qg_get_nominal_capacity((int *)&temp, 250, true);
+
+ if (rc < 0) {
+ pr_err("Failed to get FCC for charge-counter rc=%d\n", rc);
+ return rc;
+ }
+
+ cc_soc = CAP(0, 100, DIV_ROUND_CLOSEST(chip->cc_soc, 100));
+ *charge_counter = div_s64(temp * cc_soc, 100);
+
+ return 0;
+}
+
static int qg_get_ttf_param(void *data, enum ttf_param param, int *val)
{
union power_supply_propval prop = {0, };
@@ -1732,7 +1748,7 @@ static int qg_psy_get_property(struct power_supply *psy,
pval->intval = chip->bp.qg_profile_version;
break;
case POWER_SUPPLY_PROP_CHARGE_COUNTER:
- pval->intval = chip->charge_counter_uah;
+ rc = qg_get_charge_counter(chip, &pval->intval);
break;
case POWER_SUPPLY_PROP_CHARGE_FULL:
if (!chip->dt.cl_disable && chip->dt.cl_feedback_on)
@@ -1772,6 +1788,9 @@ static int qg_psy_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_SOH:
pval->intval = chip->soh;
break;
+ case POWER_SUPPLY_PROP_CC_SOC:
+ rc = qg_get_cc_soc(chip, &pval->intval);
+ break;
default:
pr_debug("Unsupported property %d\n", psp);
break;
@@ -1822,6 +1841,7 @@ static enum power_supply_property qg_psy_props[] = {
POWER_SUPPLY_PROP_ESR_ACTUAL,
POWER_SUPPLY_PROP_ESR_NOMINAL,
POWER_SUPPLY_PROP_SOH,
+ POWER_SUPPLY_PROP_CC_SOC,
};
static const struct power_supply_desc qg_psy_desc = {
diff --git a/drivers/power/supply/qcom/qpnp-smb5.c b/drivers/power/supply/qcom/qpnp-smb5.c
index 0a677ec8c6a4..7994741ccb1c 100644
--- a/drivers/power/supply/qcom/qpnp-smb5.c
+++ b/drivers/power/supply/qcom/qpnp-smb5.c
@@ -282,7 +282,8 @@ static int smb5_chg_config_init(struct smb5 *chip)
break;
case PMI632_SUBTYPE:
chip->chg.smb_version = PMI632_SUBTYPE;
- chg->wa_flags |= WEAK_ADAPTER_WA | USBIN_OV_WA;
+ chg->wa_flags |= WEAK_ADAPTER_WA | USBIN_OV_WA |
+ CHG_TERMINATION_WA;
if (pmic_rev_id->rev4 >= 2)
chg->wa_flags |= MOISTURE_PROTECTION_WA;
chg->param = smb5_pmi632_params;
diff --git a/drivers/power/supply/qcom/qpnp-vm-bms.c b/drivers/power/supply/qcom/qpnp-vm-bms.c
index 6295bfc3349b..9caced7a2f33 100644
--- a/drivers/power/supply/qcom/qpnp-vm-bms.c
+++ b/drivers/power/supply/qcom/qpnp-vm-bms.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2016, 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
@@ -1863,6 +1863,10 @@ static int setup_vbat_monitoring(struct qpnp_bms_chip *chip)
{
int rc;
+ if (is_debug_batt_id(chip)) {
+ pr_debug("skip configuring vbat monitoring for debug_board\n");
+ return 0;
+ }
chip->vbat_monitor_params.low_thr =
chip->dt.cfg_low_voltage_threshold;
chip->vbat_monitor_params.high_thr =
@@ -2102,6 +2106,10 @@ static void monitor_soc_work(struct work_struct *work)
monitor_soc_work.work);
int rc, new_soc = 0, batt_temp;
+ /*skip if its a debug-board */
+ if (is_debug_batt_id(chip))
+ return;
+
bms_stay_awake(&chip->vbms_soc_wake_source);
calculate_delta_time(&chip->tm_sec, &chip->delta_time_s);
diff --git a/drivers/power/supply/qcom/smb5-lib.c b/drivers/power/supply/qcom/smb5-lib.c
index 6f13635dcb75..fa59ebf1f877 100644
--- a/drivers/power/supply/qcom/smb5-lib.c
+++ b/drivers/power/supply/qcom/smb5-lib.c
@@ -773,6 +773,7 @@ static void smblib_uusb_removal(struct smb_charger *chg)
struct storm_watch *wdata;
cancel_delayed_work_sync(&chg->pl_enable_work);
+ alarm_cancel(&chg->chg_termination_alarm);
if (chg->wa_flags & BOOST_BACK_WA) {
data = chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data;
@@ -793,6 +794,7 @@ static void smblib_uusb_removal(struct smb_charger *chg)
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
is_flash_active(chg) ? SDP_CURRENT_UA : SDP_100_MA);
vote(chg->usb_icl_votable, SW_QC3_VOTER, false, 0);
+ vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
/* reconfigure allowed voltage for HVDCP */
rc = smblib_set_adapter_allowance(chg,
@@ -1482,6 +1484,16 @@ int smblib_get_prop_batt_status(struct smb_charger *chg,
break;
}
+ /*
+ * If charge termination WA is active and has suspended charging, then
+ * continue reporting charging status as FULL.
+ */
+ if (is_client_vote_enabled(chg->usb_icl_votable,
+ CHG_TERMINATION_VOTER)) {
+ val->intval = POWER_SUPPLY_STATUS_FULL;
+ return 0;
+ }
+
if (val->intval != POWER_SUPPLY_STATUS_CHARGING)
return 0;
@@ -1991,6 +2003,12 @@ int smblib_get_prop_usb_online(struct smb_charger *chg,
return rc;
}
+ if (is_client_vote_enabled(chg->usb_icl_votable,
+ CHG_TERMINATION_VOTER)) {
+ rc = smblib_get_prop_usb_present(chg, val);
+ return rc;
+ }
+
rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
if (rc < 0) {
smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
@@ -2760,6 +2778,38 @@ irqreturn_t default_irq_handler(int irq, void *data)
return IRQ_HANDLED;
}
+#define CHG_TERM_WA_ENTRY_DELAY_MS 300000 /* 5 min */
+#define CHG_TERM_WA_EXIT_DELAY_MS 60000 /* 1 min */
+static void smblib_eval_chg_termination(struct smb_charger *chg, u8 batt_status)
+{
+ union power_supply_propval pval = {0, };
+ int rc = 0;
+
+ rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CAPACITY, &pval);
+ if (rc < 0) {
+ smblib_err(chg, "Couldn't read SOC value, rc=%d\n", rc);
+ return;
+ }
+
+ /*
+ * Post charge termination, switch to BSM mode triggers the risk of
+ * over charging as BATFET opening may take some time post the necessity
+ * of staying in supplemental mode, leading to unintended charging of
+ * battery. Trigger the charge termination WA once charging is completed
+ * to prevent overcharing.
+ */
+ if ((batt_status == TERMINATE_CHARGE) && (pval.intval == 100)) {
+ alarm_start_relative(&chg->chg_termination_alarm,
+ ms_to_ktime(CHG_TERM_WA_ENTRY_DELAY_MS));
+ } else if (pval.intval < 100) {
+ /*
+ * Reset CC_SOC reference value for charge termination WA once
+ * we exit the TERMINATE_CHARGE state and soc drops below 100%
+ */
+ chg->cc_soc_ref = 0;
+ }
+}
+
irqreturn_t chg_state_change_irq_handler(int irq, void *data)
{
struct smb_irq_data *irq_data = data;
@@ -2777,6 +2827,10 @@ irqreturn_t chg_state_change_irq_handler(int irq, void *data)
}
stat = stat & BATTERY_CHARGER_STATUS_MASK;
+
+ if (chg->wa_flags & CHG_TERMINATION_WA)
+ smblib_eval_chg_termination(chg, stat);
+
power_supply_changed(chg->batt_psy);
return IRQ_HANDLED;
}
@@ -3468,6 +3522,7 @@ static void typec_src_removal(struct smb_charger *chg)
}
cancel_delayed_work_sync(&chg->pl_enable_work);
+ alarm_cancel(&chg->chg_termination_alarm);
/* reset input current limit voters */
vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
@@ -3479,6 +3534,7 @@ static void typec_src_removal(struct smb_charger *chg)
vote(chg->usb_icl_votable, SW_QC3_VOTER, false, 0);
vote(chg->usb_icl_votable, OTG_VOTER, false, 0);
vote(chg->usb_icl_votable, CTM_VOTER, false, 0);
+ vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
/* reset usb irq voters */
vote(chg->usb_irq_enable_votable, PD_VOTER, false, 0);
@@ -3996,6 +4052,12 @@ static void smblib_moisture_protection_work(struct work_struct *work)
u8 stat;
/*
+ * Hold awake votable to prevent pm_relax being called prior to
+ * completion of this work.
+ */
+ vote(chg->awake_votable, MOISTURE_VOTER, true, 0);
+
+ /*
* Disable 1% duty cycle on CC_ID pin and enable uUSB factory mode
* detection to track any change on RID, as interrupts are disable.
*/
@@ -4057,6 +4119,7 @@ static void smblib_moisture_protection_work(struct work_struct *work)
}
out:
+ vote(chg->awake_votable, MOISTURE_VOTER, false, 0);
pm_relax(chg->dev);
}
@@ -4076,6 +4139,93 @@ static enum alarmtimer_restart moisture_protection_alarm_cb(struct alarm *alarm,
return ALARMTIMER_NORESTART;
}
+static void smblib_chg_termination_work(struct work_struct *work)
+{
+ struct smb_charger *chg = container_of(work, struct smb_charger,
+ chg_termination_work);
+ union power_supply_propval pval;
+ int rc, delay = CHG_TERM_WA_ENTRY_DELAY_MS;
+
+ /*
+ * Hold awake votable to prevent pm_relax being called prior to
+ * completion of this work.
+ */
+ vote(chg->awake_votable, CHG_TERMINATION_VOTER, true, 0);
+
+ rc = smblib_get_prop_usb_present(chg, &pval);
+ if (rc < 0 || !pval.intval)
+ goto out;
+
+ rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CAPACITY, &pval);
+ if (rc < 0 || (pval.intval < 100)) {
+ vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
+ goto out;
+ }
+
+ rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CHARGE_FULL,
+ &pval);
+ if (rc < 0)
+ goto out;
+
+ /*
+ * On change in the value of learned capacity, re-initialize the
+ * reference cc_soc value due to change in cc_soc characteristic value
+ * at full capacity. Also, in case cc_soc_ref value is reset,
+ * re-initialize it.
+ */
+ if ((pval.intval != chg->charge_full_cc) || !chg->cc_soc_ref) {
+ chg->charge_full_cc = pval.intval;
+ rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CC_SOC,
+ &pval);
+ if (rc < 0)
+ goto out;
+
+ chg->cc_soc_ref = pval.intval;
+ } else {
+ rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CC_SOC,
+ &pval);
+ if (rc < 0)
+ goto out;
+ }
+
+ /*
+ * Suspend/Unsuspend USB input to keep cc_soc within the 0.5% to 0.75%
+ * overshoot range of the cc_soc value at termination, to prevent
+ * overcharging.
+ */
+ if (pval.intval < DIV_ROUND_CLOSEST(chg->cc_soc_ref * 10050, 10000)) {
+ vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
+ delay = CHG_TERM_WA_ENTRY_DELAY_MS;
+ } else if (pval.intval > DIV_ROUND_CLOSEST(chg->cc_soc_ref * 10075,
+ 10000)) {
+ vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, true, 0);
+ delay = CHG_TERM_WA_EXIT_DELAY_MS;
+ }
+
+ smblib_dbg(chg, PR_MISC, "Chg Term WA readings: cc_soc: %d, cc_soc_ref: %d, delay: %d\n",
+ pval.intval, chg->cc_soc_ref, delay);
+ alarm_start_relative(&chg->chg_termination_alarm, ms_to_ktime(delay));
+out:
+ vote(chg->awake_votable, CHG_TERMINATION_VOTER, false, 0);
+ pm_relax(chg->dev);
+}
+
+static enum alarmtimer_restart chg_termination_alarm_cb(struct alarm *alarm,
+ ktime_t now)
+{
+ struct smb_charger *chg = container_of(alarm, struct smb_charger,
+ chg_termination_alarm);
+
+ smblib_dbg(chg, PR_MISC, "Charge termination WA alarm triggered %lld\n",
+ ktime_to_ms(now));
+
+ /* Atomic context, cannot use voter */
+ pm_stay_awake(chg->dev);
+ schedule_work(&chg->chg_termination_work);
+
+ return ALARMTIMER_NORESTART;
+}
+
#define JEITA_SOFT 0
#define JEITA_HARD 1
static int smblib_update_jeita(struct smb_charger *chg, u32 *thresholds,
@@ -4288,6 +4438,19 @@ int smblib_init(struct smb_charger *chg)
INIT_DELAYED_WORK(&chg->bb_removal_work, smblib_bb_removal_work);
INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work);
+ if (chg->wa_flags & CHG_TERMINATION_WA) {
+ INIT_WORK(&chg->chg_termination_work,
+ smblib_chg_termination_work);
+
+ if (alarmtimer_get_rtcdev()) {
+ alarm_init(&chg->chg_termination_alarm, ALARM_BOOTTIME,
+ chg_termination_alarm_cb);
+ } else {
+ smblib_err(chg, "Couldn't get rtc device\n");
+ return -ENODEV;
+ }
+ }
+
if (chg->moisture_protection_enabled &&
(chg->wa_flags & MOISTURE_PROTECTION_WA)) {
INIT_WORK(&chg->moisture_protection_work,
@@ -4368,9 +4531,11 @@ int smblib_deinit(struct smb_charger *chg)
alarm_cancel(&chg->moisture_protection_alarm);
cancel_work_sync(&chg->moisture_protection_work);
}
+ alarm_cancel(&chg->chg_termination_alarm);
cancel_work_sync(&chg->bms_update_work);
cancel_work_sync(&chg->jeita_update_work);
cancel_work_sync(&chg->pl_update_work);
+ cancel_work_sync(&chg->chg_termination_work);
cancel_delayed_work_sync(&chg->clear_hdc_work);
cancel_delayed_work_sync(&chg->icl_change_work);
cancel_delayed_work_sync(&chg->pl_enable_work);
diff --git a/drivers/power/supply/qcom/smb5-lib.h b/drivers/power/supply/qcom/smb5-lib.h
index 1bba20618bd9..64b640fcfc5e 100644
--- a/drivers/power/supply/qcom/smb5-lib.h
+++ b/drivers/power/supply/qcom/smb5-lib.h
@@ -72,6 +72,7 @@ enum print_reason {
#define MOISTURE_VOTER "MOISTURE_VOTER"
#define USBOV_DBC_VOTER "USBOV_DBC_VOTER"
#define FCC_STEPPER_VOTER "FCC_STEPPER_VOTER"
+#define CHG_TERMINATION_VOTER "CHG_TERMINATION_VOTER"
#define BOOST_BACK_STORM_COUNT 3
#define WEAK_CHG_STORM_COUNT 8
@@ -104,6 +105,7 @@ enum {
WEAK_ADAPTER_WA = BIT(1),
MOISTURE_PROTECTION_WA = BIT(2),
USBIN_OV_WA = BIT(3),
+ CHG_TERMINATION_WA = BIT(4),
};
enum {
@@ -345,6 +347,7 @@ struct smb_charger {
struct work_struct pl_update_work;
struct work_struct jeita_update_work;
struct work_struct moisture_protection_work;
+ struct work_struct chg_termination_work;
struct delayed_work ps_change_timeout_work;
struct delayed_work clear_hdc_work;
struct delayed_work icl_change_work;
@@ -355,6 +358,7 @@ struct smb_charger {
/* alarm */
struct alarm moisture_protection_alarm;
+ struct alarm chg_termination_alarm;
/* pd */
int voltage_min_uv;
@@ -407,6 +411,8 @@ struct smb_charger {
bool moisture_present;
bool moisture_protection_enabled;
bool fcc_stepper_enable;
+ int charge_full_cc;
+ int cc_soc_ref;
/* workaround flag */
u32 wa_flags;
diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c
index c629e9756ffe..c74e9ac24547 100644
--- a/fs/crypto/bio.c
+++ b/fs/crypto/bio.c
@@ -131,7 +131,7 @@ int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk,
bio->bi_bdev = inode->i_sb->s_bdev;
bio->bi_iter.bi_sector =
pblk << (inode->i_sb->s_blocksize_bits - 9);
- bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
+ bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_NOENCRYPT);
ret = bio_add_page(bio, ciphertext_page,
inode->i_sb->s_blocksize, 0);
if (ret != inode->i_sb->s_blocksize) {
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 064753880e99..f0d3daaaa114 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -203,7 +203,10 @@ typedef struct ext4_io_end {
ssize_t size; /* size of the extent */
} ext4_io_end_t;
+#define EXT4_IO_ENCRYPTED 1
+
struct ext4_io_submit {
+ unsigned int io_flags;
struct writeback_control *io_wbc;
struct bio *io_bio;
ext4_io_end_t *io_end;
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index af9b5f60f930..9a3262973dbe 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1150,11 +1150,12 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len,
if (!buffer_uptodate(bh) && !buffer_delay(bh) &&
!buffer_unwritten(bh) &&
(block_start < from || block_end > to)) {
- ll_rw_block(REQ_OP_READ, 0, 1, &bh);
- *wait_bh++ = bh;
decrypt = ext4_encrypted_inode(inode) &&
S_ISREG(inode->i_mode) &&
!fscrypt_using_hardware_encryption(inode);
+ ll_rw_block(REQ_OP_READ, (decrypt ? REQ_NOENCRYPT : 0),
+ 1, &bh);
+ *wait_bh++ = bh;
}
}
/*
@@ -3784,6 +3785,7 @@ static int __ext4_block_zero_page_range(handle_t *handle,
struct inode *inode = mapping->host;
struct buffer_head *bh;
struct page *page;
+ bool decrypt;
int err = 0;
page = find_or_create_page(mapping, from >> PAGE_SHIFT,
@@ -3826,14 +3828,15 @@ static int __ext4_block_zero_page_range(handle_t *handle,
if (!buffer_uptodate(bh)) {
err = -EIO;
- ll_rw_block(REQ_OP_READ, 0, 1, &bh);
+ decrypt = S_ISREG(inode->i_mode) &&
+ ext4_encrypted_inode(inode) &&
+ !fscrypt_using_hardware_encryption(inode);
+ ll_rw_block(REQ_OP_READ, (decrypt ? REQ_NOENCRYPT : 0), 1, &bh);
wait_on_buffer(bh);
/* Uhhuh. Read error. Complain and punt. */
if (!buffer_uptodate(bh))
goto unlock;
- if (S_ISREG(inode->i_mode) &&
- ext4_encrypted_inode(inode) &&
- !fscrypt_using_hardware_encryption(inode)) {
+ if (decrypt) {
/* We expect the key to be set. */
BUG_ON(!fscrypt_has_encryption_key(inode));
BUG_ON(blocksize != PAGE_SIZE);
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index 8d4ec1abd01f..228baa5eb3d7 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -341,6 +341,8 @@ void ext4_io_submit(struct ext4_io_submit *io)
if (bio) {
int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ?
WRITE_SYNC : 0;
+ if (io->io_flags & EXT4_IO_ENCRYPTED)
+ io_op_flags |= REQ_NOENCRYPT;
bio_set_op_attrs(io->io_bio, REQ_OP_WRITE, io_op_flags);
submit_bio(io->io_bio);
}
@@ -350,6 +352,7 @@ void ext4_io_submit(struct ext4_io_submit *io)
void ext4_io_submit_init(struct ext4_io_submit *io,
struct writeback_control *wbc)
{
+ io->io_flags = 0;
io->io_wbc = wbc;
io->io_bio = NULL;
io->io_end = NULL;
@@ -492,6 +495,8 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
do {
if (!buffer_async_write(bh))
continue;
+ if (data_page)
+ io->io_flags |= EXT4_IO_ENCRYPTED;
ret = io_submit_add_bh(io, inode,
data_page ? data_page : page, bh);
if (ret) {
diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c
index c39a12d6d2d6..270c4f495db3 100644
--- a/fs/ext4/readpage.c
+++ b/fs/ext4/readpage.c
@@ -297,7 +297,8 @@ int ext4_mpage_readpages(struct address_space *mapping,
bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9);
bio->bi_end_io = mpage_end_io;
bio->bi_private = ctx;
- bio_set_op_attrs(bio, REQ_OP_READ, 0);
+ bio_set_op_attrs(bio, REQ_OP_READ,
+ ctx ? REQ_NOENCRYPT : 0);
}
length = first_hole << blkbits;
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 8bc9e2244850..3e1f82d04492 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -455,6 +455,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
bio_put(bio);
return -EFAULT;
}
+ fio->op_flags |= fio->encrypted_page ? REQ_NOENCRYPT : 0;
bio_set_op_attrs(bio, fio->op, fio->op_flags);
__submit_bio(fio->sbi, bio, fio->type);
@@ -497,6 +498,8 @@ next:
verify_block_addr(fio, fio->new_blkaddr);
bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page;
+ fio->op_flags |= fio->encrypted_page ? REQ_NOENCRYPT : 0;
+
inode = fio->page->mapping->host;
dun = PG_DUN(inode, fio->page);
bi_crypt_skip = fio->encrypted_page ? 1 : 0;
@@ -566,7 +569,10 @@ static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr,
return ERR_PTR(-ENOMEM);
f2fs_target_device(sbi, blkaddr, bio);
bio->bi_end_io = f2fs_read_end_io;
- bio_set_op_attrs(bio, REQ_OP_READ, 0);
+ bio_set_op_attrs(bio, REQ_OP_READ,
+ (f2fs_encrypted_inode(inode) ?
+ REQ_NOENCRYPT :
+ 0));
if (f2fs_encrypted_file(inode) &&
!fscrypt_using_hardware_encryption(inode))
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index a14967198d60..f0641d334cd8 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -188,6 +188,9 @@ enum rq_flag_bits {
__REQ_FUA, /* forced unit access */
__REQ_PREFLUSH, /* request for cache flush */
__REQ_BARRIER, /* marks flush req as barrier */
+ /* Android specific flags */
+ __REQ_NOENCRYPT, /* ok to not encrypt (already encrypted at fs
+ level) */
/* bio only flags */
__REQ_RAHEAD, /* read ahead, can fail anytime */
@@ -228,6 +231,7 @@ enum rq_flag_bits {
#define REQ_URGENT (1ULL << __REQ_URGENT)
#define REQ_NOIDLE (1ULL << __REQ_NOIDLE)
#define REQ_INTEGRITY (1ULL << __REQ_INTEGRITY)
+#define REQ_NOENCRYPT (1ULL << __REQ_NOENCRYPT)
#define REQ_FAILFAST_MASK \
(REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER)
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index 4c0778848426..6ec5e52e16ec 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -303,6 +303,7 @@ enum power_supply_property {
POWER_SUPPLY_PROP_SOH,
POWER_SUPPLY_PROP_QC_OPTI_DISABLE,
POWER_SUPPLY_PROP_FCC_STEPPER_ENABLE,
+ POWER_SUPPLY_PROP_CC_SOC,
/* Local extensions of type int64_t */
POWER_SUPPLY_PROP_CHARGE_COUNTER_EXT,
/* Properties of type `const char *' */
diff --git a/include/linux/qpnp/qpnp-adc.h b/include/linux/qpnp/qpnp-adc.h
index 770cd646114e..308225b96258 100644
--- a/include/linux/qpnp/qpnp-adc.h
+++ b/include/linux/qpnp/qpnp-adc.h
@@ -406,6 +406,8 @@ enum qpnp_adc_channel_scaling_param {
* %SCALE_BATT_THERM_TEMP_PU400: Conversion to temperature(decidegC) for 400k
* pullup.
* %SCALE_SMB1390_DIE_TEMP: Conversion for SMB1390 die temp
+ * %SCALE_BATT_THERM_TEMP_QRD_215: Conversion to temperature(decidegC) based on
+ * btm parameters for QRD.
* %SCALE_NONE: Do not use this scaling type.
*/
enum qpnp_adc_scale_fn_type {
@@ -432,6 +434,7 @@ enum qpnp_adc_scale_fn_type {
SCALE_SMB1390_DIE_TEMP,
SCALE_BATT_THERM_TEMP_PU30,
SCALE_BATT_THERM_TEMP_PU400,
+ SCALE_BATT_THERM_TEMP_QRD_215,
SCALE_NONE,
};
@@ -1510,6 +1513,23 @@ int32_t qpnp_adc_batt_therm_pu400(struct qpnp_vadc_chip *dev,
const struct qpnp_vadc_chan_properties *chan_prop,
struct qpnp_vadc_result *chan_rslt);
/**
+ * qpnp_adc_batt_therm_qrd_215() - Scales the pre-calibrated digital output
+ * of an ADC to the ADC reference and compensates for the
+ * gain and offset. Returns the temperature in decidegC for QRD.
+ * @dev: Structure device for qpnp vadc
+ * @adc_code: pre-calibrated digital output of the ADC.
+ * @adc_prop: adc properties of the pm8xxx adc such as bit resolution,
+ * reference voltage.
+ * @chan_prop: individual channel properties to compensate the i/p scaling,
+ * slope and offset.
+ * @chan_rslt: physical result to be stored.
+ */
+int32_t qpnp_adc_batt_therm_qrd_215(struct qpnp_vadc_chip *dev,
+ int32_t adc_code,
+ const struct qpnp_adc_properties *adc_prop,
+ const struct qpnp_vadc_chan_properties *chan_prop,
+ struct qpnp_vadc_result *chan_rslt);
+/**
* qpnp_adc_scale_batt_therm() - Scales the pre-calibrated digital output
* of an ADC to the ADC reference and compensates for the
* gain and offset. Returns the temperature in decidegC.
@@ -2164,6 +2184,12 @@ static inline int32_t qpnp_adc_batt_therm_pu400(struct qpnp_vadc_chip *vadc,
const struct qpnp_vadc_chan_properties *chan_prop,
struct qpnp_vadc_result *chan_rslt)
{ return -ENXIO; }
+static inline int32_t qpnp_adc_batt_therm_qrd_215(struct qpnp_vadc_chip *vadc,
+ int32_t adc_code,
+ const struct qpnp_adc_properties *adc_prop,
+ const struct qpnp_vadc_chan_properties *chan_prop,
+ struct qpnp_vadc_result *chan_rslt)
+{ return -ENXIO; }
static inline int32_t qpnp_adc_scale_batt_therm(struct qpnp_vadc_chip *vadc,
int32_t adc_code,
const struct qpnp_adc_properties *adc_prop,
diff --git a/include/net/cnss2.h b/include/net/cnss2.h
index c5ccee4db262..64ae740ff8ec 100644
--- a/include/net/cnss2.h
+++ b/include/net/cnss2.h
@@ -115,6 +115,11 @@ struct cnss_shadow_reg_v2_cfg {
u32 addr;
};
+struct cnss_rri_over_ddr_cfg {
+ u32 base_addr_low;
+ u32 base_addr_high;
+};
+
struct cnss_wlan_enable_cfg {
u32 num_ce_tgt_cfg;
struct cnss_ce_tgt_pipe_cfg *ce_tgt_cfg;
@@ -124,6 +129,8 @@ struct cnss_wlan_enable_cfg {
struct cnss_shadow_reg_cfg *shadow_reg_cfg;
u32 num_shadow_reg_v2_cfg;
struct cnss_shadow_reg_v2_cfg *shadow_reg_v2_cfg;
+ bool rri_over_ddr_cfg_valid;
+ struct cnss_rri_over_ddr_cfg rri_over_ddr_cfg;
};
enum cnss_driver_mode {