diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt index 528c9861e615..72821b619b52 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm.txt @@ -407,4 +407,5 @@ compatible = "qcom,sdxpoorwills-atp" compatible = "qcom,sdxpoorwills-mtp" compatible = "qcom,sdxpoorwills-cdp" compatible = "qcom,sdxpoorwills-ttp" +compatible = "qcom,sdxpoorwills-adp" compatible = "qcom,mdm9607-ttp" diff --git a/Documentation/devicetree/bindings/gpu/adreno.txt b/Documentation/devicetree/bindings/gpu/adreno.txt index d0ac72168af4..4cd43d00ce35 100644 --- a/Documentation/devicetree/bindings/gpu/adreno.txt +++ b/Documentation/devicetree/bindings/gpu/adreno.txt @@ -207,6 +207,10 @@ Optional Properties: Specify the name of GPU temperature sensor. This name will be used to get the temperature from the thermal driver API. +- tzone-names: + Specify the names of GPU thermal zones. These will be used + to get the temperature from the thermal driver API. + - qcom,enable-midframe-timer: Boolean. Enables the use of midframe sampling timer. This timer samples the GPU powerstats if the cmdbatch expiry takes longer than diff --git a/Documentation/devicetree/bindings/input/sensors/smi130.txt b/Documentation/devicetree/bindings/input/sensors/smi130.txt new file mode 100644 index 000000000000..79179ba71e71 --- /dev/null +++ b/Documentation/devicetree/bindings/input/sensors/smi130.txt @@ -0,0 +1,56 @@ +The SMI130 is a highly integrated, low power inertial measurement unit (IMU) +that provides precise acceleration and angular rate (gyroscopic) measurement. + +To enable driver probing, add the smi130_gyro and smi130_acc node to the platform +device tree as described below. + +Required properties: + +- compatible: "smi130_gyro", "smi130_acc" +- reg: the I2C address or SPI chip select the device will respond to +- interrupt-parent: phandle to the parent interrupt controller as documented in [interrupts][4] +- interrupts: interrupt mapping for IRQ as documented in [interrupts][4] + +Recommended properties for SPI bus usage: +- spi-max-frequency: maximum SPI bus frequency as documented in [SPI][3] + +Optional properties: +- smi130_gyro,gpio_irq: MEMS sensor interrupt line to use (default 1) + +I2C example (based on Raspberry PI 3): + + &i2c0 { + status = "ok"; + #address-cells = <0x1>; + #size-cells = <0x0>; + smi130_gyro@68 { + compatible = "smi130_gyro"; + reg = <0x68>; + interrupt-parent = <&gpio>; + interrupts = <26 IRQ_TYPE_EDGE_RISING>; + }; + smi130_acc@18 { + compatible = "smi130_acc"; + reg = <0x18>; + interrupt-parent = <&gpio>; + interrupts = <25 IRQ_TYPE_EDGE_RISING>; + }; + +SPI example (based on Raspberry PI 3): + + &spi0 { + status = "ok"; + #address-cells = <0x1>; + #size-cells = <0x0>; + smi130_gyro@68 { + compatible = "smi130_gyro"; + reg = <0x68>; + interrupt-parent = <&gpio>; + interrupts = <26 IRQ_TYPE_EDGE_RISING>; + }; + smi130_acc@18 { + compatible = "smi130_acc"; + reg = <0x18>; + interrupt-parent = <&gpio>; + interrupts = <25 IRQ_TYPE_EDGE_RISING>; + }; diff --git a/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt b/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt index 6fae8b086a70..4ef8d7a3c120 100644 --- a/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt +++ b/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt @@ -50,6 +50,11 @@ Optional properties: to enable. - qcom,reset-aon-logic: If present, the GPU DEMET cells need to be reset while enabling the GX GDSC. + - vdd_parent-supply: phandle to the regulator that this GDSC gates. If + present, need to vote for a minimum operational voltage + (LOW_SVS) on the GDSC parent regulator prior to + configuring it. The vote is removed once the GDSC FSM + has latched on to the new state. - resets: reset specifier pair consisting of phandle for the reset controller and reset lines used by this controller. These can be supplied only if we support qcom,skip-logic-collapse. diff --git a/Documentation/filesystems/overlayfs.txt b/Documentation/filesystems/overlayfs.txt index bcbf9710e4af..3ef85226bcce 100644 --- a/Documentation/filesystems/overlayfs.txt +++ b/Documentation/filesystems/overlayfs.txt @@ -82,6 +82,29 @@ Only the lists of names from directories are merged. Other content such as metadata and extended attributes are reported for the upper directory only. These attributes of the lower directory are hidden. +credentials +----------- + +By default, all access to the upper, lower and work directories is the +recorded mounter's MAC and DAC credentials. The incoming accesses are +checked against the caller's credentials. + +In the case where caller MAC or DAC credentials do not overlap, a +use case available in older versions of the driver, the +override_creds mount flag can be turned off and help when the use +pattern has caller with legitimate credentials where the mounter +does not. Several unintended side effects will occur though. The +caller without certain key capabilities or lower privilege will not +always be able to delete files or directories, create nodes, or +search some restricted directories. The ability to search and read +a directory entry is spotty as a result of the cache mechanism not +retesting the credentials because of the assumption, a privileged +caller can fill cache, then a lower privilege can read the directory +cache. The uneven security model where cache, upperdir and workdir +are opened at privilege, but accessed without creating a form of +privilege escalation, should only be used with strict understanding +of the side effects and of the security policies. + whiteouts and opaque directories -------------------------------- diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index 4902d2f9d9a5..8b14c873aa46 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -15,7 +15,10 @@ dtb-$(CONFIG_ARCH_SDXPOORWILLS) += sdxpoorwills-rumi.dtb \ sdxpoorwills-v2-mtp.dtb \ sdxpoorwills-v2-cdp.dtb \ sdxpoorwills-v2-dualwifi-mtp.dtb \ - sdxpoorwills-v2-dualwifi-cdp.dtb + sdxpoorwills-v2-dualwifi-cdp.dtb \ + sdxpoorwills-adp.dtb \ + sdxpoorwills-pcie-ep-adp.dtb \ + sdxpoorwills-usb-ep-adp.dtb dtb-$(CONFIG_ARCH_MDM9650) += mdm9650-nand-mtp.dtb \ mdm9650-ttp.dtb \ diff --git a/arch/arm/boot/dts/qcom/sdx-audio-lpass.dtsi b/arch/arm/boot/dts/qcom/sdx-audio-lpass.dtsi index d891a4bd4948..2c2319f7c886 100644 --- a/arch/arm/boot/dts/qcom/sdx-audio-lpass.dtsi +++ b/arch/arm/boot/dts/qcom/sdx-audio-lpass.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -191,6 +191,85 @@ qcom,msm-cpudai-afe-clk-ver = <2>; }; + qcom,msm-dai-tdm-pri-rx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37120>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36864>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-internal = <1>; + qcom,msm-cpudai-tdm-sync-mode = <0>; + qcom,msm-cpudai-tdm-sync-src = <1>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <1>; + qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>; + dai_pri_tdm_rx_0: qcom,msm-dai-q6-tdm-pri-rx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36864>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + + }; + + qcom,msm-dai-tdm-pri-tx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37121>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36865>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-internal = <1>; + qcom,msm-cpudai-tdm-sync-mode = <0>; + qcom,msm-cpudai-tdm-sync-src = <1>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <1>; + qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>; + dai_pri_tdm_tx_0: qcom,msm-dai-q6-tdm-pri-tx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36865>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; + + qcom,msm-dai-tdm-sec-rx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37136>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36880>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-internal = <1>; + qcom,msm-cpudai-tdm-sync-mode = <1>; + qcom,msm-cpudai-tdm-sync-src = <0>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <0>; + dai_sec_tdm_rx_0: qcom,msm-dai-q6-tdm-sec-rx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36880>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; + + qcom,msm-dai-tdm-sec-tx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37137>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36881>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-internal = <1>; + qcom,msm-cpudai-tdm-sync-mode = <1>; + qcom,msm-cpudai-tdm-sync-src = <0>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <0>; + dai_sec_tdm_tx_0: qcom,msm-dai-q6-tdm-sec-tx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36881>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; + qcom,msm-dai-mi2s { compatible = "qcom,msm-dai-mi2s"; mi2s_prim: qcom,msm-dai-q6-mi2s-prim { diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-adp.dts b/arch/arm/boot/dts/qcom/sdxpoorwills-adp.dts new file mode 100644 index 000000000000..369929b89ac7 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-adp.dts @@ -0,0 +1,22 @@ +/* Copyright (c) 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/; + +#include "sdxpoorwills-adp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDXPOORWILLS ADP"; + compatible = "qcom,sdxpoorwills-adp", + "qcom,sdxpoorwills", "qcom,adp"; + qcom,board-id = <25 0>, <25 0x100>; +}; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-adp.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-adp.dtsi new file mode 100644 index 000000000000..2c2099eb4211 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-adp.dtsi @@ -0,0 +1,29 @@ +/* Copyright (c) 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 "sdxpoorwills-mtp.dtsi" + +&qcom_seecom { + status = "okay"; +}; + +&qseecom_mem { + status = "okay"; +}; + +&qseecom_ta_mem { + status = "okay"; +}; + +&blsp1_uart2b_hs { + status = "okay"; +}; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-audio.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-audio.dtsi index a3eba9a80957..b45f8372189a 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-audio.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-audio.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -37,6 +37,8 @@ <&afe_pcm_rx>, <&afe_pcm_tx>, <&afe_proxy_rx>, <&afe_proxy_tx>, <&incall_record_rx>, <&incall_record_tx>, <&incall_music_rx>, + <&dai_pri_tdm_rx_0>, <&dai_pri_tdm_tx_0>, + <&dai_sec_tdm_rx_0>, <&dai_sec_tdm_tx_0>, <&dai_sec_auxpcm>; asoc-cpu-names = "msm-dai-q6-auxpcm.1", "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1", @@ -46,6 +48,8 @@ "msm-dai-q6-dev.225", "msm-dai-q6-dev.241", "msm-dai-q6-dev.240", "msm-dai-q6-dev.32771", "msm-dai-q6-dev.32772", "msm-dai-q6-dev.32773", + "msm-dai-q6-tdm.36864", "msm-dai-q6-tdm.36865", + "msm-dai-q6-tdm.36880", "msm-dai-q6-tdm.36881", "msm-dai-q6-auxpcm.2"; }; }; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-adp.dts b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-adp.dts new file mode 100644 index 000000000000..0fb75a37bdf4 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-adp.dts @@ -0,0 +1,26 @@ +/* Copyright (c) 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/; + +#include "sdxpoorwills-adp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDXPOORWILLS PCIE-EP ADP"; + compatible = "qcom,sdxpoorwills-adp", + "qcom,sdxpoorwills", "qcom,adp"; + qcom,board-id = <25 2>, <25 0x102>; +}; + +&blsp1_uart2b_hs { + status = "okay"; +}; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp-256.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp-256.dtsi index ba73271295a3..ba29301a8a17 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp-256.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp-256.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,6 +20,7 @@ status = "okay"; qcom,connector-type-uAB; extcon = <0>, <0>, <0>, <&vbus_detect>; + /delete-property/ iommus; }; &pcie_ep { diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp.dtsi index 57bd82211c8f..43490bfae4b0 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-cdp.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -16,6 +16,10 @@ status = "okay"; }; +&usb { + /delete-property/ iommus; +}; + &pcie_ep { status = "okay"; }; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp-256.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp-256.dtsi index 1f99451306fd..d2fe3be7a278 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp-256.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp-256.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,6 +20,7 @@ status = "okay"; qcom,connector-type-uAB; extcon = <0>, <0>, <0>, <&vbus_detect>; + /delete-property/ iommus; }; &pcie_ep { diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp.dtsi index d8edfdee47a8..00c81f44cc32 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-pcie-ep-mtp.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -16,6 +16,10 @@ status = "okay"; }; +&usb { + /delete-property/ iommus; +}; + &pcie_ep { status = "okay"; }; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-pinctrl.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-pinctrl.dtsi index 410d9d03118d..8c11e09f696c 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-pinctrl.dtsi @@ -1283,7 +1283,7 @@ sec_ws_active_master: sec_ws_active_master { mux { pins = "gpio16"; - function = "sec_mi2s_ws_a"; + function = "sec_mi2s"; }; config { @@ -1297,7 +1297,7 @@ sec_sck_active_master: sec_sck_active_master { mux { pins = "gpio19"; - function = "sec_mi2s_sck_a"; + function = "sec_mi2s"; }; config { @@ -1311,7 +1311,7 @@ sec_ws_active_slave: sec_ws_active_slave { mux { pins = "gpio16"; - function = "sec_mi2s_ws_a"; + function = "sec_mi2s"; }; config { @@ -1324,7 +1324,7 @@ sec_sck_active_slave: sec_sck_active_slave { mux { pins = "gpio19"; - function = "sec_mi2s_sck_a"; + function = "sec_mi2s"; }; config { @@ -1337,7 +1337,7 @@ sec_dout_active: sec_dout_active { mux { pins = "gpio18"; - function = "sec_mi2s_data1_a"; + function = "sec_mi2s"; }; config { @@ -1499,7 +1499,7 @@ sec_din_active: sec_din_active { mux { pins = "gpio17"; - function = "sec_mi2s_data0_a"; + function = "sec_mi2s"; }; config { diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-ttp.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-ttp.dtsi index 91013bb55646..629f9b8111db 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-ttp.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-ttp.dtsi @@ -45,6 +45,25 @@ &i2c_4 { status = "okay"; + smi130_gyro@68 { + compatible = "smi130_gyro"; + reg = <0x68>; + pinctrl-names = "default"; + pinctrl-0 = <&sensor_int1_default>; + interrupt-parent = <&tlmm>; + interrupts = <78 IRQ_TYPE_EDGE_RISING>; + smi130_gyro,gpio_irq = <&tlmm 78 IRQ_TYPE_EDGE_RISING>; + }; + + smi130_acc@18 { + compatible = "smi130_acc"; + reg = <0x18>; + pinctrl-names = "default"; + pinctrl-0 = <&sensor_int2_default>; + interrupt-parent = <&tlmm>; + interrupts = <79 IRQ_TYPE_EDGE_RISING>; + }; + iam20680@69 { compatible = "inven,iam20680"; reg = <0x69>; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-usb-ep-adp.dts b/arch/arm/boot/dts/qcom/sdxpoorwills-usb-ep-adp.dts new file mode 100644 index 000000000000..1158fd7bf564 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-usb-ep-adp.dts @@ -0,0 +1,26 @@ +/* Copyright (c) 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/; + +#include "sdxpoorwills-adp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDXPOORWILLS USB-EP ADP"; + compatible = "qcom,sdxpoorwills-adp", + "qcom,sdxpoorwills", "qcom,adp"; + qcom,board-id = <25 1>, <25 0x101>; +}; + +&blsp1_uart2b_hs { + status = "okay"; +}; diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-usb.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-usb.dtsi index 1d055d8ef359..cef7b2933cf0 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-usb.dtsi +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-usb.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 @@ -184,8 +184,8 @@ 0x034 0x07 0x00 /* QSERDES_COM_SSC_STEP_SIZE2_MODE1 */ 0x024 0xde 0x00 /* QSERDES_COM_SSC_STEP_SIZE1_MODE0 */ 0x028 0x07 0x00 /* QSERDES_COM_SSC_STEP_SIZE2_MODE0 */ - 0x594 0x31 0x00 /* QSERDES_RX_RX_MODE_01_HIGH4 */ - 0x590 0x39 0x00 /* QSERDES_RX_RX_MODE_01_HIGH3 */ + 0x594 0x33 0x00 /* QSERDES_RX_RX_MODE_01_HIGH4 */ + 0x590 0xb9 0x00 /* QSERDES_RX_RX_MODE_01_HIGH3 */ 0x58c 0xdb 0x00 /* QSERDES_RX_RX_MODE_01_HIGH2 */ 0x588 0x54 0x00 /* QSERDES_RX_RX_MODE_01_HIGH */ 0x584 0xd4 0x00 /* QSERDES_RX_RX_MODE_01_LOW */ @@ -195,6 +195,7 @@ 0x440 0x0f 0x00 /* QSERDES_RX_UCDR_FASTLOCK_COUNT_HIGH */ 0x434 0x7f 0x00 /* QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE */ 0x4d8 0x03 0x00 /* QSERDES_RX_VGA_CAL_CNTRL2 */ + 0x4dc 0x1f 0x00 /* QSERDES_RX_GM_CAL */ 0x4ec 0x0f 0x00 /* QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2 */ 0x4f0 0x4a 0x00 /* QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3 */ 0x4f4 0x08 0x00 /* QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4 */ diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-v2-ttp.dts b/arch/arm/boot/dts/qcom/sdxpoorwills-v2-ttp.dts index 2e473a3d3e3a..a686c4b69528 100644 --- a/arch/arm/boot/dts/qcom/sdxpoorwills-v2-ttp.dts +++ b/arch/arm/boot/dts/qcom/sdxpoorwills-v2-ttp.dts @@ -25,3 +25,7 @@ &blsp1_uart2b_hs { status = "okay"; }; + +&mss_mem { + reg = <0x86400000 0x9300000>; +}; diff --git a/arch/arm/configs/msm8909-perf_defconfig b/arch/arm/configs/msm8909-perf_defconfig old mode 100644 new mode 100755 index e2e989dc17f5..afa00c051d7b --- a/arch/arm/configs/msm8909-perf_defconfig +++ b/arch/arm/configs/msm8909-perf_defconfig @@ -140,9 +140,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y diff --git a/arch/arm/configs/msm8909_defconfig b/arch/arm/configs/msm8909_defconfig old mode 100644 new mode 100755 index 7fba40834ca0..b903f859fd8d --- a/arch/arm/configs/msm8909_defconfig +++ b/arch/arm/configs/msm8909_defconfig @@ -140,9 +140,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y diff --git a/arch/arm/configs/msm8909w-perf_defconfig b/arch/arm/configs/msm8909w-perf_defconfig old mode 100644 new mode 100755 index 5dad1dce3836..4592a087e0d1 --- a/arch/arm/configs/msm8909w-perf_defconfig +++ b/arch/arm/configs/msm8909w-perf_defconfig @@ -138,9 +138,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y diff --git a/arch/arm/configs/msm8909w_defconfig b/arch/arm/configs/msm8909w_defconfig old mode 100644 new mode 100755 index 0d2c453f61be..31c4fd964acc --- a/arch/arm/configs/msm8909w_defconfig +++ b/arch/arm/configs/msm8909w_defconfig @@ -142,9 +142,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig old mode 100644 new mode 100755 index 68ea060eaf92..33b9e7e0fef9 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -170,9 +170,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -360,7 +360,6 @@ CONFIG_GPIO_QPNP_PIN=y CONFIG_POWER_RESET=y CONFIG_POWER_RESET_QCOM=y CONFIG_QCOM_DLOAD_MODE=y -CONFIG_POWER_SUPPLY=y CONFIG_QPNP_FG=y CONFIG_SMB135X_CHARGER=y CONFIG_SMB1360_CHARGER_FG=y @@ -458,6 +457,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -621,6 +621,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig old mode 100644 new mode 100755 index b65fbac85719..33cc8b18909f --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -173,9 +173,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -366,7 +366,6 @@ CONFIG_GPIO_QPNP_PIN=y CONFIG_POWER_RESET=y CONFIG_POWER_RESET_QCOM=y CONFIG_QCOM_DLOAD_MODE=y -CONFIG_POWER_SUPPLY=y CONFIG_QPNP_FG=y CONFIG_SMB135X_CHARGER=y CONFIG_SMB1360_CHARGER_FG=y @@ -467,6 +466,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -638,6 +638,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y diff --git a/arch/arm/configs/msm8937go-perf_defconfig b/arch/arm/configs/msm8937go-perf_defconfig old mode 100644 new mode 100755 index 6be2749963db..3850830376be --- a/arch/arm/configs/msm8937go-perf_defconfig +++ b/arch/arm/configs/msm8937go-perf_defconfig @@ -170,9 +170,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set diff --git a/arch/arm/configs/msm8937go_defconfig b/arch/arm/configs/msm8937go_defconfig old mode 100644 new mode 100755 index b76c4183a762..a056f449db1e --- a/arch/arm/configs/msm8937go_defconfig +++ b/arch/arm/configs/msm8937go_defconfig @@ -173,9 +173,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set diff --git a/arch/arm/configs/msm8953-perf_defconfig b/arch/arm/configs/msm8953-perf_defconfig old mode 100644 new mode 100755 index eb973a047143..0f92c1713f65 --- a/arch/arm/configs/msm8953-perf_defconfig +++ b/arch/arm/configs/msm8953-perf_defconfig @@ -165,9 +165,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -357,7 +357,6 @@ CONFIG_GPIO_QPNP_PIN=y CONFIG_POWER_RESET=y CONFIG_POWER_RESET_QCOM=y CONFIG_QCOM_DLOAD_MODE=y -CONFIG_POWER_SUPPLY=y CONFIG_QPNP_FG=y CONFIG_SMB135X_CHARGER=y CONFIG_SMB1355_SLAVE_CHARGER=y @@ -457,6 +456,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -626,6 +626,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y diff --git a/arch/arm/configs/msm8953_defconfig b/arch/arm/configs/msm8953_defconfig old mode 100644 new mode 100755 index 72c12458721c..b556b5aec17b --- a/arch/arm/configs/msm8953_defconfig +++ b/arch/arm/configs/msm8953_defconfig @@ -169,9 +169,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -364,7 +364,6 @@ CONFIG_GPIO_QPNP_PIN=y CONFIG_POWER_RESET=y CONFIG_POWER_RESET_QCOM=y CONFIG_QCOM_DLOAD_MODE=y -CONFIG_POWER_SUPPLY=y CONFIG_QPNP_FG=y CONFIG_SMB135X_CHARGER=y CONFIG_SMB1355_SLAVE_CHARGER=y @@ -465,6 +464,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -641,6 +641,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y diff --git a/arch/arm/configs/ranchu_defconfig b/arch/arm/configs/ranchu_defconfig index 49e7bbd5825a..c40bd3c0b054 100644 --- a/arch/arm/configs/ranchu_defconfig +++ b/arch/arm/configs/ranchu_defconfig @@ -103,6 +103,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QTAGUID=y diff --git a/arch/arm/configs/sdm670-perf_defconfig b/arch/arm/configs/sdm670-perf_defconfig old mode 100644 new mode 100755 index 71bc3903151f..d597ff072851 --- a/arch/arm/configs/sdm670-perf_defconfig +++ b/arch/arm/configs/sdm670-perf_defconfig @@ -158,9 +158,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_SOCKET=y diff --git a/arch/arm/configs/sdm670_defconfig b/arch/arm/configs/sdm670_defconfig old mode 100644 new mode 100755 index a2bbb682cd23..83aaf9b64952 --- a/arch/arm/configs/sdm670_defconfig +++ b/arch/arm/configs/sdm670_defconfig @@ -161,9 +161,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y diff --git a/arch/arm/configs/sdxpoorwills-auto-perf_defconfig b/arch/arm/configs/sdxpoorwills-auto-perf_defconfig index 5eb249548251..f8a24a2a2ec0 100644 --- a/arch/arm/configs/sdxpoorwills-auto-perf_defconfig +++ b/arch/arm/configs/sdxpoorwills-auto-perf_defconfig @@ -247,6 +247,7 @@ CONFIG_SENSORS_SMI_ACC2X2=y CONFIG_SENSORS_SMI_ACC2X2_ENABLE_INT2=y CONFIG_SENSORS_SMI_GYRO=y CONFIG_SENSORS_SMI_GYRO_FIFO=y +CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING=y CONFIG_SERIO_LIBPS2=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_MSM=y diff --git a/arch/arm/configs/sdxpoorwills-auto_defconfig b/arch/arm/configs/sdxpoorwills-auto_defconfig index 32556b035673..b2c0ca77139a 100644 --- a/arch/arm/configs/sdxpoorwills-auto_defconfig +++ b/arch/arm/configs/sdxpoorwills-auto_defconfig @@ -241,6 +241,7 @@ CONFIG_SENSORS_SMI_ACC2X2=y CONFIG_SENSORS_SMI_ACC2X2_ENABLE_INT2=y CONFIG_SENSORS_SMI_GYRO=y CONFIG_SENSORS_SMI_GYRO_FIFO=y +CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING=y CONFIG_SERIO_LIBPS2=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_MSM=y diff --git a/arch/arm/configs/spyro-perf_defconfig b/arch/arm/configs/spyro-perf_defconfig index b8849dba8920..5a2e6c75db95 100644 --- a/arch/arm/configs/spyro-perf_defconfig +++ b/arch/arm/configs/spyro-perf_defconfig @@ -13,9 +13,7 @@ CONFIG_RCU_EXPERT=y CONFIG_RCU_FAST_NO_HZ=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y -CONFIG_LOG_BUF_SHIFT=15 CONFIG_LOG_CPU_MAX_BUF_SHIFT=13 -CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_SCHEDTUNE=y @@ -165,7 +163,6 @@ CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_SOCKET=y @@ -245,6 +242,9 @@ CONFIG_BLK_DEV_RAM_SIZE=8192 CONFIG_HDCP_QSEECOM=y CONFIG_QSEECOM=y CONFIG_UID_SYS_STATS=y +CONFIG_QPNP_MISC=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y @@ -327,7 +327,6 @@ CONFIG_SPI_QUP=y CONFIG_SPI_SPIDEV=y CONFIG_SLIMBUS_MSM_NGD=y CONFIG_SPMI=y -CONFIG_SPMI_MSM_PMIC_ARB_DEBUG=y CONFIG_PINCTRL_MSM8937=y CONFIG_PINCTRL_MSM8917=y CONFIG_PINCTRL_QCOM_SPMI_PMIC=y @@ -338,14 +337,8 @@ CONFIG_POWER_RESET_QCOM=y CONFIG_QCOM_DLOAD_MODE=y CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_SUPPLY=y -CONFIG_QPNP_FG=y -CONFIG_SMB135X_CHARGER=y -CONFIG_SMB1355_SLAVE_CHARGER=y -CONFIG_SMB1351_USB_CHARGER=y -CONFIG_QPNP_SMB5=y -CONFIG_QPNP_SMBCHARGER=y -CONFIG_QPNP_TYPEC=y -CONFIG_QPNP_QG=y +CONFIG_QPNP_FG_GEN3=y +CONFIG_QPNP_SMB2=y CONFIG_MSM_APM=y CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y CONFIG_THERMAL=y @@ -362,7 +355,6 @@ CONFIG_QTI_QMI_COOLING_DEVICE=y CONFIG_REGULATOR_COOLING_DEVICE=y CONFIG_QTI_BCL_PMIC5=y CONFIG_QTI_BCL_SOC_DRIVER=y -CONFIG_MFD_I2C_PMIC=y CONFIG_MFD_SPMI_PMIC=y CONFIG_REGULATOR=y CONFIG_REGULATOR_FIXED_VOLTAGE=y @@ -372,8 +364,6 @@ CONFIG_REGULATOR_CPR4_APSS=y CONFIG_REGULATOR_CPRH_KBSS=y CONFIG_REGULATOR_MEM_ACC=y CONFIG_REGULATOR_MSM_GFX_LDO=y -CONFIG_REGULATOR_QPNP_LABIBB=y -CONFIG_REGULATOR_QPNP_LCDB=y CONFIG_REGULATOR_QPNP=y CONFIG_REGULATOR_RPM_SMD=y CONFIG_REGULATOR_SPM=y @@ -444,6 +434,7 @@ CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_MSM=y CONFIG_USB_EHCI_HCD_PLATFORM=y CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y CONFIG_USB_SERIAL=y CONFIG_USB_EHSET_TEST_FIXTURE=y CONFIG_NOP_USB_XCEIV=y @@ -484,13 +475,7 @@ CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_MSM=y CONFIG_MMC_SDHCI_MSM_ICE=y CONFIG_MMC_CQ_HCI=y -CONFIG_LEDS_QTI_TRI_LED=y -CONFIG_LEDS_QPNP=y -CONFIG_LEDS_QPNP_FLASH=y -CONFIG_LEDS_QPNP_FLASH_V2=y -CONFIG_LEDS_QPNP_WLED=y CONFIG_LEDS_QPNP_HAPTICS=y -CONFIG_LEDS_QPNP_VIBRATOR_LDO=y CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_EDAC=y @@ -564,10 +549,7 @@ CONFIG_SPDM_SCM=y CONFIG_DEVFREQ_SPDM=y CONFIG_IIO=y CONFIG_PWM=y -CONFIG_PWM_QPNP=y -CONFIG_PWM_QTI_LPG=y CONFIG_QTI_MPM=y -CONFIG_PHY_QCOM_UFS=y CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_BINDER_IPC_32BIT=y diff --git a/arch/arm/configs/spyro_defconfig b/arch/arm/configs/spyro_defconfig index 6fb2cf40ca7f..2f84f603c7f9 100644 --- a/arch/arm/configs/spyro_defconfig +++ b/arch/arm/configs/spyro_defconfig @@ -1,4 +1,3 @@ -CONFIG_LOCALVERSION="-perf" # CONFIG_LOCALVERSION_AUTO is not set # CONFIG_FHANDLE is not set CONFIG_AUDIT=y @@ -7,14 +6,16 @@ CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_SCHED_WALT=y CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y CONFIG_RCU_EXPERT=y CONFIG_RCU_FAST_NO_HZ=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y CONFIG_LOG_CPU_MAX_BUF_SHIFT=17 -CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_SCHEDTUNE=y @@ -37,9 +38,10 @@ CONFIG_KALLSYMS_ALL=y CONFIG_BPF_SYSCALL=y # CONFIG_MEMBARRIER is not set CONFIG_EMBEDDED=y -# CONFIG_SLUB_DEBUG is not set # CONFIG_COMPAT_BRK is not set CONFIG_PROFILING=y +CONFIG_OPROFILE=m +CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_STRONG=y CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y @@ -88,6 +90,7 @@ CONFIG_PM_AUTOSLEEP=y CONFIG_PM_WAKELOCKS=y CONFIG_PM_WAKELOCKS_LIMIT=0 # CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_DEBUG=y CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y @@ -147,6 +150,7 @@ CONFIG_NETFILTER_XT_TARGET_TPROXY=y CONFIG_NETFILTER_XT_TARGET_TRACE=y CONFIG_NETFILTER_XT_TARGET_SECMARK=y CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_BPF=y CONFIG_NETFILTER_XT_MATCH_COMMENT=y CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y CONFIG_NETFILTER_XT_MATCH_CONNMARK=y @@ -162,9 +166,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_SOCKET=y @@ -220,6 +224,7 @@ CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_EMATCH_TEXT=y CONFIG_NET_CLS_ACT=y +CONFIG_DNS_RESOLVER=y CONFIG_RMNET_DATA=y CONFIG_RMNET_DATA_FC=y CONFIG_RMNET_DATA_DEBUG_PKT=y @@ -244,6 +249,9 @@ CONFIG_BLK_DEV_RAM_SIZE=8192 CONFIG_HDCP_QSEECOM=y CONFIG_QSEECOM=y CONFIG_UID_SYS_STATS=y +CONFIG_QPNP_MISC=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y @@ -328,7 +336,6 @@ CONFIG_SPI_QUP=y CONFIG_SPI_SPIDEV=y CONFIG_SLIMBUS_MSM_NGD=y CONFIG_SPMI=y -CONFIG_SPMI_MSM_PMIC_ARB_DEBUG=y CONFIG_PINCTRL_MSM8937=y CONFIG_PINCTRL_MSM8917=y CONFIG_PINCTRL_QCOM_SPMI_PMIC=y @@ -339,14 +346,8 @@ CONFIG_POWER_RESET_QCOM=y CONFIG_QCOM_DLOAD_MODE=y CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_SUPPLY=y -CONFIG_QPNP_FG=y -CONFIG_SMB135X_CHARGER=y -CONFIG_SMB1355_SLAVE_CHARGER=y -CONFIG_SMB1351_USB_CHARGER=y -CONFIG_QPNP_SMB5=y -CONFIG_QPNP_SMBCHARGER=y -CONFIG_QPNP_TYPEC=y -CONFIG_QPNP_QG=y +CONFIG_QPNP_FG_GEN3=y +CONFIG_QPNP_SMB2=y CONFIG_MSM_APM=y CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y CONFIG_THERMAL=y @@ -363,7 +364,6 @@ CONFIG_QTI_QMI_COOLING_DEVICE=y CONFIG_REGULATOR_COOLING_DEVICE=y CONFIG_QTI_BCL_PMIC5=y CONFIG_QTI_BCL_SOC_DRIVER=y -CONFIG_MFD_I2C_PMIC=y CONFIG_MFD_SPMI_PMIC=y CONFIG_REGULATOR=y CONFIG_REGULATOR_FIXED_VOLTAGE=y @@ -373,8 +373,6 @@ CONFIG_REGULATOR_CPR4_APSS=y CONFIG_REGULATOR_CPRH_KBSS=y CONFIG_REGULATOR_MEM_ACC=y CONFIG_REGULATOR_MSM_GFX_LDO=y -CONFIG_REGULATOR_QPNP_LABIBB=y -CONFIG_REGULATOR_QPNP_LCDB=y CONFIG_REGULATOR_QPNP=y CONFIG_REGULATOR_RPM_SMD=y CONFIG_REGULATOR_SPM=y @@ -445,6 +443,7 @@ CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_MSM=y CONFIG_USB_EHCI_HCD_PLATFORM=y CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y CONFIG_USB_SERIAL=y CONFIG_USB_EHSET_TEST_FIXTURE=y CONFIG_NOP_USB_XCEIV=y @@ -457,6 +456,7 @@ CONFIG_USB_CI13XXX_MSM=y CONFIG_USB_CONFIGFS=y CONFIG_USB_CONFIGFS_SERIAL=y CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_QCRNDIS=y CONFIG_USB_CONFIGFS_RNDIS=y CONFIG_USB_CONFIGFS_RMNET_BAM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y @@ -476,6 +476,7 @@ CONFIG_MMC=y CONFIG_MMC_PERF_PROFILING=y # CONFIG_PWRSEQ_EMMC is not set # CONFIG_PWRSEQ_SIMPLE is not set +CONFIG_MMC_RING_BUFFER=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_BLOCK_MINORS=32 @@ -485,13 +486,7 @@ CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_MSM=y CONFIG_MMC_SDHCI_MSM_ICE=y CONFIG_MMC_CQ_HCI=y -CONFIG_LEDS_QTI_TRI_LED=y -CONFIG_LEDS_QPNP=y -CONFIG_LEDS_QPNP_FLASH=y -CONFIG_LEDS_QPNP_FLASH_V2=y -CONFIG_LEDS_QPNP_WLED=y CONFIG_LEDS_QPNP_HAPTICS=y -CONFIG_LEDS_QPNP_VIBRATOR_LDO=y CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_EDAC=y @@ -521,12 +516,18 @@ CONFIG_REMOTE_SPINLOCK_MSM=y CONFIG_MAILBOX=y CONFIG_ARM_SMMU=y CONFIG_QCOM_LAZY_MAPPING=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_DEBUG_TRACKING=y +CONFIG_IOMMU_TESTS=y +CONFIG_QCOM_CPUSS_DUMP=y CONFIG_QCOM_RUN_QUEUE_STATS=y CONFIG_MSM_SPM=y CONFIG_MSM_L2_SPM=y CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CORE_HANG_DETECT=y CONFIG_QCOM_WATCHDOG_V2=y CONFIG_QCOM_MEMORY_DUMP_V2=y +CONFIG_MSM_DEBUG_LAR_UNLOCK=y CONFIG_MSM_RPM_SMD=y CONFIG_QCOM_BUS_SCALING=y CONFIG_QCOM_SECURE_BUFFER=y @@ -535,6 +536,7 @@ CONFIG_MSM_SMEM=y CONFIG_MSM_SMD=y CONFIG_MSM_SMD_DEBUG=y CONFIG_MSM_TZ_SMMU=y +CONFIG_TRACER_PKT=y CONFIG_MSM_SMP2P=y CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y CONFIG_MSM_QMI_INTERFACE=y @@ -552,6 +554,7 @@ CONFIG_QCOM_DCC=y CONFIG_QTI_RPM_STATS_LOG=y CONFIG_QCOM_FORCE_WDOG_BITE_ON_PANIC=y CONFIG_MEM_SHARE_QMI_SERVICE=y +# CONFIG_MSM_JTAGV8 is not set CONFIG_MSM_BAM_DMUX=y CONFIG_WCNSS_CORE=y CONFIG_WCNSS_CORE_PRONTO=y @@ -565,10 +568,8 @@ CONFIG_SPDM_SCM=y CONFIG_DEVFREQ_SPDM=y CONFIG_IIO=y CONFIG_PWM=y -CONFIG_PWM_QPNP=y -CONFIG_PWM_QTI_LPG=y +CONFIG_QCOM_SHOW_RESUME_IRQ=y CONFIG_QTI_MPM=y -CONFIG_PHY_QCOM_UFS=y CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_BINDER_IPC_32BIT=y @@ -594,17 +595,72 @@ CONFIG_SDCARD_FS=y CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ISO8859_1=y CONFIG_PRINTK_TIME=y +CONFIG_DYNAMIC_DEBUG=y CONFIG_DEBUG_INFO=y CONFIG_FRAME_WARN=2048 +CONFIG_PAGE_OWNER=y +CONFIG_PAGE_OWNER_ENABLE_DEFAULT=y CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_PAGEALLOC=y +CONFIG_SLUB_DEBUG_PANIC_ON=y +CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT=y +CONFIG_PAGE_POISONING=y +CONFIG_PAGE_POISONING_ENABLE_DEFAULT=y +CONFIG_DEBUG_OBJECTS=y +CONFIG_DEBUG_OBJECTS_FREE=y +CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_OBJECTS_WORK=y +CONFIG_DEBUG_OBJECTS_RCU_HEAD=y +CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y +CONFIG_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4000 +CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y +CONFIG_DEBUG_STACK_USAGE=y +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_LOCKUP_DETECTOR=y +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y +CONFIG_WQ_WATCHDOG=y CONFIG_PANIC_TIMEOUT=5 -# CONFIG_SCHED_DEBUG is not set +CONFIG_PANIC_ON_SCHED_BUG=y +CONFIG_PANIC_ON_RT_THROTTLING=y CONFIG_SCHEDSTATS=y +CONFIG_SCHED_STACK_END_CHECK=y # CONFIG_DEBUG_PREEMPT is not set -# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_ATOMIC_SLEEP=y +CONFIG_DEBUG_LIST=y +CONFIG_FAULT_INJECTION=y +CONFIG_FAIL_PAGE_ALLOC=y +CONFIG_FAULT_INJECTION_DEBUG_FS=y +CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y CONFIG_IPC_LOGGING=y -# CONFIG_FTRACE is not set -# CONFIG_ARM_UNWIND is not set +CONFIG_QCOM_RTB=y +CONFIG_QCOM_RTB_SEPARATE_CPUS=y +CONFIG_FUNCTION_TRACER=y +CONFIG_IRQSOFF_TRACER=y +CONFIG_PREEMPT_TRACER=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_LKDTM=y +CONFIG_MEMTEST=y +CONFIG_PANIC_ON_DATA_CORRUPTION=y +CONFIG_DEBUG_USER=y +CONFIG_FORCE_PAGES=y +CONFIG_PID_IN_CONTEXTIDR=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_CORESIGHT=y +CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y +CONFIG_CORESIGHT_SOURCE_ETM4X=y +CONFIG_CORESIGHT_REMOTE_ETM=y +CONFIG_CORESIGHT_REMOTE_ETM_DEFAULT_ENABLE=0 +CONFIG_CORESIGHT_QCOM_REPLICATOR=y +CONFIG_CORESIGHT_DBGUI=y +CONFIG_CORESIGHT_STM=y +CONFIG_CORESIGHT_TPDA=y +CONFIG_CORESIGHT_TPDM=y +CONFIG_CORESIGHT_CTI=y +CONFIG_CORESIGHT_EVENT=y +CONFIG_CORESIGHT_HWEVENT=y CONFIG_PFK=y CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y CONFIG_SECURITY=y diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c old mode 100644 new mode 100755 diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c old mode 100644 new mode 100755 diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index ebee899a63a8..efbc7d50b0e8 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -192,7 +192,11 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max_low, #ifdef CONFIG_HAVE_ARCH_PFN_VALID int pfn_valid(unsigned long pfn) { - return memblock_is_map_memory(__pfn_to_phys(pfn)); + phys_addr_t addr = __pfn_to_phys(pfn); + + if (__phys_to_pfn(addr) != pfn) + return 0; + return memblock_is_map_memory(addr); } EXPORT_SYMBOL(pfn_valid); #endif diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile index ffa171d40c27..b8be8ee65783 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile @@ -163,7 +163,8 @@ dtb-$(CONFIG_ARCH_SDM845) += sdm845-sim.dtb \ sdm845-4k-panel-cdp.dtb \ sdm845-4k-panel-qrd.dtb \ sdm845-interposer-sdm670-mtp.dtb \ - sdm845-interposer-sdm670-cdp.dtb + sdm845-interposer-sdm670-cdp.dtb \ + sdm845-v2.1-rb3.dtb endif ifeq ($(CONFIG_BUILD_ARM64_DT_OVERLAY),y) @@ -444,7 +445,8 @@ dtbo-$(CONFIG_ARCH_SDM439) += sdm439-mtp-overlay.dtbo \ dtbo-$(CONFIG_ARCH_SDM429) += sdm429-mtp-overlay.dtbo \ sdm429-cdp-overlay.dtbo \ - sdm429-qrd-overlay.dtbo + sdm429-qrd-overlay.dtbo \ + sdm429-qrd-spyro-evt-overlay.dtbo msm8940-mtp-overlay.dtbo-base := msm8940-pmi8950.dtb \ msm8940-pmi8937.dtb \ @@ -563,6 +565,8 @@ sdm429-cdp-overlay.dtbo-base := sdm429.dtb \ msm8937-interposer-sdm429.dtb sdm429-qrd-overlay.dtbo-base := sdm429.dtb \ msm8937-interposer-sdm429.dtb +sdm429-qrd-spyro-evt-overlay.dtbo-base := sdm429.dtb \ + msm8937-interposer-sdm429.dtb else dtb-$(CONFIG_ARCH_MSM8953) += msm8953-cdp.dtb \ msm8953-mtp.dtb \ @@ -693,7 +697,8 @@ dtb-$(CONFIG_ARCH_SDM429) += sdm429-mtp.dtb \ sdm429-cdp.dtb \ sdm429-qrd.dtb \ sda429-mtp.dtb \ - sda429-cdp.dtb + sda429-cdp.dtb \ + sdm429-qrd-spyro-evt.dtb endif diff --git a/arch/arm64/boot/dts/qcom/apq8017-mtp-overlay.dts b/arch/arm64/boot/dts/qcom/apq8017-mtp-overlay.dts index 0b958ee7cdfa..e7c0e86e33cc 100644 --- a/arch/arm64/boot/dts/qcom/apq8017-mtp-overlay.dts +++ b/arch/arm64/boot/dts/qcom/apq8017-mtp-overlay.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,6 +44,8 @@ &i2c_2 { /* DSI_TO_HDMI I2C configuration */ + #address-cells = <1>; + #size-cells = <0>; adv7533@39 { compatible = "adv7533"; reg = <0x39>; diff --git a/arch/arm64/boot/dts/qcom/apq8053-lat-concam-dev.dts b/arch/arm64/boot/dts/qcom/apq8053-lat-concam-dev.dts index 7947008400bc..a9e8d323de79 100644 --- a/arch/arm64/boot/dts/qcom/apq8053-lat-concam-dev.dts +++ b/arch/arm64/boot/dts/qcom/apq8053-lat-concam-dev.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -24,6 +24,9 @@ }; &pm8953_mpps { + #address-cells = <1>; + #size-cells = <1>; + mpp@a100 { reg = <0xa100 0x100>; qcom,pin-num = <2>; diff --git a/arch/arm64/boot/dts/qcom/apq8053-lat-concam-proto.dts b/arch/arm64/boot/dts/qcom/apq8053-lat-concam-proto.dts index f3124bc9d0f7..cc8ac51a7fd9 100644 --- a/arch/arm64/boot/dts/qcom/apq8053-lat-concam-proto.dts +++ b/arch/arm64/boot/dts/qcom/apq8053-lat-concam-proto.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -26,6 +26,8 @@ &pm8953_mpps { + #address-cells = <1>; + #size-cells = <1>; mpp@a100 { reg = <0xa100 0x100>; qcom,pin-num = <2>; diff --git a/arch/arm64/boot/dts/qcom/dsi-panel-390p-auo-cmd.dtsi b/arch/arm64/boot/dts/qcom/dsi-panel-390p-auo-cmd.dtsi index e69d7d4f145e..00445869d1cd 100644 --- a/arch/arm64/boot/dts/qcom/dsi-panel-390p-auo-cmd.dtsi +++ b/arch/arm64/boot/dts/qcom/dsi-panel-390p-auo-cmd.dtsi @@ -85,6 +85,7 @@ qcom,mdss-dsi-te-dcs-command = <1>; qcom,mdss-dsi-te-using-te-pin; qcom,mdss-dsi-te-check-enable; + qcom,ulps-enabled; qcom,mdss-dsi-panel-timings = [5f 12 0a 00 32 34 10 16 0f 03 04 00]; qcom,mdss-dsi-t-clk-post = <0x05>; diff --git a/arch/arm64/boot/dts/qcom/fg-gen3-batterydata-I13Z5P-680mAh.dtsi b/arch/arm64/boot/dts/qcom/fg-gen3-batterydata-I13Z5P-680mAh.dtsi new file mode 100644 index 000000000000..2eb9bc0cac1e --- /dev/null +++ b/arch/arm64/boot/dts/qcom/fg-gen3-batterydata-I13Z5P-680mAh.dtsi @@ -0,0 +1,84 @@ +/* + * Copyright (c) 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. + */ + +qcom,3388014_i13z5p_680mah_averaged_masterslave_mar26th2018 { + qcom, = <24>; + /* #3388014_I13Z5P_680mAh_averaged_MasterSlave_Mar26th2018*/ + qcom,max-voltage-uv = <4400000>; + qcom,fg-cc-cv-threshold-mv = <4390>; + qcom,nom-batt-capacity-mah = <680>; + qcom,batt-id-kohm = <200>; + qcom,battery-beta = <3435>; + qcom,battery-type = + "3388014_i13z5p_680mah_averaged_masterslave_mar26th2018"; + qcom,checksum = <0x8C0B>; + qcom,gui-version = "PM660GUI - 0.0.0.45"; + qcom,fg-profile-data = [ + 5E 24 56 0C + E9 12 B0 0D + 05 1D 59 01 + F8 05 8C 02 + 24 1B CF 13 + D6 35 86 3B + A2 00 00 00 + 1A 00 00 00 + 00 00 1F CD + 57 AD 6C CA + 47 00 08 00 + FD DA E6 ED + 09 EC 03 E2 + 58 07 89 01 + 21 14 BA 5A + 0A 06 09 20 + 27 00 14 00 + 55 20 C3 04 + 3A 0B 7C 05 + 01 1D 39 02 + 41 0D 1A 0B + 89 18 A6 2B + 2E 54 B7 72 + 75 00 00 00 + 07 00 00 00 + 00 00 9C CC + DE C3 51 A4 + 48 00 00 00 + 77 EB E6 ED + 6F EC D3 D2 + FF 07 DF F3 + 91 E3 56 1A + 99 33 CC FF + 07 10 00 00 + BB 02 66 46 + 48 00 40 00 + D8 02 0A FA + FF 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + 00 00 00 00 + ]; +}; diff --git a/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-cdp.dtsi b/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-cdp.dtsi index 23545f9d194d..a0edcf651123 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -12,6 +12,9 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-mtp.dtsi index 23c0987e34f2..102554282e4e 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -12,6 +12,8 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi index dbaccfafb4c2..544f564dcbf6 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, 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 @@ -12,6 +12,9 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8917-cdp-mirror-lake-touch.dtsi b/arch/arm64/boot/dts/qcom/msm8917-cdp-mirror-lake-touch.dtsi index f1138c006e13..fdb6bdc6f297 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-cdp-mirror-lake-touch.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-cdp-mirror-lake-touch.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 @@ -112,6 +112,9 @@ pinctrl-0 = <&uart_console_active>; }; &i2c_3 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; synaptics@22 { compatible = "synaptics,dsx-i2c"; diff --git a/arch/arm64/boot/dts/qcom/msm8917-cdp-ml-touch-overlay.dts b/arch/arm64/boot/dts/qcom/msm8917-cdp-ml-touch-overlay.dts index 73ea29b2e200..e0a04c9eb350 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-cdp-ml-touch-overlay.dts +++ b/arch/arm64/boot/dts/qcom/msm8917-cdp-ml-touch-overlay.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -57,6 +57,9 @@ }; &i2c_5 { /* BLSP2 QUP1 */ + #address-cells = <1>; + #size-cells = <0>; + nq@28 { compatible = "qcom,nq-nci"; reg = <0x28>; diff --git a/arch/arm64/boot/dts/qcom/msm8917-cdp.dtsi b/arch/arm64/boot/dts/qcom/msm8917-cdp.dtsi index 761e2d235b57..a66494c6d6e8 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -173,6 +173,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/msm8917-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8917-mtp.dtsi index 2330c76e6c7c..ef669f4d32d9 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -32,6 +32,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/msm8917-qrd-overlay.dts b/arch/arm64/boot/dts/qcom/msm8917-qrd-overlay.dts index c0dc21787dd4..a07ee17c1848 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-qrd-overlay.dts +++ b/arch/arm64/boot/dts/qcom/msm8917-qrd-overlay.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -60,6 +60,9 @@ &soc { i2c@78b7000 { + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; focaltech@38 { compatible = "focaltech,5x06"; diff --git a/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi index 7c0d323f9d54..529ccc1152f8 100644 --- a/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8917-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 @@ -32,6 +32,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi index d134dd14b182..909dc4779cf3 100644 --- a/arch/arm64/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, 2018, The Linux Foundation. All rights reserved. + * 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 @@ -12,6 +12,9 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi b/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi index c4100ab27c9d..173901dda1a4 100644 --- a/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8937-cdp.dtsi @@ -178,10 +178,13 @@ }; &spi_3 { /* BLSP1 QUP3 */ + #address-cells = <1>; + #size-cells = <0>; + maxim_sti@0 { status = "disabled"; compatible = "maxim,maxim_sti"; - reg = <0>; + reg = <0x0>; interrupt-parent = <&tlmm>; interrupts = <65 0>; spi-max-frequency = <16000000>; @@ -201,6 +204,9 @@ }; &i2c_5 { /* BLSP2 QUP1 */ + #address-cells = <1>; + #size-cells = <0>; + nq@28 { compatible = "qcom,nq-nci"; reg = <0x28>; diff --git a/arch/arm64/boot/dts/qcom/msm8940-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8940-mtp.dtsi index 60f3d798904d..4081dcf2d550 100644 --- a/arch/arm64/boot/dts/qcom/msm8940-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8940-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 @@ -170,6 +170,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi index c2efa2df9244..f3e13c0a1949 100644 --- a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -12,6 +12,9 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi index 61b23099f05c..b9c901c4f855 100644 --- a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi @@ -12,6 +12,9 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi index adaaec68082d..be954d7ff530 100644 --- a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -12,6 +12,9 @@ */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/msm8953-cdp.dtsi b/arch/arm64/boot/dts/qcom/msm8953-cdp.dtsi index b21983c3e73c..a14cbb860ec7 100644 --- a/arch/arm64/boot/dts/qcom/msm8953-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8953-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -34,6 +34,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/msm8953-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8953-mtp.dtsi index 5655e94709d4..69cf52ebc606 100644 --- a/arch/arm64/boot/dts/qcom/msm8953-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8953-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -33,6 +33,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi b/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi index 50dea911f9a6..2115dcbf653f 100644 --- a/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8953-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -61,6 +61,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/pm660-rpm-regulator.dtsi b/arch/arm64/boot/dts/qcom/pm660-rpm-regulator.dtsi index ff9125069862..6d384fc794c8 100644 --- a/arch/arm64/boot/dts/qcom/pm660-rpm-regulator.dtsi +++ b/arch/arm64/boot/dts/qcom/pm660-rpm-regulator.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -11,6 +11,22 @@ */ &rpm_bus { + rpm-regulator-smpa1 { + compatible = "qcom,rpm-smd-regulator-resource"; + qcom,resource-name = "smpa"; + qcom,resource-id = <1>; + qcom,regulator-type = <1>; + qcom,hpm-min-load = <100000>; + status = "disabled"; + + regulator-s2 { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s2"; + qcom,set = <3>; + status = "disabled"; + }; + }; + rpm-regulator-smpa2 { compatible = "qcom,rpm-smd-regulator-resource"; qcom,resource-name = "smpa"; diff --git a/arch/arm64/boot/dts/qcom/qcs605-360camera.dtsi b/arch/arm64/boot/dts/qcom/qcs605-360camera.dtsi index 3da9825fd0fe..6a859dadf52b 100644 --- a/arch/arm64/boot/dts/qcom/qcs605-360camera.dtsi +++ b/arch/arm64/boot/dts/qcom/qcs605-360camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 @@ -419,3 +419,51 @@ qcom,thermal-node; }; }; + +&msm_fastrpc_compute_cb1 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb2 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb3 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb4 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb5 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb6 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb7 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb8 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb9 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb10 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb11 { + /delete-property/ dma-coherent; +}; + +&msm_fastrpc_compute_cb12 { + /delete-property/ dma-coherent; +}; diff --git a/arch/arm64/boot/dts/qcom/qcs605.dtsi b/arch/arm64/boot/dts/qcom/qcs605.dtsi index 89ab5144685f..010036fc0322 100644 --- a/arch/arm64/boot/dts/qcom/qcs605.dtsi +++ b/arch/arm64/boot/dts/qcom/qcs605.dtsi @@ -18,40 +18,52 @@ qcom,msm-id = <347 0x0>; }; +&removed_region { + reg = <0 0x85fc0000 0 0x1540000>; +}; + +&pil_camera_mem { + reg = <0 0x8b800000 0 0x500000>; +}; + &pil_modem_mem { - reg = <0 0x8b000000 0 0x3100000>; + reg = <0 0x8bd00000 0 0x3100000>; }; &pil_video_mem { - reg = <0 0x8e100000 0 0x500000>; + reg = <0 0x8ee00000 0 0x500000>; }; &wlan_msa_mem { - reg = <0 0x8e600000 0 0x100000>; + reg = <0 0x8f300000 0 0x100000>; }; &pil_cdsp_mem { - reg = <0 0x8e700000 0 0x800000>; + reg = <0 0x8f400000 0 0x800000>; }; &pil_mba_mem { - reg = <0 0x8ef00000 0 0x200000>; + reg = <0 0x8fc00000 0 0x200000>; }; &pil_adsp_mem { - reg = <0 0x8f100000 0 0x1e00000>; + reg = <0 0x8fe00000 0 0x1e00000>; }; &pil_ipa_fw_mem { - reg = <0 0x90f00000 0 0x10000>; + reg = <0 0x91c00000 0 0x10000>; }; &pil_ipa_gsi_mem { - reg = <0 0x90f10000 0 0x5000>; + reg = <0 0x91c10000 0 0x5000>; }; &pil_gpu_mem { - reg = <0 0x90f15000 0 0x2000>; + reg = <0 0x91c15000 0 0x2000>; +}; + +&qseecom_mem { + reg = <0 0x9e800000 0 0x1000000>; }; &adsp_mem { diff --git a/arch/arm64/boot/dts/qcom/qm215-camera-sensor-qrd.dtsi b/arch/arm64/boot/dts/qcom/qm215-camera-sensor-qrd.dtsi index f7c6814a0333..08658dc480ee 100644 --- a/arch/arm64/boot/dts/qcom/qm215-camera-sensor-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/qm215-camera-sensor-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -11,6 +11,9 @@ * GNU General Public License for more details. */ &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi index c255ee2b4580..6de406df0f9a 100644 --- a/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi @@ -12,7 +12,126 @@ */ #include "sdm439-qrd.dtsi" +#include "sdm429w-pm660.dtsi" &mdss_dsi0 { qcom,dsi-pref-prim-pan = <&dsi_hx8399c_hd_vid>; }; + +&dsi_hx8399c_hd_vid { + qcom,mdss-dsi-on-command = [ + 39 01 00 00 00 00 04 + b9 ff 83 99 + 39 01 00 00 00 00 02 + d2 88 + 39 01 00 00 00 00 0c + b1 02 04 72 92 01 + 32 aa 11 11 52 57 + 39 01 00 00 00 00 10 + b2 00 80 80 cc 05 07 5a + 11 10 10 00 1e 70 03 d4 + 39 01 00 00 00 00 2d + b4 00 ff 59 59 01 ab 00 + 00 09 00 03 05 00 28 03 + 0b 0d 21 03 02 00 0c a3 + 80 59 59 02 ab 00 00 09 + 00 03 05 00 28 03 0b 0d + 02 00 0c a3 01 + 39 01 00 00 05 00 22 + d3 00 0c 03 03 00 00 10 + 10 00 00 03 00 03 00 08 + 78 08 78 00 00 00 00 00 + 24 02 05 05 03 00 00 00 + 05 40 + 39 01 00 00 05 00 21 + d5 20 20 19 19 18 18 02 + 03 00 01 24 24 18 18 18 + 18 24 24 00 00 00 00 00 + 00 00 00 2f 2f 30 30 31 + 31 + 39 01 00 00 05 00 21 + d6 24 24 18 18 19 19 01 + 00 03 02 24 24 18 18 18 + 18 20 20 40 40 40 40 40 + 40 40 40 2f 2f 30 30 31 + 31 + 39 01 00 00 00 00 02 + bd 00 + 39 01 00 00 00 00 11 + d8 aa aa aa aa aa aa aa + aa aa ba aa aa aa ba aa + aa + 39 01 00 00 00 00 02 + bd 01 + 39 01 00 00 00 00 11 + d8 00 00 00 00 00 00 00 + 00 82 ea aa aa 82 ea aa + aa + 39 01 00 00 00 00 02 + bd 02 + 39 01 00 00 00 00 09 + d8 ff ff c0 3f ff ff c0 + 3f + 39 01 00 00 00 00 02 + bd 00 + 39 01 00 00 05 00 37 + e0 01 21 31 2d 66 6f 7b + 75 7a 81 86 89 8c 90 95 + 97 9a a1 a2 aa 9e ad b0 + 5b 57 63 7a 01 21 31 2d + 66 6f 7b 75 7a 81 86 89 + 8c 90 95 97 9a a1 a2 aa + 9e ad b0 5b 57 63 7a + 39 01 00 00 00 00 03 + b6 7e 7e + 39 01 00 00 00 00 02 + cc 08 + 39 01 00 00 00 00 02 + 35 00 + 39 01 00 00 00 00 02 + dd 03 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 05 00 02 29 00]; + qcom,mdss-dsi-reset-sequence = <1 2>, <0 5>, <1 10>; + }; + +&firmware { + android { + compatible = "android,firmware"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo,recovery"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/platform/soc/7824900.sdhci/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,discard"; + fsmgr_flags = "wait,avb"; + status = "ok"; + }; + 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,avb"; + status = "ok"; + }; + }; + }; +}; + +&modem_mem { + reg = <0x0 0x86800000 0x0 0x5000000>; +}; + +&adsp_fw_mem { + reg = <0x0 0x8b800000 0x0 0x1100000>; +}; + +&wcnss_fw_mem { + reg = <0x0 0x8c900000 0x0 0x700000>; +}; diff --git a/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi b/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi new file mode 100644 index 000000000000..7238e1b194ab --- /dev/null +++ b/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi @@ -0,0 +1,695 @@ +/* + * Copyright (c) 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 + +&rpm_bus { + /* Delete all pm8953 regulators */ + /delete-node/ rpm-regulator-smpa1; + /delete-node/ rpm-regulator-smpa2; + /delete-node/ rpm-regulator-smpa3; + /delete-node/ rpm-regulator-smpa4; + /delete-node/ rpm-regulator-smpa7; + /delete-node/ rpm-regulator-ldoa1; + /delete-node/ rpm-regulator-ldoa2; + /delete-node/ rpm-regulator-ldoa3; + /delete-node/ rpm-regulator-ldoa4; + /delete-node/ rpm-regulator-ldoa5; + /delete-node/ rpm-regulator-ldoa6; + /delete-node/ rpm-regulator-ldoa7; + /delete-node/ rpm-regulator-ldoa8; + /delete-node/ rpm-regulator-ldoa9; + /delete-node/ rpm-regulator-ldoa10; + /delete-node/ rpm-regulator-ldoa11; + /delete-node/ rpm-regulator-ldoa12; + /delete-node/ rpm-regulator-ldoa13; + /delete-node/ rpm-regulator-ldoa14; + /delete-node/ rpm-regulator-ldoa15; + /delete-node/ rpm-regulator-ldoa16; + /delete-node/ rpm-regulator-ldoa17; + /delete-node/ rpm-regulator-ldoa19; + /delete-node/ rpm-regulator-ldoa22; + /delete-node/ rpm-regulator-ldoa23; + /delete-node/ rpm-regulator-clk0; +}; + +&thermal_zones { + /delete-node/ xo-therm-adc; + /delete-node/ xo-therm-buf-adc; + /delete-node/ pm8953_tz; + /delete-node/ pmi-ibat-lvl0; + /delete-node/ pmi-ibat-lvl1; + /delete-node/ pmi-vbat-lvl0; + /delete-node/ pmi-vbat-lvl1; + /delete-node/ pmi-vbat-lvl2; + /delete-node/ soc; + /delete-node/ pmi632_tz; + /delete-node/ quiet-therm-step; + /delete-node/ quiet-therm-adc; + /delete-node/ pa-therm0; + + aoss0-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + mdm-core-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + lpass-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + camera-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + cpuss1-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + apc1-cpu0-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + apc1-cpu1-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + apc1-cpu2-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + apc1-cpu3-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + cpuss0-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; + + gpu-lowf { + cooling-maps { + cx_vdd_cdev { + /delete-property/ cooling-device; + }; + }; + }; +}; + +&usb_otg { + /delete-property/ vbus_otg-supply; + /delete-property/ extcon; + /delete-property/ hsusb_vdd_dig-supply; + /delete-property/ HSUSB_1p8-supply; + /delete-property/ HSUSB_3p3-supply; + /delete-property/ qcom,vdd-voltage-level; +}; + +&soc { + /delete-node/ qcom,camera-flash; + + regulator@b018000 { + /delete-property/ vdd-apc-supply; + }; + + qcom,cpu-clock-8939@b111050 { + /delete-property/ vdd-c0-supply; + /delete-property/ vdd-c1-supply; + /delete-property/ vdd-cci-supply; + }; + + qcom,gcc@1800000 { + /delete-property/ vdd_dig-supply; + /delete-property/ vdd_sr2_dig-supply; + /delete-property/ vdd_sr2_pll-supply; + /delete-property/ vdd_hf_dig-supply; + /delete-property/ vdd_hf_pll-supply; + }; + + qcom,lpass@c200000 { + /delete-property/ vdd_cx-supply; + }; + + qcom,pronto@a21b000 { + /delete-property/ vdd_pronto_pll-supply; + }; + + qcom,wcnss-wlan@0a000000 { + /delete-property/ qcom,pronto-vddmx-supply; + /delete-property/ qcom,pronto-vddcx-supply; + /delete-property/ qcom,pronto-vddpx-supply; + /delete-property/ qcom,iris-vddxo-supply; + /delete-property/ qcom,iris-vddrfa-supply; + /delete-property/ qcom,iris-vddpa-supply; + /delete-property/ qcom,iris-vdddig-supply; + /delete-property/ qcom,wcnss-adc_tm; + }; + + qcom,csid@1b30000 { + /delete-property/ qcom,mipi-csi-vdd-supply; + }; + + qcom,csid@1b30400 { + /delete-property/ qcom,mipi-csi-vdd-supply; + }; + + qcom,csid@1b30800 { + /delete-property/ qcom,mipi-csi-vdd-supply; + }; + + sound { + /delete-property/ asoc-codec; + /delete-property/ msm-vdd-wsa-switch-supply; + }; + + hbtp { + /delete-property/ vcc_ana-supply; + /delete-property/ vcc_dig-supply; + }; + + fpc1020 { + /delete-property/ vcc_spi-supply; + /delete-property/ vdd_io-supply; + /delete-property/ vdd_ana-supply; + }; +}; + +&clock_audio { + /delete-property/ pinctrl-0; + /delete-property/ pinctrl-1; + /delete-property/ qcom,audio-ref-clk-gpio; +}; + +&wcd9335 { + /delete-property/ cdc-vdd-buck-supply; + /delete-property/ cdc-buck-sido-supply; + /delete-property/ cdc-vdd-tx-h-supply; + /delete-property/ cdc-vdd-rx-h-supply; + /delete-property/ cdc-vdd-px-supply; + /delete-property/ cdc-vdd-mic-bias-supply; +}; + +&pil_mss { + /delete-property/ vdd_mss-supply; + /delete-property/ vdd_cx-supply; + /delete-property/ vdd_cx-voltage; + /delete-property/ vdd_mx-supply; + /delete-property/ vdd_mx-uV; + /delete-property/ vdd_pll-supply; +}; + +&cci { + qcom,actuator@0 { + /delete-property/ cam_vaf-supply; + }; + + qcom,actuator@1 { + /delete-property/ cam_vaf-supply; + }; + + qcom,eeprom@0 { + /delete-property/ cam_vana-supply; + /delete-property/ cam_vio-supply; + /delete-property/ cam_vaf-supply; + /delete-property/ cam_vdig-supply; + }; + + qcom,eeprom@1 { + /delete-property/ cam_vdig-supply; + /delete-property/ cam_vana-supply; + /delete-property/ cam_vio-supply; + /delete-property/ cam_vaf-supply; + }; + + qcom,camera@0 { + /delete-property/ qcom,led-flash-src; + /delete-property/ cam_vana-supply; + /delete-property/ cam_vio-supply; + /delete-property/ cam_vaf-supply; + /delete-property/ cam_vdig-supply; + }; + + qcom,camera@1 { + /delete-property/ cam_vdig-supply; + /delete-property/ cam_vana-supply; + /delete-property/ cam_vio-supply; + /delete-property/ cam_vaf-supply; + }; + + qcom,camera@2 { + /delete-property/ cam_vdig-supply; + /delete-property/ cam_vana-supply; + /delete-property/ cam_vio-supply; + /delete-property/ cam_vaf-supply; + }; +}; + +&mdss_dsi { + /delete-property/ vdda-supply; + /delete-property/ vddio-supply; +}; + +&mdss_dsi0 { + /delete-property/ vdd-supply; + /delete-property/ vddio-supply; + /delete-property/ bklight_en-supply; + /delete-property/ lab-supply; + /delete-property/ ibb-supply; +}; + +&mdss_dsi1 { + /delete-property/ vdd-supply; + /delete-property/ vddio-supply; +}; + +&mdss_dsi0_pll { + /delete-property/ vddio-supply; +}; + +&mdss_dsi1_pll { + /delete-property/ vddio-supply; +}; + +&i2c_2 { + /delete-node/ qcom,smb1355@8; + /delete-node/ qcom,smb1355@c; +}; + +&i2c_5 { + nq@28 { + /delete-property/ qcom,nq-clkreq; + /delete-property/ pinctrl-0; + }; +}; + +&sdhc_1 { + /delete-property/ vdd-supply; + /delete-property/ vdd-io-supply; +}; + +&sdhc_2 { + /delete-property/ vdd-supply; + /delete-property/ vdd-io-supply; +}; + +&spmi_bus { + /delete-node/ qcom,pm8953@0; + /delete-node/ qcom,pm8953@1; + /delete-node/ qcom,pmi632@2; + /delete-node/ qcom,pmi632@3; +}; + +&dsi_hx8399c_truly_vid { + /delete-property/ qcom,mdss-dsi-pwm-gpio; +}; + +&dsi_hx8399c_hd_vid { + /delete-property/ qcom,mdss-dsi-pwm-gpio; +}; + +&tlmm { + /delete-node/ smb_int_default; +}; + +&soc { + /delete-node/ qcom,rpm-smd; + rpm_bus: qcom,rpm-smd { + compatible = "qcom,rpm-smd"; + rpm-channel-name = "rpm_requests"; + rpm-channel-type = <15>; /* SMD_APSS_RPM */ + }; +}; + +#include "pm660.dtsi" +#include "pm660-rpm-regulator.dtsi" +#include "sdm429w-regulator.dtsi" + +&pm660_pdphy { + /delete-property/ vdd-pdphy-supply; +}; + +/{ + /delete-node/ mtp_batterydata; + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "fg-gen3-batterydata-I13Z5P-680mAh.dtsi" + }; +}; + +/* over-write the PM660 GPIO mappings for 429w */ +&pm660_gpios { + interrupts = <0x0 0xc3 0 IRQ_TYPE_NONE>; + interrupt-names = "pm660_gpio4"; + qcom,gpios-disallowed = <1 2 3 5 6 7 8 9 10 11 12 13>; +}; + +&pm660_vadc { + /delete-node/ chan@1d; +}; + +&pm660_0 { + pm660_charger: qcom,qpnp-smb2 { + compatible = "qcom,qpnp-smb2"; + #address-cells = <1>; + #size-cells = <1>; + #cooling-cells = <2>; + + qcom,pmic-revid = <&pm660_revid>; + io-channels = <&pm660_rradc 8>, + <&pm660_rradc 10>, + <&pm660_rradc 3>, + <&pm660_rradc 4>; + io-channel-names = "charger_temp", + "charger_temp_max", + "usbin_i", + "usbin_v"; + qcom,thermal-mitigation + = <3000000 2500000 2000000 1500000 + 1000000 500000>; + qcom,wipower-max-uw = <5000000>; + qcom,auto-recharge-soc; + qcom,use-extcon; + qcom,pd-not-supported; + + qcom,chgr@1000 { + reg = <0x1000 0x100>; + interrupts = + <0x0 0x10 0x0 IRQ_TYPE_EDGE_RISING>, + <0x0 0x10 0x1 IRQ_TYPE_EDGE_RISING>, + <0x0 0x10 0x2 IRQ_TYPE_EDGE_RISING>, + <0x0 0x10 0x3 IRQ_TYPE_EDGE_RISING>, + <0x0 0x10 0x4 IRQ_TYPE_EDGE_RISING>; + + interrupt-names = "chg-error", + "chg-state-change", + "step-chg-state-change", + "step-chg-soc-update-fail", + "step-chg-soc-update-request"; + }; + + qcom,otg@1100 { + reg = <0x1100 0x100>; + interrupts = <0x0 0x11 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x11 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x11 0x2 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x11 0x3 IRQ_TYPE_EDGE_BOTH>; + + interrupt-names = "otg-fail", + "otg-overcurrent", + "otg-oc-dis-sw-sts", + "testmode-change-detect"; + }; + + qcom,bat-if@1200 { + reg = <0x1200 0x100>; + interrupts = + <0x0 0x12 0x0 IRQ_TYPE_EDGE_RISING>, + <0x0 0x12 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x12 0x2 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x12 0x3 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x12 0x4 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x12 0x5 IRQ_TYPE_EDGE_BOTH>; + + interrupt-names = "bat-temp", + "bat-ocp", + "bat-ov", + "bat-low", + "bat-therm-or-id-missing", + "bat-terminal-missing"; + }; + + qcom,usb-chgpth@1300 { + reg = <0x1300 0x100>; + interrupts = + <0x0 0x13 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x13 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x13 0x2 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x13 0x3 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x13 0x4 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x13 0x5 IRQ_TYPE_EDGE_RISING>, + <0x0 0x13 0x6 IRQ_TYPE_EDGE_RISING>, + <0x0 0x13 0x7 IRQ_TYPE_EDGE_RISING>; + + interrupt-names = "usbin-collapse", + "usbin-lt-3p6v", + "usbin-uv", + "usbin-ov", + "usbin-plugin", + "usbin-src-change", + "usbin-icl-change", + "type-c-change"; + }; + + qcom,dc-chgpth@1400 { + reg = <0x1400 0x100>; + interrupts = + <0x0 0x14 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x14 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x14 0x2 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x14 0x3 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x14 0x4 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x14 0x5 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x14 0x6 IRQ_TYPE_EDGE_RISING>; + + interrupt-names = "dcin-collapse", + "dcin-lt-3p6v", + "dcin-uv", + "dcin-ov", + "dcin-plugin", + "div2-en-dg", + "dcin-icl-change"; + }; + + qcom,chgr-misc@1600 { + reg = <0x1600 0x100>; + interrupts = + <0x0 0x16 0x0 IRQ_TYPE_EDGE_RISING>, + <0x0 0x16 0x1 IRQ_TYPE_EDGE_RISING>, + <0x0 0x16 0x2 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x16 0x3 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x16 0x4 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x16 0x5 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x16 0x6 IRQ_TYPE_EDGE_FALLING>, + <0x0 0x16 0x7 IRQ_TYPE_EDGE_BOTH>; + + interrupt-names = "wdog-snarl", + "wdog-bark", + "aicl-fail", + "aicl-done", + "high-duty-cycle", + "input-current-limiting", + "temperature-change", + "switcher-power-ok"; + }; + + smb2_vbus: qcom,smb2-vbus { + regulator-name = "smb2-vbus"; + }; + + smb2_vconn: qcom,smb2-vconn { + regulator-name = "smb2-vconn"; + }; + }; + + qcom,power-on@800 { + qcom,use-legacy-hard-reset-offset; + }; + + pm660_rradc: rradc@4500 { + compatible = "qcom,rradc"; + reg = <0x4500 0x100>; + #address-cells = <1>; + #size-cells = <0>; + #io-channel-cells = <1>; + qcom,pmic-revid = <&pm660_revid>; + }; + + pm660_fg: qpnp,fg { + compatible = "qcom,fg-gen3"; + #address-cells = <1>; + #size-cells = <1>; + qcom,pmic-revid = <&pm660_revid>; + io-channels = <&pm660_rradc 0>, + <&pm660_rradc 7>; + io-channel-names = "rradc_batt_id", + "rradc_die_temp"; + qcom,rradc-base = <0x4500>; + qcom,fg-esr-timer-awake = <64 96>; + qcom,fg-esr-timer-charging = <0 96>; + qcom,fg-esr-timer-shutdown = <2048 2048>; + qcom,fg-esr-timer-asleep = <512 512>; + qcom,cycle-counter-en; + qcom,hold-soc-while-full; + qcom,fg-auto-recharge-soc; + qcom,fg-recharge-soc-thr = <98>; + qcom,fg-rsense-sel = <1>; /* External rsense */ + qcom,fg-cutoff-voltage = <3400>; + qcom,fg-recharge-voltage = <4100>; + qcom,fg-use-sw-esr; + qcom,fg-esr-pulse-thresh-ma = <40>; + qcom,fg-esr-meas-curr-ma = <60>; + qcom,fg-cutoff-current = <50>; + qcom,fg-sync-sleep-threshold-ma = <30>; + qcom,battery-data = <&mtp_batterydata>; + status = "okay"; + + qcom,fg-batt-soc@4000 { + status = "okay"; + reg = <0x4000 0x100>; + interrupts = <0x0 0x40 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x40 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x40 0x2 + IRQ_TYPE_EDGE_RISING>, + <0x0 0x40 0x3 + IRQ_TYPE_EDGE_RISING>, + <0x0 0x40 0x4 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x40 0x5 + IRQ_TYPE_EDGE_RISING>, + <0x0 0x40 0x6 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x40 0x7 IRQ_TYPE_EDGE_BOTH>; + interrupt-names = "soc-update", + "soc-ready", + "bsoc-delta", + "msoc-delta", + "msoc-low", + "msoc-empty", + "msoc-high", + "msoc-full"; + }; + + qcom,fg-batt-info@4100 { + status = "okay"; + reg = <0x4100 0x100>; + interrupts = <0x0 0x41 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x41 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x41 0x2 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x41 0x3 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x41 0x6 IRQ_TYPE_EDGE_BOTH>; + interrupt-names = "vbatt-pred-delta", + "vbatt-low", + "esr-delta", + "batt-missing", + "batt-temp-delta"; + }; + + qcom,fg-memif@4400 { + status = "okay"; + reg = <0x4400 0x100>; + interrupts = <0x0 0x44 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x44 0x1 IRQ_TYPE_EDGE_BOTH>, + <0x0 0x44 0x2 IRQ_TYPE_EDGE_BOTH>; + interrupt-names = "ima-rdy", + "mem-xcp", + "dma-grant"; + }; + }; +}; + +&pm660_1 { + pm660_haptics: qcom,haptics@c000 { + compatible = "qcom,pm660-haptics"; + reg = <0xc000 0x100>; + interrupts = <0x1 0xc0 0x0 IRQ_TYPE_EDGE_BOTH>, + <0x1 0xc0 0x1 IRQ_TYPE_EDGE_BOTH>; + interrupt-names = "hap-sc-irq", "hap-play-irq"; + qcom,actuator-type = "erm"; + qcom,vmax-mv = <3200>; + qcom,ilim-ma = <400>; + qcom,play-rate-us = <10000>; + wf_0 { + /* CLICK */ + qcom,effect-id = <0>; + qcom,wf-vmax-mv = <3600>; + qcom,wf-pattern = [3e 3e 3e]; + qcom,wf-brake-pattern = [01 00 00 00]; + }; + wf_1 { + /* DOUBLE CLICK */ + qcom,effect-id = <1>; + qcom,wf-vmax-mv = <3600>; + qcom,wf-pattern = [7e 7e 02 02 02 02 02 02]; + qcom,wf-repeat-count = <2>; + qcom,wf-s-repeat-count = <1>; + }; + wf_2 { + /* TICK */ + qcom,effect-id = <2>; + qcom,wf-vmax-mv = <3600>; + qcom,wf-pattern = [7e 7e]; + }; + wf_3 { + /* THUD */ + qcom,effect-id = <3>; + qcom,wf-vmax-mv = <3600>; + qcom,wf-pattern = [7e 7e 7e]; + }; + wf_4 { + /* POP */ + qcom,effect-id = <4>; + qcom,wf-vmax-mv = <3600>; + qcom,wf-pattern = [7e 7e]; + }; + wf_5 { + /* HEAVY CLICK */ + qcom,effect-id = <5>; + qcom,wf-vmax-mv = <3600>; + qcom,wf-pattern = [7e 7e 7e]; + qcom,wf-play-rate-us = <6667>; + }; + }; +}; + +&usb_otg { + extcon = <&pm660_charger>; +}; diff --git a/arch/arm64/boot/dts/qcom/sdm429w-regulator.dtsi b/arch/arm64/boot/dts/qcom/sdm429w-regulator.dtsi new file mode 100644 index 000000000000..905e12804695 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/sdm429w-regulator.dtsi @@ -0,0 +1,326 @@ +/* + * Copyright (c) 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 +#include + +&rpm_bus { + /* PM660 S1 - VDD_CX supply */ + rpm-regulator-smpa1 { + status = "okay"; + VDD_CX_LEVEL: S1A_LEVEL: + pm660_s1_level: regulator-s1-level { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s1_level"; + qcom,set = <3>; + regulator-min-microvolt = + ; + regulator-max-microvolt = + ; + qcom,use-voltage-level; + }; + + VDD_CX_FLOOR_LEVEL: S1A_FLOOR_LEVEL: + pm660_s1_floor_level: regulator-s1-floor-level { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s1_floor_level"; + qcom,set = <3>; + regulator-min-microvolt = + ; + regulator-max-microvolt = + ; + qcom,use-voltage-floor-level; + qcom,always-send-voltage; + }; + + VDD_CX_LEVEL_AO: S1A_LEVEL_AO: + pm660_s1_level_ao: regulator-s1-level-ao { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s1_level_ao"; + qcom,set = <1>; + regulator-min-microvolt = + ; + regulator-max-microvolt = + ; + qcom,use-voltage-level; + }; + }; + + /* PM660 S2 - VDD_MX supply */ + rpm-regulator-smpa2 { + status = "okay"; + VDD_MX_LEVEL: S2A_LEVEL: + pm660_s2_level: regulator-s2-level { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s2_level"; + qcom,set = <3>; + regulator-min-microvolt = + ; + regulator-max-microvolt = + ; + qcom,use-voltage-level; + }; + + VDD_MX_LEVEL_AO: S2A_LEVEL_AO: + pm660_s2_level_ao: regulator-s2-level-ao { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s2_level_ao"; + qcom,set = <1>; + regulator-min-microvolt = + ; + regulator-max-microvolt = + ; + qcom,use-voltage-level; + }; + + VDD_MX_LEVEL_SO: S2A_LEVEL_SO: + pm660_s2_level_so: regulator-s2-level-so { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_s2_level_so"; + qcom,set = <2>; + regulator-min-microvolt = + ; + regulator-max-microvolt = + ; + qcom,use-voltage-level; + }; + }; + + rpm-regulator-smpa4 { + status = "okay"; + S4A: pm660_s4: regulator-s4 { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1800000>; + status = "okay"; + }; + }; + + rpm-regulator-smpa5 { + status = "okay"; + S5A: pm660_s5: regulator-s5 { + regulator-min-microvolt = <1040000>; + regulator-max-microvolt = <1350000>; + qcom,init-voltage = <1040000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa1 { + status = "okay"; + L1A: pm660_l1: regulator-l1 { + regulator-min-microvolt = <970000>; + regulator-max-microvolt = <1280000>; + qcom,init-voltage = <970000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa2 { + status = "okay"; + L2A: pm660_l2: regulator-l2 { + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <1280000>; + qcom,init-voltage = <900000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa3 { + status = "okay"; + L3A: pm660_l3: regulator-l3 { + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <1280000>; + qcom,init-voltage = <900000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa5 { + status = "okay"; + L5A: pm660_l5: regulator-l5 { + regulator-min-microvolt = <1150000>; + regulator-max-microvolt = <1450000>; + qcom,init-voltage = <1150000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa6 { + status = "okay"; + L6A: pm660_l6: regulator-l6 { + regulator-min-microvolt = <670000>; + regulator-max-microvolt = <928000>; + qcom,init-voltage = <670000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa7 { + status = "okay"; + L7A: pm660_l7: regulator-l7 { + regulator-min-microvolt = <1140000>; + regulator-max-microvolt = <1280000>; + qcom,init-voltage = <1140000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa8 { + status = "okay"; + L8A: pm660_l8: regulator-l8 { + regulator-min-microvolt = <1500000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1500000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa9 { + status = "okay"; + L9A: pm660_l9: regulator-l9 { + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1200000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa10 { + status = "okay"; + L10A: pm660_l10: regulator-l10 { + regulator-min-microvolt = <500000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <500000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa11 { + status = "okay"; + L11A: pm660_l11: regulator-l11 { + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1200000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa12 { + status = "okay"; + L12A: pm660_l12: regulator-l12 { + regulator-min-microvolt = <1620000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1620000>; + status = "okay"; + }; + + L12A_AO: pm660_l12_ao: regulator-l12-ao { + compatible = "qcom,rpm-smd-regulator"; + regulator-name = "pm660_l12_ao"; + qcom,set = <1>; + regulator-min-microvolt = <1620000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1620000>; + }; + }; + + rpm-regulator-ldoa13 { + status = "okay"; + L13A: pm660_l13: regulator-l13 { + regulator-min-microvolt = <1600000>; + regulator-max-microvolt = <2040000>; + qcom,init-voltage = <1600000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa14 { + status = "okay"; + L14A: pm660_l14: regulator-l14 { + regulator-min-microvolt = <1700000>; + regulator-max-microvolt = <1900000>; + qcom,init-voltage = <1700000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa15 { + status = "okay"; + L15A: pm660_l15: regulator-l15 { + regulator-min-microvolt = <2650000>; + regulator-max-microvolt = <3400000>; + qcom,init-voltage = <2650000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa16 { + status = "okay"; + L16A: pm660_l16: regulator-l16 { + regulator-min-microvolt = <2970000>; + regulator-max-microvolt = <3400000>; + qcom,init-voltage = <2970000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa17 { + status = "okay"; + L17A: pm660_l17: regulator-l17 { + regulator-min-microvolt = <2400000>; + regulator-max-microvolt = <3300000>; + qcom,init-voltage = <2400000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa18 { + status = "okay"; + L18A: pm660_l18: regulator-l18 { + regulator-min-microvolt = <1650000>; + regulator-max-microvolt = <3050000>; + qcom,init-voltage = <1650000>; + status = "okay"; + }; + }; + + rpm-regulator-ldoa19 { + status = "okay"; + L19A: pm660_l19: regulator-l19 { + regulator-min-microvolt = <2700000>; + regulator-max-microvolt = <3400000>; + qcom,init-voltage = <2700000>; + status = "okay"; + }; + }; +}; + +/* SPM controlled regulators */ +&spmi_bus { + qcom,pm660@1 { + S3A: pm660_s3: spm-regulator@1a00 { + compatible = "qcom,spm-regulator"; + reg = <0x1a00 0x100>; + regulator-name = "pm660_s3"; + regulator-min-microvolt = <725000>; + regulator-max-microvolt = <736000>; + }; + }; +}; + +&soc { + regulator@b018000 { + vdd-apc-supply = <&pm660_s3>; + }; +}; diff --git a/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-cdp.dtsi b/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-cdp.dtsi index 2987d67d95c2..0aa8e9911b12 100644 --- a/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, 2018, The Linux Foundation. All rights reserved. + * 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 @@ -14,6 +14,9 @@ #include &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-mtp.dtsi b/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-mtp.dtsi index 2987d67d95c2..0aa8e9911b12 100644 --- a/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, 2018, The Linux Foundation. All rights reserved. + * 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 @@ -14,6 +14,9 @@ #include &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-qrd.dtsi b/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-qrd.dtsi index ef0e9779877b..e0a0c48df0e9 100644 --- a/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm439-camera-sensor-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, 2018 The Linux Foundation. All rights reserved. + * 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 @@ -14,6 +14,9 @@ #include &cci { + #address-cells = <1>; + #size-cells = <0>; + actuator0: qcom,actuator@0 { cell-index = <0>; reg = <0x0>; diff --git a/arch/arm64/boot/dts/qcom/sdm439-cdp.dtsi b/arch/arm64/boot/dts/qcom/sdm439-cdp.dtsi index 867193af64cc..21989ea162f3 100644 --- a/arch/arm64/boot/dts/qcom/sdm439-cdp.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm439-cdp.dtsi @@ -31,6 +31,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; diff --git a/arch/arm64/boot/dts/qcom/sdm439-mtp.dtsi b/arch/arm64/boot/dts/qcom/sdm439-mtp.dtsi index e1623e0b960d..07e1d13289ae 100644 --- a/arch/arm64/boot/dts/qcom/sdm439-mtp.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm439-mtp.dtsi @@ -31,6 +31,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; @@ -571,6 +574,9 @@ }; &i2c_2 { +#address-cells = <1>; +#size-cells = <0>; + #include "smb1355.dtsi" }; diff --git a/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi b/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi index 537d9fc278d8..c382f06b02ad 100644 --- a/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm439-qrd.dtsi @@ -80,6 +80,9 @@ }; &i2c_5 { /* BLSP2 QUP1 (NFC) */ + #address-cells = <1>; + #size-cells = <0>; + status = "ok"; nq@28 { compatible = "qcom,nq-nci"; @@ -347,6 +350,9 @@ }; &i2c_2 { +#address-cells = <1>; +#size-cells = <0>; + #include "smb1355.dtsi" }; diff --git a/arch/arm64/boot/dts/qcom/sdm450-pmi632-mtp-s3.dtsi b/arch/arm64/boot/dts/qcom/sdm450-pmi632-mtp-s3.dtsi index 5db626b95599..1afea684eaeb 100644 --- a/arch/arm64/boot/dts/qcom/sdm450-pmi632-mtp-s3.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm450-pmi632-mtp-s3.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -48,6 +48,9 @@ }; &i2c_2 { +#address-cells = <1>; +#size-cells = <0>; + #include "smb1355.dtsi" }; diff --git a/arch/arm64/boot/dts/qcom/sdm450-qrd-sku4.dtsi b/arch/arm64/boot/dts/qcom/sdm450-qrd-sku4.dtsi index 8671877c202d..004411fef08d 100644 --- a/arch/arm64/boot/dts/qcom/sdm450-qrd-sku4.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm450-qrd-sku4.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -178,6 +178,9 @@ }; &i2c_2 { +#address-cells = <1>; +#size-cells = <0>; + #include "smb1355.dtsi" }; diff --git a/arch/arm64/boot/dts/qcom/sdm670-camera.dtsi b/arch/arm64/boot/dts/qcom/sdm670-camera.dtsi index 76b7b058d9af..a18f9fa57dd7 100644 --- a/arch/arm64/boot/dts/qcom/sdm670-camera.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm670-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 diff --git a/arch/arm64/boot/dts/qcom/sdm670-coresight.dtsi b/arch/arm64/boot/dts/qcom/sdm670-coresight.dtsi index dc9e54e1dd4c..30039db69b5a 100644 --- a/arch/arm64/boot/dts/qcom/sdm670-coresight.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm670-coresight.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 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 @@ -494,6 +494,15 @@ <&audio_etm0_out_funnel_in1>; }; }; + + port@2 { + reg = <0>; + funnel_in1_in_tpdm_lpass: endpoint { + slave-mode; + remote-endpoint = + <&tpdm_lpass_out_funnel_in1>; + }; + }; }; }; @@ -2089,6 +2098,18 @@ }; }; + tpdm_lpass: tpdm@6b16000 { + compatible = "qcom,coresight-dummy"; + coresight-name = "coresight-tpdm-lpass"; + + qcom,dummy-source; + port { + tpdm_lpass_out_funnel_in1: endpoint { + remote-endpoint = <&funnel_in1_in_tpdm_lpass>; + }; + }; + }; + audio_etm0 { compatible = "qcom,coresight-remote-etm"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-camera.dtsi b/arch/arm64/boot/dts/qcom/sdm845-camera.dtsi index 86b17046ed31..4865d71ec983 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-camera.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 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 diff --git a/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi b/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi index 093c94064952..88adbaaa9217 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 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 @@ -79,6 +79,8 @@ qcom,tsens-name = "tsens_tz_sensor12"; #cooling-cells = <2>; + tzone-names = "gpu0-usr", "gpu1-usr"; + clocks = <&clock_gfx GPU_CC_GX_GFX3D_CLK>, <&clock_gpucc GPU_CC_CXO_CLK>, <&clock_gcc GCC_DDRSS_GPU_AXI_CLK>, diff --git a/arch/arm64/boot/dts/qcom/sdm845-interposer-pm660.dtsi b/arch/arm64/boot/dts/qcom/sdm845-interposer-pm660.dtsi index d698d1f812f1..91e941831078 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-interposer-pm660.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-interposer-pm660.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -273,6 +273,7 @@ &gpu_cx_gdsc { /delete-property/ parent-supply; + /delete-property/ vdd_parent-supply; }; &gpu_gx_gdsc { diff --git a/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi b/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi index 2e1b8d1edbef..206517de6eee 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -341,6 +341,32 @@ bias-pull-up; }; }; + + pcie0_3v3_on: pcie0_3v3_on { + mux { + pins = "gpio90"; + function = "gpio"; + }; + config { + pins = "gpio90"; + drive_strength = <2>; + bias-disable; + output-high; + }; + }; + + pcie0_1v5_on: pcie0_1v5_on { + mux { + pins = "gpio90"; + function = "gpio"; + }; + config { + pins = "gpio90"; + drive_strength = <2>; + bias-disable; + output-high; + }; + }; }; pcie1 { @@ -3550,6 +3576,15 @@ }; }; + led_bt { + led_bt_default: led_bt_default { + pins = "gpio5"; + function = "normal"; + power-source = <0>; + output-low; + }; + }; + key_vol_up { key_vol_up_default: key_vol_up_default { pins = "gpio6"; @@ -3580,6 +3615,15 @@ }; }; + led_wifi { + led_wifi_default: led_wifi_default { + pins = "gpio9"; + function = "normal"; + power-source = <0>; + output-low; + }; + }; + camera_dvdd_en { camera_dvdd_en_default: camera_dvdd_en_default { pins = "gpio9"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2-camera-sensor-mtp-robotics.dtsi b/arch/arm64/boot/dts/qcom/sdm845-v2-camera-sensor-mtp-robotics.dtsi new file mode 100644 index 000000000000..a1f51633edf9 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/sdm845-v2-camera-sensor-mtp-robotics.dtsi @@ -0,0 +1,582 @@ +/* + * Copyright (c) 2016-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. + */ + +&soc { + led_flash_rear: qcom,camera-flash@0 { + cell-index = <0>; + reg = <0x00 0x00>; + compatible = "qcom,camera-flash"; + flash-source = <&pmi8998_flash0 &pmi8998_flash1>; + torch-source = <&pmi8998_torch0 &pmi8998_torch1>; + switch-source = <&pmi8998_switch0>; + status = "ok"; + }; + + led_flash_rear_aux: qcom,camera-flash@1 { + cell-index = <1>; + reg = <0x01 0x00>; + compatible = "qcom,camera-flash"; + flash-source = <&pmi8998_flash0 &pmi8998_flash1>; + torch-source = <&pmi8998_torch0 &pmi8998_torch1>; + switch-source = <&pmi8998_switch0>; + status = "ok"; + }; + + led_flash_front: qcom,camera-flash@2 { + cell-index = <2>; + reg = <0x02 0x00>; + compatible = "qcom,camera-flash"; + flash-source = <&pmi8998_flash2>; + torch-source = <&pmi8998_torch2>; + switch-source = <&pmi8998_switch1>; + status = "ok"; + }; + + led_flash_iris: qcom,camera-flash@3 { + cell-index = <3>; + reg = <0x03 0x00>; + compatible = "qcom,camera-flash"; + flash-source = <&pmi8998_flash2>; + torch-source = <&pmi8998_torch2>; + switch-source = <&pmi8998_switch2>; + status = "ok"; + }; + + actuator_regulator: gpio-regulator@0 { + compatible = "regulator-fixed"; + reg = <0x00 0x00>; + regulator-name = "actuator_regulator"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + regulator-enable-ramp-delay = <100>; + enable-active-high; + gpio = <&tlmm 27 0>; + vin-supply = <&pmi8998_bob>; + }; + + camera_rear_ldo: gpio-regulator@1 { + compatible = "regulator-fixed"; + reg = <0x01 0x00>; + regulator-name = "camera_rear_ldo"; + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1050000>; + regulator-enable-ramp-delay = <135>; + enable-active-high; + gpio = <&pm8998_gpios 12 0>; + pinctrl-names = "default"; + pinctrl-0 = <&camera_rear_dvdd_en_default>; + vin-supply = <&pm8998_s3>; + }; + + camera_ldo: gpio-regulator@2 { + compatible = "regulator-fixed"; + reg = <0x02 0x00>; + regulator-name = "camera_ldo"; + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1050000>; + regulator-enable-ramp-delay = <233>; + enable-active-high; + gpio = <&pm8998_gpios 9 0>; + pinctrl-names = "default"; + pinctrl-0 = <&camera_dvdd_en_default>; + vin-supply = <&pm8998_s3>; + }; + + camera_vana_ldo: gpio-regulator@4 { + compatible = "regulator-fixed"; + reg = <0x04 0x00>; + regulator-name = "camera_vana_ldo"; + regulator-min-microvolt = <2850000>; + regulator-max-microvolt = <2850000>; + regulator-enable-ramp-delay = <233>; + enable-active-high; + gpio = <&tlmm 8 0>; + pinctrl-names = "default"; + pinctrl-0 = <&cam_sensor_rear_vana>; + vin-supply = <&pmi8998_bob>; + }; +}; + +&cam_cci { + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + status = "ok"; + }; + + actuator_rear: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + cci-master = <0>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <2800000>; + rgltr-max-voltage = <2800000>; + rgltr-load-current = <0>; + }; + + actuator_rear_aux: qcom,actuator@1 { + cell-index = <1>; + reg = <0x1>; + compatible = "qcom,actuator"; + cci-master = <1>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <2800000>; + rgltr-max-voltage = <2800000>; + rgltr-load-current = <0>; + }; + + actuator_front: qcom,actuator@2 { + cell-index = <2>; + reg = <0x2>; + compatible = "qcom,actuator"; + cci-master = <1>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <2800000>; + rgltr-max-voltage = <2800000>; + rgltr-load-current = <0>; + }; + + ois_rear: qcom,ois@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,ois"; + cci-master = <0>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <2800000>; + rgltr-max-voltage = <2800000>; + rgltr-load-current = <0>; + status = "ok"; + }; + + eeprom_rear: qcom,eeprom@0 { + cell-index = <0>; + reg = <0>; + compatible = "qcom,eeprom"; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&pmi8998_bob>; + cam_vdig-supply = <&camera_rear_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk", "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0 3312000 1050000 0 2800000>; + rgltr-max-voltage = <0 3600000 1050000 0 2800000>; + rgltr-load-current = <0 80000 105000 0 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_active + &cam_sensor_rear_active>; + pinctrl-1 = <&cam_sensor_mclk0_suspend + &cam_sensor_rear_suspend>; + gpios = <&tlmm 13 0>, + <&tlmm 80 0>, + <&tlmm 79 0>; + gpio-reset = <1>; + gpio-vana = <2>; + gpio-req-tbl-num = <0 1 2>; + gpio-req-tbl-flags = <1 0 0>; + gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_VANA0"; + sensor-position = <0>; + sensor-mode = <0>; + cci-master = <0>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + eeprom_rear_aux: qcom,eeprom@1 { + cell-index = <1>; + reg = <0x1>; + compatible = "qcom,eeprom"; + cam_vdig-supply = <&camera_ldo>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&pmi8998_bob>; + cam_clk-supply = <&titan_top_gdsc>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vdig", "cam_vio", "cam_vana", + "cam_clk", "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <1050000 0 3312000 0 2800000>; + rgltr-max-voltage = <1050000 0 3600000 0 2800000>; + rgltr-load-current = <105000 0 80000 0 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_active + &cam_sensor_rear2_active>; + pinctrl-1 = <&cam_sensor_mclk2_suspend + &cam_sensor_rear2_suspend>; + gpios = <&tlmm 15 0>, + <&tlmm 9 0>, + <&tlmm 8 0>; + gpio-reset = <1>; + gpio-vana = <2>; + gpio-req-tbl-num = <0 1 2>; + gpio-req-tbl-flags = <1 0 0>; + gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1", + "CAM_VANA1"; + sensor-position = <0>; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + eeprom_front: qcom,eeprom@2 { + cell-index = <2>; + reg = <0x2>; + compatible = "qcom,eeprom"; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&pmi8998_bob>; + cam_vdig-supply = <&camera_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk", "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0 3312000 1050000 0 2800000>; + rgltr-max-voltage = <0 3600000 1050000 0 2800000>; + rgltr-load-current = <0 80000 105000 0 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_active + &cam_sensor_front_active>; + pinctrl-1 = <&cam_sensor_mclk1_suspend + &cam_sensor_front_suspend>; + gpios = <&tlmm 14 0>, + <&tlmm 28 0>, + <&tlmm 8 0>; + gpio-reset = <1>; + gpio-vana = <2>; + gpio-req-tbl-num = <0 1 2>; + gpio-req-tbl-flags = <1 0 0>; + gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_VANA2"; + sensor-position = <1>; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + eeprom_back: qcom,eeprom@3 { + cell-index = <3>; + reg = <0x3>; + compatible = "qcom,eeprom"; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&pmi8998_bob>; + cam_vdig-supply = <&camera_rear_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + cam_vaf-supply = <&actuator_regulator>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk", "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <1800000 3312000 1050000 0 2800000>; + rgltr-max-voltage = <1800000 3600000 1050000 0 2800000>; + rgltr-load-current = <80000 80000 105000 0 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_active>; + pinctrl-1 = <&cam_sensor_mclk0_suspend>; + gpios = <&tlmm 13 0>; + gpio-req-tbl-num = <0>; + gpio-req-tbl-flags = <1>; + gpio-req-tbl-label = "CAMIF_MCLK0"; + sensor-position = <0>; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + qcom,cam-sensor@0 { + cell-index = <0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + csiphy-sd-index = <0>; + sensor-position-roll = <270>; + sensor-position-pitch = <0>; + sensor-position-yaw = <180>; + led-flash-src = <&led_flash_rear>; + actuator-src = <&actuator_rear>; + ois-src = <&ois_rear>; + eeprom-src = <&eeprom_rear>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&pmi8998_bob>; + cam_vdig-supply = <&camera_rear_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0 3312000 1050000 0>; + rgltr-max-voltage = <0 3600000 1050000 0>; + rgltr-load-current = <0 80000 105000 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_active + &cam_sensor_rear_active>; + pinctrl-1 = <&cam_sensor_mclk0_suspend + &cam_sensor_rear_suspend>; + gpios = <&tlmm 13 0>, + <&tlmm 80 0>, + <&tlmm 79 0>; + gpio-reset = <1>; + gpio-vana = <2>; + gpio-req-tbl-num = <0 1 2>; + gpio-req-tbl-flags = <1 0 0>; + gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_VANA"; + sensor-mode = <0>; + cci-master = <0>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + qcom,cam-sensor@1 { + cell-index = <1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + csiphy-sd-index = <1>; + sensor-position-roll = <270>; + sensor-position-pitch = <0>; + sensor-position-yaw = <180>; + actuator-src = <&actuator_rear_aux>; + led-flash-src = <&led_flash_rear_aux>; + eeprom-src = <&eeprom_rear_aux>; + cam_vdig-supply = <&camera_ldo>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&camera_vana_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + regulator-names = "cam_vdig", "cam_vio", "cam_vana", + "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <1050000 0 2850000 0>; + rgltr-max-voltage = <1050000 0 2850000 0>; + rgltr-load-current = <105000 0 80000 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_active + &cam_sensor_rear2_active>; + pinctrl-1 = <&cam_sensor_mclk2_suspend + &cam_sensor_rear2_suspend>; + gpios = <&tlmm 15 0>, + <&tlmm 9 0>; + gpio-reset = <1>; + gpio-req-tbl-num = <0 1>; + gpio-req-tbl-flags = <1 0>; + gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + qcom,cam-sensor@2 { + cell-index = <2>; + compatible = "qcom,cam-sensor"; + reg = <0x02>; + csiphy-sd-index = <2>; + sensor-position-roll = <270>; + sensor-position-pitch = <0>; + sensor-position-yaw = <0>; + eeprom-src = <&eeprom_front>; + actuator-src = <&actuator_front>; + led-flash-src = <&led_flash_front>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&camera_vana_ldo>; + cam_vdig-supply = <&camera_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0 2850000 1050000 0>; + rgltr-max-voltage = <0 2850000 1050000 0>; + rgltr-load-current = <0 80000 105000 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_active + &cam_sensor_front_active>; + pinctrl-1 = <&cam_sensor_mclk1_suspend + &cam_sensor_front_suspend>; + gpios = <&tlmm 14 0>, + <&tlmm 28 0>; + gpio-reset = <1>; + gpio-req-tbl-num = <0 1>; + gpio-req-tbl-flags = <1 0>; + gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2"; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + qcom,cam-sensor@3 { + cell-index = <3>; + compatible = "qcom,cam-sensor"; + reg = <0x03>; + csiphy-sd-index = <3>; + sensor-position-roll = <270>; + sensor-position-pitch = <0>; + sensor-position-yaw = <0>; + led-flash-src = <&led_flash_iris>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&camera_vana_ldo>; + cam_vdig-supply = <&camera_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0 2850000 1050000 0>; + rgltr-max-voltage = <0 2850000 1050000 0>; + rgltr-load-current = <0 80000 105000 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk3_active + &cam_sensor_iris_active>; + pinctrl-1 = <&cam_sensor_mclk3_suspend + &cam_sensor_iris_suspend>; + gpios = <&tlmm 16 0>, + <&tlmm 9 0>; + gpio-reset = <1>; + gpio-req-tbl-num = <0 1>; + gpio-req-tbl-flags = <1 0>; + gpio-req-tbl-label = "CAMIF_MCLK3", + "CAM_RESET3"; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + qcom,cam-sensor@4 { + cell-index = <4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + csiphy-sd-index = <0>; + sensor-position-roll = <270>; + sensor-position-pitch = <0>; + sensor-position-yaw = <180>; + actuator-src = <>; + led-flash-src = <>; + eeprom-src = <&eeprom_back>; + cam_vdig-supply = <>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&pm8998_s4>; + cam_clk-supply = <&titan_top_gdsc>; + regulator-names = "cam_vio", "cam_vana", + "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <1800000 1800000 0>; + rgltr-max-voltage = <1800000 1800000 0>; + rgltr-load-current = <80000 100000 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_active + &cam_sensor_rear4_active>; + pinctrl-1 = <&cam_sensor_mclk0_suspend + &cam_sensor_rear4_suspend>; + gpios = <&tlmm 13 0>, + <&tlmm 11 0>; + gpio-reset = <1>; + gpio-req-tbl-num = <0 1>; + gpio-req-tbl-flags = <1 0>; + gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + sensor-mode = <0>; + cci-master = <0>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; + + qcom,cam-sensor@5 { + cell-index = <5>; + compatible = "qcom,cam-sensor"; + reg = <0x05>; + csiphy-sd-index = <1>; + sensor-position-roll = <270>; + sensor-position-pitch = <0>; + sensor-position-yaw = <0>; + led-flash-src = <>; + cam_vio-supply = <&pm8998_lvs1>; + cam_vana-supply = <&camera_vana_ldo>; + cam_vdig-supply = <&camera_ldo>; + cam_clk-supply = <&titan_top_gdsc>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", + "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0 2850000 1050000 0>; + rgltr-max-voltage = <0 2850000 1050000 0>; + rgltr-load-current = <0 80000 105000 0>; + gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_active + &cam_sensor_front_active>; + pinctrl-1 = <&cam_sensor_mclk1_suspend + &cam_sensor_front_suspend>; + gpios = <&tlmm 14 0>, + <&tlmm 28 0>; + gpio-reset = <1>; + gpio-req-tbl-num = <0 1>; + gpio-req-tbl-flags = <1 0>; + gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2"; + sensor-mode = <0>; + cci-master = <1>; + status = "ok"; + clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <24000000>; + }; +}; diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dts b/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dts index fff2869290bd..68a4134fa3a4 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dts @@ -16,6 +16,8 @@ #include "sdm845-v2.dtsi" #include "sdm845-sde-display.dtsi" #include "sdm845-mtp.dtsi" +#include "sdm845-v2-robotics.dtsi" +#include "sdm845-v2-camera-sensor-mtp-robotics.dtsi" / { model = "Qualcomm Technologies, Inc. MSM sdm845 V2 Robotics MTP"; diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dtsi b/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dtsi new file mode 100644 index 000000000000..7f4e710917cb --- /dev/null +++ b/arch/arm64/boot/dts/qcom/sdm845-v2-robotics.dtsi @@ -0,0 +1,44 @@ +/* + * Copyright (c) 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. + */ + +&tlmm { + cam_sensor_rear4_active: cam_sensor_rear4_active { + /* RESET */ + mux { + pins = "gpio11"; + function = "gpio"; + }; + + config { + pins = "gpio11"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear4_suspend: cam_sensor_rear4_suspend { + /* RESET */ + mux { + pins = "gpio11"; + function = "gpio"; + }; + + config { + pins = "gpio11"; + bias-pull-down; /* PULL DOWN */ + drive-strength = <2>; /* 2 MA */ + output-low; + }; + }; + +}; diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dts b/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dts new file mode 100644 index 000000000000..bec2638fd713 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dts @@ -0,0 +1,25 @@ +/* Copyright (c) 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/; +#include "sdm845-v2.1-rb3.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. sda845 v2.1 TurboX-SOM_V01"; + compatible = "qcom,sda845-mtp", "qcom,sda845", "qcom,mtp"; + qcom,msm-id = <341 0x20001>; + qcom,board-id = <8 7>; + aliases { + spi0 = &qupv3_se5_spi; + }; +}; diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi b/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi new file mode 100644 index 000000000000..aec260c2a553 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi @@ -0,0 +1,103 @@ +/* Copyright (c) 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 +#include +#include +#include +#include + +#include "sda845-v2.1.dtsi" +#include "sdm845-sde-display.dtsi" +#include "sdm845-mtp.dtsi" +#include "sdm845-audio-overlay.dtsi" + +&labibb { + status = "disabled"; +}; + +&pmi8998_wled { + status = "disabled"; +}; + +&qupv3_se3_i2c { + status = "disabled"; +}; + +&pmi8998_pdphy { + vbus-supply = <&smb2_vbus>; +}; + +&pmi8998_pwm_2 { + status = "ok"; +}; + +&ext_5v_boost { + status = "disabled"; +}; + +&wil6210 { + status = "disabled"; +}; + +&smb1355_0 { + status = "disabled"; +}; + +&smb1355_1 { + status = "disabled"; +}; + +&key_home_default { + pins = "gpio4"; +}; + +&max_rst_active { + mux { + pins = "gpio31","gpio77","gpio32"; + }; + config { + pins = "gpio31","gpio77","gpio32"; + }; +}; + +&max_rst_suspend { + mux { + pins = "gpio31","gpio77","gpio32"; + }; + config { + pins = "gpio31","gpio77","gpio32"; + }; +}; + +&camera_dvdd_en_default { + pins = "gpio11"; +}; + +&sde_dp { + status = "disabled"; +}; + +&mdss_mdp { + status = "disabled"; +}; + +&soc { + qcom,qbt1000 { + compatible = "qcom,qbt1000"; + clock-names = "core", "iface"; + clock-frequency = <25000000>; + qcom,ipc-gpio = <&tlmm 121 0>; + qcom,finger-detect-gpio = <&pm8998_gpios 4 0>; + }; + }; + diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi index 23567f0f7b58..bb6f998b27b7 100644 --- a/arch/arm64/boot/dts/qcom/sdm845.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi @@ -4104,6 +4104,7 @@ &gpu_cx_gdsc { parent-supply = <&pm8998_s9_level>; + vdd_parent-supply = <&pm8998_s9_level>; status = "ok"; }; diff --git a/arch/arm64/configs/cuttlefish_defconfig b/arch/arm64/configs/cuttlefish_defconfig index a16f315604e8..5aead19180f8 100644 --- a/arch/arm64/configs/cuttlefish_defconfig +++ b/arch/arm64/configs/cuttlefish_defconfig @@ -80,6 +80,7 @@ CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_XFRM_USER=y +CONFIG_XFRM_INTERFACE=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y @@ -122,6 +123,7 @@ CONFIG_NF_CT_NETLINK=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_CT=y CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y @@ -142,6 +144,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y @@ -178,6 +181,7 @@ CONFIG_IP6_NF_RAW=y CONFIG_L2TP=y CONFIG_NET_SCHED=y CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_NETEM=y CONFIG_NET_CLS_U32=y CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y @@ -225,6 +229,7 @@ CONFIG_PPP_DEFLATE=y CONFIG_PPP_MPPE=y CONFIG_PPTP=y CONFIG_PPPOL2TP=y +CONFIG_USB_RTL8152=y CONFIG_USB_USBNET=y # CONFIG_USB_NET_AX8817X is not set # CONFIG_USB_NET_AX88179_178A is not set @@ -298,6 +303,12 @@ CONFIG_DRM=y CONFIG_DRM_VIRTIO_GPU=y CONFIG_SOUND=y CONFIG_SND=y +CONFIG_SND_HRTIMER=y +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +# CONFIG_SND_DRIVERS is not set +CONFIG_SND_INTEL8X0=y +# CONFIG_SND_USB is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_A4TECH=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig old mode 100644 new mode 100755 index 74bd3d9edf97..a06ad8ad2f62 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -169,9 +169,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -221,6 +221,7 @@ CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_FLOW=y +CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y @@ -452,6 +453,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -620,6 +622,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig old mode 100644 new mode 100755 index 49461679ce90..6ac16ecc6214 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -173,9 +173,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -226,6 +226,7 @@ CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_FLOW=y +CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y @@ -462,6 +463,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -636,6 +638,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y diff --git a/arch/arm64/configs/msm8953-perf_defconfig b/arch/arm64/configs/msm8953-perf_defconfig old mode 100644 new mode 100755 index 92135e054795..906b1c6c5966 --- a/arch/arm64/configs/msm8953-perf_defconfig +++ b/arch/arm64/configs/msm8953-perf_defconfig @@ -168,9 +168,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -220,6 +220,7 @@ CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_FLOW=y +CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y @@ -451,6 +452,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -625,6 +627,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y diff --git a/arch/arm64/configs/msm8953_defconfig b/arch/arm64/configs/msm8953_defconfig old mode 100644 new mode 100755 index d41ea44b0df5..1247d470001d --- a/arch/arm64/configs/msm8953_defconfig +++ b/arch/arm64/configs/msm8953_defconfig @@ -172,9 +172,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y # CONFIG_NETFILTER_XT_MATCH_SCTP is not set @@ -225,6 +225,7 @@ CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_FLOW=y +CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y @@ -461,6 +462,7 @@ CONFIG_HID_ELECOM=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MULTITOUCH=y +CONFIG_HID_SONY=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -642,6 +644,7 @@ CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_QFMT_V2=y CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_TMPFS=y diff --git a/arch/arm64/configs/ranchu64_defconfig b/arch/arm64/configs/ranchu64_defconfig index fc55008d8c4c..21a15ed825e2 100644 --- a/arch/arm64/configs/ranchu64_defconfig +++ b/arch/arm64/configs/ranchu64_defconfig @@ -105,6 +105,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QTAGUID=y diff --git a/arch/arm64/configs/sdm670-perf_defconfig b/arch/arm64/configs/sdm670-perf_defconfig old mode 100644 new mode 100755 index bee1795220e8..e3c71c06fd66 --- a/arch/arm64/configs/sdm670-perf_defconfig +++ b/arch/arm64/configs/sdm670-perf_defconfig @@ -168,9 +168,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_SOCKET=y @@ -220,6 +220,7 @@ CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_FLOW=y +CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y diff --git a/arch/arm64/configs/sdm670_defconfig b/arch/arm64/configs/sdm670_defconfig old mode 100644 new mode 100755 index a7db8ab854ec..05b5118a1d7e --- a/arch/arm64/configs/sdm670_defconfig +++ b/arch/arm64/configs/sdm670_defconfig @@ -173,9 +173,9 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_QTAGUID=y CONFIG_NETFILTER_XT_MATCH_QUOTA=y CONFIG_NETFILTER_XT_MATCH_QUOTA2=y CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y @@ -227,6 +227,7 @@ CONFIG_NET_CLS_FW=y CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_FLOW=y +CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_CMP=y CONFIG_NET_EMATCH_NBYTE=y diff --git a/arch/x86/configs/i386_ranchu_defconfig b/arch/x86/configs/i386_ranchu_defconfig index a1c83c4e78ae..e3c769260750 100644 --- a/arch/x86/configs/i386_ranchu_defconfig +++ b/arch/x86/configs/i386_ranchu_defconfig @@ -137,6 +137,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QTAGUID=y diff --git a/arch/x86/configs/x86_64_cuttlefish_defconfig b/arch/x86/configs/x86_64_cuttlefish_defconfig index bdc5c66a322f..9219f9b2e46a 100644 --- a/arch/x86/configs/x86_64_cuttlefish_defconfig +++ b/arch/x86/configs/x86_64_cuttlefish_defconfig @@ -84,6 +84,7 @@ CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_XFRM_USER=y +CONFIG_XFRM_INTERFACE=y CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y @@ -98,6 +99,7 @@ CONFIG_SYN_COOKIES=y CONFIG_NET_IPVTI=y CONFIG_INET_ESP=y # CONFIG_INET_XFRM_MODE_BEET is not set +CONFIG_INET_UDP_DIAG=y CONFIG_INET_DIAG_DESTROY=y CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set @@ -133,6 +135,7 @@ CONFIG_NF_CT_NETLINK=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_CONNMARK=y CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_CT=y CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFLOG=y @@ -153,6 +156,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QTAGUID=y @@ -191,6 +195,7 @@ CONFIG_IP6_NF_MANGLE=y CONFIG_IP6_NF_RAW=y CONFIG_NET_SCHED=y CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_NETEM=y CONFIG_NET_CLS_U32=y CONFIG_NET_CLS_BPF=y CONFIG_NET_EMATCH=y @@ -242,6 +247,7 @@ CONFIG_PPP_DEFLATE=y CONFIG_PPP_MPPE=y CONFIG_PPPOLAC=y CONFIG_PPPOPNS=y +CONFIG_USB_RTL8152=y CONFIG_USB_USBNET=y # CONFIG_USB_NET_AX8817X is not set # CONFIG_USB_NET_AX88179_178A is not set @@ -324,6 +330,12 @@ CONFIG_DRM_VIRTIO_GPU=y CONFIG_FB=y CONFIG_SOUND=y CONFIG_SND=y +CONFIG_SND_HRTIMER=y +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +# CONFIG_SND_DRIVERS is not set +CONFIG_SND_INTEL8X0=y +# CONFIG_SND_USB is not set CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_A4TECH=y @@ -456,6 +468,7 @@ CONFIG_TIMER_STATS=y CONFIG_RCU_CPU_STALL_TIMEOUT=60 CONFIG_ENABLE_DEFAULT_TRACERS=y CONFIG_UPROBE_EVENT=y +CONFIG_DEBUG_SET_MODULE_RONX=y CONFIG_IO_DELAY_NONE=y CONFIG_DEBUG_BOOT_PARAMS=y CONFIG_OPTIMIZE_INLINING=y diff --git a/arch/x86/configs/x86_64_ranchu_defconfig b/arch/x86/configs/x86_64_ranchu_defconfig index d50434f501fb..8fde64ec4208 100644 --- a/arch/x86/configs/x86_64_ranchu_defconfig +++ b/arch/x86/configs/x86_64_ranchu_defconfig @@ -135,6 +135,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_OWNER=y CONFIG_NETFILTER_XT_MATCH_POLICY=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_QTAGUID=y diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 54a57e52da91..e3c069e9ab87 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -354,6 +354,7 @@ struct binder_error { * @min_priority: minimum scheduling priority * (invariant after initialized) * @inherit_rt: inherit RT scheduling policy from caller + * @txn_security_ctx: require sender's security context * (invariant after initialized) * @async_todo: list of async work items * (protected by @proc->inner_lock) @@ -393,6 +394,7 @@ struct binder_node { u8 sched_policy:2; u8 inherit_rt:1; u8 accept_fds:1; + u8 txn_security_ctx:1; u8 min_priority; }; bool has_async_transaction; @@ -650,6 +652,7 @@ struct binder_transaction { struct binder_priority saved_priority; bool set_priority_called; kuid_t sender_euid; + binder_uintptr_t security_ctx; /** * @lock: protects @from, @to_proc, and @to_thread * @@ -1359,6 +1362,7 @@ static struct binder_node *binder_init_node_ilocked( node->min_priority = to_kernel_prio(node->sched_policy, priority); node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS); node->inherit_rt = !!(flags & FLAT_BINDER_FLAG_INHERIT_RT); + node->txn_security_ctx = !!(flags & FLAT_BINDER_FLAG_TXN_SECURITY_CTX); spin_lock_init(&node->lock); INIT_LIST_HEAD(&node->work.entry); INIT_LIST_HEAD(&node->async_todo); @@ -2897,6 +2901,8 @@ static void binder_transaction(struct binder_proc *proc, binder_size_t last_fixup_min_off = 0; struct binder_context *context = proc->context; int t_debug_id = atomic_inc_return(&binder_last_id); + char *secctx = NULL; + u32 secctx_sz = 0; e = binder_transaction_log_add(&binder_transaction_log); e->debug_id = t_debug_id; @@ -3120,6 +3126,20 @@ static void binder_transaction(struct binder_proc *proc, t->priority = target_proc->default_priority; } + if (target_node && target_node->txn_security_ctx) { + u32 secid; + + security_task_getsecid(proc->tsk, &secid); + ret = security_secid_to_secctx(secid, &secctx, &secctx_sz); + if (ret) { + return_error = BR_FAILED_REPLY; + return_error_param = ret; + return_error_line = __LINE__; + goto err_get_secctx_failed; + } + extra_buffers_size += ALIGN(secctx_sz, sizeof(u64)); + } + trace_binder_transaction(reply, t, target_node); t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size, @@ -3136,6 +3156,19 @@ static void binder_transaction(struct binder_proc *proc, t->buffer = NULL; goto err_binder_alloc_buf_failed; } + if (secctx) { + size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) + + ALIGN(tr->offsets_size, sizeof(void *)) + + ALIGN(extra_buffers_size, sizeof(void *)) - + ALIGN(secctx_sz, sizeof(u64)); + char *kptr = t->buffer->data + buf_offset; + + t->security_ctx = (uintptr_t)kptr + + binder_alloc_get_user_buffer_offset(&target_proc->alloc); + memcpy(kptr, secctx, secctx_sz); + security_release_secctx(secctx, secctx_sz); + secctx = NULL; + } t->buffer->debug_id = t->debug_id; t->buffer->transaction = t; t->buffer->target_node = target_node; @@ -3406,6 +3439,9 @@ static void binder_transaction(struct binder_proc *proc, t->buffer->transaction = NULL; binder_alloc_free_buf(&target_proc->alloc, t->buffer); err_binder_alloc_buf_failed: + if (secctx) + security_release_secctx(secctx, secctx_sz); +err_get_secctx_failed: kfree(tcomplete); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); err_alloc_tcomplete_failed: @@ -4052,11 +4088,13 @@ static int binder_thread_read(struct binder_proc *proc, while (1) { uint32_t cmd; - struct binder_transaction_data tr; + struct binder_transaction_data_secctx tr; + struct binder_transaction_data *trd = &tr.transaction_data; struct binder_work *w = NULL; struct list_head *list = NULL; struct binder_transaction *t = NULL; struct binder_thread *t_from; + size_t trsize = sizeof(*trd); binder_inner_proc_lock(proc); if (!binder_worklist_empty_ilocked(&thread->todo)) @@ -4252,41 +4290,47 @@ static int binder_thread_read(struct binder_proc *proc, struct binder_node *target_node = t->buffer->target_node; struct binder_priority node_prio; - tr.target.ptr = target_node->ptr; - tr.cookie = target_node->cookie; + trd->target.ptr = target_node->ptr; + trd->cookie = target_node->cookie; node_prio.sched_policy = target_node->sched_policy; node_prio.prio = target_node->min_priority; binder_transaction_priority(current, t, node_prio, target_node->inherit_rt); cmd = BR_TRANSACTION; } else { - tr.target.ptr = 0; - tr.cookie = 0; + trd->target.ptr = 0; + trd->cookie = 0; cmd = BR_REPLY; } - tr.code = t->code; - tr.flags = t->flags; - tr.sender_euid = from_kuid(current_user_ns(), t->sender_euid); + trd->code = t->code; + trd->flags = t->flags; + trd->sender_euid = from_kuid(current_user_ns(), t->sender_euid); t_from = binder_get_txn_from(t); if (t_from) { struct task_struct *sender = t_from->proc->tsk; - tr.sender_pid = task_tgid_nr_ns(sender, - task_active_pid_ns(current)); + trd->sender_pid = + task_tgid_nr_ns(sender, + task_active_pid_ns(current)); } else { - tr.sender_pid = 0; + trd->sender_pid = 0; } - tr.data_size = t->buffer->data_size; - tr.offsets_size = t->buffer->offsets_size; - tr.data.ptr.buffer = (binder_uintptr_t) + trd->data_size = t->buffer->data_size; + trd->offsets_size = t->buffer->offsets_size; + trd->data.ptr.buffer = (binder_uintptr_t) ((uintptr_t)t->buffer->data + binder_alloc_get_user_buffer_offset(&proc->alloc)); - tr.data.ptr.offsets = tr.data.ptr.buffer + + trd->data.ptr.offsets = trd->data.ptr.buffer + ALIGN(t->buffer->data_size, sizeof(void *)); + tr.secctx = t->security_ctx; + if (t->security_ctx) { + cmd = BR_TRANSACTION_SEC_CTX; + trsize = sizeof(tr); + } if (put_user(cmd, (uint32_t __user *)ptr)) { if (t_from) binder_thread_dec_tmpref(t_from); @@ -4297,7 +4341,7 @@ static int binder_thread_read(struct binder_proc *proc, return -EFAULT; } ptr += sizeof(uint32_t); - if (copy_to_user(ptr, &tr, sizeof(tr))) { + if (copy_to_user(ptr, &tr, trsize)) { if (t_from) binder_thread_dec_tmpref(t_from); @@ -4306,7 +4350,7 @@ static int binder_thread_read(struct binder_proc *proc, return -EFAULT; } - ptr += sizeof(tr); + ptr += trsize; trace_binder_transaction_received(t); binder_stat_br(proc, thread, cmd); @@ -4314,16 +4358,18 @@ static int binder_thread_read(struct binder_proc *proc, "%d:%d %s %d %d:%d, cmd %d size %zd-%zd ptr %016llx-%016llx\n", proc->pid, thread->pid, (cmd == BR_TRANSACTION) ? "BR_TRANSACTION" : - "BR_REPLY", + (cmd == BR_TRANSACTION_SEC_CTX) ? + "BR_TRANSACTION_SEC_CTX" : "BR_REPLY", t->debug_id, t_from ? t_from->proc->pid : 0, t_from ? t_from->pid : 0, cmd, t->buffer->data_size, t->buffer->offsets_size, - (u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets); + (u64)trd->data.ptr.buffer, + (u64)trd->data.ptr.offsets); if (t_from) binder_thread_dec_tmpref(t_from); t->buffer->allow_user_free = 1; - if (cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)) { + if (cmd != BR_REPLY && !(t->flags & TF_ONE_WAY)) { binder_inner_proc_lock(thread->proc); t->to_parent = thread->transaction_stack; t->to_thread = thread; @@ -4668,7 +4714,8 @@ static int binder_ioctl_write_read(struct file *filp, return ret; } -static int binder_ioctl_set_ctx_mgr(struct file *filp) +static int binder_ioctl_set_ctx_mgr(struct file *filp, + struct flat_binder_object *fbo) { int ret = 0; struct binder_proc *proc = filp->private_data; @@ -4697,7 +4744,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp) } else { context->binder_context_mgr_uid = curr_euid; } - new_node = binder_new_node(proc, NULL); + new_node = binder_new_node(proc, fbo); if (!new_node) { ret = -ENOMEM; goto out; @@ -4819,8 +4866,20 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) binder_inner_proc_unlock(proc); break; } + case BINDER_SET_CONTEXT_MGR_EXT: { + struct flat_binder_object fbo; + + if (copy_from_user(&fbo, ubuf, sizeof(fbo))) { + ret = -EINVAL; + goto err; + } + ret = binder_ioctl_set_ctx_mgr(filp, &fbo); + if (ret) + goto err; + break; + } case BINDER_SET_CONTEXT_MGR: - ret = binder_ioctl_set_ctx_mgr(filp); + ret = binder_ioctl_set_ctx_mgr(filp, NULL); if (ret) goto err; break; diff --git a/drivers/base/dma-removed.c b/drivers/base/dma-removed.c index 4ecce1f4d0fe..0223751e052b 100644 --- a/drivers/base/dma-removed.c +++ b/drivers/base/dma-removed.c @@ -221,11 +221,11 @@ void *removed_alloc(struct device *dev, size_t size, dma_addr_t *handle, { bool no_kernel_mapping = attrs & DMA_ATTR_NO_KERNEL_MAPPING; bool skip_zeroing = attrs & DMA_ATTR_SKIP_ZEROING; - int pageno; + unsigned int pageno; unsigned long order; void __iomem *addr = NULL; struct removed_region *dma_mem = dev->removed_mem; - int nbits; + unsigned int nbits; unsigned int align; if (!gfpflags_allow_blocking(gfp)) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 2d0574200459..94c371161fcc 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -103,6 +103,7 @@ #define FASTRPC_LINK_DISCONNECTING (0x7) #define FASTRPC_LINK_REMOTE_DISCONNECTING (0x8) #define FASTRPC_GLINK_INTENT_LEN (64) +#define FASTRPC_GLINK_INTENT_NUM (16) #define PERF_KEYS \ "count:flush:map:copy:glink:getargs:putargs:invalidate:invoke:tid:ptr" @@ -3356,7 +3357,7 @@ static const struct file_operations debugfs_fops = { static int fastrpc_channel_open(struct fastrpc_file *fl) { struct fastrpc_apps *me = &gfa; - int cid, err = 0; + int cid, ii, err = 0; mutex_lock(&me->smd_mutex); @@ -3403,15 +3404,11 @@ static int fastrpc_channel_open(struct fastrpc_file *fl) kref_init(&me->channel[cid].kref); pr_info("'opened /dev/%s c %d %d'\n", gcinfo[cid].name, MAJOR(me->dev_no), cid); - if (me->glink) { - err = glink_queue_rx_intent(me->channel[cid].chan, NULL, + + for (ii = 0; ii < FASTRPC_GLINK_INTENT_NUM && me->glink; ii++) + glink_queue_rx_intent(me->channel[cid].chan, NULL, FASTRPC_GLINK_INTENT_LEN); - err |= glink_queue_rx_intent(me->channel[cid].chan, - NULL, FASTRPC_GLINK_INTENT_LEN); - if (err) - pr_warn("adsprpc: initial intent fail for %d err %d\n", - cid, err); - } + if (cid == 0 && me->channel[cid].ssrcount != me->channel[cid].prevssrcount) { if (fastrpc_mmap_remove_ssr(fl)) diff --git a/drivers/char/diag/diag_dci.c b/drivers/char/diag/diag_dci.c index 4cdf0926a253..0da2a3439d08 100644 --- a/drivers/char/diag/diag_dci.c +++ b/drivers/char/diag/diag_dci.c @@ -1951,7 +1951,9 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len) if (!buf) return -EIO; - if (len <= sizeof(struct dci_pkt_req_t) || len > DCI_REQ_BUF_SIZE) { + if (len <= (sizeof(struct dci_pkt_req_t) + + sizeof(struct diag_pkt_header_t)) || + len > DCI_REQ_BUF_SIZE) { pr_err("diag: dci: Invalid length %d len in %s", len, __func__); return -EIO; } @@ -2074,9 +2076,9 @@ int diag_process_dci_transaction(unsigned char *buf, int len) uint8_t *event_mask_ptr; struct diag_dci_client_tbl *dci_entry = NULL; - if (!temp) { - pr_err("diag: Invalid buffer in %s\n", __func__); - return -ENOMEM; + if (!temp || len < sizeof(int)) { + pr_err("diag: Invalid input in %s\n", __func__); + return -EINVAL; } /* This is Pkt request/response transaction */ @@ -2132,7 +2134,7 @@ int diag_process_dci_transaction(unsigned char *buf, int len) count = 0; /* iterator for extracting log codes */ while (count < num_codes) { - if (read_len >= USER_SPACE_DATA) { + if (read_len + sizeof(uint16_t) > len) { pr_err("diag: dci: Invalid length for log type in %s", __func__); mutex_unlock(&driver->dci_mutex); @@ -2246,7 +2248,7 @@ int diag_process_dci_transaction(unsigned char *buf, int len) pr_debug("diag: head of dci event mask %pK\n", event_mask_ptr); count = 0; /* iterator for extracting log codes */ while (count < num_codes) { - if (read_len >= USER_SPACE_DATA) { + if (read_len + sizeof(int) > len) { pr_err("diag: dci: Invalid length for event type in %s", __func__); mutex_unlock(&driver->dci_mutex); diff --git a/drivers/char/diag/diag_dci.h b/drivers/char/diag/diag_dci.h index 835c0c1708cf..f727609a54f0 100644 --- a/drivers/char/diag/diag_dci.h +++ b/drivers/char/diag/diag_dci.h @@ -26,7 +26,7 @@ #define DISABLE_LOG_MASK 0 #define MAX_EVENT_SIZE 512 #define DCI_CLIENT_INDEX_INVALID -1 -#define DCI_LOG_CON_MIN_LEN 14 +#define DCI_LOG_CON_MIN_LEN 16 #define DCI_EVENT_CON_MIN_LEN 16 #define EXT_HDR_LEN 8 diff --git a/drivers/char/diag/diag_masks.c b/drivers/char/diag/diag_masks.c index 395209473a3b..8508246fb859 100644 --- a/drivers/char/diag/diag_masks.c +++ b/drivers/char/diag/diag_masks.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -641,7 +641,8 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, struct diag_build_mask_req_t *req = NULL; struct diag_msg_build_mask_t rsp; - if (!src_buf || !dest_buf || src_len <= 0 || dest_len <= 0) { + if (!src_buf || !dest_buf || src_len <= 0 || dest_len <= 0 || + src_len < sizeof(struct diag_build_mask_req_t)) { pr_err("diag: Invalid input in %s, src_buf: %pK, src_len: %d, dest_buf: %pK, dest_len: %d\n", __func__, src_buf, src_len, dest_buf, dest_len); return -EINVAL; @@ -703,7 +704,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, mask_info = (!info) ? &msg_mask : info->msg_mask; if (!src_buf || !dest_buf || src_len <= 0 || dest_len <= 0 || - !mask_info) { + !mask_info || (src_len < sizeof(struct diag_build_mask_req_t))) { pr_err("diag: Invalid input in %s, src_buf: %pK, src_len: %d, dest_buf: %pK, dest_len: %d, mask_info: %pK\n", __func__, src_buf, src_len, dest_buf, dest_len, mask_info); diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index 4755790e2c37..36a74a4e5f4e 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -1029,7 +1029,7 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) uint32_t pd_mask = 0; struct diag_md_session_t *info = NULL; - if (!buf) + if (!buf || len <= 0) return -EIO; /* Check if the command is a supported mask command */ @@ -1040,18 +1040,31 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) } temp = buf; - entry.cmd_code = (uint16_t)(*(uint8_t *)temp); - temp += sizeof(uint8_t); - entry.subsys_id = (uint16_t)(*(uint8_t *)temp); - temp += sizeof(uint8_t); - entry.cmd_code_hi = (uint16_t)(*(uint16_t *)temp); - entry.cmd_code_lo = (uint16_t)(*(uint16_t *)temp); - temp += sizeof(uint16_t); - - pr_debug("diag: In %s, received cmd %02x %02x %02x\n", - __func__, entry.cmd_code, entry.subsys_id, entry.cmd_code_hi); - - if (*buf == DIAG_CMD_LOG_ON_DMND && driver->log_on_demand_support && + if (len >= sizeof(uint8_t)) { + entry.cmd_code = (uint16_t)(*(uint8_t *)temp); + pr_debug("diag: received cmd_code %02x\n", entry.cmd_code); + } + if (len >= (2 * sizeof(uint8_t))) { + temp += sizeof(uint8_t); + entry.subsys_id = (uint16_t)(*(uint8_t *)temp); + pr_debug("diag: received subsys_id %02x\n", entry.subsys_id); + } + if (len == (3 * sizeof(uint8_t))) { + temp += sizeof(uint8_t); + entry.cmd_code_hi = (uint16_t)(*(uint8_t *)temp); + entry.cmd_code_lo = (uint16_t)(*(uint8_t *)temp); + pr_debug("diag: received cmd_code_hi %02x\n", + entry.cmd_code_hi); + } else if (len >= (2 * sizeof(uint8_t)) + sizeof(uint16_t)) { + temp += sizeof(uint8_t); + entry.cmd_code_hi = (uint16_t)(*(uint16_t *)temp); + entry.cmd_code_lo = (uint16_t)(*(uint16_t *)temp); + pr_debug("diag: received cmd_code_hi %02x\n", + entry.cmd_code_hi); + } + + if ((len >= sizeof(uint8_t)) && *buf == DIAG_CMD_LOG_ON_DMND && + driver->log_on_demand_support && driver->feature[PERIPHERAL_MODEM].rcvd_feature_mask) { write_len = diag_cmd_log_on_demand(buf, len, driver->apps_rsp_buf, @@ -1094,14 +1107,16 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) #if defined(CONFIG_DIAG_OVER_USB) /* Check for the command/respond msg for the maximum packet length */ - if ((*buf == 0x4b) && (*(buf+1) == 0x12) && + if ((len >= (4 * sizeof(uint8_t))) && + (*buf == 0x4b) && (*(buf+1) == 0x12) && (*(uint16_t *)(buf+2) == 0x0055)) { for (i = 0; i < 4; i++) *(driver->apps_rsp_buf+i) = *(buf+i); *(uint32_t *)(driver->apps_rsp_buf+4) = DIAG_MAX_REQ_SIZE; diag_send_rsp(driver->apps_rsp_buf, 8, pid); return 0; - } else if ((*buf == 0x4b) && (*(buf+1) == 0x12) && + } else if ((len >= ((2 * sizeof(uint8_t)) + sizeof(uint16_t))) && + (*buf == 0x4b) && (*(buf+1) == 0x12) && (*(uint16_t *)(buf+2) == DIAG_DIAG_STM)) { len = diag_process_stm_cmd(buf, driver->apps_rsp_buf); if (len > 0) { @@ -1111,7 +1126,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return len; } /* Check for time sync query command */ - else if ((*buf == DIAG_CMD_DIAG_SUBSYS) && + else if ((len >= ((2 * sizeof(uint8_t)) + sizeof(uint16_t))) && + (*buf == DIAG_CMD_DIAG_SUBSYS) && (*(buf+1) == DIAG_SS_DIAG) && (*(uint16_t *)(buf+2) == DIAG_GET_TIME_API)) { write_len = diag_process_time_sync_query_cmd(buf, len, @@ -1122,7 +1138,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* Check for time sync switch command */ - else if ((*buf == DIAG_CMD_DIAG_SUBSYS) && + else if ((len >= ((2 * sizeof(uint8_t)) + sizeof(uint16_t))) && + (*buf == DIAG_CMD_DIAG_SUBSYS) && (*(buf+1) == DIAG_SS_DIAG) && (*(uint16_t *)(buf+2) == DIAG_SET_TIME_API)) { write_len = diag_process_time_sync_switch_cmd(buf, len, @@ -1133,7 +1150,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* Check for diag id command */ - else if ((*buf == DIAG_CMD_DIAG_SUBSYS) && + else if ((len >= ((2 * sizeof(uint8_t)) + sizeof(uint16_t))) && + (*buf == DIAG_CMD_DIAG_SUBSYS) && (*(buf+1) == DIAG_SS_DIAG) && (*(uint16_t *)(buf+2) == DIAG_GET_DIAG_ID)) { write_len = diag_process_diag_id_query_cmd(buf, len, @@ -1144,7 +1162,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* Check for download command */ - else if ((chk_apps_master()) && (*buf == 0x3A)) { + else if ((len >= sizeof(uint8_t)) && (chk_apps_master()) && + (*buf == 0x3A)) { /* send response back */ driver->apps_rsp_buf[0] = *buf; diag_send_rsp(driver->apps_rsp_buf, 1, pid); @@ -1157,8 +1176,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* Check for polling for Apps only DIAG */ - else if ((*buf == 0x4b) && (*(buf+1) == 0x32) && - (*(buf+2) == 0x03)) { + else if ((len >= (3 * sizeof(uint8_t))) && + (*buf == 0x4b) && (*(buf+1) == 0x32) && (*(buf+2) == 0x03)) { /* If no one has registered for polling */ if (chk_polling_response()) { /* Respond to polling for Apps only DIAG */ @@ -1172,7 +1191,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) } } /* Return the Delayed Response Wrap Status */ - else if ((*buf == 0x4b) && (*(buf+1) == 0x32) && + else if ((len >= (4 * sizeof(uint8_t))) && + (*buf == 0x4b) && (*(buf+1) == 0x32) && (*(buf+2) == 0x04) && (*(buf+3) == 0x0)) { memcpy(driver->apps_rsp_buf, buf, 4); driver->apps_rsp_buf[4] = wrap_enabled; @@ -1180,7 +1200,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* Wrap the Delayed Rsp ID */ - else if ((*buf == 0x4b) && (*(buf+1) == 0x32) && + else if ((len >= (4 * sizeof(uint8_t))) && + (*buf == 0x4b) && (*(buf+1) == 0x32) && (*(buf+2) == 0x05) && (*(buf+3) == 0x0)) { wrap_enabled = true; memcpy(driver->apps_rsp_buf, buf, 4); @@ -1189,7 +1210,8 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* Mobile ID Rsp */ - else if ((*buf == DIAG_CMD_DIAG_SUBSYS) && + else if ((len >= (4 * sizeof(uint8_t))) && + (*buf == DIAG_CMD_DIAG_SUBSYS) && (*(buf+1) == DIAG_SS_PARAMS) && (*(buf+2) == DIAG_EXT_MOBILE_ID) && (*(buf+3) == 0x0)) { write_len = diag_cmd_get_mobile_id(buf, len, @@ -1212,7 +1234,7 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) !(driver->diagfwd_cntl[PERIPHERAL_MODEM]->ch_open) && !(driver->feature[PERIPHERAL_MODEM].rcvd_feature_mask)) { /* respond to 0x0 command */ - if (*buf == 0x00) { + if ((len >= sizeof(uint8_t)) && *buf == 0x00) { for (i = 0; i < 55; i++) driver->apps_rsp_buf[i] = 0; @@ -1220,7 +1242,7 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) return 0; } /* respond to 0x7c command */ - else if (*buf == 0x7c) { + else if ((len >= sizeof(uint8_t)) && *buf == 0x7c) { driver->apps_rsp_buf[0] = 0x7c; for (i = 1; i < 8; i++) driver->apps_rsp_buf[i] = 0; diff --git a/drivers/clk/qcom/gdsc-regulator.c b/drivers/clk/qcom/gdsc-regulator.c index 4d05a829b3ec..27d53b9c9f11 100644 --- a/drivers/clk/qcom/gdsc-regulator.c +++ b/drivers/clk/qcom/gdsc-regulator.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -30,6 +30,8 @@ #include #include +#include + /* GDSCR */ #define PWR_ON_MASK BIT(31) #define CLK_DIS_WAIT_MASK (0xF << 12) @@ -72,6 +74,7 @@ struct gdsc { struct regmap *hw_ctrl; struct regmap *sw_reset; struct clk **clocks; + struct regulator *parent_regulator; struct reset_control **reset_clocks; bool toggle_mem; bool toggle_periph; @@ -198,6 +201,17 @@ static int gdsc_enable(struct regulator_dev *rdev) uint32_t regval, cfg_regval, hw_ctrl_regval = 0x0; int i, ret = 0; + if (sc->parent_regulator) { + ret = regulator_set_voltage(sc->parent_regulator, + RPMH_REGULATOR_LEVEL_LOW_SVS, INT_MAX); + if (ret) { + dev_warn(&rdev->dev, + "Unable to set the voltage on parent for %s\n", + sc->rdesc.name); + return ret; + } + } + mutex_lock(&gdsc_seq_lock); if (sc->root_en || sc->force_root_en) @@ -208,6 +222,8 @@ static int gdsc_enable(struct regulator_dev *rdev) dev_warn(&rdev->dev, "Invalid enable while %s is under HW control\n", sc->rdesc.name); mutex_unlock(&gdsc_seq_lock); + if (sc->parent_regulator) + regulator_set_voltage(sc->parent_regulator, 0, INT_MAX); return -EBUSY; } @@ -296,6 +312,11 @@ static int gdsc_enable(struct regulator_dev *rdev) regval, hw_ctrl_regval); mutex_unlock(&gdsc_seq_lock); + + if (sc->parent_regulator) + regulator_set_voltage( + sc->parent_regulator, + 0, INT_MAX); return ret; } } else { @@ -321,6 +342,10 @@ static int gdsc_enable(struct regulator_dev *rdev) } mutex_unlock(&gdsc_seq_lock); + if (sc->parent_regulator) + regulator_set_voltage( + sc->parent_regulator, + 0, INT_MAX); return ret; } } @@ -439,6 +464,9 @@ static int gdsc_disable(struct regulator_dev *rdev) mutex_unlock(&gdsc_seq_lock); + if (sc->parent_regulator) + regulator_set_voltage(sc->parent_regulator, 0, INT_MAX); + return ret; } @@ -636,6 +664,19 @@ static int gdsc_probe(struct platform_device *pdev) if (prop_val) sc->flags |= TOGGLE_SW_COLLAPSE_IN_DISABLE; + if (of_find_property(pdev->dev.of_node, "vdd_parent-supply", NULL)) { + sc->parent_regulator = devm_regulator_get(&pdev->dev, + "vdd_parent"); + if (IS_ERR(sc->parent_regulator)) { + ret = PTR_ERR(sc->parent_regulator); + if (ret != -EPROBE_DEFER) + dev_err(&pdev->dev, + "Unable to get vdd_parent regulator, err: %d\n", + ret); + return ret; + } + } + for (i = 0; i < sc->clock_count; i++) { const char *clock_name; diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 67869c38efd4..c171e754024e 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -466,7 +466,7 @@ static void __cpufreq_notify_transition(struct cpufreq_policy *policy, (unsigned long)freqs->new, (unsigned long)freqs->cpu); trace_cpu_frequency(freqs->new, freqs->cpu); cpufreq_stats_record_transition(policy, freqs->new); - cpufreq_times_record_transition(freqs); + cpufreq_times_record_transition(policy, freqs->new); srcu_notifier_call_chain(&cpufreq_transition_notifier_list, CPUFREQ_POSTCHANGE, freqs); if (likely(policy) && likely(policy->cpu == freqs->cpu)) @@ -2000,9 +2000,14 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier); unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy, unsigned int target_freq) { + int ret; target_freq = clamp_val(target_freq, policy->min, policy->max); - return cpufreq_driver->fast_switch(policy, target_freq); + ret = cpufreq_driver->fast_switch(policy, target_freq); + if (ret) + cpufreq_times_record_transition(policy, ret); + + return ret; } EXPORT_SYMBOL_GPL(cpufreq_driver_fast_switch); diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c old mode 100644 new mode 100755 index 8b2468c8112c..99204528103c --- a/drivers/cpufreq/cpufreq_interactive.c +++ b/drivers/cpufreq/cpufreq_interactive.c @@ -1430,7 +1430,7 @@ static ssize_t store_use_migration_notif( */ #define show_gov_pol_sys(file_name) \ static ssize_t show_##file_name##_gov_sys \ -(struct kobject *kobj, struct attribute *attr, char *buf) \ +(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ { \ return show_##file_name(common_tunables, buf); \ } \ @@ -1443,7 +1443,7 @@ static ssize_t show_##file_name##_gov_pol \ #define store_gov_pol_sys(file_name) \ static ssize_t store_##file_name##_gov_sys \ -(struct kobject *kobj, struct attribute *attr, const char *buf, \ +(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, \ size_t count) \ { \ return store_##file_name(common_tunables, buf, count); \ @@ -1479,7 +1479,7 @@ show_store_gov_pol_sys(fast_ramp_down); show_store_gov_pol_sys(enable_prediction); #define gov_sys_attr_rw(_name) \ -static struct global_attr _name##_gov_sys = \ +static struct kobj_attribute _name##_gov_sys = \ __ATTR(_name, 0644, show_##_name##_gov_sys, store_##_name##_gov_sys) #define gov_pol_attr_rw(_name) \ @@ -1508,7 +1508,7 @@ gov_sys_pol_attr_rw(ignore_hispeed_on_notif); gov_sys_pol_attr_rw(fast_ramp_down); gov_sys_pol_attr_rw(enable_prediction); -static struct global_attr boostpulse_gov_sys = +static struct kobj_attribute boostpulse_gov_sys = __ATTR(boostpulse, 0200, NULL, store_boostpulse_gov_sys); static struct freq_attr boostpulse_gov_pol = diff --git a/drivers/cpufreq/cpufreq_times.c b/drivers/cpufreq/cpufreq_times.c index c260d0f345db..421390055cd9 100644 --- a/drivers/cpufreq/cpufreq_times.c +++ b/drivers/cpufreq/cpufreq_times.c @@ -139,27 +139,10 @@ static struct uid_entry *find_or_register_uid_locked(uid_t uid) return uid_entry; } -static bool freq_index_invalid(unsigned int index) -{ - unsigned int cpu; - struct cpu_freqs *freqs; - - for_each_possible_cpu(cpu) { - freqs = all_freqs[cpu]; - if (!freqs || index < freqs->offset || - freqs->offset + freqs->max_state <= index) - continue; - return freqs->freq_table[index - freqs->offset] == - CPUFREQ_ENTRY_INVALID; - } - return true; -} - static int single_uid_time_in_state_show(struct seq_file *m, void *ptr) { struct uid_entry *uid_entry; unsigned int i; - u64 time; uid_t uid = from_kuid_munged(current_user_ns(), *(kuid_t *)m->private); if (uid == overflowuid) @@ -174,9 +157,7 @@ static int single_uid_time_in_state_show(struct seq_file *m, void *ptr) } for (i = 0; i < uid_entry->max_state; ++i) { - if (freq_index_invalid(i)) - continue; - time = cputime_to_clock_t(uid_entry->time_in_state[i]); + u64 time = cputime_to_clock_t(uid_entry->time_in_state[i]); seq_write(m, &time, sizeof(time)); } @@ -221,9 +202,6 @@ static int uid_time_in_state_seq_show(struct seq_file *m, void *v) continue; last_freqs = freqs; for (i = 0; i < freqs->max_state; i++) { - if (freqs->freq_table[i] == - CPUFREQ_ENTRY_INVALID) - continue; seq_put_decimal_ull(m, " ", freqs->freq_table[i]); } @@ -239,10 +217,8 @@ static int uid_time_in_state_seq_show(struct seq_file *m, void *v) seq_putc(m, ':'); } for (i = 0; i < uid_entry->max_state; ++i) { - u64 time; - if (freq_index_invalid(i)) - continue; - time = cputime_to_clock_t(uid_entry->time_in_state[i]); + u64 time = + cputime_to_clock_t(uid_entry->time_in_state[i]); seq_put_decimal_ull(m, " ", time); } if (uid_entry->max_state) @@ -409,8 +385,6 @@ int proc_time_in_state_show(struct seq_file *m, struct pid_namespace *ns, seq_printf(m, "cpu%u\n", cpu); for (i = 0; i < freqs->max_state; i++) { - if (freqs->freq_table[i] == CPUFREQ_ENTRY_INVALID) - continue; cputime = 0; if (freqs->offset + i < p->max_state && p->time_in_state) @@ -490,9 +464,19 @@ void cpufreq_acct_update_power(struct task_struct *p, cputime_t cputime) rcu_read_unlock(); } +static int cpufreq_times_get_index(struct cpu_freqs *freqs, unsigned int freq) +{ + int index; + for (index = 0; index < freqs->max_state; ++index) { + if (freqs->freq_table[index] == freq) + return index; + } + return -1; +} + void cpufreq_times_create_policy(struct cpufreq_policy *policy) { - int cpu, index; + int cpu, index = 0; unsigned int count = 0; struct cpufreq_frequency_table *pos, *table; struct cpu_freqs *freqs; @@ -505,7 +489,7 @@ void cpufreq_times_create_policy(struct cpufreq_policy *policy) if (!table) return; - cpufreq_for_each_entry(pos, table) + cpufreq_for_each_valid_entry(pos, table) count++; tmp = kzalloc(struct_size(freqs, freq_table, count), GFP_KERNEL); @@ -515,13 +499,13 @@ void cpufreq_times_create_policy(struct cpufreq_policy *policy) freqs = tmp; freqs->max_state = count; - index = cpufreq_frequency_table_get_index(policy, policy->cur); + cpufreq_for_each_valid_entry(pos, table) + freqs->freq_table[index++] = pos->frequency; + + index = cpufreq_times_get_index(freqs, policy->cur); if (index >= 0) WRITE_ONCE(freqs->last_index, index); - cpufreq_for_each_entry(pos, table) - freqs->freq_table[pos - table] = pos->frequency; - freqs->offset = next_offset; WRITE_ONCE(next_offset, freqs->offset + count); for_each_cpu(cpu, policy->related_cpus) @@ -557,24 +541,17 @@ void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end) spin_unlock_irqrestore(&uid_lock, flags); } -void cpufreq_times_record_transition(struct cpufreq_freqs *freq) +void cpufreq_times_record_transition(struct cpufreq_policy *policy, + unsigned int new_freq) { int index; - struct cpu_freqs *freqs = all_freqs[freq->cpu]; - struct cpufreq_policy *policy; - + struct cpu_freqs *freqs = all_freqs[policy->cpu]; if (!freqs) return; - policy = cpufreq_cpu_get(freq->cpu); - if (!policy) - return; - - index = cpufreq_frequency_table_get_index(policy, freq->new); + index = cpufreq_times_get_index(freqs, new_freq); if (index >= 0) WRITE_ONCE(freqs->last_index, index); - - cpufreq_cpu_put(policy); } static const struct seq_operations uid_time_in_state_seq_ops = { diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c index 174057ba82ca..12b02fb6baa2 100644 --- a/drivers/gpu/drm/drm_property.c +++ b/drivers/gpu/drm/drm_property.c @@ -768,9 +768,13 @@ int drm_mode_createblob_ioctl(struct drm_device *dev, if (!drm_core_check_feature(dev, DRIVER_MODESET)) return -EINVAL; + mutex_lock(&dev->mode_config.blob_lock); + list_for_each_entry(bt, &file_priv->blobs, head_file) count++; + mutex_unlock(&dev->mode_config.blob_lock); + if (count == MAX_BLOB_PROP_COUNT) return -EINVAL; diff --git a/drivers/gpu/drm/msm/dp/dp_debug.c b/drivers/gpu/drm/msm/dp/dp_debug.c index 64945cf752cd..92fc9bc1bb3a 100644 --- a/drivers/gpu/drm/msm/dp/dp_debug.c +++ b/drivers/gpu/drm/msm/dp/dp_debug.c @@ -122,8 +122,24 @@ static ssize_t dp_debug_write_edid(struct file *file, goto bail; if (edid_size != debug->edid_size) { - pr_debug("clearing debug edid\n"); - goto bail; + pr_debug("realloc debug edid\n"); + + if (debug->edid) { + devm_kfree(debug->dev, debug->edid); + + debug->edid = devm_kzalloc(debug->dev, + edid_size, GFP_KERNEL); + if (!debug->edid) { + rc = -ENOMEM; + goto bail; + } + + debug->edid_size = edid_size; + + debug->aux->set_sim_mode(debug->aux, + debug->dp_debug.sim_mode, + debug->edid, debug->dpcd); + } } while (edid_size--) { diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c index 1278d59e7bc1..9d0391663de5 100644 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -618,13 +618,111 @@ void dsi_connector_put_modes(struct drm_connector *connector, dsi_display->modes = NULL; } -int dsi_connector_get_modes(struct drm_connector *connector, - void *display) + +static int dsi_drm_update_edid_name(struct edid *edid, const char *name) +{ + u8 *dtd = (u8 *)&edid->detailed_timings[3]; + u8 standard_header[] = {0x00, 0x00, 0x00, 0xFE, 0x00}; + u32 dtd_size = 18; + u32 header_size = sizeof(standard_header); + + if (!name) + return -EINVAL; + + /* Fill standard header */ + memcpy(dtd, standard_header, header_size); + + dtd_size -= header_size; + dtd_size = min_t(u32, dtd_size, strlen(name)); + + memcpy(dtd + header_size, name, dtd_size); + + return 0; +} + +static void dsi_drm_update_dtd(struct edid *edid, + struct dsi_display_mode *modes, u32 modes_count) +{ + u32 i; + u32 count = min_t(u32, modes_count, 3); + + for (i = 0; i < count; i++) { + struct detailed_timing *dtd = &edid->detailed_timings[i]; + struct dsi_display_mode *mode = &modes[i]; + struct dsi_mode_info *timing = &mode->timing; + struct detailed_pixel_timing *pd = &dtd->data.pixel_data; + u32 h_blank = timing->h_front_porch + timing->h_sync_width + + timing->h_back_porch; + u32 v_blank = timing->v_front_porch + timing->v_sync_width + + timing->v_back_porch; + u32 h_img = 0, v_img = 0; + + dtd->pixel_clock = mode->pixel_clk_khz / 10; + + pd->hactive_lo = timing->h_active & 0xFF; + pd->hblank_lo = h_blank & 0xFF; + pd->hactive_hblank_hi = ((h_blank >> 8) & 0xF) | + ((timing->h_active >> 8) & 0xF) << 4; + + pd->vactive_lo = timing->v_active & 0xFF; + pd->vblank_lo = v_blank & 0xFF; + pd->vactive_vblank_hi = ((v_blank >> 8) & 0xF) | + ((timing->v_active >> 8) & 0xF) << 4; + + pd->hsync_offset_lo = timing->h_front_porch & 0xFF; + pd->hsync_pulse_width_lo = timing->h_sync_width & 0xFF; + pd->vsync_offset_pulse_width_lo = + ((timing->v_front_porch & 0xF) << 4) | + (timing->v_sync_width & 0xF); + + pd->hsync_vsync_offset_pulse_width_hi = + (((timing->h_front_porch >> 8) & 0x3) << 6) | + (((timing->h_sync_width >> 8) & 0x3) << 4) | + (((timing->v_front_porch >> 4) & 0x3) << 2) | + (((timing->v_sync_width >> 4) & 0x3) << 0); + + pd->width_mm_lo = h_img & 0xFF; + pd->height_mm_lo = v_img & 0xFF; + pd->width_height_mm_hi = (((h_img >> 8) & 0xF) << 4) | + ((v_img >> 8) & 0xF); + + pd->hborder = 0; + pd->vborder = 0; + pd->misc = 0; + } +} + +static void dsi_drm_update_checksum(struct edid *edid) { - u32 count = 0; + u8 *data = (u8 *)edid; + u32 i, sum = 0; + + for (i = 0; i < EDID_LENGTH - 1; i++) + sum += data[i]; + + edid->checksum = 0x100 - (sum & 0xFF); +} + +int dsi_connector_get_modes(struct drm_connector *connector, void *data) +{ + int rc, i; + u32 count = 0, edid_size; struct dsi_display_mode *modes = NULL; struct drm_display_mode drm_mode; - int rc, i; + struct dsi_display *display = data; + struct edid edid; + const u8 edid_buf[EDID_LENGTH] = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0x6D, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x10, 0x01, 0x03, + 0x80, 0x50, 0x2D, 0x78, 0x0A, 0x0D, 0xC9, 0xA0, 0x57, 0x47, + 0x98, 0x27, 0x12, 0x48, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, + }; + + edid_size = min_t(u32, sizeof(edid), EDID_LENGTH); + + memcpy(&edid, edid_buf, edid_size); if (sde_connector_get_panel(connector)) { /* @@ -664,6 +762,18 @@ int dsi_connector_get_modes(struct drm_connector *connector, m->height_mm = connector->display_info.height_mm; drm_mode_probed_add(connector, m); } + + rc = dsi_drm_update_edid_name(&edid, display->panel->name); + if (rc) { + count = 0; + goto end; + } + + dsi_drm_update_dtd(&edid, modes, count); + dsi_drm_update_checksum(&edid); + rc = drm_mode_connector_update_edid_property(connector, &edid); + if (rc) + count = 0; end: pr_debug("MODE COUNT =%d\n\n", count); return count; diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 7fa61aa6dcb3..aa7a062adab0 100755 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -128,15 +128,6 @@ static void put_pages(struct drm_gem_object *obj) if (msm_obj->pages) { if (msm_obj->sgt) { - /* For non-cached buffers, ensure the new - * pages are clean because display controller, - * GPU, etc. are not coherent: - */ - if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) - dma_unmap_sg(obj->dev->dev, msm_obj->sgt->sgl, - msm_obj->sgt->nents, - DMA_BIDIRECTIONAL); - sg_free_table(msm_obj->sgt); kfree(msm_obj->sgt); } diff --git a/drivers/gpu/drm/msm/msm_rd.c b/drivers/gpu/drm/msm/msm_rd.c old mode 100644 new mode 100755 diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.c b/drivers/gpu/drm/msm/sde/sde_encoder.c index eff42ee4b142..a5b9fcd6c456 100644 --- a/drivers/gpu/drm/msm/sde/sde_encoder.c +++ b/drivers/gpu/drm/msm/sde/sde_encoder.c @@ -67,7 +67,7 @@ #define MAX_PHYS_ENCODERS_PER_VIRTUAL \ (MAX_H_TILES_PER_DISPLAY * NUM_PHYS_ENCODER_TYPES) -#define MAX_CHANNELS_PER_ENC 2 +#define MAX_CHANNELS_PER_ENC 4 #define MISR_BUFF_SIZE 256 @@ -420,7 +420,8 @@ bool sde_encoder_is_dsc_merge(struct drm_encoder *drm_enc) return false; topology = sde_connector_get_topology_name(drm_conn); - if (topology == SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE) + if (topology == SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE || + topology == SDE_RM_TOPOLOGY_QUADPIPE_DSCMERGE) return true; return false; @@ -1182,6 +1183,113 @@ static int _sde_encoder_dsc_n_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) return 0; } + +static int _sde_encoder_dsc_4_lm_4_enc_2_intf(struct sde_encoder_virt *sde_enc, + struct sde_encoder_kickoff_params *params) +{ + int this_frame_slices; + int intf_ip_w, enc_ip_w; + int ich_res, dsc_common_mode; + + struct sde_encoder_phys *enc_master = sde_enc->cur_master; + const struct sde_rect *roi = &sde_enc->cur_conn_roi; + struct sde_hw_dsc *hw_dsc[MAX_CHANNELS_PER_ENC]; + struct sde_hw_pingpong *hw_pp[MAX_CHANNELS_PER_ENC]; + struct msm_display_dsc_info dsc[MAX_CHANNELS_PER_ENC]; + struct msm_mode_info mode_info; + bool half_panel_partial_update; + int i, rc; + + memset(hw_dsc, 0, sizeof(struct sde_hw_dsc *)*MAX_CHANNELS_PER_ENC); + memset(hw_pp, 0, sizeof(struct sde_hw_pingpong *)*MAX_CHANNELS_PER_ENC); + + for (i = 0; i < params->num_channels; i++) { + hw_pp[i] = sde_enc->hw_pp[i]; + hw_dsc[i] = sde_enc->hw_dsc[i]; + + if (!hw_pp[i] || !hw_dsc[i]) { + SDE_ERROR_ENC(sde_enc, "invalid params for DSC\n"); + return -EINVAL; + } + } + + rc = _sde_encoder_get_mode_info(&sde_enc->base, &mode_info); + if (rc) { + SDE_ERROR_ENC(sde_enc, "failed to get mode info\n"); + return -EINVAL; + } + + half_panel_partial_update = + hweight_long(params->affected_displays) == 1; + + dsc_common_mode = 0; + if (!half_panel_partial_update) + dsc_common_mode |= DSC_MODE_SPLIT_PANEL | DSC_MODE_MULTIPLEX; + if (enc_master->intf_mode == INTF_MODE_VIDEO) + dsc_common_mode |= DSC_MODE_VIDEO; + + memcpy(&dsc[0], &mode_info.comp_info.dsc_info, sizeof(dsc[0])); + memcpy(&dsc[1], &mode_info.comp_info.dsc_info, sizeof(dsc[1])); + memcpy(&dsc[2], &mode_info.comp_info.dsc_info, sizeof(dsc[2])); + memcpy(&dsc[3], &mode_info.comp_info.dsc_info, sizeof(dsc[3])); + + /* + * Since both DSC use same pic dimension, set same pic dimension + * to both DSC structures. + */ + _sde_encoder_dsc_update_pic_dim(&dsc[0], roi->w, roi->h); + _sde_encoder_dsc_update_pic_dim(&dsc[1], roi->w, roi->h); + _sde_encoder_dsc_update_pic_dim(&dsc[2], roi->w, roi->h); + _sde_encoder_dsc_update_pic_dim(&dsc[3], roi->w, roi->h); + + this_frame_slices = roi->w / dsc[0].slice_width; + intf_ip_w = this_frame_slices * dsc[0].slice_width; + + if (!half_panel_partial_update) + intf_ip_w /= 2; + + /* + * In this topology when both interfaces are active, they have same + * load so intf_ip_w will be same. + */ + _sde_encoder_dsc_pclk_param_calc(&dsc[0], intf_ip_w); + _sde_encoder_dsc_pclk_param_calc(&dsc[1], intf_ip_w); + _sde_encoder_dsc_pclk_param_calc(&dsc[2], intf_ip_w); + _sde_encoder_dsc_pclk_param_calc(&dsc[3], intf_ip_w); + + /* + * In this topology, since there is no dsc_merge, uncompressed input + * to encoder and interface is same. + */ + enc_ip_w = intf_ip_w; + _sde_encoder_dsc_initial_line_calc(&dsc[0], enc_ip_w); + _sde_encoder_dsc_initial_line_calc(&dsc[1], enc_ip_w); + _sde_encoder_dsc_initial_line_calc(&dsc[2], enc_ip_w); + _sde_encoder_dsc_initial_line_calc(&dsc[3], enc_ip_w); + + /* + * __is_ich_reset_override_needed should be called only after + * updating pic dimension, mdss_panel_dsc_update_pic_dim. + */ + ich_res = _sde_encoder_dsc_ich_reset_override_needed( + half_panel_partial_update, &dsc[0]); + + SDE_DEBUG_ENC(sde_enc, "pic_w: %d pic_h: %d mode:%d\n", + roi->w, roi->h, dsc_common_mode); + + _sde_encoder_dsc_pipe_cfg(hw_dsc[0], hw_pp[0], &dsc[0], + dsc_common_mode, ich_res, true); + _sde_encoder_dsc_pipe_cfg(hw_dsc[1], hw_pp[1], &dsc[1], + dsc_common_mode, ich_res, true); + _sde_encoder_dsc_pipe_cfg(hw_dsc[2], hw_pp[2], &dsc[2], + dsc_common_mode, ich_res, true); + _sde_encoder_dsc_pipe_cfg(hw_dsc[3], hw_pp[3], &dsc[3], + dsc_common_mode, ich_res, true); + + return 0; +} + + static int _sde_encoder_dsc_2_lm_2_enc_2_intf(struct sde_encoder_virt *sde_enc, struct sde_encoder_kickoff_params *params) { @@ -1198,7 +1306,7 @@ static int _sde_encoder_dsc_2_lm_2_enc_2_intf(struct sde_encoder_virt *sde_enc, bool half_panel_partial_update; int i, rc; - for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) { + for (i = 0; i < params->num_channels; i++) { hw_pp[i] = sde_enc->hw_pp[i]; hw_dsc[i] = sde_enc->hw_dsc[i]; @@ -1292,7 +1400,7 @@ static int _sde_encoder_dsc_2_lm_2_enc_1_intf(struct sde_encoder_virt *sde_enc, bool half_panel_partial_update; int i, rc; - for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) { + for (i = 0; i < params->num_channels; i++) { hw_pp[i] = sde_enc->hw_pp[i]; hw_dsc[i] = sde_enc->hw_dsc[i]; @@ -1438,6 +1546,9 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc, case SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC: ret = _sde_encoder_dsc_2_lm_2_enc_2_intf(sde_enc, params); break; + case SDE_RM_TOPOLOGY_QUADPIPE_DSCMERGE: + ret = _sde_encoder_dsc_4_lm_4_enc_2_intf(sde_enc, params); + break; default: SDE_ERROR_ENC(sde_enc, "No DSC support for topology %d", topology); @@ -4163,8 +4274,8 @@ int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc, /* only enable border color on LM */ if (phys_enc->hw_ctl->ops.setup_blendstage) phys_enc->hw_ctl->ops.setup_blendstage( - phys_enc->hw_ctl, hw_lm->cfg.flags, - hw_lm->idx, NULL); + phys_enc->hw_ctl, hw_lm->idx, + hw_lm->cfg.flags, NULL); } if (!lm_valid) { diff --git a/drivers/gpu/drm/msm/sde/sde_wb.c b/drivers/gpu/drm/msm/sde/sde_wb.c index 61588bd95503..84e0764a7d47 100644 --- a/drivers/gpu/drm/msm/sde/sde_wb.c +++ b/drivers/gpu/drm/msm/sde/sde_wb.c @@ -388,7 +388,7 @@ int sde_wb_connector_set_info_blob(struct drm_connector *connector, wb_dev->wb_cfg->sblk->maxlinewidth); sde_kms_info_start(info, "features"); - if (wb_dev->wb_cfg && (wb_dev->wb_cfg->features & SDE_WB_UBWC)) + if (wb_dev->wb_cfg && (wb_dev->wb_cfg->features & BIT(SDE_WB_UBWC))) sde_kms_info_append(info, "wb_ubwc"); sde_kms_info_stop(info); diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index fc35d957e43f..00b64910b08c 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -1381,28 +1381,23 @@ static ssize_t kgsl_pwrctrl_temp_show(struct device *dev, struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr; struct thermal_zone_device *thermal_dev; - int ret, temperature = 0; + int i, max_temp = 0; if (device == NULL) - goto done; + return 0; pwr = &device->pwrctrl; - if (!pwr->tzone_name) - goto done; - - thermal_dev = thermal_zone_get_zone_by_name((char *)pwr->tzone_name); - if (thermal_dev == NULL) - goto done; + for (i = 0; i < KGSL_MAX_TZONE_NAMES; i++) { + int temp = 0; - ret = thermal_zone_get_temp(thermal_dev, &temperature); - if (ret) - goto done; + thermal_dev = thermal_zone_get_zone_by_name( + pwr->tzone_names[i]); + if (!(thermal_zone_get_temp(thermal_dev, &temp))) + max_temp = max_t(int, temp, max_temp); + } - return snprintf(buf, PAGE_SIZE, "%d\n", - temperature); -done: - return 0; + return scnprintf(buf, PAGE_SIZE, "%d\n", max_temp); } static ssize_t kgsl_pwrctrl_pwrscale_store(struct device *dev, @@ -2328,8 +2323,9 @@ int kgsl_pwrctrl_init(struct kgsl_device *device) kgsl_pwrctrl_vbif_init(); /* temperature sensor name */ - of_property_read_string(pdev->dev.of_node, "qcom,tzone-name", - &pwr->tzone_name); + + of_property_read_string_array(pdev->dev.of_node, "tzone-names", + pwr->tzone_names, KGSL_MAX_TZONE_NAMES); return result; diff --git a/drivers/gpu/msm/kgsl_pwrctrl.h b/drivers/gpu/msm/kgsl_pwrctrl.h index 4725c6fe7716..bd58cfe6da50 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.h +++ b/drivers/gpu/msm/kgsl_pwrctrl.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -30,6 +30,8 @@ #define KGSL_MAX_PWRLEVELS 10 +#define KGSL_MAX_TZONE_NAMES 2 + /* Only two supported levels, min & max */ #define KGSL_CONSTRAINT_PWR_MAXLEVELS 2 @@ -167,7 +169,7 @@ struct kgsl_regulator { * @sysfs_pwr_limit - pointer to the sysfs limits node * isense_clk_indx - index of isense clock, 0 if no isense * isense_clk_on_level - isense clock rate is XO rate below this level. - * tzone_name - pointer to thermal zone name of GPU temperature sensor + * tzone_names - array of thermal zone names of GPU temperature sensors */ struct kgsl_pwrctrl { @@ -222,7 +224,7 @@ struct kgsl_pwrctrl { struct kgsl_pwr_limit *sysfs_pwr_limit; unsigned int gpu_bimc_int_clk_freq; bool gpu_bimc_interface_enabled; - const char *tzone_name; + const char *tzone_names[KGSL_MAX_TZONE_NAMES]; }; int kgsl_pwrctrl_init(struct kgsl_device *device); diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c index 34a4f7772e71..24564b34014e 100644 --- a/drivers/hwmon/qpnp-adc-common.c +++ b/drivers/hwmon/qpnp-adc-common.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -1830,7 +1830,7 @@ int32_t qpnp_adc_scale_default(struct qpnp_vadc_chip *vadc, } else { qpnp_adc_scale_with_calib_param(adc_code, adc_properties, chan_properties, &scale_voltage); - if (chan_properties->calib_type) + if (!(chan_properties->calib_type == CALIB_ABSOLUTE)) scale_voltage *= 1000; } diff --git a/drivers/hwmon/qpnp-adc-voltage.c b/drivers/hwmon/qpnp-adc-voltage.c index 8d0422460775..35d33de7dc13 100644 --- a/drivers/hwmon/qpnp-adc-voltage.c +++ b/drivers/hwmon/qpnp-adc-voltage.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -521,7 +521,7 @@ static int qpnp_vadc_hc_pre_configure_usb_in(struct qpnp_vadc_chip *vadc, /* Setup dig params for USB_IN_V */ conv.decimation = DECIMATION_TYPE2; - conv.cal_val = ADC_HC_ABS_CAL; + conv.cal_val = (enum qpnp_adc_cal_val)ADC_HC_ABS_CAL; conv.calib_type = vadc->adc->adc_channels[dt_index].calib_type; qpnp_vadc_hc_update_adc_dig_param(vadc, &conv, &dig_param); @@ -1630,7 +1630,7 @@ int32_t qpnp_vadc_calib_vref(struct qpnp_vadc_chip *vadc, conv.mode_sel = ADC_OP_NORMAL_MODE << QPNP_VADC_OP_MODE_SHIFT; conv.hw_settle_time = ADC_CHANNEL_HW_SETTLE_DELAY_0US; conv.fast_avg_setup = ADC_FAST_AVG_SAMPLE_1; - conv.calib_type = calib_type; + conv.cal_val = (enum qpnp_adc_cal_val)calib_type; if (vadc->vadc_hc) { rc = qpnp_vadc_hc_configure(vadc, &conv); @@ -1703,7 +1703,7 @@ int32_t qpnp_vadc_calib_gnd(struct qpnp_vadc_chip *vadc, conv.mode_sel = ADC_OP_NORMAL_MODE << QPNP_VADC_OP_MODE_SHIFT; conv.hw_settle_time = ADC_CHANNEL_HW_SETTLE_DELAY_0US; conv.fast_avg_setup = ADC_FAST_AVG_SAMPLE_1; - conv.calib_type = calib_type; + conv.cal_val = (enum qpnp_adc_cal_val)calib_type; if (vadc->vadc_hc) { rc = qpnp_vadc_hc_configure(vadc, &conv); @@ -1821,10 +1821,10 @@ static int32_t qpnp_vadc_calib_device(struct qpnp_vadc_chip *vadc) (calib_read_1 - calib_read_2); vadc->adc->amux_prop->chan_prop->adc_graph[CALIB_RATIOMETRIC].dx = vadc->adc->adc_prop->adc_vdd_reference; - vadc->adc->amux_prop->chan_prop->adc_graph[CALIB_RATIOMETRIC].adc_vref - = calib_read_1; - vadc->adc->amux_prop->chan_prop->adc_graph[CALIB_RATIOMETRIC].adc_gnd - = calib_read_2; + vadc->adc->amux_prop->chan_prop->adc_graph[CALIB_RATIOMETRIC].adc_vref = + calib_read_1; + vadc->adc->amux_prop->chan_prop->adc_graph[CALIB_RATIOMETRIC].adc_gnd = + calib_read_2; calib_fail: return rc; diff --git a/drivers/iio/imu/inv_mpu/iam20680/inv_mpu_setup_20680.c b/drivers/iio/imu/inv_mpu/iam20680/inv_mpu_setup_20680.c index 5056c476a997..b3ae5dd77e84 100644 --- a/drivers/iio/imu/inv_mpu/iam20680/inv_mpu_setup_20680.c +++ b/drivers/iio/imu/inv_mpu/iam20680/inv_mpu_setup_20680.c @@ -272,7 +272,7 @@ static int inv_set_batch(struct inv_mpu_state *st) int required_fifo_size; #ifdef CONFIG_ENABLE_IAM_ACC_GYRO_BUFFERING - st->batch.timeout = 10; + st->batch.timeout = 100; #endif if (st->batch.timeout) { required_fifo_size = st->batch.timeout * st->eng_info[ENGINE_GYRO].running_rate diff --git a/drivers/iio/imu/st_asm330lhh/st_asm330lhh_buffer.c b/drivers/iio/imu/st_asm330lhh/st_asm330lhh_buffer.c index 2242adde5b92..734d735e2aed 100644 --- a/drivers/iio/imu/st_asm330lhh/st_asm330lhh_buffer.c +++ b/drivers/iio/imu/st_asm330lhh/st_asm330lhh_buffer.c @@ -249,7 +249,7 @@ static void store_acc_gyro_boot_sample(struct st_asm330lhh_sensor *sensor, static int st_asm330lhh_read_fifo(struct st_asm330lhh_hw *hw) { u8 iio_buf[ALIGN(ST_ASM330LHH_SAMPLE_SIZE, sizeof(s64)) + sizeof(s64)]; - u8 buf[6 * ST_ASM330LHH_FIFO_SAMPLE_SIZE], tag, *ptr; + u8 buf[30 * ST_ASM330LHH_FIFO_SAMPLE_SIZE], tag, *ptr; s64 ts_delta_hw_ts = 0, ts_irq; s64 ts_delta_offs; int i, err, read_len, word_len, fifo_len; diff --git a/drivers/input/sensors/smi130/Kconfig b/drivers/input/sensors/smi130/Kconfig index 97db6cdb69f5..82ca109a9b1d 100644 --- a/drivers/input/sensors/smi130/Kconfig +++ b/drivers/input/sensors/smi130/Kconfig @@ -126,4 +126,12 @@ depends on SENSORS_SMI_ACC4XY help If you say yes here, you get support for Bosch Sensortec's sensor driver of SMI_ACC4XY with mag sensor support. + +config ENABLE_SMI_ACC_GYRO_BUFFERING + bool "Enable accel & gyro boot time sensor sample buffering" + depends on SMI130 + help + Say Y here if you want to buffer boot time sensor + samples for ASM330 accelerometer and gyroscope + endif diff --git a/drivers/input/sensors/smi130/smi130_acc.c b/drivers/input/sensors/smi130/smi130_acc.c index 3979b65deaef..c36c31dab67b 100644 --- a/drivers/input/sensors/smi130/smi130_acc.c +++ b/drivers/input/sensors/smi130/smi130_acc.c @@ -1325,7 +1325,7 @@ #define SMI_ACC2X2_SET_BITSLICE(regvar, bitname, val)\ ((regvar & ~bitname##__MSK) | ((val<sensor_type = sensor_type_map[i].sensor_type; data->chip_id = chip_id; - PINFO("Bosch Sensortec Device detected,\n\n" + PINFO("Bosch Sensortec Device detected\n" " HW IC name: %s\n", sensor_type_map[i].sensor_name); return err; @@ -1917,7 +1938,7 @@ static int smi130_acc_check_chip_id(struct i2c_client *client, return err; else { if (read_count == CHECK_CHIP_ID_TIME_MAX) { - PERR("Failed! Bosch Sensortec Device\n\n" + PERR("Failed! Bosch Sensortec Device\n" " not found, mismatch chip_id:%d\n", chip_id); err = -ENODEV; @@ -4043,6 +4064,23 @@ static int smi130_acc_read_temperature(struct i2c_client *client, return comres; } +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static inline int smi130_check_acc_early_buff_enable_flag( + struct smi130_acc_data *client_data) +{ + if (client_data->acc_buffer_smi130_samples == true) + return 1; + else + return 0; +} +#else +static inline int smi130_check_acc_early_buff_enable_flag( + struct smi130_acc_data *client_data) +{ + return 0; +} +#endif + static ssize_t smi130_acc_enable_int_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -5364,6 +5402,10 @@ static ssize_t smi130_acc_range_store(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct smi130_acc_data *smi130_acc = i2c_get_clientdata(client); + error = smi130_check_acc_early_buff_enable_flag(smi130_acc); + if (error) + return count; + error = kstrtoul(buf, 10, &data); if (error) return error; @@ -5396,6 +5438,10 @@ static ssize_t smi130_acc_bandwidth_store(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct smi130_acc_data *smi130_acc = i2c_get_clientdata(client); + error = smi130_check_acc_early_buff_enable_flag(smi130_acc); + if (error) + return count; + error = kstrtoul(buf, 10, &data); if (error) return error; @@ -5435,6 +5481,10 @@ static ssize_t smi130_acc_mode_store(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct smi130_acc_data *smi130_acc = i2c_get_clientdata(client); + error = smi130_check_acc_early_buff_enable_flag(smi130_acc); + if (error) + return count; + error = kstrtoul(buf, 10, &data); if (error) return error; @@ -6431,10 +6481,97 @@ static void smi130_acc_tap_timeout_handle(unsigned long data) } #endif +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static int smi_acc_read_bootsampl(struct smi130_acc_data *client_data, + unsigned long enable_read) +{ + int i = 0; + + if (enable_read) { + client_data->acc_buffer_smi130_samples = false; + for (i = 0; i < client_data->acc_bufsample_cnt; i++) { + if (client_data->debug_level & 0x08) + PINFO("acc=%d,x=%d,y=%d,z=%d,sec=%d,ns=%lld\n", + i, client_data->smi130_acc_samplist[i]->xyz[0], + client_data->smi130_acc_samplist[i]->xyz[1], + client_data->smi130_acc_samplist[i]->xyz[2], + client_data->smi130_acc_samplist[i]->tsec, + client_data->smi130_acc_samplist[i]->tnsec); + input_report_abs(client_data->accbuf_dev, ABS_X, + client_data->smi130_acc_samplist[i]->xyz[0]); + input_report_abs(client_data->accbuf_dev, ABS_Y, + client_data->smi130_acc_samplist[i]->xyz[1]); + input_report_abs(client_data->accbuf_dev, ABS_Z, + client_data->smi130_acc_samplist[i]->xyz[2]); + input_report_abs(client_data->accbuf_dev, ABS_RX, + client_data->smi130_acc_samplist[i]->tsec); + input_report_abs(client_data->accbuf_dev, ABS_RY, + client_data->smi130_acc_samplist[i]->tnsec); + input_sync(client_data->accbuf_dev); + } + } else { + /* clean up */ + if (client_data->acc_bufsample_cnt != 0) { + for (i = 0; i < SMI_ACC_MAXSAMPLE; i++) + kmem_cache_free(client_data->smi_acc_cachepool, + client_data->smi130_acc_samplist[i]); + kmem_cache_destroy(client_data->smi_acc_cachepool); + client_data->acc_bufsample_cnt = 0; + } + + } + /*SYN_CONFIG indicates end of data*/ + input_event(client_data->accbuf_dev, EV_SYN, SYN_CONFIG, 0xFFFFFFFF); + input_sync(client_data->accbuf_dev); + if (client_data->debug_level & 0x08) + PINFO("End of acc samples bufsample_cnt=%d\n", + client_data->acc_bufsample_cnt); + return 0; +} +static ssize_t read_acc_boot_sample_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct smi130_acc_data *smi130_acc = i2c_get_clientdata(client); + + return snprintf(buf, 16, "%u\n", + smi130_acc->read_acc_boot_sample); +} + +static ssize_t read_acc_boot_sample_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int err; + struct i2c_client *client = to_i2c_client(dev); + struct smi130_acc_data *smi130_acc = i2c_get_clientdata(client); + unsigned long enable = 0; + + err = kstrtoul(buf, 10, &enable); + if (err) + return err; + if (enable > 1) { + PERR("Invalid value of input, input=%ld\n", enable); + return -EINVAL; + } + err = smi_acc_read_bootsampl(smi130_acc, enable); + if (err) + return err; + + smi130_acc->read_acc_boot_sample = enable; + return count; +} +#endif + static DEVICE_ATTR(range, S_IRUGO | S_IWUSR, smi130_acc_range_show, smi130_acc_range_store); static DEVICE_ATTR(bandwidth, S_IRUGO | S_IWUSR, smi130_acc_bandwidth_show, smi130_acc_bandwidth_store); +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static DEVICE_ATTR(read_acc_boot_sample, 0644, + read_acc_boot_sample_show, read_acc_boot_sample_store); +#endif static DEVICE_ATTR(op_mode, S_IRUGO | S_IWUSR, smi130_acc_mode_show, smi130_acc_mode_store); static DEVICE_ATTR(value, S_IRUSR, @@ -6554,6 +6691,9 @@ static DEVICE_ATTR(en_double_tap, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, static struct attribute *smi130_acc_attributes[] = { &dev_attr_range.attr, &dev_attr_bandwidth.attr, +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING + &dev_attr_read_acc_boot_sample.attr, +#endif &dev_attr_op_mode.attr, &dev_attr_value.attr, &dev_attr_value_cache.attr, @@ -6751,6 +6891,136 @@ static void smi130_acc_slope_interrupt_handle(struct smi130_acc_data *smi130_acc } } #endif +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static void store_acc_boot_sample(struct smi130_acc_data *client_data, + int x, int y, int z, struct timespec ts) +{ + if (false == client_data->acc_buffer_smi130_samples) + return; + if (ts.tv_sec < client_data->max_buffer_time) { + if (client_data->acc_bufsample_cnt < SMI_ACC_MAXSAMPLE) { + client_data->smi130_acc_samplist[client_data-> + acc_bufsample_cnt]->xyz[0] = x; + client_data->smi130_acc_samplist[client_data-> + acc_bufsample_cnt]->xyz[1] = y; + client_data->smi130_acc_samplist[client_data-> + acc_bufsample_cnt]->xyz[2] = z; + client_data->smi130_acc_samplist[client_data-> + acc_bufsample_cnt]->tsec = ts.tv_sec; + client_data->smi130_acc_samplist[client_data-> + acc_bufsample_cnt]->tnsec = ts.tv_nsec; + client_data->acc_bufsample_cnt++; + } + } else { + PINFO("End of ACC buffering %d\n", + client_data->acc_bufsample_cnt); + client_data->acc_buffer_smi130_samples = false; + } +} +#else +static void store_acc_boot_sample(struct smi130_acc_data *client_data, + int x, int y, int z, struct timespec ts) +{ +} +#endif + +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static int smi130_acc_early_buff_init(struct i2c_client *client, + struct smi130_acc_data *client_data) +{ + int i = 0, err = 0; + + client_data->acc_bufsample_cnt = 0; + client_data->report_evt_cnt = 5; + client_data->max_buffer_time = 40; + + client_data->smi_acc_cachepool = kmem_cache_create("acc_sensor_sample", + sizeof(struct smi_acc_sample), + 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!client_data->smi_acc_cachepool) { + PERR("smi_acc_cachepool cache create failed\n"); + err = -ENOMEM; + goto clean_exit1; + } + for (i = 0; i < SMI_ACC_MAXSAMPLE; i++) { + client_data->smi130_acc_samplist[i] = + kmem_cache_alloc(client_data->smi_acc_cachepool, + GFP_KERNEL); + if (!client_data->smi130_acc_samplist[i]) { + err = -ENOMEM; + goto clean_exit2; + } + } + + client_data->accbuf_dev = input_allocate_device(); + if (!client_data->accbuf_dev) { + err = -ENOMEM; + PERR("input device allocation failed\n"); + goto clean_exit3; + } + client_data->accbuf_dev->name = "smi130_accbuf"; + client_data->accbuf_dev->id.bustype = BUS_I2C; + input_set_events_per_packet(client_data->accbuf_dev, + client_data->report_evt_cnt * SMI_ACC_MAXSAMPLE); + set_bit(EV_ABS, client_data->accbuf_dev->evbit); + input_set_abs_params(client_data->accbuf_dev, ABS_X, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->accbuf_dev, ABS_Y, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->accbuf_dev, ABS_Z, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->accbuf_dev, ABS_RX, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->accbuf_dev, ABS_RY, + -G_MAX, G_MAX, 0, 0); + err = input_register_device(client_data->accbuf_dev); + if (err) { + PERR("unable to register input device %s\n", + client_data->accbuf_dev->name); + goto clean_exit3; + } + + client_data->acc_buffer_smi130_samples = true; + + smi130_acc_set_mode(client, SMI_ACC2X2_MODE_NORMAL, 1); + smi130_acc_set_bandwidth(client, SMI_ACC2X2_BW_62_50HZ); + smi130_acc_set_range(client, SMI_ACC2X2_RANGE_2G); + + return 1; + +clean_exit3: + input_free_device(client_data->accbuf_dev); +clean_exit2: + for (i = 0; i < SMI_ACC_MAXSAMPLE; i++) + kmem_cache_free(client_data->smi_acc_cachepool, + client_data->smi130_acc_samplist[i]); +clean_exit1: + kmem_cache_destroy(client_data->smi_acc_cachepool); + return 0; +} + +static void smi130_acc_input_cleanup(struct smi130_acc_data *client_data) +{ + int i = 0; + + input_unregister_device(client_data->accbuf_dev); + input_free_device(client_data->accbuf_dev); + for (i = 0; i < SMI_ACC_MAXSAMPLE; i++) + kmem_cache_free(client_data->smi_acc_cachepool, + client_data->smi130_acc_samplist[i]); + kmem_cache_destroy(client_data->smi_acc_cachepool); +} +#else +static int smi130_acc_early_buff_init(struct i2c_client *client, + struct smi130_acc_data *client_data) +{ + return 1; +} +static void smi130_acc_input_cleanup(struct smi130_acc_data *client_data) +{ +} +#endif static void smi130_acc_irq_work_func(struct work_struct *work) { @@ -6799,6 +7069,7 @@ static void smi130_acc_irq_work_func(struct work_struct *work) smi130_acc->value = acc; mutex_unlock(&smi130_acc->value_mutex); } + store_acc_boot_sample(smi130_acc, acc.x, acc.y, acc.z, ts); #endif smi130_acc_get_interruptstatus1(smi130_acc->smi130_acc_client, &status); @@ -7267,6 +7538,11 @@ static int smi130_acc_probe(struct i2c_client *client, PDEBUG("data->IRQ = %d", data->IRQ); err = request_irq(data->IRQ, smi130_acc_irq_handler, IRQF_TRIGGER_RISING, "smi130_acc", data); + + err = smi130_acc_early_buff_init(client, data); + if (!err) + goto exit; + PINFO("SMI130_ACC driver probe successfully"); return 0; @@ -7378,6 +7654,7 @@ static int smi130_acc_remove(struct i2c_client *client) if (NULL == data) return 0; + smi130_acc_input_cleanup(data); smi130_acc_set_enable(&client->dev, 0); #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&data->early_suspend); diff --git a/drivers/input/sensors/smi130/smi130_gyro_driver.c b/drivers/input/sensors/smi130/smi130_gyro_driver.c index 5ed951329882..552d39cf25fc 100644 --- a/drivers/input/sensors/smi130/smi130_gyro_driver.c +++ b/drivers/input/sensors/smi130/smi130_gyro_driver.c @@ -151,7 +151,7 @@ #define SENSOR_NAME "smi130_gyro" #define SMI130_GYRO_ENABLE_INT1 1 #define SENSOR_CHIP_ID_SMI_GYRO (0x0f) -#define CHECK_CHIP_ID_TIME_MAX 5 +#define CHECK_CHIP_ID_TIME_MAX 1 #define DRIVER_VERSION "0.0.53.0" #define SMI_GYRO_USE_FIFO 1 #define SMI_GYRO_USE_BASIC_I2C_FUNC 1 @@ -163,7 +163,7 @@ #define SMI_GYRO_I2C_WRITE_DELAY_TIME 1 /* generic */ -#define SMI_GYRO_MAX_RETRY_I2C_XFER (100) +#define SMI_GYRO_MAX_RETRY_I2C_XFER (2) #define SMI_GYRO_MAX_RETRY_WAKEUP (5) #define SMI_GYRO_MAX_RETRY_WAIT_DRDY (100) @@ -249,6 +249,16 @@ struct bosch_sensor_data { }; }; +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +#define SMI_GYRO_MAXSAMPLE 4000 +#define G_MAX 23920640 +struct smi_gyro_sample { + int xyz[3]; + unsigned int tsec; + unsigned long long tnsec; +}; +#endif + struct smi_gyro_client_data { struct smi130_gyro_t device; struct i2c_client *client; @@ -281,6 +291,16 @@ struct smi_gyro_client_data { uint8_t gpio_pin; int16_t IRQ; struct work_struct irq_work; +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING + bool read_gyro_boot_sample; + int gyro_bufsample_cnt; + bool gyro_buffer_smi130_samples; + struct kmem_cache *smi_gyro_cachepool; + struct smi_gyro_sample *smi130_gyro_samplist[SMI_GYRO_MAXSAMPLE]; + int max_buffer_time; + struct input_dev *gyrobuf_dev; + int report_evt_cnt; +#endif }; static struct i2c_client *smi_gyro_client; @@ -831,6 +851,23 @@ static ssize_t smi_gyro_show_chip_id(struct device *dev, return snprintf(buf, 16, "%d\n", SENSOR_CHIP_ID_SMI_GYRO); } +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static inline int smi130_check_gyro_early_buff_enable_flag( + struct smi_gyro_client_data *client_data) +{ + if (client_data->gyro_buffer_smi130_samples == true) + return 1; + else + return 0; +} +#else +static inline int smi130_check_gyro_early_buff_enable_flag( + struct smi_gyro_client_data *client_data) +{ + return 0; +} +#endif + static ssize_t smi_gyro_show_op_mode(struct device *dev, struct device_attribute *attr, char *buf) { @@ -858,6 +895,10 @@ static ssize_t smi_gyro_store_op_mode(struct device *dev, long op_mode; + err = smi130_check_gyro_early_buff_enable_flag(client_data); + if (err) + return count; + err = kstrtoul(buf, 10, &op_mode); if (err) return err; @@ -911,6 +952,13 @@ static ssize_t smi_gyro_store_range(struct device *dev, { int err; unsigned long range; + struct input_dev *input = to_input_dev(dev); + struct smi_gyro_client_data *client_data = input_get_drvdata(input); + + err = smi130_check_gyro_early_buff_enable_flag(client_data); + if (err) + return count; + err = kstrtoul(buf, 10, &range); if (err) return err; @@ -952,6 +1000,11 @@ static ssize_t smi_gyro_store_bandwidth(struct device *dev, struct smi_gyro_client_data *client_data = input_get_drvdata(input); unsigned long bandwidth; u8 op_mode = 0xff; + + err = smi130_check_gyro_early_buff_enable_flag(client_data); + if (err) + return count; + err = kstrtoul(buf, 10, &bandwidth); if (err) return err; @@ -1445,8 +1498,96 @@ static ssize_t smi130_gyro_driver_version_show(struct device *dev DRIVER_VERSION); return ret; } + +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static int smi_gyro_read_bootsampl(struct smi_gyro_client_data *client_data, + unsigned long enable_read) +{ + int i = 0; + + if (enable_read) { + client_data->gyro_buffer_smi130_samples = false; + for (i = 0; i < client_data->gyro_bufsample_cnt; i++) { + if (client_data->debug_level & 0x08) + PINFO("gyro=%d,x=%d,y=%d,z=%d,sec=%d,ns=%lld\n", + i, client_data->smi130_gyro_samplist[i]->xyz[0], + client_data->smi130_gyro_samplist[i]->xyz[1], + client_data->smi130_gyro_samplist[i]->xyz[2], + client_data->smi130_gyro_samplist[i]->tsec, + client_data->smi130_gyro_samplist[i]->tnsec); + input_report_abs(client_data->gyrobuf_dev, ABS_X, + client_data->smi130_gyro_samplist[i]->xyz[0]); + input_report_abs(client_data->gyrobuf_dev, ABS_Y, + client_data->smi130_gyro_samplist[i]->xyz[1]); + input_report_abs(client_data->gyrobuf_dev, ABS_Z, + client_data->smi130_gyro_samplist[i]->xyz[2]); + input_report_abs(client_data->gyrobuf_dev, ABS_RX, + client_data->smi130_gyro_samplist[i]->tsec); + input_report_abs(client_data->gyrobuf_dev, ABS_RY, + client_data->smi130_gyro_samplist[i]->tnsec); + input_sync(client_data->gyrobuf_dev); + } + } else { + /* clean up */ + if (client_data->gyro_bufsample_cnt != 0) { + for (i = 0; i < SMI_GYRO_MAXSAMPLE; i++) + kmem_cache_free(client_data->smi_gyro_cachepool, + client_data->smi130_gyro_samplist[i]); + kmem_cache_destroy(client_data->smi_gyro_cachepool); + client_data->gyro_bufsample_cnt = 0; + } + + } + /*SYN_CONFIG indicates end of data*/ + input_event(client_data->gyrobuf_dev, EV_SYN, SYN_CONFIG, 0xFFFFFFFF); + input_sync(client_data->gyrobuf_dev); + if (client_data->debug_level & 0x08) + PINFO("End of gyro samples bufsample_cnt=%d\n", + client_data->gyro_bufsample_cnt); + return 0; +} +static ssize_t read_gyro_boot_sample_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct input_dev *input = to_input_dev(dev); + struct smi_gyro_client_data *client_data = input_get_drvdata(input); + + return snprintf(buf, 16, "%u\n", + client_data->read_gyro_boot_sample); +} +static ssize_t read_gyro_boot_sample_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int err; + struct input_dev *input = to_input_dev(dev); + struct smi_gyro_client_data *client_data = input_get_drvdata(input); + unsigned long enable = 0; + + err = kstrtoul(buf, 10, &enable); + if (err) + return err; + if (enable > 1) { + PERR("Invalid value of input, input=%ld\n", enable); + return -EINVAL; + } + err = smi_gyro_read_bootsampl(client_data, enable); + if (err) + return err; + client_data->read_gyro_boot_sample = enable; + + return count; +} +#endif + + static DEVICE_ATTR(chip_id, S_IRUSR, smi_gyro_show_chip_id, NULL); +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static DEVICE_ATTR(read_gyro_boot_sample, 0644, + read_gyro_boot_sample_show, read_gyro_boot_sample_store); +#endif static DEVICE_ATTR(op_mode, S_IRUGO | S_IWUSR, smi_gyro_show_op_mode, smi_gyro_store_op_mode); static DEVICE_ATTR(value, S_IRUSR, @@ -1500,6 +1641,9 @@ static DEVICE_ATTR(fifo_tag, S_IRUGO | S_IWUSR, static struct attribute *smi_gyro_attributes[] = { &dev_attr_chip_id.attr, +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING + &dev_attr_read_gyro_boot_sample.attr, +#endif &dev_attr_op_mode.attr, &dev_attr_value.attr, &dev_attr_range.attr, @@ -1574,6 +1718,159 @@ static void smi_gyro_input_destroy(struct smi_gyro_client_data *client_data) input_unregister_device(dev); input_free_device(dev); } +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static void store_gyro_boot_sample(struct smi_gyro_client_data *client_data, + int x, int y, int z, struct timespec ts) +{ + if (false == client_data->gyro_buffer_smi130_samples) + return; + if (ts.tv_sec < client_data->max_buffer_time) { + if (client_data->gyro_bufsample_cnt < SMI_GYRO_MAXSAMPLE) { + client_data->smi130_gyro_samplist[client_data-> + gyro_bufsample_cnt]->xyz[0] = x; + client_data->smi130_gyro_samplist[client_data-> + gyro_bufsample_cnt]->xyz[1] = y; + client_data->smi130_gyro_samplist[client_data-> + gyro_bufsample_cnt]->xyz[2] = z; + client_data->smi130_gyro_samplist[client_data-> + gyro_bufsample_cnt]->tsec = ts.tv_sec; + client_data->smi130_gyro_samplist[client_data-> + gyro_bufsample_cnt]->tnsec = ts.tv_nsec; + client_data->gyro_bufsample_cnt++; + } + } else { + PINFO("End of GYRO buffering %d", + client_data->gyro_bufsample_cnt); + client_data->gyro_buffer_smi130_samples = false; + } +} +#else +static void store_gyro_boot_sample(struct smi_gyro_client_data *client_data, + int x, int y, int z, struct timespec ts) +{ +} +#endif + + +#ifdef CONFIG_ENABLE_SMI_ACC_GYRO_BUFFERING +static int smi130_gyro_early_buff_init(struct smi_gyro_client_data *client_data) +{ + int i = 0, err = 0; + + client_data->gyro_bufsample_cnt = 0; + client_data->report_evt_cnt = 5; + client_data->max_buffer_time = 40; + + client_data->smi_gyro_cachepool = kmem_cache_create("gyro_sensor_sample" + , sizeof(struct smi_gyro_sample), 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!client_data->smi_gyro_cachepool) { + PERR("smi_gyro_cachepool cache create failed\n"); + err = -ENOMEM; + goto clean_exit1; + } + + for (i = 0; i < SMI_GYRO_MAXSAMPLE; i++) { + client_data->smi130_gyro_samplist[i] = + kmem_cache_alloc(client_data->smi_gyro_cachepool, + GFP_KERNEL); + if (!client_data->smi130_gyro_samplist[i]) { + err = -ENOMEM; + goto clean_exit2; + } + } + + + client_data->gyrobuf_dev = input_allocate_device(); + if (!client_data->gyrobuf_dev) { + err = -ENOMEM; + PERR("input device allocation failed\n"); + goto clean_exit3; + } + client_data->gyrobuf_dev->name = "smi130_gyrobuf"; + client_data->gyrobuf_dev->id.bustype = BUS_I2C; + input_set_events_per_packet(client_data->gyrobuf_dev, + client_data->report_evt_cnt * SMI_GYRO_MAXSAMPLE); + set_bit(EV_ABS, client_data->gyrobuf_dev->evbit); + input_set_abs_params(client_data->gyrobuf_dev, ABS_X, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->gyrobuf_dev, ABS_Y, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->gyrobuf_dev, ABS_Z, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->gyrobuf_dev, ABS_RX, + -G_MAX, G_MAX, 0, 0); + input_set_abs_params(client_data->gyrobuf_dev, ABS_RY, + -G_MAX, G_MAX, 0, 0); + err = input_register_device(client_data->gyrobuf_dev); + if (err) { + PERR("unable to register input device %s\n", + client_data->gyrobuf_dev->name); + goto clean_exit3; + } + + client_data->gyro_buffer_smi130_samples = true; + + smi130_gyro_set_mode(SMI130_GYRO_MODE_NORMAL); + smi130_gyro_delay(5); + + smi130_gyro_set_bw(5); + smi130_gyro_delay(5); + + smi130_gyro_set_range_reg(4); + smi130_gyro_delay(5); + + smi130_gyro_set_mode(SMI130_GYRO_MODE_NORMAL); + smi130_gyro_delay(5); + + smi130_gyro_set_range_reg(4); + smi130_gyro_delay(5); + + smi130_gyro_set_data_en(SMI130_GYRO_ENABLE); + + return 1; + +clean_exit3: + input_free_device(client_data->gyrobuf_dev); +clean_exit2: + for (i = 0; i < SMI_GYRO_MAXSAMPLE; i++) + kmem_cache_free(client_data->smi_gyro_cachepool, + client_data->smi130_gyro_samplist[i]); +clean_exit1: + kmem_cache_destroy(client_data->smi_gyro_cachepool); + return 0; +} + +static void smi130_gyro_input_cleanup(struct smi_gyro_client_data *client_data) +{ + int i = 0; + + input_unregister_device(client_data->gyrobuf_dev); + input_free_device(client_data->gyrobuf_dev); + for (i = 0; i < SMI_GYRO_MAXSAMPLE; i++) + kmem_cache_free(client_data->smi_gyro_cachepool, + client_data->smi130_gyro_samplist[i]); + kmem_cache_destroy(client_data->smi_gyro_cachepool); +} + +static int smi130_enable_int1(void) +{ + return smi130_gyro_set_data_en(SMI130_GYRO_DISABLE); +} +#else +static int smi130_gyro_early_buff_init(struct smi_gyro_client_data *client_data) +{ + return 1; +} +static void smi130_gyro_input_cleanup(struct smi_gyro_client_data *client_data) +{ +} +static int smi130_enable_int1(void) +{ + return smi130_gyro_set_data_en(SMI130_GYRO_ENABLE); +} +#endif + #if defined(SMI130_GYRO_ENABLE_INT1) || defined(SMI130_GYRO_ENABLE_INT2) static void smi130_gyro_irq_work_func(struct work_struct *work) @@ -1598,7 +1895,8 @@ static void smi130_gyro_irq_work_func(struct work_struct *work) input_event(client_data->input, EV_MSC, MSC_SCAN, gyro_data.dataz); input_sync(client_data->input); - + store_gyro_boot_sample(client_data, gyro_data.datax, + gyro_data.datay, gyro_data.dataz, ts); } static irqreturn_t smi_gyro_irq_handler(int irq, void *handle) @@ -1727,7 +2025,7 @@ static int smi_gyro_probe(struct i2c_client *client, const struct i2c_device_id smi130_gyro_delay(5); err += smi130_gyro_set_int_data(SMI130_GYRO_INT1_DATA, SMI130_GYRO_ENABLE); smi130_gyro_delay(5); - err += smi130_gyro_set_data_en(SMI130_GYRO_ENABLE); + err += smi130_enable_int1(); smi130_gyro_delay(5); /*default odr is 100HZ*/ err += SMI_GYRO_CALL_API(set_bw)(7); @@ -1786,6 +2084,11 @@ static int smi_gyro_probe(struct i2c_client *client, const struct i2c_device_id } INIT_WORK(&client_data->irq_work, smi130_gyro_irq_work_func); #endif + + err = smi130_gyro_early_buff_init(client_data); + if (!err) + return err; + PINFO("sensor %s probed successfully", SENSOR_NAME); dev_dbg(&client->dev, @@ -1926,6 +2229,7 @@ static int smi_gyro_remove(struct i2c_client *client) #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&client_data->early_suspend_handler); #endif + smi130_gyro_input_cleanup(client_data); mutex_lock(&client_data->mutex_op_mode); SMI_GYRO_CALL_API(get_mode)(&op_mode); if (SMI_GYRO_VAL_NAME(MODE_NORMAL) == op_mode) { @@ -1942,7 +2246,6 @@ static int smi_gyro_remove(struct i2c_client *client) &smi_gyro_attribute_group); smi_gyro_input_destroy(client_data); kfree(client_data); - smi_gyro_client = NULL; } diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c old mode 100644 new mode 100755 diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_base.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_base.c index b08a1a376e3f..f0fa06faffc4 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_base.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_base.c @@ -476,7 +476,7 @@ static int sde_mdp_parse_dt_handler(struct platform_device *pdev, rc = of_property_read_u32_array(pdev->dev.of_node, prop_name, offsets, len); if (rc) { - SDEROT_ERR("Error from prop %s : u32 array read\n", prop_name); + SDEROT_DBG("Error from prop %s : u32 array read\n", prop_name); return -EINVAL; } diff --git a/drivers/media/platform/msm/vidc/msm_vidc_clocks.c b/drivers/media/platform/msm/vidc/msm_vidc_clocks.c index 0f0e3d02a6d3..8f307303cacd 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_clocks.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_clocks.c @@ -15,6 +15,7 @@ #include "vidc_hfi_api.h" #include "msm_vidc_debug.h" #include "msm_vidc_clocks.h" +#include "./governors/fixedpoint.h" #define MSM_VIDC_MIN_UBWC_COMPLEXITY_FACTOR (1 << 16) #define MSM_VIDC_MAX_UBWC_COMPLEXITY_FACTOR (4 << 16) @@ -38,7 +39,7 @@ static inline void msm_dcvs_print_dcvs_stats(struct clock_data *dcvs) static inline unsigned long int get_ubwc_compression_ratio( struct ubwc_cr_stats_info_type ubwc_stats_info) { - unsigned long int sum = 0, weighted_sum = 0; + fp_t sum = 0, weighted_sum = 0; unsigned long int compression_ratio = 1 << 16; weighted_sum = @@ -60,7 +61,7 @@ static inline unsigned long int get_ubwc_compression_ratio( ubwc_stats_info.cr_stats_info6; compression_ratio = (weighted_sum && sum) ? - ((256 * sum) << 16) / weighted_sum : compression_ratio; + fp_div((256 * sum), weighted_sum) : compression_ratio; return compression_ratio; } diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c index 97300e7276ad..b170d0e8824a 100644 --- a/drivers/media/platform/msm/vidc/venus_hfi.c +++ b/drivers/media/platform/msm/vidc/venus_hfi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -322,7 +322,7 @@ static int __write_queue(struct vidc_iface_q_info *qinfo, u8 *packet, { struct hfi_queue_header *queue; u32 packet_size_in_words, new_write_idx; - u32 empty_space, read_idx; + u32 empty_space, read_idx, write_idx; u32 *write_ptr; if (!qinfo || !packet) { @@ -345,16 +345,18 @@ static int __write_queue(struct vidc_iface_q_info *qinfo, u8 *packet, } packet_size_in_words = (*(u32 *)packet) >> 2; - if (!packet_size_in_words) { - dprintk(VIDC_ERR, "Zero packet size\n"); + if (!packet_size_in_words || packet_size_in_words > + qinfo->q_array.mem_size>>2) { + dprintk(VIDC_ERR, "Invalid packet size\n"); return -ENODATA; } read_idx = queue->qhdr_read_idx; + write_idx = queue->qhdr_write_idx; - empty_space = (queue->qhdr_write_idx >= read_idx) ? - (queue->qhdr_q_size - (queue->qhdr_write_idx - read_idx)) : - (read_idx - queue->qhdr_write_idx); + empty_space = (write_idx >= read_idx) ? + ((qinfo->q_array.mem_size>>2) - (write_idx - read_idx)) : + (read_idx - write_idx); if (empty_space <= packet_size_in_words) { queue->qhdr_tx_req = 1; dprintk(VIDC_ERR, "Insufficient size (%d) to write (%d)\n", @@ -364,13 +366,20 @@ static int __write_queue(struct vidc_iface_q_info *qinfo, u8 *packet, queue->qhdr_tx_req = 0; - new_write_idx = (queue->qhdr_write_idx + packet_size_in_words); + new_write_idx = write_idx + packet_size_in_words; write_ptr = (u32 *)((qinfo->q_array.align_virtual_addr) + - (queue->qhdr_write_idx << 2)); - if (new_write_idx < queue->qhdr_q_size) { + (write_idx << 2)); + if (write_ptr < (u32 *)qinfo->q_array.align_virtual_addr || + write_ptr > (u32 *)(qinfo->q_array.align_virtual_addr + + qinfo->q_array.mem_size)) { + dprintk(VIDC_ERR, "Invalid write index"); + return -ENODATA; + } + + if (new_write_idx < (qinfo->q_array.mem_size >> 2)) { memcpy(write_ptr, packet, packet_size_in_words << 2); } else { - new_write_idx -= queue->qhdr_q_size; + new_write_idx -= qinfo->q_array.mem_size >> 2; memcpy(write_ptr, packet, (packet_size_in_words - new_write_idx) << 2); memcpy((void *)qinfo->q_array.align_virtual_addr, @@ -466,7 +475,8 @@ static int __read_queue(struct vidc_iface_q_info *qinfo, u8 *packet, u32 packet_size_in_words, new_read_idx; u32 *read_ptr; u32 receive_request = 0; - int rc = 0; + u32 read_idx, write_idx; + int rc = 0; if (!qinfo || !packet || !pb_tx_req_is_set) { dprintk(VIDC_ERR, "Invalid Params\n"); @@ -499,7 +509,10 @@ static int __read_queue(struct vidc_iface_q_info *qinfo, u8 *packet, if (queue->qhdr_type & HFI_Q_ID_CTRL_TO_HOST_MSG_Q) receive_request = 1; - if (queue->qhdr_read_idx == queue->qhdr_write_idx) { + read_idx = queue->qhdr_read_idx; + write_idx = queue->qhdr_write_idx; + + if (read_idx == write_idx) { queue->qhdr_rx_req = receive_request; /* * mb() to ensure qhdr is updated in main memory @@ -516,21 +529,28 @@ static int __read_queue(struct vidc_iface_q_info *qinfo, u8 *packet, } read_ptr = (u32 *)((qinfo->q_array.align_virtual_addr) + - (queue->qhdr_read_idx << 2)); + (read_idx << 2)); + if (read_ptr < (u32 *)qinfo->q_array.align_virtual_addr || + read_ptr > (u32 *)(qinfo->q_array.align_virtual_addr + + qinfo->q_array.mem_size - sizeof(*read_ptr))) { + dprintk(VIDC_ERR, "Invalid read index\n"); + return -ENODATA; + } + packet_size_in_words = (*read_ptr) >> 2; if (!packet_size_in_words) { dprintk(VIDC_ERR, "Zero packet size\n"); return -ENODATA; } - new_read_idx = queue->qhdr_read_idx + packet_size_in_words; - if (((packet_size_in_words << 2) <= VIDC_IFACEQ_VAR_HUGE_PKT_SIZE) - && queue->qhdr_read_idx <= queue->qhdr_q_size) { - if (new_read_idx < queue->qhdr_q_size) { + new_read_idx = read_idx + packet_size_in_words; + if (((packet_size_in_words << 2) <= VIDC_IFACEQ_VAR_HUGE_PKT_SIZE) && + read_idx <= (qinfo->q_array.mem_size >> 2)) { + if (new_read_idx < (qinfo->q_array.mem_size >> 2)) { memcpy(packet, read_ptr, packet_size_in_words << 2); } else { - new_read_idx -= queue->qhdr_q_size; + new_read_idx -= (qinfo->q_array.mem_size >> 2); memcpy(packet, read_ptr, (packet_size_in_words - new_read_idx) << 2); memcpy(packet + ((packet_size_in_words - @@ -541,18 +561,18 @@ static int __read_queue(struct vidc_iface_q_info *qinfo, u8 *packet, } else { dprintk(VIDC_WARN, "BAD packet received, read_idx: %#x, pkt_size: %d\n", - queue->qhdr_read_idx, packet_size_in_words << 2); + read_idx, packet_size_in_words << 2); dprintk(VIDC_WARN, "Dropping this packet\n"); - new_read_idx = queue->qhdr_write_idx; + new_read_idx = write_idx; rc = -ENODATA; } - queue->qhdr_read_idx = new_read_idx; - - if (queue->qhdr_read_idx != queue->qhdr_write_idx) + if (new_read_idx != write_idx) queue->qhdr_rx_req = 0; else queue->qhdr_rx_req = receive_request; + + queue->qhdr_read_idx = new_read_idx; /* * mb() to ensure qhdr is updated in main memory * so that venus reads the updated header values diff --git a/drivers/misc/lkdtm_bugs.c b/drivers/misc/lkdtm_bugs.c index 77949fa3785e..a88a1149ba5f 100644 --- a/drivers/misc/lkdtm_bugs.c +++ b/drivers/misc/lkdtm_bugs.c @@ -67,7 +67,7 @@ void lkdtm_WARNING(void) void lkdtm_EXCEPTION(void) { - *((int *) 0) = 0; + *((volatile int *) 0) = 0; } void lkdtm_LOOP(void) diff --git a/drivers/net/can/spi/qti-can.c b/drivers/net/can/spi/qti-can.c index a8e122bb135e..3aa93951daba 100644 --- a/drivers/net/can/spi/qti-can.c +++ b/drivers/net/can/spi/qti-can.c @@ -122,6 +122,8 @@ struct spi_miso { /* TLV for MISO line */ #define CMD_END_BOOT_ROM_UPGRADE 0x9B #define CMD_END_FW_UPDATE_FILE 0x9C #define CMD_UPDATE_TIME_INFO 0x9D +#define CMD_SUSPEND_EVENT 0x9E +#define CMD_RESUME_EVENT 0x9F #define IOCTL_RELEASE_CAN_BUFFER (SIOCDEVPRIVATE + 0) #define IOCTL_ENABLE_BUFFERING (SIOCDEVPRIVATE + 1) @@ -597,6 +599,30 @@ static int qti_can_query_firmware_version(struct qti_can *priv_data) return ret; } +static int qti_can_notify_power_events(struct qti_can *priv_data, u8 event_type) +{ + char *tx_buf, *rx_buf; + int ret; + struct spi_mosi *req; + + mutex_lock(&priv_data->spi_lock); + tx_buf = priv_data->tx_buf; + rx_buf = priv_data->rx_buf; + memset(tx_buf, 0, XFER_BUFFER_SIZE); + memset(rx_buf, 0, XFER_BUFFER_SIZE); + priv_data->xfer_length = XFER_BUFFER_SIZE; + + req = (struct spi_mosi *)tx_buf; + req->cmd = event_type; + req->len = 0; + req->seq = atomic_inc_return(&priv_data->msg_seq); + + ret = qti_can_do_spi_transaction(priv_data); + mutex_unlock(&priv_data->spi_lock); + + return ret; +} + static int qti_can_set_bitrate(struct net_device *netdev) { char *tx_buf, *rx_buf; @@ -1472,6 +1498,7 @@ static int qti_can_suspend(struct device *dev) { struct spi_device *spi = to_spi_device(dev); struct qti_can *priv_data = NULL; + u8 power_event = CMD_SUSPEND_EVENT; int ret = 0; if (spi) { @@ -1481,8 +1508,8 @@ static int qti_can_suspend(struct device *dev) ret = -1; } - if (priv_data) - LOGDE("suspend %s", (ret < 0) ? "failed!!" : "success"); + if (priv_data && !(ret < 0)) + ret = qti_can_notify_power_events(priv_data, power_event); return ret; } @@ -1492,6 +1519,7 @@ static int qti_can_resume(struct device *dev) struct spi_device *spi = to_spi_device(dev); struct qti_can *priv_data = NULL; int ret = 0; + u8 power_event = CMD_RESUME_EVENT; if (spi) { priv_data = spi_get_drvdata(spi); @@ -1506,8 +1534,8 @@ static int qti_can_resume(struct device *dev) ret = -1; } - if (priv_data) - LOGDE("resume %s", (ret < 0) ? "failed!!" : "success"); + if (priv_data && !(ret < 0)) + ret = qti_can_notify_power_events(priv_data, power_event); return ret; } diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index d88d5f5359eb..282a0b9abc69 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include /* Operation Mode Strap Override */ #define MII_KSZPHY_OMSO 0x16 @@ -73,6 +75,21 @@ #define PS_TO_REG 200 +/*Register 2.10. 15:14 PME Output Select*/ +#define MII_KSZPHY_OMSO_PME_N2 BIT(10) +/*Register 2.10. BITS 6, 1 and 0 to detect the type of WOL */ +#define MII_KSZPHY_WOL_MAGIC_PKT BIT(6) +#define MII_KSZPHY_WOL_LINK_DOWN BIT(1) +#define MII_KSZPHY_WOL_LINK_UP BIT(0) +/* Register 2.10.15:14 PME Output Select */ +#define MII_KSZPHY_WOL_CTRL_PME_N2 BIT(15) +#define MII_KSZPHY_WOL_CTRL_INT_N BIT(14) + +/* MMD Address 2h, Register 2h Operation Mode Strap Override*/ +#define MII_KSZPHY_OMSO_REG 0x2 +/* MMD Address 2h, Register 10h Wake-On-LAN Control */ +#define MII_KSZPHY_WOL_CTRL_REG 0x10 + struct kszphy_hw_stat { const char *string; u8 reg; @@ -472,6 +489,37 @@ static int ksz9031_extended_read(struct phy_device *phydev, return phy_read(phydev, MII_KSZ9031RN_MMD_REGDATA_REG); } +static int ksz9031_ack_interrupt(struct phy_device *phydev) +{ + /* bit[7..0] int status, which is a read and clear register. */ + int rc; + u32 reg_value; + + rc = phy_read(phydev, MII_KSZPHY_INTCS); + + reg_value = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG); + if (reg_value & MII_KSZPHY_WOL_CTRL_PME_N2) { + /* PME output is cleared by disabling the PME trigger src */ + reg_value = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG); + reg_value &= ~(MII_KSZPHY_WOL_MAGIC_PKT | + MII_KSZPHY_WOL_LINK_UP | + MII_KSZPHY_WOL_LINK_DOWN); + ksz9031_extended_write( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG, reg_value); + reg_value = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG); + reg_value |= (MII_KSZPHY_WOL_MAGIC_PKT | + MII_KSZPHY_WOL_LINK_UP | + MII_KSZPHY_WOL_LINK_DOWN); + ksz9031_extended_write( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG, reg_value); + } + + return (rc < 0) ? rc : 0; +} + static int ksz9031_of_load_skew_values(struct phy_device *phydev, const struct device_node *of_node, u16 reg, size_t field_sz, @@ -801,6 +849,130 @@ static int kszphy_probe(struct phy_device *phydev) return 0; } +static void ksz9031_set_wol_settings( + struct phy_device *phydev, bool is_wol_enabled) +{ + u32 reg_value; + u32 reg_value1; + + reg_value = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG); + if (is_wol_enabled) { + /* Enable both PHY and PME_N2 interrupts */ + reg_value |= MII_KSZPHY_WOL_CTRL_PME_N2; + reg_value &= ~MII_KSZPHY_WOL_CTRL_INT_N; + reg_value |= (MII_KSZPHY_WOL_MAGIC_PKT | + MII_KSZPHY_WOL_LINK_UP | + MII_KSZPHY_WOL_LINK_DOWN); + /* Enable PME_N2 output */ + reg_value1 = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_OMSO_REG); + reg_value1 |= MII_KSZPHY_OMSO_PME_N2; + ksz9031_extended_write( + phydev, OP_DATA, 0x2, MII_KSZPHY_OMSO_REG, reg_value1); + } else { + /* Disable PME_N2 output and enable only PHY interrupt */ + reg_value &= ~MII_KSZPHY_WOL_CTRL_PME_N2; + reg_value |= MII_KSZPHY_WOL_CTRL_INT_N; + reg_value &= ~(MII_KSZPHY_WOL_MAGIC_PKT | + MII_KSZPHY_WOL_LINK_UP | + MII_KSZPHY_WOL_LINK_DOWN); + } + ksz9031_extended_write( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG, reg_value); +} + +static int ksz9031_set_wol( + struct phy_device *phydev, struct ethtool_wolinfo *wol) +{ + struct net_device *ndev = phydev->attached_dev; + const u8 *mac; + int ret = 0; + bool is_wol_enabled = false; + + if (!ndev) + return -ENODEV; + + if (wol->wolopts & WAKE_MAGIC) { + mac = (const u8 *)ndev->dev_addr; + + if (!is_valid_ether_addr(mac)) + return -EINVAL; + + ksz9031_extended_write( + phydev, OP_DATA, 0x2, 0x11, mac[5] | (mac[4] << 8)); + ksz9031_extended_write( + phydev, OP_DATA, 0x2, 0x12, mac[3] | (mac[2] << 8)); + ksz9031_extended_write( + phydev, OP_DATA, 0x2, 0x13, mac[1] | (mac[0] << 8)); + + /* Enable WOL interrupt for magic pkt, link up and down */ + is_wol_enabled = true; + } + ksz9031_set_wol_settings(phydev, is_wol_enabled); + + return ret; +} + +static void ksz9031_get_wol( + struct phy_device *phydev, struct ethtool_wolinfo *wol) +{ + u32 reg_value; + + wol->supported = WAKE_MAGIC; + wol->wolopts = 0; + + reg_value = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG); + if (reg_value & MII_KSZPHY_WOL_CTRL_PME_N2) + wol->wolopts |= WAKE_MAGIC; +} + +static int ksz9031_suspend(struct phy_device *phydev) +{ + int value; + int wol_enabled; + u32 reg_value; + + mutex_lock(&phydev->lock); + + reg_value = ksz9031_extended_read( + phydev, OP_DATA, 0x2, MII_KSZPHY_WOL_CTRL_REG); + wol_enabled = reg_value & MII_KSZPHY_WOL_CTRL_PME_N2; + + value = phy_read(phydev, MII_BMCR); + if (wol_enabled) + value |= BMCR_ISOLATE; + else + value |= BMCR_PDOWN; + + phy_write(phydev, MII_BMCR, value); + mutex_unlock(&phydev->lock); + + return 0; +} + +static int ksz9031_resume(struct phy_device *phydev) +{ + int value; + + mutex_lock(&phydev->lock); + + value = phy_read(phydev, MII_BMCR); + value &= ~(BMCR_PDOWN | BMCR_ISOLATE); + phy_write(phydev, MII_BMCR, value); + + mutex_unlock(&phydev->lock); + + if (phy_interrupt_is_valid(phydev) || phydev->interrupts == + PHY_INTERRUPT_ENABLED) { + if (phydev->drv->config_intr) + phydev->drv->config_intr(phydev); + } + + return 0; +} + static struct phy_driver ksphy_driver[] = { { .phy_id = PHY_ID_KS8737, @@ -992,13 +1164,15 @@ static struct phy_driver ksphy_driver[] = { .config_init = ksz9031_config_init, .config_aneg = genphy_config_aneg, .read_status = ksz9031_read_status, - .ack_interrupt = kszphy_ack_interrupt, + .ack_interrupt = ksz9031_ack_interrupt, .config_intr = kszphy_config_intr, .get_sset_count = kszphy_get_sset_count, .get_strings = kszphy_get_strings, .get_stats = kszphy_get_stats, - .suspend = genphy_suspend, - .resume = kszphy_resume, + .set_wol = ksz9031_set_wol, + .get_wol = ksz9031_get_wol, + .suspend = ksz9031_suspend, + .resume = ksz9031_resume, }, { .phy_id = PHY_ID_KSZ8873MLL, .phy_id_mask = MICREL_PHY_ID_MASK, diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c index dacde1192eb8..4883bc626ce9 100644 --- a/drivers/net/wireless/ath/wil6210/cfg80211.c +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c @@ -1905,6 +1905,10 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct wil6210_priv *wil = wiphy_to_wil(wiphy); enum wmi_ps_profile_type ps_profile; + if (wil->vr_profile != WMI_VR_PROFILE_DISABLED) + /* disallow in VR mode */ + return -EINVAL; + wil_dbg_misc(wil, "enabled=%d, timeout=%d\n", enabled, timeout); diff --git a/drivers/net/wireless/cnss2/Makefile b/drivers/net/wireless/cnss2/Makefile index fe0f59552553..ba279b538808 100644 --- a/drivers/net/wireless/cnss2/Makefile +++ b/drivers/net/wireless/cnss2/Makefile @@ -4,5 +4,6 @@ cnss2-y := main.o cnss2-y += bus.o cnss2-y += debug.o cnss2-y += pci.o +cnss2-y += usb.o cnss2-y += power.o cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o diff --git a/drivers/net/wireless/cnss2/bus.c b/drivers/net/wireless/cnss2/bus.c index accd50a7fcb7..c8f633ddd569 100644 --- a/drivers/net/wireless/cnss2/bus.c +++ b/drivers/net/wireless/cnss2/bus.c @@ -13,6 +13,7 @@ #include "bus.h" #include "debug.h" #include "pci.h" +#include "usb.h" enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev) { @@ -35,12 +36,33 @@ enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id) case QCA6290_EMULATION_DEVICE_ID: case QCA6290_DEVICE_ID: return CNSS_BUS_PCI; + case QCN7605_COMPOSITE_DEVICE_ID: + case QCN7605_STANDALONE_DEVICE_ID: + return CNSS_BUS_USB; default: cnss_pr_err("Unknown device_id: 0x%lx\n", device_id); return CNSS_BUS_NONE; } } +bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv) +{ + if (cnss_get_bus_type(plat_priv->device_id) == CNSS_BUS_USB) + return false; + else + return true; +} + +bool cnss_bus_dev_cal_rep_valid(struct cnss_plat_data *plat_priv) +{ + bool ret = false; + + if (cnss_get_bus_type(plat_priv->device_id) == CNSS_BUS_USB) + ret = true; + + return ret; +} + void *cnss_bus_dev_to_bus_priv(struct device *dev) { if (!dev) @@ -68,6 +90,8 @@ struct cnss_plat_data *cnss_bus_dev_to_plat_priv(struct device *dev) switch (cnss_get_dev_bus_type(dev)) { case CNSS_BUS_PCI: return cnss_pci_priv_to_plat_priv(bus_priv); + case CNSS_BUS_USB: + return cnss_usb_priv_to_plat_priv(bus_priv); default: return NULL; } @@ -81,6 +105,8 @@ int cnss_bus_init(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_init(plat_priv); + case CNSS_BUS_USB: + return cnss_usb_init(plat_priv); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -96,6 +122,8 @@ void cnss_bus_deinit(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: cnss_pci_deinit(plat_priv); + case CNSS_BUS_USB: + cnss_usb_deinit(plat_priv); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -204,6 +232,8 @@ int cnss_bus_call_driver_probe(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_call_driver_probe(plat_priv->bus_priv); + case CNSS_BUS_USB: + return cnss_usb_call_driver_probe(plat_priv->bus_priv); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -219,6 +249,8 @@ int cnss_bus_call_driver_remove(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_call_driver_remove(plat_priv->bus_priv); + case CNSS_BUS_USB: + return cnss_usb_call_driver_remove(plat_priv->bus_priv); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -234,6 +266,8 @@ int cnss_bus_dev_powerup(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_dev_powerup(plat_priv->bus_priv); + case CNSS_BUS_USB: + return 0; default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -249,6 +283,8 @@ int cnss_bus_dev_shutdown(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_dev_shutdown(plat_priv->bus_priv); + case CNSS_BUS_USB: + return 0; default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -294,6 +330,8 @@ int cnss_bus_register_driver_hdlr(struct cnss_plat_data *plat_priv, void *data) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_register_driver_hdlr(plat_priv->bus_priv, data); + case CNSS_BUS_USB: + return cnss_usb_register_driver_hdlr(plat_priv->bus_priv, data); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); @@ -309,6 +347,8 @@ int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv) switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_unregister_driver_hdlr(plat_priv->bus_priv); + case CNSS_BUS_USB: + return cnss_usb_unregister_driver_hdlr(plat_priv->bus_priv); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); diff --git a/drivers/net/wireless/cnss2/bus.h b/drivers/net/wireless/cnss2/bus.h index cfa3524541be..3d3bc2e6fd21 100644 --- a/drivers/net/wireless/cnss2/bus.h +++ b/drivers/net/wireless/cnss2/bus.h @@ -28,6 +28,13 @@ #define QCA6390_EMULATION_DEVICE_ID 0x0108 #define QCA6390_DEVICE_ID 0x1101 +#define QCN7605_USB_VENDOR_ID 0x05C6 +#define QCN7605_COMPOSITE_DEVICE_ID QCN7605_COMPOSITE_PRODUCT_ID +#define QCN7605_STANDALONE_DEVICE_ID QCN7605_STANDALONE_PRODUCT_ID + +#define QCN7605_STANDALONE_PRODUCT_ID 0x9900 +#define QCN7605_COMPOSITE_PRODUCT_ID 0x9901 + enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev); enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id); void *cnss_bus_dev_to_bus_priv(struct device *dev); @@ -53,5 +60,8 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv, int modem_current_status); int cnss_bus_update_status(struct cnss_plat_data *plat_priv, enum cnss_driver_status status); +int cnss_bus_recovery_update_status(struct cnss_plat_data *plat_priv); +bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv); +bool cnss_bus_dev_cal_rep_valid(struct cnss_plat_data *plat_priv); #endif /* _CNSS_BUS_H */ diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index a1d894789662..8a024aa86352 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -463,6 +463,15 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv) return ret; } +static int cnss_cal_update_hdlr(struct cnss_plat_data *plat_priv) +{ + /* QCN7605 store the cal data sent by FW to calDB memory area + * get out of this after complete data is uploaded. FW is expected + * to send cal done + */ + return 0; +} + static char *cnss_driver_event_to_str(enum cnss_driver_event_type type) { switch (type) { @@ -480,6 +489,10 @@ static char *cnss_driver_event_to_str(enum cnss_driver_event_type type) return "COLD_BOOT_CAL_START"; case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE: return "COLD_BOOT_CAL_DONE"; + case CNSS_DRIVER_EVENT_CAL_UPDATE: + return "COLD_BOOT_CAL_DATA_UPDATE"; + case CNSS_DRIVER_EVENT_CAL_DOWNLOAD: + return "COLD_BOOT_CAL_DATA_DOWNLOAD"; case CNSS_DRIVER_EVENT_REGISTER_DRIVER: return "REGISTER_DRIVER"; case CNSS_DRIVER_EVENT_UNREGISTER_DRIVER: @@ -632,6 +645,18 @@ int cnss_power_down(struct device *dev) } EXPORT_SYMBOL(cnss_power_down); +int cnss_idle_restart(struct device *dev) +{ + return 0; +} +EXPORT_SYMBOL(cnss_idle_restart); + +int cnss_idle_shutdown(struct device *dev) +{ + return 0; +} +EXPORT_SYMBOL(cnss_idle_shutdown); + static int cnss_get_resources(struct cnss_plat_data *plat_priv) { int ret = 0; @@ -1072,6 +1097,30 @@ int cnss_force_collect_rddm(struct device *dev) } EXPORT_SYMBOL(cnss_force_collect_rddm); +static int cnss_wlfw_server_arrive_hdlr(struct cnss_plat_data *plat_priv) +{ + int ret; + + ret = cnss_wlfw_server_arrive(plat_priv); + if (ret) + goto out; + + if (!cnss_bus_req_mem_ind_valid(plat_priv)) { + ret = cnss_wlfw_tgt_cap_send_sync(plat_priv); + if (ret) + goto out; + + ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv); + if (ret) + goto out; + /*cnss driver sends meta data report and waits for FW_READY*/ + if (cnss_bus_dev_cal_rep_valid(plat_priv)) + ret = cnss_wlfw_cal_report_send_sync(plat_priv); + } +out: + return ret; +} + static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) { int ret = 0; @@ -1151,7 +1200,7 @@ static void cnss_driver_event_work(struct work_struct *work) switch (event->type) { case CNSS_DRIVER_EVENT_SERVER_ARRIVE: - ret = cnss_wlfw_server_arrive(plat_priv); + ret = cnss_wlfw_server_arrive_hdlr(plat_priv); break; case CNSS_DRIVER_EVENT_SERVER_EXIT: ret = cnss_wlfw_server_exit(plat_priv); @@ -1171,6 +1220,9 @@ static void cnss_driver_event_work(struct work_struct *work) case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START: ret = cnss_cold_boot_cal_start_hdlr(plat_priv); break; + case CNSS_DRIVER_EVENT_CAL_UPDATE: + ret = cnss_cal_update_hdlr(plat_priv); + break; case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE: ret = cnss_cold_boot_cal_done_hdlr(plat_priv); break; @@ -1440,6 +1492,10 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv) case QCA6390_DEVICE_ID: ret = cnss_register_ramdump_v2(plat_priv); break; + case QCN7605_COMPOSITE_DEVICE_ID: + case QCN7605_STANDALONE_DEVICE_ID: + break; + default: cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id); ret = -ENODEV; @@ -1460,6 +1516,9 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv) case QCA6390_DEVICE_ID: cnss_unregister_ramdump_v2(plat_priv); break; + case QCN7605_COMPOSITE_DEVICE_ID: + case QCN7605_STANDALONE_DEVICE_ID: + break; default: cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id); break; diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index f18b08aa092d..31aa35b9ad97 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -36,6 +36,7 @@ enum cnss_dev_bus_type { CNSS_BUS_NONE = -1, CNSS_BUS_PCI, + CNSS_BUS_USB, }; struct cnss_vreg_info { @@ -160,6 +161,8 @@ enum cnss_driver_event_type { CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, CNSS_DRIVER_EVENT_POWER_UP, CNSS_DRIVER_EVENT_POWER_DOWN, + CNSS_DRIVER_EVENT_CAL_UPDATE, + CNSS_DRIVER_EVENT_CAL_DOWNLOAD, CNSS_DRIVER_EVENT_MAX, }; @@ -270,5 +273,7 @@ void cnss_unregister_subsys(struct cnss_plat_data *plat_priv); int cnss_register_ramdump(struct cnss_plat_data *plat_priv); void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv); void cnss_set_pin_connect_status(struct cnss_plat_data *plat_priv); - +u32 cnss_get_wake_msi(struct cnss_plat_data *plat_priv); +bool *cnss_get_qmi_bypass(void); +bool is_qcn7605_device(u16 device_id); #endif /* _CNSS_MAIN_H */ diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index e3c076e79526..3c8def257fc2 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -713,6 +713,17 @@ int cnss_pci_dev_ramdump(struct cnss_pci_data *pci_priv) return ret; } +int cnss_pci_is_drv_connected(struct device *dev) +{ + struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev)); + + if (!pci_priv) + return -ENODEV; + + return pci_priv->drv_connected_last; +} +EXPORT_SYMBOL(cnss_pci_is_drv_connected); + int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) { int ret = 0; diff --git a/drivers/net/wireless/cnss2/pci.h b/drivers/net/wireless/cnss2/pci.h index debb55446e62..8c0a3688b6a1 100644 --- a/drivers/net/wireless/cnss2/pci.h +++ b/drivers/net/wireless/cnss2/pci.h @@ -59,6 +59,7 @@ struct cnss_pci_data { struct pci_saved_state *default_state; struct msm_pcie_register_event msm_pci_event; atomic_t auto_suspended; + u8 drv_connected_last; bool monitor_wake_intr; struct dma_iommu_mapping *smmu_mapping; bool smmu_s1_enable; diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index d857b9f98f6f..e4d71a7c2bdc 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -244,6 +244,10 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv) req.pin_connect_result_enable = 1; req.cal_done_enable_valid = 1; req.cal_done_enable = 1; + req.initiate_cal_download_enable_valid = 1; + req.initiate_cal_download_enable = 1; + req.initiate_cal_update_enable_valid = 1; + req.initiate_cal_update_enable = 1; req_desc.max_msg_len = WLFW_IND_REGISTER_REQ_MSG_V01_MAX_MSG_LEN; req_desc.msg_id = QMI_WLFW_IND_REGISTER_REQ_V01; @@ -275,6 +279,13 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv) return ret; } +static int cnss_qmi_initiate_cal_update_ind_hdlr( + struct cnss_plat_data *plat_priv, + void *msg, unsigned int msg_len) +{ + return 0; +} + static int cnss_wlfw_request_mem_ind_hdlr(struct cnss_plat_data *plat_priv, void *msg, unsigned int msg_len) { @@ -1020,6 +1031,11 @@ int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, return ret; } +int cnss_wlfw_cal_report_send_sync(struct cnss_plat_data *plat_priv) +{ + return 0; +} + static void cnss_wlfw_clnt_ind(struct qmi_handle *handle, unsigned int msg_id, void *msg, unsigned int msg_len, void *ind_cb_priv) @@ -1061,6 +1077,9 @@ static void cnss_wlfw_clnt_ind(struct qmi_handle *handle, CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE, 0, NULL); break; + case QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01: + cnss_qmi_initiate_cal_update_ind_hdlr(plat_priv, msg, msg_len); + break; default: cnss_pr_err("Invalid QMI WLFW indication, msg_id: 0x%x\n", msg_id); diff --git a/drivers/net/wireless/cnss2/qmi.h b/drivers/net/wireless/cnss2/qmi.h index a48263e3873c..4a71216abad4 100644 --- a/drivers/net/wireless/cnss2/qmi.h +++ b/drivers/net/wireless/cnss2/qmi.h @@ -40,6 +40,8 @@ int cnss_wlfw_athdiag_write_send_sync(struct cnss_plat_data *plat_priv, u32 data_len, u8 *data); int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, u8 fw_log_mode); +int cnss_wlfw_cal_report_send_sync(struct cnss_plat_data *plat_priv); + #else #define QMI_WLFW_TIMEOUT_MS 10000 @@ -125,6 +127,12 @@ int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, { return 0; } -#endif /* CONFIG_CNSS2_QMI */ +static inline +int cnss_wlfw_cal_report_send_sync(struct cnss_plat_data *plat_priv) +{ + return 0; +} + +#endif /* CONFIG_CNSS2_QMI */ #endif /* _CNSS_QMI_H */ diff --git a/drivers/net/wireless/cnss2/usb.c b/drivers/net/wireless/cnss2/usb.c new file mode 100644 index 000000000000..6cf5aaea1b37 --- /dev/null +++ b/drivers/net/wireless/cnss2/usb.c @@ -0,0 +1,361 @@ +/* Copyright (c) 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 + * 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 "main.h" +#include "bus.h" +#include "debug.h" +#include "usb.h" + +int cnss_usb_dev_powerup(struct cnss_usb_data *usb_priv) +{ + int ret = 0; + + if (!usb_priv) { + cnss_pr_err("usb_priv is NULL\n"); + return -ENODEV; + } + return ret; +} + +int cnss_usb_wlan_register_driver(struct cnss_usb_wlan_driver *driver_ops) +{ + int ret = 0; + struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); + struct cnss_usb_data *usb_priv; + + if (!plat_priv) { + cnss_pr_err("plat_priv is NULL\n"); + return -ENODEV; + } + + usb_priv = plat_priv->bus_priv; + if (!usb_priv) { + cnss_pr_err("usb_priv is NULL\n"); + return -ENODEV; + } + + if (usb_priv->driver_ops) { + cnss_pr_err("Driver has already registered\n"); + return -EEXIST; + } + + ret = cnss_driver_event_post(plat_priv, + CNSS_DRIVER_EVENT_REGISTER_DRIVER, + CNSS_EVENT_SYNC_UNINTERRUPTIBLE, + driver_ops); + return ret; +} +EXPORT_SYMBOL(cnss_usb_wlan_register_driver); + +void cnss_usb_wlan_unregister_driver(struct cnss_usb_wlan_driver *driver_ops) +{ + struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); + + if (!plat_priv) { + cnss_pr_err("plat_priv is NULL\n"); + return; + } + + cnss_driver_event_post(plat_priv, + CNSS_DRIVER_EVENT_UNREGISTER_DRIVER, + CNSS_EVENT_SYNC_UNINTERRUPTIBLE, NULL); +} +EXPORT_SYMBOL(cnss_usb_wlan_unregister_driver); + +int cnss_usb_register_driver_hdlr(struct cnss_usb_data *usb_priv, + void *data) +{ + int ret = 0; + struct cnss_plat_data *plat_priv = usb_priv->plat_priv; + + set_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state); + usb_priv->driver_ops = data; + + ret = cnss_bus_call_driver_probe(plat_priv); + + return ret; +} + +int cnss_usb_unregister_driver_hdlr(struct cnss_usb_data *usb_priv) +{ + struct cnss_plat_data *plat_priv = usb_priv->plat_priv; + + set_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state); + cnss_usb_dev_shutdown(usb_priv); + usb_priv->driver_ops = NULL; + + return 0; +} + +int cnss_usb_dev_shutdown(struct cnss_usb_data *usb_priv) +{ + int ret = 0; + + if (!usb_priv) { + cnss_pr_err("usb_priv is NULL\n"); + return -ENODEV; + } + + switch (usb_priv->device_id) { + case QCN7605_COMPOSITE_DEVICE_ID: + case QCN7605_STANDALONE_DEVICE_ID: + break; + default: + cnss_pr_err("Unknown device_id found: 0x%x\n", + usb_priv->device_id); + ret = -ENODEV; + } + return ret; +} + +int cnss_usb_call_driver_probe(struct cnss_usb_data *usb_priv) +{ + int ret = 0; + struct cnss_plat_data *plat_priv = usb_priv->plat_priv; + + if (!usb_priv->driver_ops) { + cnss_pr_err("driver_ops is NULL\n"); + ret = -EINVAL; + goto out; + } + + if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) && + test_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state)) { + ret = usb_priv->driver_ops->reinit(usb_priv->usb_intf, + usb_priv->usb_device_id); + if (ret) { + cnss_pr_err("Failed to reinit host driver, err = %d\n", + ret); + goto out; + } + clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); + } else if (test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state)) { + ret = usb_priv->driver_ops->probe(usb_priv->usb_intf, + usb_priv->usb_device_id); + if (ret) { + cnss_pr_err("Failed to probe host driver, err = %d\n", + ret); + goto out; + } + clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); + clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state); + set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); + } + + return 0; + +out: + return ret; +} + +int cnss_usb_call_driver_remove(struct cnss_usb_data *usb_priv) +{ + struct cnss_plat_data *plat_priv = usb_priv->plat_priv; + + if (test_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state) || + test_bit(CNSS_FW_BOOT_RECOVERY, &plat_priv->driver_state) || + test_bit(CNSS_DRIVER_DEBUG, &plat_priv->driver_state)) { + cnss_pr_dbg("Skip driver remove\n"); + return 0; + } + + if (!usb_priv->driver_ops) { + cnss_pr_err("driver_ops is NULL\n"); + return -EINVAL; + } + + if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) && + test_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state)) { + usb_priv->driver_ops->shutdown(usb_priv->usb_intf); + } else if (test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) { + usb_priv->driver_ops->remove(usb_priv->usb_intf); + clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); + } + + return 0; +} + +static struct usb_driver cnss_usb_driver; +#define QCN7605_WLAN_INTERFACE_NUM 0x0000 + +static int cnss_usb_probe(struct usb_interface *interface, + const struct usb_device_id *id) +{ + int ret = 0; + struct cnss_usb_data *usb_priv; + struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); + struct usb_device *usb_dev; + unsigned short bcd_device; + + cnss_pr_dbg("USB probe, vendor ID: 0x%x, product ID: 0x%x\n", + id->idVendor, id->idProduct); + + usb_dev = interface_to_usbdev(interface); + usb_priv = devm_kzalloc(&usb_dev->dev, sizeof(*usb_priv), + GFP_KERNEL); + if (!usb_priv) { + ret = -ENOMEM; + goto out; + } + + if (interface->cur_altsetting->desc.bInterfaceNumber == + QCN7605_WLAN_INTERFACE_NUM) { + if (usb_driver_claim_interface(&cnss_usb_driver, + interface, + NULL)) { + ret = -ENODEV; + goto reset_priv; + } + } + bcd_device = le16_to_cpu(usb_dev->descriptor.bcdDevice); + usb_priv->plat_priv = plat_priv; + usb_priv->usb_intf = interface; + usb_priv->usb_device_id = id; + usb_priv->device_id = id->idProduct; + usb_priv->target_version = bcd_device; + cnss_set_usb_priv(interface, usb_priv); + plat_priv->device_id = usb_priv->device_id; + plat_priv->bus_priv = usb_priv; + + /*increment the ref count of usb dev structure*/ + usb_get_dev(usb_dev); + + ret = cnss_register_subsys(plat_priv); + if (ret) + goto reset_ctx; + + ret = cnss_register_ramdump(plat_priv); + if (ret) + goto unregister_subsys; + + switch (usb_priv->device_id) { + case QCN7605_COMPOSITE_DEVICE_ID: + case QCN7605_STANDALONE_DEVICE_ID: + break; + default: + cnss_pr_err("Unknown USB device found: 0x%x\n", + usb_priv->device_id); + ret = -ENODEV; + goto unregister_ramdump; + } + + return 0; + +unregister_ramdump: + cnss_unregister_ramdump(plat_priv); +unregister_subsys: + cnss_unregister_subsys(plat_priv); +reset_ctx: + plat_priv->bus_priv = NULL; +reset_priv: + devm_kfree(&usb_dev->dev, usb_priv); +out: + return ret; +} + +static void cnss_usb_remove(struct usb_interface *interface) +{ + struct usb_device *usb_dev; + struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); + struct cnss_usb_data *usb_priv = plat_priv->bus_priv; + + usb_priv->plat_priv = NULL; + plat_priv->bus_priv = NULL; + usb_dev = interface_to_usbdev(interface); + usb_put_dev(usb_dev); + devm_kfree(&usb_dev->dev, usb_priv); +} + +static int cnss_usb_suspend(struct usb_interface *interface, pm_message_t state) +{ + int ret = 0; + struct cnss_usb_data *usb_priv; + struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); + + usb_priv = plat_priv->bus_priv; + if (!usb_priv->driver_ops) { + cnss_pr_err("driver_ops is NULL\n"); + ret = -EINVAL; + goto out; + } + ret = usb_priv->driver_ops->suspend(usb_priv->usb_intf, + state); +out: + return ret; +} + +static int cnss_usb_resume(struct usb_interface *interface) +{ + int ret = 0; + struct cnss_usb_data *usb_priv; + struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL); + + usb_priv = plat_priv->bus_priv; + if (!usb_priv->driver_ops) { + cnss_pr_err("driver_ops is NULL\n"); + ret = -EINVAL; + goto out; + } + ret = usb_priv->driver_ops->resume(usb_priv->usb_intf); + +out: + return ret; +} + +static int cnss_usb_reset_resume(struct usb_interface *interface) +{ + return 0; +} + +static struct usb_device_id cnss_usb_id_table[] = { + { USB_DEVICE_AND_INTERFACE_INFO(QCN7605_USB_VENDOR_ID, + QCN7605_COMPOSITE_PRODUCT_ID, + QCN7605_WLAN_INTERFACE_NUM, + 0xFF, 0xFF) }, + { USB_DEVICE_AND_INTERFACE_INFO(QCN7605_USB_VENDOR_ID, + QCN7605_STANDALONE_PRODUCT_ID, + QCN7605_WLAN_INTERFACE_NUM, + 0xFF, 0xFF) }, + {} /* Terminating entry */ +}; + +static struct usb_driver cnss_usb_driver = { + .name = "cnss_usb", + .id_table = cnss_usb_id_table, + .probe = cnss_usb_probe, + .disconnect = cnss_usb_remove, + .suspend = cnss_usb_suspend, + .resume = cnss_usb_resume, + .reset_resume = cnss_usb_reset_resume, + .supports_autosuspend = true, +}; + +int cnss_usb_init(struct cnss_plat_data *plat_priv) +{ + int ret = 0; + + ret = usb_register(&cnss_usb_driver); + if (ret) { + cnss_pr_err("Failed to register to Linux USB framework, err = %d\n", + ret); + goto out; + } + + return 0; +out: + return ret; +} + +void cnss_usb_deinit(struct cnss_plat_data *plat_priv) +{ + usb_deregister(&cnss_usb_driver); +} diff --git a/drivers/net/wireless/cnss2/usb.h b/drivers/net/wireless/cnss2/usb.h new file mode 100644 index 000000000000..b285dc27daa9 --- /dev/null +++ b/drivers/net/wireless/cnss2/usb.h @@ -0,0 +1,66 @@ +/* Copyright (c) 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 + * 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. + */ + +#ifndef _CNSS_USB_H +#define _CNSS_USB_H + +#include + +#include "main.h" + +struct cnss_usb_data { + struct usb_interface *usb_intf; + struct cnss_plat_data *plat_priv; + const struct usb_device_id *usb_device_id; + u16 device_id; /*USB PID*/ + u16 target_version; /* [QCN7605] - from bcdDevice*/ + struct cnss_usb_wlan_driver *driver_ops; +}; + +static inline void cnss_set_usb_priv(struct usb_interface *usb_intf, void *data) +{ + usb_set_intfdata(usb_intf, data); +} + +static inline struct cnss_usb_data *cnss_get_usb_priv(struct usb_interface + *usb_intf) +{ + return usb_get_intfdata(usb_intf); +} + +static inline struct cnss_plat_data *cnss_usb_priv_to_plat_priv(void *bus_priv) +{ + struct cnss_usb_data *usb_priv = bus_priv; + + return usb_priv->plat_priv; +} + +int cnss_usb_init(struct cnss_plat_data *plat_priv); +void cnss_usb_deinit(struct cnss_plat_data *plat_priv); +void cnss_usb_collect_dump_info(struct cnss_usb_data *usb_priv, bool in_panic); +void cnss_usb_clear_dump_info(struct cnss_usb_data *usb_priv); +int cnss_usb_force_fw_assert_hdlr(struct cnss_usb_data *usb_priv); +void cnss_usb_fw_boot_timeout_hdlr(struct cnss_usb_data *usb_priv); +int cnss_usb_call_driver_probe(struct cnss_usb_data *usb_priv); +int cnss_usb_call_driver_remove(struct cnss_usb_data *usb_priv); +int cnss_usb_dev_powerup(struct cnss_usb_data *usb_priv); +int cnss_usb_dev_shutdown(struct cnss_usb_data *usb_priv); +int cnss_usb_dev_crash_shutdown(struct cnss_usb_data *usb_priv); +int cnss_usb_dev_ramdump(struct cnss_usb_data *usb_priv); + +int cnss_usb_register_driver_hdlr(struct cnss_usb_data *usb_priv, void *data); + +int cnss_usb_unregister_driver_hdlr(struct cnss_usb_data *usb_priv); +int cnss_usb_call_driver_modem_status(struct cnss_usb_data *usb_priv, + int modem_current_status); + +#endif /* _CNSS_USB_H */ diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c index 17dbc364b8a5..52f34b3e553e 100644 --- a/drivers/net/wireless/virt_wifi.c +++ b/drivers/net/wireless/virt_wifi.c @@ -529,8 +529,10 @@ static int virt_wifi_newlink(struct net *src_net, struct net_device *dev, SET_NETDEV_DEV(dev, &priv->lowerdev->dev); dev->ieee80211_ptr = kzalloc(sizeof(*dev->ieee80211_ptr), GFP_KERNEL); - if (!dev->ieee80211_ptr) + if (!dev->ieee80211_ptr) { + err = -ENOMEM; goto remove_handler; + } dev->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION; dev->ieee80211_ptr->wiphy = common_wiphy; diff --git a/drivers/nfc/nq-nci.c b/drivers/nfc/nq-nci.c index 9e005099fb7f..0d9b6f0e49b0 100644 --- a/drivers/nfc/nq-nci.c +++ b/drivers/nfc/nq-nci.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -682,8 +682,11 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev) 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_get_version_cmd[] = {0x00, 0x04, 0xF1, + 0x00, 0x00, 0x00, 0x6E, 0xEF}; unsigned char nci_init_rsp[28]; unsigned char nci_reset_rsp[6]; + unsigned char nci_get_version_rsp[12]; unsigned char init_rsp_len = 0; unsigned int enable_gpio = nqx_dev->en_gpio; @@ -701,8 +704,47 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev) sizeof(raw_nci_reset_cmd)); if (ret < 0) { dev_err(&client->dev, - "%s: - i2c_master_send Error\n", __func__); - goto err_nfcc_hw_check; + "%s: - i2c_master_send core reset Error\n", __func__); + + if (gpio_is_valid(nqx_dev->firm_gpio)) { + gpio_set_value(nqx_dev->firm_gpio, 1); + usleep_range(10000, 10100); + } + gpio_set_value(nqx_dev->en_gpio, 0); + usleep_range(10000, 10100); + gpio_set_value(nqx_dev->en_gpio, 1); + usleep_range(10000, 10100); + + ret = i2c_master_send(client, nci_get_version_cmd, + sizeof(nci_get_version_cmd)); + + if (ret < 0) { + dev_err(&client->dev, + "%s: - i2c_master_send get version cmd Error\n", + __func__); + goto err_nfcc_hw_check; + } + /* hardware dependent delay */ + usleep_range(10000, 10100); + + ret = i2c_master_recv(client, nci_get_version_rsp, + sizeof(nci_get_version_rsp)); + if (ret < 0) { + dev_err(&client->dev, + "%s: - i2c_master_recv get version rsp Error\n", + __func__); + goto err_nfcc_hw_check; + } else { + nqx_dev->nqx_info.info.chip_type = + nci_get_version_rsp[3]; + nqx_dev->nqx_info.info.rom_version = + nci_get_version_rsp[4]; + nqx_dev->nqx_info.info.fw_minor = + nci_get_version_rsp[10]; + nqx_dev->nqx_info.info.fw_major = + nci_get_version_rsp[11]; + } + goto err_nfcc_reset_failed; } /* hardware dependent delay */ msleep(30); @@ -722,7 +764,7 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev) sizeof(raw_nci_init_cmd)); if (ret < 0) { dev_err(&client->dev, - "%s: - i2c_master_send Error\n", __func__); + "%s: - i2c_master_send failed for Core INIT\n", __func__); goto err_nfcc_core_init_fail; } /* hardware dependent delay */ @@ -751,6 +793,7 @@ static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev) __func__, nci_reset_rsp[0], nci_reset_rsp[1], nci_reset_rsp[2]); +err_nfcc_reset_failed: dev_dbg(&nqx_dev->client->dev, "NQ NFCC chip_type = %x\n", nqx_dev->nqx_info.info.chip_type); dev_dbg(&nqx_dev->client->dev, "NQ fw version = %x.%x.%x\n", diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_com.h b/drivers/platform/msm/ep_pcie/ep_pcie_com.h index a3ff69ad05d7..38e6f4969a1f 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_com.h +++ b/drivers/platform/msm/ep_pcie/ep_pcie_com.h @@ -333,7 +333,8 @@ struct ep_pcie_dev_t { u16 vendor_id; u16 device_id; u32 subsystem_id; - u32 link_speed; + u32 max_link_speed; + u32 curr_link_speed; bool active_config; bool aggregated_irq; bool mhi_a7_irq; diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_core.c b/drivers/platform/msm/ep_pcie/ep_pcie_core.c index de92cbd107ba..1ec5670e2ca9 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_core.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie_core.c @@ -604,7 +604,7 @@ static void ep_pcie_core_init(struct ep_pcie_dev_t *dev, bool configured) /* Configure link speed */ ep_pcie_write_mask(dev->dm_core + PCIE20_LINK_CONTROL2_LINK_STATUS2, - 0xf, dev->link_speed); + 0xf, dev->curr_link_speed); } if (dev->active_config) { @@ -1597,6 +1597,10 @@ int ep_pcie_core_enable_endpoint(enum ep_pcie_options opt) } } + EP_PCIE_DBG(dev, "PCIe V%d: PCIE20_CAP_LINKCTRLSTATUS: 0x%x\n", + dev->rev, + readl_relaxed(dev->dm_core + PCIE20_CAP_LINKCTRLSTATUS)); + dev->suspending = false; goto out; @@ -2564,17 +2568,18 @@ static int ep_pcie_probe(struct platform_device *pdev) pr_debug("%s\n", __func__); - ep_pcie_dev.link_speed = 1; + ep_pcie_dev.max_link_speed = 1; ret = of_property_read_u32((&pdev->dev)->of_node, "qcom,pcie-link-speed", - &ep_pcie_dev.link_speed); + &ep_pcie_dev.max_link_speed); if (ret) EP_PCIE_DBG(&ep_pcie_dev, "PCIe V%d: pcie-link-speed does not exist.\n", ep_pcie_dev.rev); else EP_PCIE_DBG(&ep_pcie_dev, "PCIe V%d: pcie-link-speed:%d.\n", - ep_pcie_dev.rev, ep_pcie_dev.link_speed); + ep_pcie_dev.rev, ep_pcie_dev.max_link_speed); + ep_pcie_dev.curr_link_speed = ep_pcie_dev.max_link_speed; ep_pcie_dev.vendor_id = 0xFFFF; ret = of_property_read_u16((&pdev->dev)->of_node, diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c b/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c index 1f09a8864e47..a6ec33f4827c 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie_dbg.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 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 @@ -23,7 +23,7 @@ #include "ep_pcie_phy.h" static struct dentry *dent_ep_pcie; -static struct dentry *dfile_case; +static u8 link_speed; static struct ep_pcie_dev_t *dev; static void ep_ep_pcie_phy_dump_pcs_debug_bus(struct ep_pcie_dev_t *dev, @@ -406,6 +406,17 @@ static ssize_t ep_pcie_cmd_debug(struct file *file, case 32: /* do not output core registers when D3 hot is set by host*/ dev->dump_conf = false; break; + case 33: /* Set link speed, takes effect upon next hlos link training */ + if (link_speed > 0 && link_speed <= dev->max_link_speed) { + EP_PCIE_DBG_FS("Setting link speed to gen %d\n", + link_speed); + dev->curr_link_speed = link_speed; + } else { + EP_PCIE_DBG_FS( + "Invalid link speed %d, max supported speed %d\n", + link_speed, dev->max_link_speed); + } + break; default: EP_PCIE_DBG_FS("PCIe: Invalid testcase: %d.\n", testcase); break; @@ -423,6 +434,8 @@ const struct file_operations ep_pcie_cmd_debug_ops = { void ep_pcie_debugfs_init(struct ep_pcie_dev_t *ep_dev) { + struct dentry *dfile; + dev = ep_dev; dent_ep_pcie = debugfs_create_dir("pcie-ep", 0); if (IS_ERR(dent_ep_pcie)) { @@ -432,14 +445,23 @@ void ep_pcie_debugfs_init(struct ep_pcie_dev_t *ep_dev) return; } - dfile_case = debugfs_create_file("case", 0664, - dent_ep_pcie, 0, - &ep_pcie_cmd_debug_ops); - if (!dfile_case || IS_ERR(dfile_case)) { + dfile = debugfs_create_file("case", 0664, + dent_ep_pcie, NULL, + &ep_pcie_cmd_debug_ops); + if (!dfile || IS_ERR(dfile)) { EP_PCIE_ERR(dev, "PCIe V%d: fail to create the file for case.\n", dev->rev); - goto case_error; + goto file_error; + } + + dfile = debugfs_create_u8("link_speed", 0664, + dent_ep_pcie, &link_speed); + if (!dfile || IS_ERR(dfile)) { + EP_PCIE_ERR(dev, + "PCIe V%d: fail to create the file for link speed.\n", + dev->rev); + goto file_error; } EP_PCIE_DBG2(dev, @@ -448,12 +470,11 @@ void ep_pcie_debugfs_init(struct ep_pcie_dev_t *ep_dev) return; -case_error: - debugfs_remove(dent_ep_pcie); +file_error: + debugfs_remove_recursive(dent_ep_pcie); } void ep_pcie_debugfs_exit(void) { - debugfs_remove(dfile_case); - debugfs_remove(dent_ep_pcie); + debugfs_remove_recursive(dent_ep_pcie); } diff --git a/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c b/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c index 54e82f3ad126..bc04ed4a5cfd 100644 --- a/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c +++ b/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c @@ -161,6 +161,7 @@ struct ipa_gsb_context { spinlock_t iface_spinlock[MAX_SUPPORTED_IFACE]; u32 pm_hdl; atomic_t disconnect_in_progress; + atomic_t suspend_in_progress; }; static struct ipa_gsb_context *ipa_gsb_ctx; @@ -1070,20 +1071,24 @@ int ipa_bridge_suspend(u32 hdl) IPA_GSB_DBG_LOW("client hdl: %d\n", hdl); mutex_lock(&ipa_gsb_ctx->iface_lock[hdl]); + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 1); if (!ipa_gsb_ctx->iface[hdl]) { IPA_GSB_ERR("fail to find interface, hdl: %d\n", hdl); + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 0); mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]); return -EFAULT; } if (!ipa_gsb_ctx->iface[hdl]->is_connected) { IPA_GSB_ERR("iface is not connected\n"); + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 0); mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]); return -EFAULT; } if (!ipa_gsb_ctx->iface[hdl]->is_resumed) { IPA_GSB_DBG_LOW("iface was already suspended\n"); + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 0); mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]); return 0; } @@ -1096,6 +1101,7 @@ int ipa_bridge_suspend(u32 hdl) IPA_GSB_ERR( "fail to stop cons ep %d\n", ret); + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 0); mutex_unlock(&ipa_gsb_ctx->lock); mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]); return ret; @@ -1105,6 +1111,7 @@ int ipa_bridge_suspend(u32 hdl) if (ret) { IPA_GSB_ERR("fail to deactivate ipa pm\n"); ipa_start_gsi_channel(ipa_gsb_ctx->cons_hdl); + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 0); mutex_unlock(&ipa_gsb_ctx->lock); mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]); return ret; @@ -1115,7 +1122,7 @@ int ipa_bridge_suspend(u32 hdl) ipa_gsb_ctx->num_resumed_iface--; IPA_GSB_DBG_LOW("num resumed iface: %d\n", ipa_gsb_ctx->num_resumed_iface); - + atomic_set(&ipa_gsb_ctx->suspend_in_progress, 0); mutex_unlock(&ipa_gsb_ctx->lock); mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]); return 0; @@ -1169,6 +1176,16 @@ int ipa_bridge_tx_dp(u32 hdl, struct sk_buff *skb, return -EFAULT; } + if (unlikely(atomic_read(&ipa_gsb_ctx->suspend_in_progress))) { + IPA_GSB_ERR("ipa bridge suspend_in_progress\n"); + return -EFAULT; + } + + if (unlikely(!ipa_gsb_ctx->iface[hdl]->is_resumed)) { + IPA_GSB_ERR("iface %d was suspended\n", hdl); + return -EFAULT; + } + /* make sure skb has enough headroom */ if (unlikely(skb_headroom(skb) < sizeof(struct ipa_gsb_mux_hdr))) { IPA_GSB_DBG_LOW("skb doesn't have enough headroom\n"); diff --git a/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c b/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c index ae9dd62dd64f..10d34ea3321b 100644 --- a/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c +++ b/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c @@ -2804,12 +2804,15 @@ int ipa_mhi_init(struct ipa_mhi_init_params *params) goto fail_rm; } - /* Initialize uC interface */ - ipa_uc_mhi_init(ipa_mhi_uc_ready_cb, - ipa_mhi_uc_wakeup_request_cb); - if (ipa_uc_state_check() == 0) + if (ipa_get_transport_type() == IPA_TRANSPORT_TYPE_GSI) { ipa_mhi_set_state(IPA_MHI_STATE_READY); - + } else { + /* Initialize uC interface */ + ipa_uc_mhi_init(ipa_mhi_uc_ready_cb, + ipa_mhi_uc_wakeup_request_cb); + if (ipa_uc_state_check() == 0) + ipa_mhi_set_state(IPA_MHI_STATE_READY); + } /* Initialize debugfs */ ipa_mhi_debugfs_init(); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 82d03c215839..98db784962ec 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -4933,6 +4933,15 @@ static ssize_t ipa3_write(struct file *file, const char __user *buf, } } + /* Prevent multiple calls from trying to load the FW again. */ + if (ipa3_ctx->fw_loaded) { + IPAERR("not load FW again\n"); + return count; + } + + /* Schedule WQ to load ipa-fws */ + ipa3_ctx->fw_loaded = true; + queue_work(ipa3_ctx->transport_power_mgmt_wq, &ipa3_fw_loading_work); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index e13c4bd79fbd..d145a4b32927 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1607,6 +1607,7 @@ struct ipa3_context { bool use_ipa_pm; bool vlan_mode_iface[IPA_VLAN_IF_MAX]; bool wdi_over_pcie; + bool fw_loaded; }; struct ipa3_plat_drv_res { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c index 2955e0961197..e32184577eab 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c @@ -1552,7 +1552,6 @@ int ipa3_del_nat_table(struct ipa_ioc_nat_ipv6ct_table_del *del) ipa3_ctx->nat_mem.pdn_mem.base, ipa3_ctx->nat_mem.pdn_mem.phys_base); ipa3_ctx->nat_mem.pdn_mem.base = NULL; - ipa3_ctx->nat_mem.dev.is_mem_allocated = false; } ipa3_nat_ipv6ct_free_mem(&ipa3_ctx->nat_mem.dev); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index 3aa8a01f75af..25152eacb855 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -794,7 +794,7 @@ int ipa3_qmi_ul_filter_request_send( { struct ipa_configure_ul_firewall_rules_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; - int rc; + int rc, i; IPAWANDBG("IPACM pass %u rules to Q6\n", req->firewall_rules_list_len); @@ -814,6 +814,37 @@ int ipa3_qmi_ul_filter_request_send( } mutex_unlock(&ipa3_qmi_lock); + /* check if modem is up */ + if (!ipa3_qmi_indication_fin || + !ipa3_qmi_modem_init_fin || + !ipa_q6_clnt) { + IPAWANDBG("modem QMI service is not up yet\n"); + return -EINVAL; + } + + /* Passing 0 rules means that firewall is disabled */ + if (req->firewall_rules_list_len == 0) + IPAWANDBG("IPACM passed 0 rules to Q6\n"); + + if (req->firewall_rules_list_len >= QMI_IPA_MAX_UL_FIREWALL_RULES_V01) { + IPAWANERR( + "Number of rules passed by IPACM, %d, exceed limit %d\n", + req->firewall_rules_list_len, + QMI_IPA_MAX_UL_FIREWALL_RULES_V01); + return -EINVAL; + } + + /* Check for valid IP type */ + for (i = 0; i < req->firewall_rules_list_len; i++) { + if (req->firewall_rules_list[i].ip_type != + QMI_IPA_IP_TYPE_V4_V01 && + req->firewall_rules_list[i].ip_type != + QMI_IPA_IP_TYPE_V6_V01) + IPAWANERR("Invalid IP type %d\n", + req->firewall_rules_list[i].ip_type); + return -EINVAL; + } + req_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_V01; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index fd3206e1cc6a..ed2a43d03f2a 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -1242,7 +1242,7 @@ int ipa3_add_rt_rule_after(struct ipa_ioc_add_rt_rule_after *rules) tbl = __ipa3_find_rt_tbl(rules->ip, rules->rt_tbl_name); if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR_RL("failed finding rt tbl name = %s\n", - rules->rt_tbl_name ? rules->rt_tbl_name : ""); + (rules->rt_tbl_name != NULL) ? rules->rt_tbl_name : ""); ret = -EINVAL; goto bail; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c index 016b4f35edfd..d72334e5ad08 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. +/* Copyright (c) 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 @@ -17,7 +17,6 @@ #define IPA_64_LOW_32_MASK (0xFFFFFFFF) #define IPA_64_HIGH_32_MASK (0xFFFFFFFF00000000ULL) -#define IPAHAL_NAT_INVALID_PROTOCOL (0xFF) static const char *ipahal_nat_type_to_str[IPA_NAT_MAX] = { __stringify(IPAHAL_NAT_IPV4), diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index d7785fa5678a..6a477f2361cc 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -728,7 +728,8 @@ static int ipa3_wwan_add_ul_flt_rule_to_ipa(void) retval = -EFAULT; } - req->install_status = IPA_QMI_RESULT_SUCCESS_V01; + req->install_status = (enum ipa_qmi_result_type_v01) + QMI_RESULT_SUCCESS_V01; req->rule_id_valid = 1; req->rule_id_len = rmnet_ipa3_ctx->num_q6_rules; for (i = 0; i < rmnet_ipa3_ctx->num_q6_rules; i++) { diff --git a/drivers/platform/msm/mhi_dev/mhi_uci.c b/drivers/platform/msm/mhi_dev/mhi_uci.c index 1876bdb57389..24b9a863791d 100644 --- a/drivers/platform/msm/mhi_dev/mhi_uci.c +++ b/drivers/platform/msm/mhi_dev/mhi_uci.c @@ -34,7 +34,7 @@ #define MHI_UCI_IPC_LOG_PAGES (100) /* Max number of MHI write request structures (used in async writes) */ -#define MAX_UCI_WR_REQ 10 +#define MHI_UCI_NUM_WR_REQ_DEFAULT 10 #define MAX_NR_TRBS_PER_CHAN 9 #define MHI_QTI_IFACE_ID 4 #define MHI_ADPL_IFACE_ID 5 @@ -44,6 +44,7 @@ #define MHI_UCI_ASYNC_READ_TIMEOUT msecs_to_jiffies(100) #define MHI_UCI_ASYNC_WRITE_TIMEOUT msecs_to_jiffies(100) #define MHI_UCI_AT_CTRL_READ_TIMEOUT msecs_to_jiffies(1000) +#define MHI_UCI_WRITE_REQ_AVAIL_TIMEOUT msecs_to_jiffies(1000) enum uci_dbg_level { UCI_DBG_VERBOSE = 0x0, @@ -86,6 +87,8 @@ struct chan_attr { bool wr_cmpl; /* Uevent broadcast of channel state */ bool state_bcast; + /* Number of write request structs to allocate */ + u32 num_wr_reqs; }; @@ -230,7 +233,11 @@ static const struct chan_attr uci_chan_attr_table[] = { MAX_NR_TRBS_PER_CHAN, MHI_DIR_IN, NULL, - NULL + NULL, + NULL, + false, + false, + 50 }, { MHI_CLIENT_ADB_OUT, @@ -429,6 +436,9 @@ static void mhi_uci_write_completion_cb(void *req) if (uci_handle->write_done) complete(uci_handle->write_done); + + /* Write queue may be waiting for write request structs */ + wake_up(&uci_handle->write_wq); } static void mhi_uci_read_completion_cb(void *req) @@ -473,7 +483,7 @@ static int mhi_uci_send_async(struct uci_client *uci_handle, if (list_empty(&uci_handle->wr_req_list)) { uci_log(UCI_DBG_ERROR, "Write request pool empty\n"); spin_unlock_irq(&uci_handle->wr_req_lock); - return -ENOMEM; + return -EBUSY; } ureq = container_of(uci_handle->wr_req_list.next, struct mhi_req, list); @@ -512,13 +522,6 @@ static int mhi_uci_send_packet(struct uci_client *uci_handle, void *data_loc, mutex_lock(&uci_handle->out_chan_lock); do { ret_val = uci_handle->send(uci_handle, data_loc, size); - if (ret_val < 0) { - uci_log(UCI_DBG_ERROR, - "Err sending data: chan %d, buf %pK, size %d\n", - uci_handle->out_chan, data_loc, size); - ret_val = -EIO; - break; - } if (!ret_val) { uci_log(UCI_DBG_VERBOSE, "No descriptors available, did we poll, chan %d?\n", @@ -535,6 +538,48 @@ static int mhi_uci_send_packet(struct uci_client *uci_handle, void *data_loc, return ret_val; } mutex_lock(&uci_handle->out_chan_lock); + } else if (ret_val == -EBUSY) { + /* + * All write requests structs have been exhausted. + * Wait till pending writes complete or a timeout. + */ + uci_log(UCI_DBG_VERBOSE, + "Write req list empty for chan %d\n", + uci_handle->out_chan); + mutex_unlock(&uci_handle->out_chan_lock); + if (uci_handle->f_flags & (O_NONBLOCK | O_NDELAY)) + return -EAGAIN; + ret_val = wait_event_interruptible_timeout( + uci_handle->write_wq, + !list_empty(&uci_handle->wr_req_list), + MHI_UCI_WRITE_REQ_AVAIL_TIMEOUT); + if (ret_val > 0) { + /* + * Write request struct became available, + * retry the write. + */ + uci_log(UCI_DBG_VERBOSE, + "Write req struct available for chan %d\n", + uci_handle->out_chan); + mutex_lock(&uci_handle->out_chan_lock); + ret_val = 0; + continue; + } else if (!ret_val) { + uci_log(UCI_DBG_ERROR, + "Timed out waiting for write req, chan %d\n", + uci_handle->out_chan); + return -EIO; + } else if (-ERESTARTSYS == ret_val) { + uci_log(UCI_DBG_WARNING, + "Waitqueue cancelled by system\n"); + return ret_val; + } + } else if (ret_val < 0) { + uci_log(UCI_DBG_ERROR, + "Err sending data: chan %d, buf %pK, size %d\n", + uci_handle->out_chan, data_loc, size); + ret_val = -EIO; + break; } } while (!ret_val); mutex_unlock(&uci_handle->out_chan_lock); @@ -601,8 +646,13 @@ static unsigned int mhi_uci_client_poll(struct file *file, poll_table *wait) static int mhi_uci_alloc_write_reqs(struct uci_client *client) { int i; + u32 num_wr_reqs; + + num_wr_reqs = client->in_chan_attr->num_wr_reqs; + if (!num_wr_reqs) + num_wr_reqs = MHI_UCI_NUM_WR_REQ_DEFAULT; - client->wreqs = kcalloc(MAX_UCI_WR_REQ, + client->wreqs = kcalloc(num_wr_reqs, sizeof(struct mhi_req), GFP_KERNEL); if (!client->wreqs) { @@ -611,11 +661,12 @@ static int mhi_uci_alloc_write_reqs(struct uci_client *client) } INIT_LIST_HEAD(&client->wr_req_list); - for (i = 0; i < MAX_UCI_WR_REQ; ++i) + for (i = 0; i < num_wr_reqs; ++i) list_add_tail(&client->wreqs[i].list, &client->wr_req_list); uci_log(UCI_DBG_INFO, - "UCI write reqs allocation successful\n"); + "Allocated %d write reqs for chan %d\n", + num_wr_reqs, client->out_chan); return 0; } @@ -1397,14 +1448,12 @@ static void mhi_uci_at_ctrl_read(struct work_struct *work) uci_log(UCI_DBG_VERBOSE, "msg: 0x%x\n", ctrl_msg->msg); tgt_client = &uci_ctxt.client_handles[CHAN_TO_CLIENT(chan)]; - tgt_client->tiocm &= (TIOCM_CD | TIOCM_DSR | TIOCM_RI); - - if (ctrl_msg->msg & MHI_UCI_CTRL_MSG_DCD) - tgt_client->tiocm |= TIOCM_CD; - if (ctrl_msg->msg & MHI_UCI_CTRL_MSG_DSR) - tgt_client->tiocm |= TIOCM_DSR; - if (ctrl_msg->msg & MHI_UCI_CTRL_MSG_RI) - tgt_client->tiocm |= TIOCM_RI; + tgt_client->tiocm &= ~(TIOCM_DTR | TIOCM_RTS); + + if (ctrl_msg->msg & MHI_UCI_CTRL_MSG_DTR) + tgt_client->tiocm |= TIOCM_DTR; + if (ctrl_msg->msg & MHI_UCI_CTRL_MSG_RTS) + tgt_client->tiocm |= TIOCM_RTS; uci_log(UCI_DBG_VERBOSE, "Rcvd tiocm %d\n", tgt_client->tiocm); diff --git a/drivers/platform/msm/qcom-geni-se.c b/drivers/platform/msm/qcom-geni-se.c index 55bdc9747462..87c029d4904b 100644 --- a/drivers/platform/msm/qcom-geni-se.c +++ b/drivers/platform/msm/qcom-geni-se.c @@ -39,6 +39,8 @@ #define GENI_SE_DMA_PTR_H(ptr) 0 #endif +/* Convert BCM threshold to actual frequency x 4 */ +#define CONV_TO_BW(x) (x*20000*4) #define NUM_LOG_PAGES 2 #define MAX_CLK_PERF_LEVEL 32 static unsigned long default_bus_bw_set[] = {0, 19200000, 50000000, @@ -732,9 +734,9 @@ static int geni_se_rmv_ab_ib(struct geni_se_device *geni_se_dev, if (geni_se_dev->num_paths == 2) { geni_se_dev->pdata->usecase[1].vectors[0].ab = - geni_se_dev->cur_ab; + CONV_TO_BW(geni_se_dev->cur_ab); geni_se_dev->pdata->usecase[1].vectors[0].ib = - geni_se_dev->cur_ib; + CONV_TO_BW(geni_se_dev->cur_ib); } if (bus_bw_update && geni_se_dev->num_paths != 2) @@ -879,9 +881,9 @@ static int geni_se_add_ab_ib(struct geni_se_device *geni_se_dev, if (geni_se_dev->num_paths == 2) { geni_se_dev->pdata->usecase[1].vectors[0].ab = - geni_se_dev->cur_ab; + CONV_TO_BW(geni_se_dev->cur_ab); geni_se_dev->pdata->usecase[1].vectors[0].ib = - geni_se_dev->cur_ib; + CONV_TO_BW(geni_se_dev->cur_ib); } if (bus_bw_update && geni_se_dev->num_paths != 2) @@ -1028,6 +1030,7 @@ EXPORT_SYMBOL(se_geni_resources_on); int geni_se_resources_init(struct se_geni_rsc *rsc, unsigned long ab, unsigned long ib) { + int ret = 0; struct geni_se_device *geni_se_dev; if (unlikely(!rsc || !rsc->wrapper_dev)) @@ -1075,8 +1078,11 @@ int geni_se_resources_init(struct se_geni_rsc *rsc, INIT_LIST_HEAD(&rsc->ab_list); INIT_LIST_HEAD(&rsc->ib_list); - geni_se_iommu_map_and_attach(geni_se_dev); - return 0; + ret = geni_se_iommu_map_and_attach(geni_se_dev); + if (ret) + GENI_SE_ERR(geni_se_dev->log_ctx, false, NULL, + "%s: Error %d iommu_map_and_attach\n", __func__, ret); + return ret; } EXPORT_SYMBOL(geni_se_resources_init); @@ -1341,6 +1347,10 @@ static int geni_se_iommu_map_and_attach(struct geni_se_device *geni_se_dev) int bypass = 1; struct device *cb_dev = geni_se_dev->cb_dev; + /*Don't proceed if IOMMU node is disabled*/ + if (!iommu_present(&platform_bus_type)) + return 0; + mutex_lock(&geni_se_dev->iommu_lock); if (likely(geni_se_dev->iommu_map)) { mutex_unlock(&geni_se_dev->iommu_lock); diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c index 10371eebcf0e..a3388c143e88 100644 --- a/drivers/platform/msm/sps/sps.c +++ b/drivers/platform/msm/sps/sps.c @@ -2246,7 +2246,13 @@ int sps_register_bam_device(const struct sps_bam_props *bam_props, ok = sps_bam_device_init(bam); mutex_unlock(&bam->lock); if (ok) { - SPS_ERR(bam, "sps:Fail to init BAM device: phys %pa", + ipc_log_context_destroy(bam->ipc_log0); + ipc_log_context_destroy(bam->ipc_log1); + ipc_log_context_destroy(bam->ipc_log2); + ipc_log_context_destroy(bam->ipc_log3); + ipc_log_context_destroy(bam->ipc_log4); + + SPS_ERR(sps, "sps:Fail to init BAM device: phys %pa", &bam->props.phys_addr); goto exit_err; } diff --git a/drivers/power/supply/qcom/qpnp-fg-gen3.c b/drivers/power/supply/qcom/qpnp-fg-gen3.c index 64cfefe82d8c..0ccdf7886dbf 100644 --- a/drivers/power/supply/qcom/qpnp-fg-gen3.c +++ b/drivers/power/supply/qcom/qpnp-fg-gen3.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -4442,6 +4442,7 @@ static const struct power_supply_desc fg_psy_desc = { #define DEFAULT_ESR_CHG_TIMER_RETRY 8 #define DEFAULT_ESR_CHG_TIMER_MAX 16 +#define VOLTAGE_MODE_SAT_CLEAR_BIT BIT(3) static int fg_hw_init(struct fg_chip *chip) { int rc; @@ -4665,6 +4666,14 @@ static int fg_hw_init(struct fg_chip *chip) return rc; } + rc = fg_sram_masked_write(chip, ESR_EXTRACTION_ENABLE_WORD, + ESR_EXTRACTION_ENABLE_OFFSET, + VOLTAGE_MODE_SAT_CLEAR_BIT, + VOLTAGE_MODE_SAT_CLEAR_BIT, + FG_IMA_DEFAULT); + if (rc < 0) + return rc; + fg_encode(chip->sp, FG_SRAM_ESR_TIGHT_FILTER, chip->dt.esr_tight_flt_upct, buf); rc = fg_sram_write(chip, chip->sp[FG_SRAM_ESR_TIGHT_FILTER].addr_word, diff --git a/drivers/soc/qcom/glink_smem_native_xprt.c b/drivers/soc/qcom/glink_smem_native_xprt.c index 8b5a46d05398..876900174c1b 100644 --- a/drivers/soc/qcom/glink_smem_native_xprt.c +++ b/drivers/soc/qcom/glink_smem_native_xprt.c @@ -483,8 +483,10 @@ static int fifo_read(struct edge_info *einfo, void *_data, int len) uint32_t fifo_size = einfo->rx_fifo_size; uint32_t n; - if (read_index >= fifo_size || write_index >= fifo_size) - return 0; + if (read_index >= fifo_size || write_index >= fifo_size) { + WARN_ON_ONCE(1); + return -EINVAL; + } while (len) { ptr = einfo->rx_fifo + read_index; if (read_index <= write_index) @@ -531,8 +533,10 @@ static int fifo_write_body(struct edge_info *einfo, const void *_data, uint32_t fifo_size = einfo->tx_fifo_size; uint32_t n; - if (read_index >= fifo_size || *write_index >= fifo_size) - return 0; + if (read_index >= fifo_size || *write_index >= fifo_size) { + WARN_ON_ONCE(1); + return -EINVAL; + } while (len) { ptr = einfo->tx_fifo + *write_index; if (*write_index < read_index) { diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c index 9c57f08525e6..9fbe0d5f8c6e 100644 --- a/drivers/soc/qcom/icnss.c +++ b/drivers/soc/qcom/icnss.c @@ -1327,6 +1327,7 @@ static int wlfw_msa_mem_info_send_sync_msg(void) struct wlfw_msa_info_req_msg_v01 req; struct wlfw_msa_info_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; + uint64_t max_mapped_addr; if (!penv || !penv->wlfw_clnt) return -ENODEV; @@ -1373,9 +1374,23 @@ static int wlfw_msa_mem_info_send_sync_msg(void) goto out; } + max_mapped_addr = penv->msa_pa + penv->msa_mem_size; penv->stats.msa_info_resp++; penv->nr_mem_region = resp.mem_region_info_len; for (i = 0; i < resp.mem_region_info_len; i++) { + + if (resp.mem_region_info[i].size > penv->msa_mem_size || + resp.mem_region_info[i].region_addr > max_mapped_addr || + resp.mem_region_info[i].region_addr < penv->msa_pa || + resp.mem_region_info[i].size + + resp.mem_region_info[i].region_addr > max_mapped_addr) { + icnss_pr_dbg("Received out of range Addr: 0x%llx Size: 0x%x\n", + resp.mem_region_info[i].region_addr, + resp.mem_region_info[i].size); + ret = -EINVAL; + goto fail_unwind; + } + penv->mem_region[i].reg_addr = resp.mem_region_info[i].region_addr; penv->mem_region[i].size = @@ -1390,6 +1405,8 @@ static int wlfw_msa_mem_info_send_sync_msg(void) return 0; +fail_unwind: + memset(&penv->mem_region[0], 0, sizeof(penv->mem_region[0]) * i); out: penv->stats.msa_info_err++; ICNSS_QMI_ASSERT(); @@ -2328,7 +2345,7 @@ static int icnss_pd_restart_complete(struct icnss_priv *priv) icnss_call_driver_shutdown(priv); - clear_bit(ICNSS_REJUVENATE, &penv->state); + clear_bit(ICNSS_REJUVENATE, &priv->state); clear_bit(ICNSS_PD_RESTART, &priv->state); priv->early_crash_ind = false; diff --git a/drivers/soc/qcom/msm_bus/msm_bus_arb_rpmh.c b/drivers/soc/qcom/msm_bus/msm_bus_arb_rpmh.c index 920d97520cc1..65b129264980 100644 --- a/drivers/soc/qcom/msm_bus/msm_bus_arb_rpmh.c +++ b/drivers/soc/qcom/msm_bus/msm_bus_arb_rpmh.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -17,6 +17,7 @@ #include #include #include +#include #include "msm_bus_core.h" #include "msm_bus_rpmh.h" @@ -1399,6 +1400,16 @@ static int update_client_paths(struct msm_bus_client *client, unsigned int idx) __func__, ret, pdata->active_only); goto exit_update_client_paths; } + + if (dest == MSM_BUS_SLAVE_IPA_CORE && cur_idx <= 0 && idx > 0) { + struct device *dev; + + dev = bus_find_device(&msm_bus_type, NULL, + (void *) &dest, msm_bus_device_match_adhoc); + + if (dev) + msm_bus_commit_single(dev); + } } commit_data(); exit_update_client_paths: diff --git a/drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c b/drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c index 83150afda378..d268a5db1221 100644 --- a/drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c +++ b/drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -708,6 +708,26 @@ static void bcm_commit_single_req(struct msm_bus_node_device_type *cur_bcm, kfree(cmd_active); } +void msm_bus_commit_single(struct device *dev) +{ + struct msm_bus_node_device_type *bus_dev; + struct msm_bus_node_device_type *bcm_dev; + + if (!dev) + return; + + bus_dev = to_msm_bus_node(dev); + if (!bus_dev) + return; + + bcm_dev = to_msm_bus_node(bus_dev->node_info->bcm_devs[0]); + if (!bcm_dev) + return; + + bcm_commit_single_req(bcm_dev, bcm_dev->node_vec[DUAL_CTX].vec_a, + bcm_dev->node_vec[DUAL_CTX].vec_b); +} + void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size, size_t new_size, gfp_t flags) { diff --git a/drivers/soc/qcom/msm_bus/msm_bus_rpmh.h b/drivers/soc/qcom/msm_bus/msm_bus_rpmh.h index b023f72b9c7d..0aaf5f35ee60 100644 --- a/drivers/soc/qcom/msm_bus/msm_bus_rpmh.h +++ b/drivers/soc/qcom/msm_bus/msm_bus_rpmh.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -229,6 +229,7 @@ static inline struct msm_bus_node_device_type *to_msm_bus_node(struct device *d) int msm_bus_enable_limiter(struct msm_bus_node_device_type *nodedev, int throttle_en, uint64_t lim_bw); int msm_bus_commit_data(struct list_head *clist); +void msm_bus_commit_single(struct device *dev); int bcm_remove_handoff_req(struct device *dev, void *data); int commit_late_init_data(bool lock); int msm_bus_query_gen(struct list_head *qlist, diff --git a/drivers/soc/qcom/msm_smem.c b/drivers/soc/qcom/msm_smem.c index 1400e18794f0..1159bc839800 100644 --- a/drivers/soc/qcom/msm_smem.c +++ b/drivers/soc/qcom/msm_smem.c @@ -181,6 +181,20 @@ static struct restart_notifier_block restart_notifiers[] = { static int init_smem_remote_spinlock(void); +/** + * smem_get_toc() - Used for getting partitions TOC + * + * @return - Base address off partitions TOC + * + * Helper function to get base address of partition TOC, + * that is present in top 4K of first smem region. + */ +static struct smem_toc __iomem *smem_get_toc(void) +{ + return smem_areas[0].virt_addr + + smem_areas[0].size - 4 * 1024; +} + /** * is_probe_done() - Did the probe function successfully complete * @@ -315,6 +329,7 @@ static void *__smem_get_entry_nonsecure(unsigned int id, unsigned int *size, int use_spinlocks = spinlocks_initialized && use_rspinlock; void *ret = 0; unsigned long flags = 0; + uint32_t e_size; int rc; if (!skip_init_check && !smem_initialized_check()) @@ -333,7 +348,11 @@ static void *__smem_get_entry_nonsecure(unsigned int id, unsigned int *size, if (toc[id].allocated) { phys_addr_t phys_base; - *size = toc[id].size; + e_size = toc[id].size; + if (e_size > smem_ram_size) + return ret; + *size = e_size; + barrier(); phys_base = toc[id].reserved & BASE_ADDR_MASK; @@ -368,12 +387,19 @@ static void *__smem_get_entry_secure(unsigned int id, bool skip_init_check, bool use_rspinlock) { + struct smem_partition_allocation_header *alloc_hdr; struct smem_partition_header *hdr; + uint32_t offset_free_uncached; + struct smem_toc __iomem *toc; + uint32_t offset_free_cached; unsigned long lflags = 0; - void *item = NULL; - struct smem_partition_allocation_header *alloc_hdr; + uint32_t partition_size; uint32_t partition_num; + uint32_t padding_data; + uint32_t padding_hdr; uint32_t a_hdr_size; + uint32_t item_size; + void *item = NULL; int rc; SMEM_DBG("%s(%u, %u, %u, %d, %d)\n", __func__, id, to_proc, @@ -393,9 +419,13 @@ static void *__smem_get_entry_secure(unsigned int id, return NULL; } + toc = smem_get_toc(); + if (flags & SMEM_ANY_HOST_FLAG || !partitions[to_proc].offset) { if (use_comm_partition) { partition_num = comm_partition.partition_num; + partition_size = + readl_relaxed(&toc->entry[partition_num].size); hdr = smem_areas[0].virt_addr + comm_partition.offset; } else { return __smem_get_entry_nonsecure(id, size, @@ -403,6 +433,7 @@ static void *__smem_get_entry_secure(unsigned int id, } } else { partition_num = partitions[to_proc].partition_num; + partition_size = readl_relaxed(&toc->entry[partition_num].size); hdr = smem_areas[0].virt_addr + partitions[to_proc].offset; } if (unlikely(!spinlocks_initialized)) { @@ -433,11 +464,20 @@ static void *__smem_get_entry_secure(unsigned int id, if (flags & SMEM_ITEM_CACHED_FLAG) { a_hdr_size = ALIGN(sizeof(*alloc_hdr), partitions[to_proc].size_cacheline); - for (alloc_hdr = (void *)(hdr) + hdr->size - a_hdr_size; + offset_free_cached = hdr->offset_free_cached; + if (WARN_ON(offset_free_cached > partition_size)) + return NULL; + + for (alloc_hdr = (void *)(hdr) + partition_size - a_hdr_size; (void *)(alloc_hdr) > (void *)(hdr) + - hdr->offset_free_cached; + offset_free_cached; alloc_hdr = (void *)(alloc_hdr) - - alloc_hdr->size - a_hdr_size) { + item_size - a_hdr_size) { + item_size = alloc_hdr->size; + padding_data = alloc_hdr->padding_data; + if (WARN_ON(padding_data > item_size + || item_size > partition_size)) + return NULL; if (alloc_hdr->canary != SMEM_ALLOCATION_CANARY) { LOG_ERR( "%s: SMEM corruption detected. Partition %d to %d at %p\n", @@ -450,20 +490,30 @@ static void *__smem_get_entry_secure(unsigned int id, } if (alloc_hdr->smem_type == id) { /* 8 byte alignment to match legacy */ - *size = ALIGN(alloc_hdr->size - - alloc_hdr->padding_data, 8); - item = (void *)(alloc_hdr) - alloc_hdr->size; + *size = ALIGN(item_size - padding_data, 8); + item = (void *)(alloc_hdr) - item_size; break; } } } else { + offset_free_uncached = hdr->offset_free_uncached; + if (WARN_ON(offset_free_uncached > partition_size)) + return NULL; + for (alloc_hdr = (void *)(hdr) + sizeof(*hdr); (void *)(alloc_hdr) < (void *)(hdr) + - hdr->offset_free_uncached; + offset_free_uncached; alloc_hdr = (void *)(alloc_hdr) + sizeof(*alloc_hdr) + - alloc_hdr->padding_hdr + - alloc_hdr->size) { + padding_hdr + + item_size) { + padding_hdr = alloc_hdr->padding_hdr; + padding_data = alloc_hdr->padding_data; + item_size = alloc_hdr->size; + if (WARN_ON(padding_hdr > partition_size + || item_size > partition_size + || padding_data > item_size)) + return NULL; if (alloc_hdr->canary != SMEM_ALLOCATION_CANARY) { LOG_ERR( "%s: SMEM corruption detected. Partition %d to %d at %p\n", @@ -476,11 +526,10 @@ static void *__smem_get_entry_secure(unsigned int id, } if (alloc_hdr->smem_type == id) { /* 8 byte alignment to match legacy */ - *size = ALIGN(alloc_hdr->size - - alloc_hdr->padding_data, 8); + *size = ALIGN(item_size - padding_data, 8); item = (void *)(alloc_hdr) + sizeof(*alloc_hdr) + - alloc_hdr->padding_hdr; + padding_hdr; break; } } @@ -571,10 +620,23 @@ static void *alloc_item_nonsecure(unsigned int id, unsigned int size_in) void *smem_base = smem_ram_base; struct smem_shared *shared = smem_base; struct smem_heap_entry *toc = shared->heap_toc; + uint32_t free_offset, heap_remaining; + struct smem_toc __iomem *p_toc; void *ret = NULL; + uint32_t p_size; + + p_toc = smem_get_toc(); + p_size = + readl_relaxed(&p_toc->entry[comm_partition.partition_num].size); - if (shared->heap_info.heap_remaining >= size_in) { - toc[id].offset = shared->heap_info.free_offset; + heap_remaining = shared->heap_info.heap_remaining; + free_offset = shared->heap_info.free_offset; + if (WARN_ON(heap_remaining > p_size + || free_offset > p_size)) + return NULL; + + if (heap_remaining >= size_in) { + toc[id].offset = free_offset; toc[id].size = size_in; /* * wmb() is necessary to ensure the allocation data is @@ -586,7 +648,7 @@ static void *alloc_item_nonsecure(unsigned int id, unsigned int size_in) shared->heap_info.free_offset += size_in; shared->heap_info.heap_remaining -= size_in; - ret = smem_base + toc[id].offset; + ret = smem_base + free_offset; /* * wmb() is necessary to ensure the heap data is consistent * before continuing to prevent race conditions with remote @@ -622,11 +684,15 @@ static void *alloc_item_secure(unsigned int id, unsigned int size_in, void *smem_base = smem_ram_base; struct smem_partition_header *hdr; struct smem_partition_allocation_header *alloc_hdr; + uint32_t offset_free_uncached; + struct smem_toc __iomem *toc; + uint32_t offset_free_cached; + uint32_t partition_size; + uint32_t partition_num; uint32_t a_hdr_size; uint32_t a_data_size; uint32_t size_cacheline; uint32_t free_space; - uint32_t partition_num; void *ret = NULL; if (to_proc == SMEM_COMM_HOST) { @@ -653,27 +719,35 @@ static void *alloc_item_secure(unsigned int id, unsigned int size_in, BUG(); } - free_space = hdr->offset_free_cached - - hdr->offset_free_uncached; + toc = smem_get_toc(); + partition_size = readl_relaxed(&toc->entry[partition_num].size); + + offset_free_cached = hdr->offset_free_cached; + offset_free_uncached = hdr->offset_free_uncached; + if (WARN_ON(offset_free_uncached > offset_free_cached + || offset_free_cached > partition_size)) + return NULL; + + free_space = offset_free_cached - offset_free_uncached; if (flags & SMEM_ITEM_CACHED_FLAG) { a_hdr_size = ALIGN(sizeof(*alloc_hdr), size_cacheline); a_data_size = ALIGN(size_in, size_cacheline); - if (free_space < a_hdr_size + a_data_size) { + if (free_space < a_hdr_size + a_data_size + || free_space < size_in) { SMEM_INFO( - "%s: id %u not enough memory %u (required %u)\n", - __func__, id, free_space, - a_hdr_size + a_data_size); + "%s: id %u not enough memory %u (required %u), (size_in %u)\n", + __func__, id, free_space, + a_hdr_size + a_data_size, size_in); return ret; } - alloc_hdr = (void *)(hdr) + hdr->offset_free_cached - - a_hdr_size; + alloc_hdr = (void *)(hdr) + offset_free_cached - a_hdr_size; alloc_hdr->canary = SMEM_ALLOCATION_CANARY; alloc_hdr->smem_type = id; alloc_hdr->size = a_data_size; alloc_hdr->padding_data = a_data_size - size_in; alloc_hdr->padding_hdr = a_hdr_size - sizeof(*alloc_hdr); - hdr->offset_free_cached = hdr->offset_free_cached - + hdr->offset_free_cached = offset_free_cached - a_hdr_size - a_data_size; ret = (void *)(alloc_hdr) - a_data_size; /* @@ -688,20 +762,21 @@ static void *alloc_item_secure(unsigned int id, unsigned int size_in, } else { a_hdr_size = sizeof(*alloc_hdr); a_data_size = ALIGN(size_in, 8); - if (free_space < a_hdr_size + a_data_size) { + if (free_space < a_hdr_size + a_data_size + || free_space < size_in) { SMEM_INFO( - "%s: id %u not enough memory %u (required %u)\n", - __func__, id, free_space, - a_hdr_size + a_data_size); + "%s: id %u not enough memory %u (required %u) (size_in %u)\n", + __func__, id, free_space, + a_hdr_size + a_data_size, size_in); return ret; } - alloc_hdr = (void *)(hdr) + hdr->offset_free_uncached; + alloc_hdr = (void *)(hdr) + offset_free_uncached; alloc_hdr->canary = SMEM_ALLOCATION_CANARY; alloc_hdr->smem_type = id; alloc_hdr->size = a_data_size; alloc_hdr->padding_data = a_data_size - size_in; alloc_hdr->padding_hdr = a_hdr_size - sizeof(*alloc_hdr); - hdr->offset_free_uncached = hdr->offset_free_uncached + + hdr->offset_free_uncached = offset_free_uncached + a_hdr_size + a_data_size; ret = alloc_hdr + 1; } @@ -892,12 +967,18 @@ unsigned int smem_get_free_space(unsigned int to_proc) { struct smem_partition_header *hdr; struct smem_shared *shared; + uint32_t offset_free_uncached; + struct smem_toc __iomem *toc; + uint32_t offset_free_cached; + uint32_t heap_remaining; + uint32_t p_size; if (to_proc >= NUM_SMEM_SUBSYSTEMS) { pr_err("%s: invalid to_proc:%d\n", __func__, to_proc); return UINT_MAX; } + toc = smem_get_toc(); if (partitions[to_proc].offset) { if (unlikely(OVERFLOW_ADD_UNSIGNED(uintptr_t, (uintptr_t)smem_areas[0].virt_addr, @@ -906,10 +987,22 @@ unsigned int smem_get_free_space(unsigned int to_proc) return UINT_MAX; } hdr = smem_areas[0].virt_addr + partitions[to_proc].offset; - return hdr->offset_free_cached - hdr->offset_free_uncached; + offset_free_cached = hdr->offset_free_cached; + offset_free_uncached = hdr->offset_free_uncached; + p_size = readl_relaxed(&toc->entry[to_proc].size); + if (WARN_ON(offset_free_uncached > offset_free_cached + || offset_free_cached > p_size)) + return -EINVAL; + + return offset_free_cached - offset_free_uncached; } shared = smem_ram_base; - return shared->heap_info.heap_remaining; + heap_remaining = shared->heap_info.heap_remaining; + p_size = readl_relaxed(&toc->entry[comm_partition.partition_num].size); + if (WARN_ON(heap_remaining > p_size)) + return -EINVAL; + + return heap_remaining; } EXPORT_SYMBOL(smem_get_free_space); @@ -1216,8 +1309,8 @@ static void smem_init_security_partition(struct smem_toc_entry *entry, LOG_ERR("Smem partition %d hdr magic is bad\n", num); BUG(); } - if (!hdr->size) { - LOG_ERR("Smem partition %d size is 0\n", num); + if (hdr->size != entry->size) { + LOG_ERR("Smem partition %d size is invalid\n", num); BUG(); } if (hdr->offset_free_uncached > hdr->size) { diff --git a/drivers/soc/qcom/smcinvoke.c b/drivers/soc/qcom/smcinvoke.c index 39568a54689d..7868251d2f89 100644 --- a/drivers/soc/qcom/smcinvoke.c +++ b/drivers/soc/qcom/smcinvoke.c @@ -1,7 +1,7 @@ /* * SMC Invoke driver * - * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -306,7 +306,7 @@ static int marshal_in(const struct smcinvoke_cmd_req *req, const union smcinvoke_arg *args_buf, uint32_t tzhandle, uint8_t *buf, size_t buf_size, struct file **arr_filp) { - int ret = -EINVAL, i = 0; + int ret = -EINVAL, i = 0, j = 0; union smcinvoke_tz_args *tz_args = NULL; struct smcinvoke_msg_hdr msg_hdr = {tzhandle, req->op, req->counts}; uint32_t offset = sizeof(struct smcinvoke_msg_hdr) + @@ -351,7 +351,7 @@ static int marshal_in(const struct smcinvoke_cmd_req *req, } FOR_ARGS(i, req->counts, OI) { if (get_tzhandle_from_fd(args_buf[i].o.fd, - &arr_filp[i], &(tz_args->tzhandle))) + &arr_filp[j++], &(tz_args->tzhandle))) goto out; tz_args++; } diff --git a/drivers/soc/qcom/sysmon-qmi.c b/drivers/soc/qcom/sysmon-qmi.c index ea4b5a5b5bc2..01c7dc2bb934 100644 --- a/drivers/soc/qcom/sysmon-qmi.c +++ b/drivers/soc/qcom/sysmon-qmi.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-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 @@ -480,7 +480,7 @@ int sysmon_send_shutdown(struct subsys_desc *dest_desc) shutdown_ack_ret = wait_for_shutdown_ack(dest_desc); if (shutdown_ack_ret < 0) { pr_err("shutdown_ack SMP2P bit for %s not set\n", data->name); - if (!&data->ind_recv.done) { + if (!completion_done(&data->ind_recv)) { pr_err("QMI shutdown indication not received\n"); ret = shutdown_ack_ret; } diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c index 4a76acec25a1..c7f23656deb0 100644 --- a/drivers/spi/spi-geni-qcom.c +++ b/drivers/spi/spi-geni-qcom.c @@ -157,6 +157,7 @@ struct spi_geni_master { void *ipc; bool shared_se; bool dis_autosuspend; + bool cmd_done; }; static struct spi_master *get_spi_master(struct device *dev) @@ -1280,7 +1281,7 @@ static irqreturn_t geni_spi_irq(int irq, void *data) if ((m_irq & M_CMD_DONE_EN) || (m_irq & M_CMD_CANCEL_EN) || (m_irq & M_CMD_ABORT_EN)) { - complete(&mas->xfer_done); + mas->cmd_done = true; /* * If this happens, then a CMD_DONE came before all the * buffer bytes were sent out. This is unusual, log this @@ -1320,12 +1321,16 @@ static irqreturn_t geni_spi_irq(int irq, void *data) if (dma_rx_status & RX_DMA_DONE) mas->rx_rem_bytes = 0; if (!mas->tx_rem_bytes && !mas->rx_rem_bytes) - complete(&mas->xfer_done); + mas->cmd_done = true; if ((m_irq & M_CMD_CANCEL_EN) || (m_irq & M_CMD_ABORT_EN)) - complete(&mas->xfer_done); + mas->cmd_done = true; } exit_geni_spi_irq: geni_write_reg(m_irq, mas->base, SE_GENI_M_IRQ_CLEAR); + if (mas->cmd_done) { + mas->cmd_done = false; + complete(&mas->xfer_done); + } return IRQ_HANDLED; } diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index 63a8dfe465ca..687b0fa521bc 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c @@ -107,7 +107,7 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, info->table = kmalloc(sizeof(struct sg_table), GFP_KERNEL); if (!info->table) - goto err; + goto free_mem; info->is_cached = ION_IS_CACHED(flags); @@ -123,6 +123,13 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, buffer->priv_virt = info; return 0; +free_mem: + if (!ION_IS_CACHED(flags)) + dma_free_writecombine(dev, len, info->cpu_addr, info->handle); + else + dma_free_attrs(dev, len, info->cpu_addr, info->handle, + DMA_ATTR_FORCE_COHERENT); + err: kfree(info); return ION_CMA_ALLOCATE_FAILED; diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c old mode 100644 new mode 100755 diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c old mode 100644 new mode 100755 diff --git a/drivers/thermal/tsens.h b/drivers/thermal/tsens.h index 4b742d5f905d..c992c068a16b 100644 --- a/drivers/thermal/tsens.h +++ b/drivers/thermal/tsens.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 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 @@ -73,9 +73,9 @@ struct tsens_dbg_context { }; struct tsens_context { - int high_th_state; - int low_th_state; - int crit_th_state; + enum thermal_trip_activation_mode high_th_state; + enum thermal_trip_activation_mode low_th_state; + enum thermal_trip_activation_mode crit_th_state; int high_temp; int low_temp; int crit_temp; diff --git a/drivers/thermal/tsens1xxx.c b/drivers/thermal/tsens1xxx.c index d698aedf1616..e5a2409adbd8 100644 --- a/drivers/thermal/tsens1xxx.c +++ b/drivers/thermal/tsens1xxx.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -166,7 +166,7 @@ static int tsens1xxx_get_temp(struct tsens_sensor *sensor, int *temp) } static int tsens_tz_activate_trip_type(struct tsens_sensor *tm_sensor, - int trip, enum thermal_device_mode mode) + int trip, enum thermal_trip_activation_mode mode) { struct tsens_device *tmdev = NULL; unsigned int reg_cntl, code, hi_code, lo_code, mask; @@ -212,7 +212,7 @@ static int tsens_tz_activate_trip_type(struct tsens_sensor *tm_sensor, return -EINVAL; } - if (mode == THERMAL_DEVICE_DISABLED) + if (mode == THERMAL_TRIP_ACTIVATION_DISABLED) writel_relaxed(reg_cntl | mask, (TSENS_S0_UPPER_LOWER_STATUS_CTRL_ADDR(tmdev->tsens_tm_addr) + (tm_sensor->hw_id * TSENS_SN_ADDR_OFFSET))); @@ -291,7 +291,7 @@ static int tsens1xxx_set_trip_temp(struct tsens_sensor *tm_sensor, if (high_temp != INT_MAX) { rc = tsens_tz_activate_trip_type(tm_sensor, THERMAL_TRIP_CONFIGURABLE_HI, - THERMAL_DEVICE_ENABLED); + THERMAL_TRIP_ACTIVATION_ENABLED); if (rc) { pr_err("trip high enable error :%d\n", rc); goto fail; @@ -299,7 +299,7 @@ static int tsens1xxx_set_trip_temp(struct tsens_sensor *tm_sensor, } else { rc = tsens_tz_activate_trip_type(tm_sensor, THERMAL_TRIP_CONFIGURABLE_HI, - THERMAL_DEVICE_DISABLED); + THERMAL_TRIP_ACTIVATION_DISABLED); if (rc) { pr_err("trip high disable error :%d\n", rc); goto fail; @@ -309,7 +309,7 @@ static int tsens1xxx_set_trip_temp(struct tsens_sensor *tm_sensor, if (low_temp != INT_MIN) { rc = tsens_tz_activate_trip_type(tm_sensor, THERMAL_TRIP_CONFIGURABLE_LOW, - THERMAL_DEVICE_ENABLED); + THERMAL_TRIP_ACTIVATION_ENABLED); if (rc) { pr_err("trip low enable activation error :%d\n", rc); goto fail; @@ -317,7 +317,7 @@ static int tsens1xxx_set_trip_temp(struct tsens_sensor *tm_sensor, } else { rc = tsens_tz_activate_trip_type(tm_sensor, THERMAL_TRIP_CONFIGURABLE_LOW, - THERMAL_DEVICE_DISABLED); + THERMAL_TRIP_ACTIVATION_DISABLED); if (rc) { pr_err("trip low disable error :%d\n", rc); goto fail; @@ -379,15 +379,15 @@ static irqreturn_t tsens_irq_thread(int irq, void *data) if (th_temp > (temp/TSENS_SCALE_MILLIDEG)) { pr_debug("Re-arm high threshold\n"); rc = tsens_tz_activate_trip_type( - &tm->sensor[i], - THERMAL_TRIP_CONFIGURABLE_HI, - THERMAL_DEVICE_ENABLED); + &tm->sensor[i], + THERMAL_TRIP_CONFIGURABLE_HI, + THERMAL_TRIP_ACTIVATION_ENABLED); if (rc) pr_err("high rearm failed"); } else { upper_thr = true; tm->sensor[i].thr_state.high_th_state = - THERMAL_DEVICE_DISABLED; + THERMAL_TRIP_ACTIVATION_DISABLED; } } @@ -401,15 +401,15 @@ static irqreturn_t tsens_irq_thread(int irq, void *data) if (th_temp < (temp/TSENS_SCALE_MILLIDEG)) { pr_debug("Re-arm Low threshold\n"); rc = tsens_tz_activate_trip_type( - &tm->sensor[i], - THERMAL_TRIP_CONFIGURABLE_LOW, - THERMAL_DEVICE_ENABLED); + &tm->sensor[i], + THERMAL_TRIP_CONFIGURABLE_LOW, + THERMAL_TRIP_ACTIVATION_ENABLED); if (rc) pr_err("low rearm failed"); } else { lower_thr = true; tm->sensor[i].thr_state.low_th_state = - THERMAL_DEVICE_DISABLED; + THERMAL_TRIP_ACTIVATION_DISABLED; } } spin_unlock_irqrestore(&tm->tsens_upp_low_lock, flags); diff --git a/drivers/thermal/tsens2xxx.c b/drivers/thermal/tsens2xxx.c index 36a8e53dda5e..c6f03b4a537d 100644 --- a/drivers/thermal/tsens2xxx.c +++ b/drivers/thermal/tsens2xxx.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -381,7 +381,8 @@ static irqreturn_t tsens_tm_critical_irq_thread(int irq, void *data) TSENS_TM_CRITICAL_INT_CLEAR( tm->tsens_tm_addr)); tm->sensor[i].thr_state. - crit_th_state = THERMAL_DEVICE_DISABLED; + crit_th_state = + THERMAL_TRIP_ACTIVATION_DISABLED; } spin_unlock_irqrestore(&tm->tsens_crit_lock, flags); } @@ -458,7 +459,8 @@ static irqreturn_t tsens_tm_irq_thread(int irq, void *data) } else { upper_thr = true; tm->sensor[i].thr_state. - high_th_state = THERMAL_DEVICE_DISABLED; + high_th_state = + THERMAL_TRIP_ACTIVATION_DISABLED; } } @@ -490,7 +492,8 @@ static irqreturn_t tsens_tm_irq_thread(int irq, void *data) } else { lower_thr = true; tm->sensor[i].thr_state. - low_th_state = THERMAL_DEVICE_DISABLED; + low_th_state = + THERMAL_TRIP_ACTIVATION_DISABLED; } } spin_unlock_irqrestore(&tm->tsens_upp_low_lock, flags); diff --git a/drivers/tty/serial/msm_geni_serial.c b/drivers/tty/serial/msm_geni_serial.c index 9b348aede13f..4b42ec850cc1 100644 --- a/drivers/tty/serial/msm_geni_serial.c +++ b/drivers/tty/serial/msm_geni_serial.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux foundation. All rights reserved. + * Copyright (c) 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 @@ -1775,7 +1775,7 @@ static void msm_geni_serial_set_termios(struct uart_port *uport, break; } - + uport->status &= ~(UPSTAT_AUTOCTS); /* stop bits */ if (termios->c_cflag & CSTOPB) stop_bit_len = TX_STOP_BIT_LEN_2; @@ -1783,8 +1783,10 @@ static void msm_geni_serial_set_termios(struct uart_port *uport, stop_bit_len = TX_STOP_BIT_LEN_1; /* flow control, clear the CTS_MASK bit if using flow control. */ - if (termios->c_cflag & CRTSCTS) + if (termios->c_cflag & CRTSCTS) { tx_trans_cfg &= ~UART_CTS_MASK; + uport->status |= UPSTAT_AUTOCTS; + } else tx_trans_cfg |= UART_CTS_MASK; /* status bits to ignore */ @@ -1796,6 +1798,10 @@ static void msm_geni_serial_set_termios(struct uart_port *uport, tx_parity_cfg, rx_trans_cfg, rx_parity_cfg, bits_per_char, stop_bit_len, ser_clk_cfg); + if (termios->c_cflag & CRTSCTS) { + geni_write_reg_nolog(0x0, uport->membase, SE_UART_MANUAL_RFR); + } + exit_set_termios: msm_geni_serial_start_rx(uport); if (!uart_console(uport)) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index d050ee3ee956..9f4b714482e4 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -176,6 +176,7 @@ static const struct usb_irq usb_irq_info[USB_MAX_IRQ] = { #define ID 0 #define B_SESS_VLD 1 #define B_SUSPEND 2 +#define WAIT_FOR_LPM 3 #define PM_QOS_SAMPLE_SEC 2 #define PM_QOS_THRESHOLD 400 @@ -2476,7 +2477,13 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc, bool hibernation) dev_info(mdwc->dev, "DWC3 in low power mode\n"); dbg_event(0xFF, "Ctl Sus", atomic_read(&dwc->in_lpm)); + + /* kick_sm if it is waiting for lpm sequence to finish */ + if (test_and_clear_bit(WAIT_FOR_LPM, &mdwc->inputs)) + schedule_delayed_work(&mdwc->sm_work, 0); + mutex_unlock(&mdwc->suspend_resume_mutex); + return 0; } @@ -4117,6 +4124,9 @@ static int dwc3_otg_start_host(struct dwc3_msm *mdwc, int on) dwc3_usb3_phy_suspend(dwc, false); mdwc->in_host_mode = false; + /* wait for LPM, to ensure h/w is reset after stop_host */ + set_bit(WAIT_FOR_LPM, &mdwc->inputs); + pm_runtime_put_sync_suspend(mdwc->dev); dbg_event(0xFF, "StopHost psync", atomic_read(&mdwc->dev->power.usage_count)); @@ -4200,6 +4210,9 @@ static int dwc3_otg_start_peripheral(struct dwc3_msm *mdwc, int on) usb_phy_notify_disconnect(mdwc->ss_phy, USB_SPEED_SUPER); dwc3_override_vbus_status(mdwc, false); dwc3_usb3_phy_suspend(dwc, false); + + /* wait for LPM, to ensure h/w is reset after stop_peripheral */ + set_bit(WAIT_FOR_LPM, &mdwc->inputs); } pm_runtime_put_sync(mdwc->dev); @@ -4366,6 +4379,11 @@ static void dwc3_otg_sm_work(struct work_struct *w) pm_runtime_enable(mdwc->dev); /* fall-through */ case OTG_STATE_B_IDLE: + if (test_bit(WAIT_FOR_LPM, &mdwc->inputs)) { + dev_dbg(mdwc->dev, "still not in lpm, wait.\n"); + break; + } + if (!test_bit(ID, &mdwc->inputs)) { dev_dbg(mdwc->dev, "!id\n"); mdwc->otg_state = OTG_STATE_A_IDLE; diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 7641886799f1..7758f1a7a339 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -937,7 +937,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, struct usb_gadget *gadget = &dwc->gadget; enum usb_device_speed speed = gadget->speed; - dwc3_trace(trace_dwc3_gadget, "%s: req %pK dma %08llx length %d%s%s", + dwc3_trace(trace_dwc3_gadget, "%s: req %pK dma %08llx length %d%s", dep->name, req, (unsigned long long) dma, length, chain ? " chain" : ""); diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 10ba1915257c..c52a68a7604e 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -1760,7 +1760,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) cdev->desc.bcdUSB = cpu_to_le16(0x0200); if (gadget_is_superspeed(gadget)) { if (gadget->speed >= USB_SPEED_SUPER) { - cdev->desc.bcdUSB = cpu_to_le16(0x0310); + cdev->desc.bcdUSB = cpu_to_le16(0x0320); cdev->desc.bMaxPacketSize0 = 9; } else if (gadget->l1_supported && !disable_l1_for_hs) { diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c index 0717cb8aa48e..24daac637fbb 100644 --- a/drivers/usb/gadget/function/f_gsi.c +++ b/drivers/usb/gadget/function/f_gsi.c @@ -63,6 +63,8 @@ static void *ipc_log_ctxt; } \ } while (0) +static struct class *gsi_class; + /* Deregister misc device and free instance structures */ static void gsi_rndis_ipa_reset_trigger(struct gsi_data_port *d_port); static void ipa_disconnect_handler(struct gsi_data_port *d_port); @@ -710,10 +712,10 @@ static void ipa_data_path_enable(struct gsi_data_port *d_port) usb_gsi_ep_op(gsi->d_port.out_ep, &gsi->d_port.out_request, GSI_EP_OP_STORE_DBL_INFO); + } - usb_gsi_ep_op(gsi->d_port.out_ep, &gsi->d_port.out_request, + usb_gsi_ep_op(gsi->d_port.in_ep, &gsi->d_port.in_request, GSI_EP_OP_ENABLE_GSI); - } /* Unblock doorbell to GSI */ usb_gsi_ep_op(d_port->in_ep, (void *)&block_db, @@ -895,10 +897,12 @@ static void ipa_work_handler(struct work_struct *w) __func__); break; } - ipa_connect_channels(d_port); + d_port->sm_state = STATE_CONNECT_IN_PROGRESS; log_event_dbg("%s: ST_INIT_EVT_CONN_IN_PROG", __func__); + if (peek_event(d_port) != EVT_DISCONNECTED) + ipa_connect_channels(d_port); } else if (event == EVT_HOST_READY) { /* * When in a composition such as RNDIS + ADB, @@ -934,8 +938,9 @@ static void ipa_work_handler(struct work_struct *w) log_event_dbg("%s: ST_CON_IN_PROG_EVT_HOST_READY", __func__); } else if (event == EVT_CONNECTED) { - if (peek_event(d_port) == EVT_SUSPEND) { - log_event_dbg("%s: ST_CON_IN_PROG_EVT_SUSPEND", + if (peek_event(d_port) == EVT_SUSPEND || + peek_event(d_port) == EVT_DISCONNECTED) { + log_event_dbg("%s: NO_OP CONN_SUS CONN_DIS", __func__); break; } @@ -1591,11 +1596,21 @@ static unsigned int gsi_xfer_bitrate(struct usb_gadget *g) return 19 * 64 * 1 * 1000 * 8; } +static void gsi_uevent_work(struct work_struct *w) +{ + struct gsi_ctrl_port *c_port = + container_of(w, struct gsi_ctrl_port, uevent_work); + + if (c_port->dev) + kobject_uevent(&c_port->dev->kobj, KOBJ_CHANGE); +} + static int gsi_function_ctrl_port_init(struct f_gsi *gsi) { int ret; char *cdev_name = NULL; int sz = GSI_CTRL_NAME_LEN; + struct device *dev; INIT_LIST_HEAD(&gsi->c_port.cpkt_req_q); INIT_LIST_HEAD(&gsi->c_port.cpkt_resp_q); @@ -1603,6 +1618,9 @@ static int gsi_function_ctrl_port_init(struct f_gsi *gsi) spin_lock_init(&gsi->c_port.lock); init_waitqueue_head(&gsi->c_port.read_wq); + INIT_WORK(&gsi->c_port.uevent_work, gsi_uevent_work); + gsi->c_port.dev = NULL; + gsi->c_port.uevent_wq = NULL; switch (gsi->prot_id) { case USB_PROT_RMNET_IPA: @@ -1632,6 +1650,10 @@ static int gsi_function_ctrl_port_init(struct f_gsi *gsi) else strlcat(gsi->c_port.name, cdev_name, sz); + gsi->c_port.uevent_wq = alloc_workqueue(gsi->c_port.name, + WQ_UNBOUND | WQ_MEM_RECLAIM | + WQ_FREEZABLE, 1); + gsi->c_port.ctrl_device.name = gsi->c_port.name; gsi->c_port.ctrl_device.fops = &gsi_ctrl_dev_fops; gsi->c_port.ctrl_device.minor = MISC_DYNAMIC_MINOR; @@ -1643,6 +1665,17 @@ static int gsi_function_ctrl_port_init(struct f_gsi *gsi) return ret; } + dev = device_create(gsi_class, NULL, MKDEV(0, MISC_DYNAMIC_MINOR), + &gsi->c_port, gsi->c_port.name); + if (IS_ERR(dev)) { + log_event_err("%s: device_create failed for (%s)\n", __func__, + gsi->c_port.name); + misc_deregister(&gsi->c_port.ctrl_device); + return PTR_ERR(dev); + } + + gsi->c_port.dev = dev; + return 0; } @@ -2081,6 +2114,10 @@ gsi_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) gsi->rmnet_dtr_status = line_state; log_event_dbg("%s: USB_CDC_REQ_SET_CONTROL_LINE_STATE DTR:%d\n", __func__, line_state); + if (gsi->c_port.uevent_wq) + queue_work(gsi->c_port.uevent_wq, + &gsi->c_port.uevent_work); + gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0); value = 0; break; @@ -2445,6 +2482,9 @@ static int gsi_set_alt(struct usb_function *f, unsigned int intf, gsi->prot_id == USB_PROT_MBIM_IPA) gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0); + if (gsi->c_port.uevent_wq) + queue_work(gsi->c_port.uevent_wq, &gsi->c_port.uevent_work); + return 0; notify_ep_disable: @@ -2478,6 +2518,10 @@ static void gsi_disable(struct usb_function *f) } gsi_ctrl_clear_cpkt_queues(gsi, false); + + if (gsi->c_port.uevent_wq) + queue_work(gsi->c_port.uevent_wq, &gsi->c_port.uevent_work); + /* send 0 len pkt to qti/qbi/gps to notify state change */ gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0); gsi->c_port.notify_req_queued = false; @@ -3680,11 +3724,27 @@ static int gsi_set_inst_name(struct usb_function_instance *fi, static void gsi_free_inst(struct usb_function_instance *f) { struct gsi_opts *opts = container_of(f, struct gsi_opts, func_inst); + struct f_gsi *gsi; if (opts) { if (opts->gsi && opts->gsi->c_port.ctrl_device.fops) misc_deregister(&opts->gsi->c_port.ctrl_device); kfree(opts->interf_group); + + if (opts->gsi && opts->gsi->c_port.dev) { + gsi = opts->gsi; + + dev_set_drvdata(gsi->c_port.dev, NULL); + + if (gsi->c_port.uevent_wq) { + cancel_work_sync(&gsi->c_port.uevent_work); + destroy_workqueue(gsi->c_port.uevent_wq); + gsi->c_port.uevent_wq = NULL; + } + + device_destroy(gsi_class, gsi->c_port.dev->devt); + gsi->c_port.dev = NULL; + } } kfree(opts); @@ -3724,9 +3784,46 @@ DECLARE_USB_FUNCTION(gsi, gsi_alloc_inst, gsi_alloc); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("GSI function driver"); +static int usb_gsi_uevent(struct device *dev, struct kobj_uevent_env *env) +{ + struct gsi_ctrl_port *c_port = dev_get_drvdata(dev); + struct f_gsi *gsi; + char *str = "undefined"; + + if (!c_port) { + dev_dbg(dev, "%s: gsi is not initialized\n", __func__); + add_uevent_var(env, "STATE=%s", str); + return 0; + } + + gsi = c_port_to_gsi(c_port); + + switch (gsi->prot_id) { + case USB_PROT_RMNET_IPA: + case USB_PROT_RMNET_ETHER: + str = gsi->rmnet_dtr_status ? "connected" : "disconnected"; + break; + case USB_PROT_MBIM_IPA: + case USB_PROT_DIAG_IPA: + case USB_PROT_DPL_ETHER: + case USB_PROT_GPS_CTRL: + str = atomic_read(&gsi->connected) ? + "connected" : "disconnected"; + break; + default: + return 0; + } + + add_uevent_var(env, "STATE=%s", str); + + log_event_dbg("%s:STATE=%s\n", c_port->name, str); + + return 0; +} + static int fgsi_init(void) { - int i; + int i, ret; ipa_usb_wq = alloc_workqueue("k_ipa_usb", WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_FREEZABLE, 1); @@ -3745,6 +3842,15 @@ static int fgsi_init(void) if (!ipc_log_ctxt) pr_err("%s: Err allocating ipc_log_ctxt\n", __func__); + gsi_class = class_create(THIS_MODULE, "gsi_usb"); + if (IS_ERR(gsi_class)) { + ret = PTR_ERR(gsi_class); + gsi_class = NULL; + pr_err("%s: class_create() failed:%d\n", __func__, ret); + return ret; + } + gsi_class->dev_uevent = usb_gsi_uevent; + usb_gsi_debugfs_init(); return usb_function_register(&gsiusb_func); } diff --git a/drivers/usb/gadget/function/f_gsi.h b/drivers/usb/gadget/function/f_gsi.h index 2667417d6eab..51872c88c252 100644 --- a/drivers/usb/gadget/function/f_gsi.h +++ b/drivers/usb/gadget/function/f_gsi.h @@ -218,6 +218,10 @@ struct gsi_ctrl_port { unsigned int modem_to_host; unsigned int cpkt_drop_cnt; unsigned int get_encap_cnt; + + struct device *dev; + struct work_struct uevent_work; + struct workqueue_struct *uevent_wq; }; struct gsi_data_port { diff --git a/drivers/usb/gadget/function/f_ipc.c b/drivers/usb/gadget/function/f_ipc.c index 3f914ce1399e..1a9d50f7ba49 100644 --- a/drivers/usb/gadget/function/f_ipc.c +++ b/drivers/usb/gadget/function/f_ipc.c @@ -27,6 +27,8 @@ #define IPC_BRIDGE_MAX_READ_SZ (8 * 1024) #define IPC_BRIDGE_MAX_WRITE_SZ (8 * 1024) +#define IPC_WRITE_WAIT_TIMEOUT 10000 + /* for configfs support */ struct ipc_opts { struct usb_function_instance func_inst; @@ -239,6 +241,7 @@ static int ipc_write(struct platform_device *pdev, char *buf, unsigned long flags; struct usb_request *req; struct usb_ep *in; + int ret; if (!ipc_dev) return -ENODEV; @@ -274,12 +277,23 @@ static int ipc_write(struct platform_device *pdev, char *buf, goto retry_write; } - if (unlikely(wait_for_completion_interruptible(&ipc_dev->write_done))) { - usb_ep_dequeue(in, req); - return -EINTR; + ret = wait_for_completion_interruptible_timeout(&ipc_dev->write_done, + msecs_to_jiffies(IPC_WRITE_WAIT_TIMEOUT)); + if (ret < 0) { + pr_err("%s: Interruption triggered\n", __func__); + ret = -EINTR; + goto fail; + } else if (ret == 0) { + pr_err("%s: Request timed out\n", __func__); + ret = -ETIMEDOUT; + goto fail; } return !req->status ? req->actual : req->status; + +fail: + usb_ep_dequeue(in, req); + return ret; } static void ipc_out_complete(struct usb_ep *ep, struct usb_request *req) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index 36795eed40b0..0b71cb514031 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -421,7 +421,7 @@ int ovl_copy_up(struct dentry *dentry) dput(parent); dput(next); } - revert_creds(old_cred); + ovl_revert_creds(old_cred); return err; } diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 8546384a5fdf..57764da62332 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -148,7 +148,7 @@ static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry, type = ovl_path_real(dentry, &realpath); old_cred = ovl_override_creds(dentry->d_sb); err = vfs_getattr(&realpath, stat); - revert_creds(old_cred); + ovl_revert_creds(old_cred); if (err) return err; @@ -497,7 +497,8 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, override_cred->fsgid = inode->i_gid; if (!hardlink) { err = security_dentry_create_files_as(dentry, - stat->mode, &dentry->d_name, old_cred, + stat->mode, &dentry->d_name, + old_cred ? old_cred : current_cred(), override_cred); if (err) { put_cred(override_cred); @@ -515,7 +516,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, link, hardlink); } out_revert_creds: - revert_creds(old_cred); + ovl_revert_creds(old_cred); if (!err) { struct inode *realinode = d_inode(ovl_dentry_upper(dentry)); @@ -757,7 +758,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) err = ovl_remove_upper(dentry, is_dir); else err = ovl_remove_and_whiteout(dentry, is_dir); - revert_creds(old_cred); + ovl_revert_creds(old_cred); if (!err) { if (is_dir) clear_nlink(dentry->d_inode); @@ -998,7 +999,7 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, out_unlock: unlock_rename(new_upperdir, old_upperdir); out_revert_creds: - revert_creds(old_cred); + ovl_revert_creds(old_cred); out_drop_write: ovl_drop_write(old); out: diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 16f6db88c8e5..12c8e5e64db5 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -34,7 +34,7 @@ static int ovl_copy_up_truncate(struct dentry *dentry) stat.size = 0; err = ovl_copy_up_one(parent, dentry, &lowerpath, &stat); } - revert_creds(old_cred); + ovl_revert_creds(old_cred); out_dput_parent: dput(parent); @@ -91,7 +91,7 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) inode_lock(upperdentry->d_inode); old_cred = ovl_override_creds(dentry->d_sb); err = notify_change(upperdentry, attr, NULL); - revert_creds(old_cred); + ovl_revert_creds(old_cred); if (!err) ovl_copyattr(upperdentry->d_inode, dentry->d_inode); inode_unlock(upperdentry->d_inode); @@ -115,7 +115,7 @@ static int ovl_getattr(struct vfsmount *mnt, struct dentry *dentry, ovl_path_real(dentry, &realpath); old_cred = ovl_override_creds(dentry->d_sb); err = vfs_getattr(&realpath, stat); - revert_creds(old_cred); + ovl_revert_creds(old_cred); return err; } @@ -147,7 +147,7 @@ int ovl_permission(struct inode *inode, int mask) mask |= MAY_READ; } err = inode_permission(realinode, mask); - revert_creds(old_cred); + ovl_revert_creds(old_cred); return err; } @@ -164,7 +164,7 @@ static const char *ovl_get_link(struct dentry *dentry, old_cred = ovl_override_creds(dentry->d_sb); p = vfs_get_link(ovl_dentry_real(dentry), done); - revert_creds(old_cred); + ovl_revert_creds(old_cred); return p; } @@ -206,7 +206,7 @@ int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value, WARN_ON(flags != XATTR_REPLACE); err = vfs_removexattr(realpath.dentry, name); } - revert_creds(old_cred); + ovl_revert_creds(old_cred); out_drop_write: ovl_drop_write(dentry); @@ -223,7 +223,7 @@ int ovl_xattr_get(struct dentry *dentry, const char *name, old_cred = ovl_override_creds(dentry->d_sb); res = vfs_getxattr(realdentry, name, value, size); - revert_creds(old_cred); + ovl_revert_creds(old_cred); return res; } @@ -247,7 +247,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) old_cred = ovl_override_creds(dentry->d_sb); res = vfs_listxattr(realdentry, list, size); - revert_creds(old_cred); + ovl_revert_creds(old_cred); if (res <= 0 || size == 0) return res; @@ -282,7 +282,7 @@ struct posix_acl *ovl_get_acl(struct inode *inode, int type) old_cred = ovl_override_creds(inode->i_sb); acl = get_acl(realinode, type); - revert_creds(old_cred); + ovl_revert_creds(old_cred); return acl; } diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index e218e741cb99..83f22daeeeb3 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -164,6 +164,7 @@ bool ovl_dentry_is_opaque(struct dentry *dentry); void ovl_dentry_set_opaque(struct dentry *dentry, bool opaque); bool ovl_is_whiteout(struct dentry *dentry); const struct cred *ovl_override_creds(struct super_block *sb); +void ovl_revert_creds(const struct cred *oldcred); void ovl_dentry_update(struct dentry *dentry, struct dentry *upperdentry); void ovl_inode_update(struct inode *inode, struct inode *upperinode); struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c index a1be6baabca3..4fcbfd0953c0 100644 --- a/fs/overlayfs/readdir.c +++ b/fs/overlayfs/readdir.c @@ -223,7 +223,7 @@ static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd) } inode_unlock(dir->d_inode); } - revert_creds(old_cred); + ovl_revert_creds(old_cred); return err; } diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index e7c8ac41e288..ae1b42489ddd 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -31,6 +31,7 @@ struct ovl_config { char *upperdir; char *workdir; bool default_permissions; + bool override_creds; }; /* private information held for overlayfs's superblock */ @@ -266,9 +267,17 @@ const struct cred *ovl_override_creds(struct super_block *sb) { struct ovl_fs *ofs = sb->s_fs_info; + if (!ofs->config.override_creds) + return NULL; return override_creds(ofs->creator_cred); } +void ovl_revert_creds(const struct cred *old_cred) +{ + if (old_cred) + revert_creds(old_cred); +} + static bool ovl_is_opaquedir(struct dentry *dentry) { int res; @@ -584,7 +593,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ovl_copyattr(realdentry->d_inode, inode); } - revert_creds(old_cred); + ovl_revert_creds(old_cred); oe->opaque = upperopaque; oe->__upperdentry = upperdentry; memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr); @@ -603,7 +612,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, out_put_upper: dput(upperdentry); out: - revert_creds(old_cred); + ovl_revert_creds(old_cred); return ERR_PTR(err); } @@ -656,6 +665,11 @@ static int ovl_statfs(struct dentry *dentry, struct kstatfs *buf) return err; } +static bool __read_mostly ovl_override_creds_def = true; +module_param_named(override_creds, ovl_override_creds_def, bool, 0644); +MODULE_PARM_DESC(ovl_override_creds_def, + "Use mounter's credentials for accesses"); + /** * ovl_show_options * @@ -674,6 +688,9 @@ static int ovl_show_options(struct seq_file *m, struct dentry *dentry) } if (ufs->config.default_permissions) seq_puts(m, ",default_permissions"); + if (ufs->config.override_creds != ovl_override_creds_def) + seq_show_option(m, "override_creds", + ufs->config.override_creds ? "on" : "off"); return 0; } @@ -700,6 +717,8 @@ enum { OPT_UPPERDIR, OPT_WORKDIR, OPT_DEFAULT_PERMISSIONS, + OPT_OVERRIDE_CREDS_ON, + OPT_OVERRIDE_CREDS_OFF, OPT_ERR, }; @@ -708,6 +727,8 @@ static const match_table_t ovl_tokens = { {OPT_UPPERDIR, "upperdir=%s"}, {OPT_WORKDIR, "workdir=%s"}, {OPT_DEFAULT_PERMISSIONS, "default_permissions"}, + {OPT_OVERRIDE_CREDS_ON, "override_creds=on"}, + {OPT_OVERRIDE_CREDS_OFF, "override_creds=off"}, {OPT_ERR, NULL} }; @@ -738,6 +759,7 @@ static int ovl_parse_opt(char *opt, struct ovl_config *config) { char *p; + config->override_creds = ovl_override_creds_def; while ((p = ovl_next_opt(&opt)) != NULL) { int token; substring_t args[MAX_OPT_ARGS]; @@ -772,6 +794,14 @@ static int ovl_parse_opt(char *opt, struct ovl_config *config) config->default_permissions = true; break; + case OPT_OVERRIDE_CREDS_ON: + config->override_creds = true; + break; + + case OPT_OVERRIDE_CREDS_OFF: + config->override_creds = false; + break; + default: pr_err("overlayfs: unrecognized mount option \"%s\" or missing value\n", p); return -EINVAL; @@ -1353,7 +1383,6 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) ovl_copyattr(realinode, d_inode(root_dentry)); sb->s_root = root_dentry; - return 0; out_free_oe: diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 00b661d52727..3fb4769ed424 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -833,6 +833,18 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx, if (cur->vm_ops) goto out_unlock; + /* + * UFFDIO_COPY will fill file holes even without + * PROT_WRITE. This check enforces that if this is a + * MAP_SHARED, the process has write permission to the backing + * file. If VM_MAYWRITE is set it also enforces that on a + * MAP_SHARED vma: there is no F_WRITE_SEAL and no further + * F_WRITE_SEAL can be taken until the vma is destroyed. + */ + ret = -EPERM; + if (unlikely(!(cur->vm_flags & VM_MAYWRITE))) + goto out_unlock; + /* * Check that this vma isn't already owned by a * different userfaultfd. We can't allow more than one @@ -858,6 +870,7 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx, BUG_ON(vma->vm_ops); BUG_ON(vma->vm_userfaultfd_ctx.ctx && vma->vm_userfaultfd_ctx.ctx != ctx); + WARN_ON(!(vma->vm_flags & VM_MAYWRITE)); /* * Nothing to do: this vma is already registered into this @@ -999,6 +1012,7 @@ static int userfaultfd_unregister(struct userfaultfd_ctx *ctx, cond_resched(); BUG_ON(vma->vm_ops); + WARN_ON(!(vma->vm_flags & VM_MAYWRITE)); /* * Nothing to do: this vma is already registered into this diff --git a/include/linux/cpufreq_times.h b/include/linux/cpufreq_times.h index 356a3fad03c9..3b12e1705d34 100644 --- a/include/linux/cpufreq_times.h +++ b/include/linux/cpufreq_times.h @@ -28,7 +28,8 @@ int proc_time_in_state_show(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *p); void cpufreq_acct_update_power(struct task_struct *p, cputime_t cputime); void cpufreq_times_create_policy(struct cpufreq_policy *policy); -void cpufreq_times_record_transition(struct cpufreq_freqs *freq); +void cpufreq_times_record_transition(struct cpufreq_policy *policy, + unsigned int new_freq); void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end); int single_uid_time_in_state_open(struct inode *inode, struct file *file); #else @@ -39,7 +40,7 @@ static inline void cpufreq_acct_update_power(struct task_struct *p, u64 cputime) {} static inline void cpufreq_times_create_policy(struct cpufreq_policy *policy) {} static inline void cpufreq_times_record_transition( - struct cpufreq_freqs *freq) {} + struct cpufreq_policy *policy, unsigned int new_freq) {} static inline void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end) {} #endif /* CONFIG_CPU_FREQ_TIMES */ diff --git a/include/linux/diagchar.h b/include/linux/diagchar.h index 770e8d5ad103..83718596c268 100644 --- a/include/linux/diagchar.h +++ b/include/linux/diagchar.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -148,10 +148,10 @@ * a new RANGE of SSIDs to the msg_mask_tbl. */ #define MSG_MASK_TBL_CNT 26 -#define APPS_EVENT_LAST_ID 0xC92 +#define APPS_EVENT_LAST_ID 0xCA7 #define MSG_SSID_0 0 -#define MSG_SSID_0_LAST 129 +#define MSG_SSID_0_LAST 130 #define MSG_SSID_1 500 #define MSG_SSID_1_LAST 506 #define MSG_SSID_2 1000 @@ -169,7 +169,7 @@ #define MSG_SSID_8 5000 #define MSG_SSID_8_LAST 5036 #define MSG_SSID_9 5500 -#define MSG_SSID_9_LAST 5516 +#define MSG_SSID_9_LAST 5517 #define MSG_SSID_10 6000 #define MSG_SSID_10_LAST 6081 #define MSG_SSID_11 6500 @@ -359,6 +359,7 @@ static const uint32_t msg_bld_masks_0[] = { MSG_LVL_LOW, MSG_LVL_MED, MSG_LVL_MED, + MSG_LVL_HIGH, MSG_LVL_HIGH }; @@ -595,7 +596,8 @@ static const uint32_t msg_bld_masks_9[] = { MSG_LVL_MED | MSG_MASK_5, MSG_LVL_MED | MSG_MASK_5, MSG_LVL_MED | MSG_MASK_5, - MSG_LVL_MED | MSG_MASK_5 + MSG_LVL_MED | MSG_MASK_5, + MSG_LVL_LOW }; static const uint32_t msg_bld_masks_10[] = { @@ -919,7 +921,7 @@ static const uint32_t msg_bld_masks_25[] = { /* LOG CODES */ static const uint32_t log_code_last_tbl[] = { 0x0, /* EQUIP ID 0 */ - 0x1C7B, /* EQUIP ID 1 */ + 0x1C94, /* EQUIP ID 1 */ 0x0, /* EQUIP ID 2 */ 0x0, /* EQUIP ID 3 */ 0x4910, /* EQUIP ID 4 */ diff --git a/include/linux/msm_mhi_dev.h b/include/linux/msm_mhi_dev.h index 54ec9f3868f1..312f984c9ec5 100644 --- a/include/linux/msm_mhi_dev.h +++ b/include/linux/msm_mhi_dev.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -133,9 +133,9 @@ enum mhi_client_channel { MHI_CLIENT_IP_HW_0_OUT = 100, MHI_CLIENT_IP_HW_0_IN = 101, MHI_CLIENT_ADPL_IN = 102, - MHI_CLIENT_RESERVED_2_LOWER = 102, + MHI_CLIENT_RESERVED_2_LOWER = 103, MHI_CLIENT_RESERVED_2_UPPER = 127, - MHI_MAX_CHANNELS = 102, + MHI_MAX_CHANNELS = 103, MHI_CLIENT_INVALID = 0xFFFFFFFF }; diff --git a/include/linux/sched.h b/include/linux/sched.h old mode 100644 new mode 100755 diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h old mode 100644 new mode 100755 diff --git a/include/net/cnss2.h b/include/net/cnss2.h index 8a1772e73679..1951b40dcf55 100644 --- a/include/net/cnss2.h +++ b/include/net/cnss2.h @@ -14,6 +14,7 @@ #define _NET_CNSS2_H #include +#include #define CNSS_MAX_FILE_NAME 20 #define CNSS_MAX_TIMESTAMP_LEN 32 @@ -50,6 +51,13 @@ struct cnss_fw_files { char evicted_data[CNSS_MAX_FILE_NAME]; }; +struct cnss_device_version { + u32 family_number; + u32 device_number; + u32 major_version; + u32 minor_version; +}; + struct cnss_soc_info { void __iomem *va; phys_addr_t pa; @@ -59,6 +67,7 @@ struct cnss_soc_info { uint32_t soc_id; uint32_t fw_version; char fw_build_timestamp[CNSS_MAX_TIMESTAMP_LEN + 1]; + struct cnss_device_version device_version; }; struct cnss_wlan_runtime_ops { @@ -70,6 +79,9 @@ struct cnss_wlan_driver { char *name; int (*probe)(struct pci_dev *pdev, const struct pci_device_id *id); void (*remove)(struct pci_dev *pdev); + int (*idle_restart)(struct pci_dev *pdev, + const struct pci_device_id *id); + int (*idle_shutdown)(struct pci_dev *pdev); int (*reinit)(struct pci_dev *pdev, const struct pci_device_id *id); void (*shutdown)(struct pci_dev *pdev); void (*crash_shutdown)(struct pci_dev *pdev); @@ -83,6 +95,21 @@ struct cnss_wlan_driver { const struct pci_device_id *id_table; }; +struct cnss_usb_wlan_driver { + char *name; + int (*probe)(struct usb_interface *pintf, const struct usb_device_id + *id); + void (*remove)(struct usb_interface *pintf); + int (*reinit)(struct usb_interface *pintf, const struct usb_device_id + *id); + void (*shutdown)(struct usb_interface *pintf); + void (*crash_shutdown)(struct usb_interface *pintf); + int (*suspend)(struct usb_interface *pintf, pm_message_t state); + int (*resume)(struct usb_interface *pintf); + int (*reset_resume)(struct usb_interface *pintf); + const struct usb_device_id *id_table; +}; + enum cnss_driver_status { CNSS_UNINITIALIZED, CNSS_INITIALIZED, @@ -175,6 +202,8 @@ extern int cnss_get_soc_info(struct device *dev, struct cnss_soc_info *info); extern int cnss_request_bus_bandwidth(struct device *dev, int bandwidth); extern int cnss_power_up(struct device *dev); extern int cnss_power_down(struct device *dev); +extern int cnss_idle_restart(struct device *dev); +extern int cnss_idle_shutdown(struct device *dev); extern void cnss_request_pm_qos(struct device *dev, u32 qos_val); extern void cnss_remove_pm_qos(struct device *dev); extern void cnss_lock_pm_sem(struct device *dev); @@ -182,6 +211,7 @@ extern void cnss_release_pm_sem(struct device *dev); extern int cnss_wlan_pm_control(struct device *dev, bool vote); extern int cnss_auto_suspend(struct device *dev); extern int cnss_auto_resume(struct device *dev); +extern int cnss_pci_is_drv_connected(struct device *dev); extern int cnss_pci_force_wake_request(struct device *dev); extern int cnss_pci_is_device_awake(struct device *dev); extern int cnss_pci_force_wake_release(struct device *dev); @@ -205,5 +235,7 @@ extern int cnss_athdiag_write(struct device *dev, uint32_t offset, uint32_t mem_type, uint32_t data_len, uint8_t *input); extern int cnss_set_fw_log_mode(struct device *dev, uint8_t fw_log_mode); - +extern int cnss_usb_wlan_register_driver(struct cnss_usb_wlan_driver *driver); +extern void cnss_usb_wlan_unregister_driver(struct cnss_usb_wlan_driver * + driver); #endif /* _NET_CNSS2_H */ diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h old mode 100644 new mode 100755 index bd0da0e992b8..fd3f5a56cdfe --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -87,6 +87,16 @@ enum flat_binder_object_flags { * scheduling policy from the caller (for synchronous transactions). */ FLAT_BINDER_FLAG_INHERIT_RT = 0x800, +#ifdef __KERNEL__ + + /** + * @FLAT_BINDER_FLAG_TXN_SECURITY_CTX: request security contexts + * + * Only when set, causes senders to include their security + * context + */ + FLAT_BINDER_FLAG_TXN_SECURITY_CTX = 0x1000, +#endif /* __KERNEL__ */ }; #ifdef BINDER_IPC_32BIT @@ -264,6 +274,7 @@ struct binder_node_info_for_ref { #define BINDER_VERSION _IOWR('b', 9, struct binder_version) #define BINDER_GET_NODE_DEBUG_INFO _IOWR('b', 11, struct binder_node_debug_info) #define BINDER_GET_NODE_INFO_FOR_REF _IOWR('b', 12, struct binder_node_info_for_ref) +#define BINDER_SET_CONTEXT_MGR_EXT _IOW('b', 13, struct flat_binder_object) /* * NOTE: Two special error codes you should check for when calling @@ -322,6 +333,13 @@ struct binder_transaction_data { } data; }; +#ifdef __KERNEL__ +struct binder_transaction_data_secctx { + struct binder_transaction_data transaction_data; + binder_uintptr_t secctx; +}; + +#endif /* __KERNEL__ */ struct binder_transaction_data_sg { struct binder_transaction_data transaction_data; binder_size_t buffers_size; @@ -357,6 +375,13 @@ enum binder_driver_return_protocol { BR_OK = _IO('r', 1), /* No parameters! */ +#ifdef __KERNEL__ + BR_TRANSACTION_SEC_CTX = _IOR('r', 2, + struct binder_transaction_data_secctx), + /* + * binder_transaction_data_secctx: the received command. + */ +#endif /* __KERNEL__ */ BR_TRANSACTION = _IOR('r', 2, struct binder_transaction_data), BR_REPLY = _IOR('r', 3, struct binder_transaction_data), /* diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h index 94771ac1e28b..96523b55d06c 100644 --- a/include/uapi/linux/msm_ipa.h +++ b/include/uapi/linux/msm_ipa.h @@ -35,6 +35,11 @@ */ #define IPA_DFLT_RT_TBL_NAME "ipa_dflt_rt" +/** + * name for default value of invalid protocol of NAT + */ +#define IPAHAL_NAT_INVALID_PROTOCOL 0xFF + /** * commands supported by IPA driver */ @@ -1776,6 +1781,23 @@ struct ipa_wlan_msg { uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; }; +/** + * struct ipa_wigig_msg- To hold information about wigig event + * @name: name of the wigig interface + * @client_mac_addr: the relevant wigig client mac address + * @ipa_client: TX pipe associated with the wigig client in case of connect + * @to_wigig: FST switch direction wlan->wigig? + */ +struct ipa_wigig_msg { + char name[IPA_RESOURCE_NAME_MAX]; + uint8_t client_mac_addr[IPA_MAC_ADDR_SIZE]; + union { + enum ipa_client_type ipa_client; + uint8_t to_wigig; + } u; +}; +#define feature_ipa_wigig_msg 1 + /** * enum ipa_wlan_hdr_attrib_type - attribute type * in wlan client header diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h index b653c893df98..419399213cba 100644 --- a/include/uapi/sound/compress_offload.h +++ b/include/uapi/sound/compress_offload.h @@ -134,6 +134,7 @@ struct snd_compr_audio_info { #define SNDRV_COMPRESS_RENDER_MODE_AUDIO_MASTER 0 #define SNDRV_COMPRESS_RENDER_MODE_STC_MASTER 1 +#define SNDRV_COMPRESS_RENDER_MODE_TTP 2 #define SNDRV_COMPRESS_CLK_REC_MODE_NONE 0 #define SNDRV_COMPRESS_CLK_REC_MODE_AUTO 1 diff --git a/include/uapi/sound/compress_params.h b/include/uapi/sound/compress_params.h index 8c8405391c7c..c7d5b3484634 100644 --- a/include/uapi/sound/compress_params.h +++ b/include/uapi/sound/compress_params.h @@ -55,6 +55,9 @@ #define SND_DEC_DDP_MAX_PARAMS 18 +/* Maximum PCM channels */ +#define MAX_PCM_DECODE_CHANNELS 32 + /* AUDIO CODECS SUPPORTED */ #define MAX_NUM_CODECS 32 #define MAX_NUM_CODEC_DESCRIPTORS 32 @@ -406,6 +409,15 @@ struct snd_dec_aptx { __u32 nap; }; +/** struct snd_dec_pcm - codec options for PCM format + * @num_channels: Number of channels + * @ch_map: Channel map for the above corresponding channels + */ +struct snd_dec_pcm { + __u32 num_channels; + __u8 ch_map[MAX_PCM_DECODE_CHANNELS]; +} __attribute__((packed, aligned(4))); + union snd_codec_options { struct snd_enc_wma wma; struct snd_enc_vorbis vorbis; @@ -418,6 +430,7 @@ union snd_codec_options { struct snd_dec_alac alac; struct snd_dec_ape ape; struct snd_dec_aptx aptx_dec; + struct snd_dec_pcm pcm_dec; }; /** struct snd_codec_desc - description of codec capabilities diff --git a/kernel/cfi.c b/kernel/cfi.c index b29bdaf8c566..5ea5da9e8a8d 100644 --- a/kernel/cfi.c +++ b/kernel/cfi.c @@ -228,7 +228,6 @@ static inline cfi_check_fn ptr_to_check_fn(const struct cfi_shadow __rcu *s, unsigned long ptr) { int index; - unsigned long check; if (unlikely(!s)) return NULL; /* No shadow available */ diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c index d381f559e0ce..c18dadd02af4 100644 --- a/kernel/locking/spinlock_debug.c +++ b/kernel/locking/spinlock_debug.c @@ -110,38 +110,14 @@ static inline void debug_spin_unlock(raw_spinlock_t *lock) lock->owner_cpu = -1; } -static void __spin_lock_debug(raw_spinlock_t *lock) -{ - u64 i; - u64 loops = loops_per_jiffy * HZ; - - for (i = 0; i < loops; i++) { - if (arch_spin_trylock(&lock->raw_lock)) - return; - __delay(1); - } - /* lockup suspected: */ - spin_bug(lock, "lockup suspected"); -#ifdef CONFIG_SMP - trigger_all_cpu_backtrace(); -#endif - - /* - * The trylock above was causing a livelock. Give the lower level arch - * specific lock code a chance to acquire the lock. We have already - * printed a warning/backtrace at this point. The non-debug arch - * specific code might actually succeed in acquiring the lock. If it is - * not successful, the end-result is the same - there is no forward - * progress. - */ - arch_spin_lock(&lock->raw_lock); -} - +/* + * We are now relying on the NMI watchdog to detect lockup instead of doing + * the detection here with an unfair lock which can cause problem of its own. + */ void do_raw_spin_lock(raw_spinlock_t *lock) { debug_spin_lock_before(lock); - if (unlikely(!arch_spin_trylock(&lock->raw_lock))) - __spin_lock_debug(lock); + arch_spin_lock(&lock->raw_lock); debug_spin_lock_after(lock); } @@ -184,32 +160,6 @@ static void rwlock_bug(rwlock_t *lock, const char *msg) #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) -#if 0 /* __write_lock_debug() can lock up - maybe this can too? */ -static void __read_lock_debug(rwlock_t *lock) -{ - u64 i; - u64 loops = loops_per_jiffy * HZ; - int print_once = 1; - - for (;;) { - for (i = 0; i < loops; i++) { - if (arch_read_trylock(&lock->raw_lock)) - return; - __delay(1); - } - /* lockup suspected: */ - if (print_once) { - print_once = 0; - printk(KERN_EMERG "BUG: read-lock lockup on CPU#%d, " - "%s/%d, %p\n", - raw_smp_processor_id(), current->comm, - current->pid, lock); - dump_stack(); - } - } -} -#endif - void do_raw_read_lock(rwlock_t *lock) { RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic"); @@ -259,32 +209,6 @@ static inline void debug_write_unlock(rwlock_t *lock) lock->owner_cpu = -1; } -#if 0 /* This can cause lockups */ -static void __write_lock_debug(rwlock_t *lock) -{ - u64 i; - u64 loops = loops_per_jiffy * HZ; - int print_once = 1; - - for (;;) { - for (i = 0; i < loops; i++) { - if (arch_write_trylock(&lock->raw_lock)) - return; - __delay(1); - } - /* lockup suspected: */ - if (print_once) { - print_once = 0; - printk(KERN_EMERG "BUG: write-lock lockup on CPU#%d, " - "%s/%d, %p\n", - raw_smp_processor_id(), current->comm, - current->pid, lock); - dump_stack(); - } - } -} -#endif - void do_raw_write_lock(rwlock_t *lock) { debug_write_lock_before(lock); diff --git a/mm/memory.c b/mm/memory.c old mode 100644 new mode 100755 diff --git a/mm/oom_kill.c b/mm/oom_kill.c old mode 100644 new mode 100755 diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index af817e5060fb..a1768470e086 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -182,13 +182,9 @@ static __always_inline ssize_t __mcopy_atomic(struct mm_struct *dst_mm, goto out_unlock; /* - * Be strict and only allow __mcopy_atomic on userfaultfd - * registered ranges to prevent userland errors going - * unnoticed. As far as the VM consistency is concerned, it - * would be perfectly safe to remove this check, but there's - * no useful usage for __mcopy_atomic ouside of userfaultfd - * registered ranges. This is after all why these are ioctls - * belonging to the userfaultfd and not syscalls. + * Check the vma is registered in uffd, this is required to + * enforce the VM_MAYWRITE check done at uffd registration + * time. */ if (!dst_vma->vm_userfaultfd_ctx.ctx) goto out_unlock; diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile index a5568212b83f..404ee2b08430 100644 --- a/net/ipv4/Makefile +++ b/net/ipv4/Makefile @@ -16,7 +16,6 @@ obj-y := route.o inetpeer.o protocol.o \ obj-$(CONFIG_NET_IP_TUNNEL) += ip_tunnel.o obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o -obj-$(CONFIG_SYSFS) += sysfs_net_ipv4.o obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o obj-$(CONFIG_IP_MROUTE) += ipmr.o diff --git a/net/ipv4/sysfs_net_ipv4.c b/net/ipv4/sysfs_net_ipv4.c deleted file mode 100644 index 0cbbf10026a6..000000000000 --- a/net/ipv4/sysfs_net_ipv4.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * net/ipv4/sysfs_net_ipv4.c - * - * sysfs-based networking knobs (so we can, unlike with sysctl, control perms) - * - * Copyright (C) 2008 Google, Inc. - * - * Robert Love - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * 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 -#include -#include -#include -#include - -#define CREATE_IPV4_FILE(_name, _var) \ -static ssize_t _name##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, char *buf) \ -{ \ - return sprintf(buf, "%d\n", _var); \ -} \ -static ssize_t _name##_store(struct kobject *kobj, \ - struct kobj_attribute *attr, \ - const char *buf, size_t count) \ -{ \ - int val, ret; \ - ret = sscanf(buf, "%d", &val); \ - if (ret != 1) \ - return -EINVAL; \ - if (val < 0) \ - return -EINVAL; \ - _var = val; \ - return count; \ -} \ -static struct kobj_attribute _name##_attr = \ - __ATTR(_name, 0644, _name##_show, _name##_store) - -CREATE_IPV4_FILE(tcp_wmem_min, sysctl_tcp_wmem[0]); -CREATE_IPV4_FILE(tcp_wmem_def, sysctl_tcp_wmem[1]); -CREATE_IPV4_FILE(tcp_wmem_max, sysctl_tcp_wmem[2]); - -CREATE_IPV4_FILE(tcp_rmem_min, sysctl_tcp_rmem[0]); -CREATE_IPV4_FILE(tcp_rmem_def, sysctl_tcp_rmem[1]); -CREATE_IPV4_FILE(tcp_rmem_max, sysctl_tcp_rmem[2]); - -static struct attribute *ipv4_attrs[] = { - &tcp_wmem_min_attr.attr, - &tcp_wmem_def_attr.attr, - &tcp_wmem_max_attr.attr, - &tcp_rmem_min_attr.attr, - &tcp_rmem_def_attr.attr, - &tcp_rmem_max_attr.attr, - NULL -}; - -static struct attribute_group ipv4_attr_group = { - .attrs = ipv4_attrs, -}; - -static __init int sysfs_ipv4_init(void) -{ - struct kobject *ipv4_kobject; - int ret; - - ipv4_kobject = kobject_create_and_add("ipv4", kernel_kobj); - if (!ipv4_kobject) - return -ENOMEM; - - ret = sysfs_create_group(ipv4_kobject, &ipv4_attr_group); - if (ret) { - kobject_put(ipv4_kobject); - return ret; - } - - return 0; -} - -subsys_initcall(sysfs_ipv4_init); diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c index 7f51f6da1ad2..d6779099d453 100644 --- a/net/netfilter/xt_qtaguid.c +++ b/net/netfilter/xt_qtaguid.c @@ -1192,7 +1192,7 @@ static void get_dev_and_dir(const struct sk_buff *skb, BUG(); } if (skb->dev && *el_dev != skb->dev) { - MT_DEBUG("qtaguid[%d]: skb->dev=%pK %s vs par->%s=%pK %s\n", + MT_DEBUG("qtaguid[%d]: skb->dev=%p %s vs par->%s=%p %s\n", par->hooknum, skb->dev, skb->dev->name, *direction == IFS_RX ? "in" : "out", *el_dev, (*el_dev)->name); @@ -1302,7 +1302,7 @@ static void if_tag_stat_update(const char *ifname, uid_t uid, } /* It is ok to process data when an iface_entry is inactive */ - MT_DEBUG("qtaguid: tag_stat: stat_update() dev=%s entry=%pK\n", + MT_DEBUG("qtaguid: tag_stat: stat_update() dev=%s entry=%p\n", ifname, iface_entry); /* @@ -1320,7 +1320,7 @@ static void if_tag_stat_update(const char *ifname, uid_t uid, uid_tag = make_tag_from_uid(uid); } MT_DEBUG("qtaguid: tag_stat: stat_update(): " - " looking for tag=0x%llx (uid=%u) in ife=%pK\n", + " looking for tag=0x%llx (uid=%u) in ife=%p\n", tag, get_uid_from_tag(tag), iface_entry); /* Loop over tag list under this interface for {acct_tag,uid_tag} */ spin_lock_bh(&iface_entry->tag_stat_list_lock); @@ -1579,7 +1579,7 @@ static struct sock *qtaguid_find_sk(const struct sk_buff *skb, struct sock *sk; unsigned int hook_mask = (1 << par->hooknum); - MT_DEBUG("qtaguid[%d]: find_sk(skb=%pK) family=%d\n", + MT_DEBUG("qtaguid[%d]: find_sk(skb=%p) family=%d\n", par->hooknum, skb, par->family); /* @@ -1601,7 +1601,7 @@ static struct sock *qtaguid_find_sk(const struct sk_buff *skb, } if (sk) { - MT_DEBUG("qtaguid[%d]: %pK->sk_proto=%u->sk_state=%d\n", + MT_DEBUG("qtaguid[%d]: %p->sk_proto=%u->sk_state=%d\n", par->hooknum, sk, sk->sk_protocol, sk->sk_state); } return sk; @@ -1758,7 +1758,7 @@ static bool qtaguid_mt(const struct sk_buff *skb, struct xt_action_param *par) kgid_t gid_max = make_kgid(&init_user_ns, info->gid_max); set_sk_callback_lock = true; read_lock_bh(&sk->sk_callback_lock); - MT_DEBUG("qtaguid[%d]: sk=%pK->sk_socket=%pK->file=%pK\n", + MT_DEBUG("qtaguid[%d]: sk=%p->sk_socket=%p->file=%p\n", par->hooknum, sk, sk->sk_socket, sk->sk_socket ? sk->sk_socket->file : (void *)-1LL); filp = sk->sk_socket ? sk->sk_socket->file : NULL; diff --git a/net/wireless/db.txt b/net/wireless/db.txt index 70213677713d..c3f4535d1111 100644 --- a/net/wireless/db.txt +++ b/net/wireless/db.txt @@ -582,8 +582,8 @@ country IT: DFS-ETSI country JM: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5250 - 5330 @ 80), (24), AUTO-BW + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) # 60 gHz band channels 1-3, FCC (57240 - 63720 @ 2160), (40) diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c old mode 100644 new mode 100755