diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2019-01-23 23:07:37 -0800 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2019-01-23 23:07:37 -0800 |
commit | 8c873f417a683c8f447df8bf0165f5b61a80795f (patch) | |
tree | c3e3ecd32473d4298d3042aff6bda77eb62075cc | |
parent | 84fc364bc3d370b6e7d05cf6760246cafd453dea (diff) | |
parent | adf55fdfff6953c88f9e43175352a9ca6ae95b67 (diff) |
Merge adf55fdfff6953c88f9e43175352a9ca6ae95b67 on remote branchLA.UM.7.8.r3-00900-SDM710.0
Change-Id: I74fe015fb17068ac936e714623dba73ba0e678d2
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 { |