Merge "msm: vidc_3x: Add checks to avoid OOB access" into msm-4.9
diff --git a/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt b/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt
index f8329a9..31c5660 100644
--- a/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt
+++ b/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt
@@ -70,6 +70,12 @@
- qcom,ignore-ssr-failure: Boolean. If set, SSR failures are not considered fatal.
- qcom,mas-crypto: Reference to the bus master of crypto core.
+- qcom,sequential-fw-load: Boolean. If set, PIL loads the firmware image blobs in a
+ serial fashion. Else, they are loaded in
+ parallel. The property is specially useful for
+ low-end (single core) systems to prevent it from
+ degrading the performance.
+
Example:
qcom,venus@fdce0000 {
compatible = "qcom,pil-tz-generic";
diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
index 83ecdc7..20abd3d 100644
--- a/Documentation/devicetree/bindings/usb/dwc3.txt
+++ b/Documentation/devicetree/bindings/usb/dwc3.txt
@@ -63,6 +63,7 @@
during bus suspend.
- snps,usb3-u1u2-disable: If present, disable U1U2 low power modes in Superspeed mode
- snps,usb2-l1-disable: If present, disable L1 low power modes in Highspeed mode
+ - normal-eps-in-gsi-mode: If present, two normal EPS (1 In, 1 Out) can be used in GSI mode
This is usually a subnode to DWC3 glue to which it is connected.
diff --git a/arch/arm/boot/dts/qcom/sa415m-ccard.dtsi b/arch/arm/boot/dts/qcom/sa415m-ccard.dtsi
index aa708e6..d2e597d 100644
--- a/arch/arm/boot/dts/qcom/sa415m-ccard.dtsi
+++ b/arch/arm/boot/dts/qcom/sa415m-ccard.dtsi
@@ -54,6 +54,12 @@
};
};
+&spi_2 {
+ can-controller@0 {
+ qcom,max-can-channels = <2>;
+ };
+};
+
&wcd934x_cdc {
status = "disabled";
};
diff --git a/arch/arm/configs/sdxpoorwills-auto-perf_defconfig b/arch/arm/configs/sa415m-perf_defconfig
similarity index 99%
rename from arch/arm/configs/sdxpoorwills-auto-perf_defconfig
rename to arch/arm/configs/sa415m-perf_defconfig
index 1af9a91..a517020 100644
--- a/arch/arm/configs/sdxpoorwills-auto-perf_defconfig
+++ b/arch/arm/configs/sa415m-perf_defconfig
@@ -180,6 +180,7 @@
CONFIG_RFKILL=y
CONFIG_IPC_ROUTER=y
CONFIG_IPC_ROUTER_SECURITY=y
+CONFIG_IPC_ROUTER_NODE_ID=2
CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS=y
CONFIG_DMA_CMA=y
CONFIG_CMA_SIZE_MBYTES=12
@@ -371,6 +372,7 @@
CONFIG_IOMMU_TESTS=y
CONFIG_QCOM_SCM=y
CONFIG_MSM_BOOT_STATS=y
+CONFIG_MSM_BOOT_TIME_MARKER=y
CONFIG_QCOM_WATCHDOG_V2=y
CONFIG_QCOM_MEMORY_DUMP_V2=y
CONFIG_QCOM_BUS_SCALING=y
diff --git a/arch/arm/configs/sdxpoorwills-auto_defconfig b/arch/arm/configs/sa415m_defconfig
similarity index 99%
rename from arch/arm/configs/sdxpoorwills-auto_defconfig
rename to arch/arm/configs/sa415m_defconfig
index 572c46b..e10d4ef 100644
--- a/arch/arm/configs/sdxpoorwills-auto_defconfig
+++ b/arch/arm/configs/sa415m_defconfig
@@ -181,6 +181,7 @@
CONFIG_RFKILL=y
CONFIG_IPC_ROUTER=y
CONFIG_IPC_ROUTER_SECURITY=y
+CONFIG_IPC_ROUTER_NODE_ID=2
CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS=y
CONFIG_DMA_CMA=y
CONFIG_CMA_SIZE_MBYTES=12
@@ -401,6 +402,7 @@
CONFIG_IOMMU_TESTS=y
CONFIG_QCOM_SCM=y
CONFIG_MSM_BOOT_STATS=y
+CONFIG_MSM_BOOT_TIME_MARKER=y
CONFIG_QCOM_WATCHDOG_V2=y
CONFIG_QCOM_MEMORY_DUMP_V2=y
CONFIG_QCOM_BUS_SCALING=y
diff --git a/arch/arm/configs/spyro-perf_defconfig b/arch/arm/configs/spyro-perf_defconfig
index d0c6b05..70a0646 100644
--- a/arch/arm/configs/spyro-perf_defconfig
+++ b/arch/arm/configs/spyro-perf_defconfig
@@ -303,7 +303,6 @@
CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y
CONFIG_SECURE_TOUCH_SYNAPTICS_DSX_V26=y
CONFIG_INPUT_MISC=y
-CONFIG_INPUT_HBTP_INPUT=y
CONFIG_INPUT_QPNP_POWER_ON=y
CONFIG_INPUT_QTI_HAPTICS=y
CONFIG_INPUT_UINPUT=y
diff --git a/arch/arm/configs/spyro_defconfig b/arch/arm/configs/spyro_defconfig
index 0e10212..a971fa1 100644
--- a/arch/arm/configs/spyro_defconfig
+++ b/arch/arm/configs/spyro_defconfig
@@ -310,7 +310,6 @@
CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y
CONFIG_SECURE_TOUCH_SYNAPTICS_DSX_V26=y
CONFIG_INPUT_MISC=y
-CONFIG_INPUT_HBTP_INPUT=y
CONFIG_INPUT_QPNP_POWER_ON=y
CONFIG_INPUT_QTI_HAPTICS=y
CONFIG_INPUT_UINPUT=y
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index b0c6499..5157889 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -393,7 +393,9 @@
dtbo-$(CONFIG_ARCH_SDM429) += sdm429-mtp-overlay.dtbo \
sdm429-cdp-overlay.dtbo \
sdm429-qrd-overlay.dtbo \
- sdm429-qrd-spyro-evt-overlay.dtbo
+ sdm429-spyro-qrd-evt-overlay.dtbo \
+ sdm429-spyro-qrd-dvt-overlay.dtbo \
+ sdm429-spyro-qrd-wdp-overlay.dtbo
msm8940-mtp-overlay.dtbo-base := msm8940-pmi8950.dtb \
msm8940-pmi8937.dtb \
@@ -512,8 +514,9 @@
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
+sdm429-spyro-qrd-evt-overlay.dtbo-base := sdm429-spyro.dtb
+sdm429-spyro-qrd-dvt-overlay.dtbo-base := sdm429-spyro-dvt.dtb
+sdm429-spyro-qrd-wdp-overlay.dtbo-base := sdm429-spyro-wdp.dtb
else
dtb-$(CONFIG_ARCH_MSM8953) += msm8953-cdp.dtb \
msm8953-mtp.dtb \
@@ -644,7 +647,10 @@
sdm429-cdp.dtb \
sdm429-qrd.dtb \
sda429-mtp.dtb \
- sda429-cdp.dtb
+ sda429-cdp.dtb \
+ sdm429-spyro.dtb \
+ sdm429-spyro-dvt.dtb \
+ sdm429-spyro-wdp.dtb
endif
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-dvt.dts b/arch/arm64/boot/dts/qcom/sdm429-spyro-dvt.dts
new file mode 100644
index 0000000..385ae4f
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-dvt.dts
@@ -0,0 +1,24 @@
+/*
+ * 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 "sdm429-spyro.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD DVT Spyro";
+ compatible = "qcom,sdm429w-qrd", "qcom,sdm429w", "qcom,qrd";
+ qcom,msm-id = <416 0x0>;
+ qcom,board-id = <0x00010b 6>;
+ qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-dvt-overlay.dts b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-dvt-overlay.dts
new file mode 100644
index 0000000..98b42ee
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-dvt-overlay.dts
@@ -0,0 +1,37 @@
+/*
+ * 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/;
+/plugin/;
+
+#include "sdm429-spyro-qrd-evt.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro DVT Overlay";
+ compatible = "qcom,sdm429w-qrd", "qcom,sdm429w", "qcom,qrd";
+ qcom,msm-id = <416 0x0>;
+ qcom,board-id = <0x00010b 6>;
+ qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
+};
+
+&usb_otg {
+ HSUSB_3p3-supply = <&L16A>;
+};
+
+&msm_dig_codec {
+ cdc-vdd-digital-supply = <&pm660_l11>;
+};
+
+&ext_smart_pa {
+ dvdd-supply = <&pm660_l11>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi
new file mode 100644
index 0000000..0c61f71
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-audio.dtsi
@@ -0,0 +1,163 @@
+/*
+ * 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.
+ */
+
+&int_codec {
+ compatible = "qcom,msm8952-dig-asoc-snd";
+ status = "okay";
+ qcom,model = "sdm429-qrd-snd-card";
+ qcom,msm-ext-pa = "quaternary";
+ /delete-property/ qcom,split-a2dp;
+ asoc-wsa-codec-names;
+ asoc-wsa-codec-prefixes;
+ ext_pa_aw8896;
+ qcom,audio-routing =
+ "CDC_CONN", "MCLK",
+ "QUAT_MI2S_RX", "DIGITAL_REGULATOR",
+ "TX_I2S_CLK", "DIGITAL_REGULATOR",
+ "DMIC1", "Digital Mic1",
+ "DMIC2", "Digital Mic2";
+ qcom,cdc-dmic-gpios = <&cdc_dmic_gpios>;
+ qcom,quat-mi2s-gpios = <&cdc_quat_mi2s_gpios>;
+ qcom,msm-gpios =
+ "quat_i2s",
+ "dmic";
+ qcom,pinctrl-names =
+ "all_off",
+ "quat_i2s_act",
+ "dmic_act",
+ "quat_i2s_dmic_act";
+ pinctrl-names =
+ "all_off",
+ "quat_i2s_act",
+ "dmic_act",
+ "quat_i2s_dmic_act";
+ pinctrl-0 = <&quat_mi2s_sleep &quat_mi2s_din_sleep
+ &cdc_dmic0_clk_sus &cdc_dmic0_data_sus>;
+ pinctrl-1 = <&quat_mi2s_active &quat_mi2s_din_active
+ &cdc_dmic0_clk_sus &cdc_dmic0_data_sus>;
+ pinctrl-2 = <&quat_mi2s_sleep &quat_mi2s_din_sleep
+ &cdc_dmic0_clk_act &cdc_dmic0_data_act>;
+ pinctrl-3 = <&quat_mi2s_active &quat_mi2s_din_active
+ &cdc_dmic0_clk_act &cdc_dmic0_data_act>;
+ /delete-property/qcom,cdc-us-euro-gpios;
+ /delete-property/qcom,pri-mi2s-gpios;
+ /delete-property/qcom,cdc-us-eu-gpios;
+
+ asoc-codec = <&stub_codec>, <&msm_dig_codec>, <&ext_smart_pa>;
+ asoc-codec-names = "msm-stub-codec.1", "msm-dig-codec", "ext-smart-pa";
+};
+
+&soc {
+ msm_dig_codec: msm_dig_codec {
+ compatible = "qcom,msm-digital-codec";
+ reg = <0xc0f0000 0x0>;
+ qcom,no-analog-codec;
+ cdc-vdd-digital-supply = <&pm660_l9>;
+ qcom,cdc-vdd-digital-voltage = <1800000 1800000>;
+ qcom,cdc-vdd-digital-current = <10000>;
+ qcom,cdc-on-demand-supplies = "cdc-vdd-digital";
+ };
+
+ cdc_dmic_gpios: cdc_dmic_pinctrl {
+ compatible = "qcom,msm-cdc-pinctrl";
+ pinctrl-names = "aud_active", "aud_sleep";
+ pinctrl-0 = <&cdc_dmic0_clk_act &cdc_dmic0_data_act>;
+ pinctrl-1 = <&cdc_dmic0_clk_sus &cdc_dmic0_data_sus>;
+ };
+
+ cdc_quat_mi2s_gpios: msm_cdc_pinctrl_quat {
+ compatible = "qcom,msm-cdc-pinctrl";
+ pinctrl-names = "aud_active", "aud_sleep";
+ pinctrl-0 = <&quat_mi2s_active &quat_mi2s_din_active>;
+ pinctrl-1 = <&quat_mi2s_sleep &quat_mi2s_din_sleep>;
+ };
+};
+
+&tlmm {
+ smart_pa_int {
+ pa_int_default: pa_int_default {
+ mux {
+ pins = "gpio73", "gpio73";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio73", "gpio73";
+ drive-strength = <4>;
+ bias-disable;
+ };
+ };
+ };
+
+ smart_pa_rst {
+ pa_rst_default: pa_rst_default {
+ mux {
+ pins = "gpio68", "gpio68";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio68", "gpio68";
+ drive-strength = <4>;
+ bias-disable;
+ };
+ };
+ };
+};
+
+&wsa881x_i2c_f {
+ status = "disabled";
+};
+
+&wsa881x_i2c_45 {
+ status = "disabled";
+};
+
+&wsa881x_analog_vi_gpio {
+ status = "disabled";
+};
+
+&wsa881x_analog_clk_gpio {
+ status = "disabled";
+};
+
+&wsa881x_analog_reset_gpio {
+ status = "disabled";
+};
+
+&cdc_us_euro_sw {
+ status = "disabled";
+};
+
+&cdc_pri_mi2s_gpios {
+ status = "disabled";
+};
+
+&cdc_quin_mi2s_gpios {
+ status = "disabled";
+};
+
+&i2c_2 {
+ ext_smart_pa: aw8896_smartpa@34 {
+ status = "okay";
+ compatible = "awinic,aw8896_smartpa";
+ reg = <0x34>;
+ reset-gpio = <&tlmm 68 0>;
+ irq-gpio = <&tlmm 73 0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pa_int_default &pa_rst_default>;
+ dvdd-supply = <&pm660_l9>;
+ dvdd-voltage = <1800000 1800000>;
+ dvdd-current = <15000>;
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-camera.dtsi b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-camera.dtsi
new file mode 100644
index 0000000..5c15948
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-camera.dtsi
@@ -0,0 +1,417 @@
+/*
+ * 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 <dt-bindings/clock/msm-clocks-8952.h>
+
+&cam_sensor_rear_standby {
+ /* STANDBY */
+ mux {
+ /delete-property/ pins;
+ pins = "gpio92";
+ function = "gpio";
+ };
+
+ config {
+ /delete-property/ pins;
+ pins = "gpio92";
+ bias-disable; /* No PULL */
+ drive-strength = <2>; /* 2 MA */
+ };
+};
+
+&cam_sensor_rear_standby_sleep {
+ /* STANDBY */
+ mux {
+ /delete-property/ pins;
+ pins = "gpio92";
+ function = "gpio";
+ };
+
+ config {
+ /delete-property/ pins;
+ pins = "gpio92";
+ bias-disable; /* No PULL */
+ drive-strength = <2>; /* 2 MA */
+ };
+};
+
+&cam_sensor_rear_vana {
+ /* VANA */
+ mux {
+ /delete-property/ pins;
+ pins = "gpio58";
+ function = "gpio";
+ };
+
+ config {
+ /delete-property/ pins;
+ pins = "gpio58";
+ bias-disable; /* No PULL */
+ drive-strength = <2>; /* 2 MA */
+ };
+};
+
+&cam_sensor_rear_vana_sleep {
+ /* VANA */
+ mux {
+ /delete-property/ pins;
+ pins = "gpio58";
+ function = "gpio";
+ };
+
+ config {
+ /delete-property/ pins;
+ pins = "gpio58";
+ bias-disable; /* No PULL */
+ drive-strength = <2>; /* 2 MA */
+ };
+};
+
+&soc {
+ /delete-node/ qcom,cci@1b0c000;
+ cci: qcom,cci@1b0c000 {
+ status = "ok";
+ cell-index = <0>;
+ compatible = "qcom,cci";
+ reg = <0x1b0c000 0x4000>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg-names = "cci";
+ interrupts = <0 50 0>;
+ interrupt-names = "cci";
+ clocks = <&clock_gcc clk_gcc_camss_ispif_ahb_clk>,
+ <&clock_gcc clk_cci_clk_src>,
+ <&clock_gcc clk_gcc_camss_cci_ahb_clk>,
+ <&clock_gcc clk_gcc_camss_cci_clk>,
+ <&clock_gcc clk_gcc_camss_ahb_clk>,
+ <&clock_gcc clk_gcc_camss_top_ahb_clk>;
+ clock-names = "ispif_ahb_clk", "cci_src_clk",
+ "cci_ahb_clk", "camss_cci_clk",
+ "camss_ahb_clk", "camss_top_ahb_clk";
+ qcom,clock-rates = <61540000 19200000 0 0 0 0>,
+ <61540000 37500000 0 0 0 0>;
+ pinctrl-names = "cci_default", "cci_suspend";
+ pinctrl-0 = <&cci0_active &cci1_active>;
+ pinctrl-1 = <&cci0_suspend &cci1_suspend>;
+ gpios = <&tlmm 29 0>,
+ <&tlmm 30 0>,
+ <&tlmm 31 0>,
+ <&tlmm 32 0>;
+ qcom,gpio-tbl-num = <0 1 2 3>;
+ qcom,gpio-tbl-flags = <1 1 1 1>;
+ qcom,gpio-tbl-label = "CCI_I2C_DATA0",
+ "CCI_I2C_CLK0",
+ "CCI_I2C_DATA1",
+ "CCI_I2C_CLK1";
+ i2c_freq_100Khz: qcom,i2c_standard_mode {
+ status = "disabled";
+ };
+ i2c_freq_400Khz: qcom,i2c_fast_mode {
+ status = "disabled";
+ };
+ i2c_freq_custom: qcom,i2c_custom_mode {
+ status = "disabled";
+ };
+
+ i2c_freq_1Mhz: qcom,i2c_fast_plus_mode {
+ status = "disabled";
+ };
+ };
+};
+
+&cci {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ actuator_spyro0: qcom,actuator@0 {
+ cell-index = <0>;
+ reg = <0x0>;
+ compatible = "qcom,actuator";
+ qcom,cci-master = <0>;
+ cam_vaf-supply = <&pm660_l19>;
+ qcom,cam-vreg-name = "cam_vaf";
+ qcom,cam-vreg-min-voltage = <2850000>;
+ qcom,cam-vreg-max-voltage = <3200000>;
+ qcom,cam-vreg-op-mode = <80000>;
+ };
+
+ actuator_spyro1: qcom,actuator@1 {
+ cell-index = <1>;
+ reg = <0x1>;
+ compatible = "qcom,actuator";
+ qcom,cci-master = <0>;
+ cam_vaf-supply = <&pm660_l19>;
+ qcom,cam-vreg-name = "cam_vaf";
+ qcom,cam-vreg-min-voltage = <2850000>;
+ qcom,cam-vreg-max-voltage = <3200000>;
+ qcom,cam-vreg-op-mode = <80000>;
+ };
+
+ eeprom_spyro0: qcom,eeprom@0 {
+ cell-index = <0>;
+ compatible = "qcom,eeprom";
+ qcom,cci-master = <0>;
+ reg = <0x0>;
+ cam_vana-supply = <&pm660_l6>;
+ cam_vio-supply = <&pm660_l14>;
+ cam_vaf-supply = <&pm660_l19>;
+ cam_vdig-supply = <&pm660_l2>;
+ qcom,cam-vreg-name = "cam_vana", "cam_vio",
+ "cam_vdig", "cam_vaf";
+ qcom,cam-vreg-min-voltage = <2800000 1800000 1050000 2850000>;
+ qcom,cam-vreg-max-voltage = <2800000 1800000 1050000 3200000>;
+ qcom,cam-vreg-op-mode = <80000 0 200000 100000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk0_default
+ &cam_sensor_rear_reset
+ &cam_sensor_rear_vana
+ &cam_sensor_rear_standby>;
+ pinctrl-1 = <&cam_sensor_mclk0_sleep
+ &cam_sensor_rear_reset_sleep
+ &cam_sensor_rear_vana_sleep
+ &cam_sensor_rear_standby_sleep>;
+ gpios = <&tlmm 26 0>,
+ <&tlmm 36 0>,
+ <&tlmm 58 0>,
+ <&tlmm 92 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-vana = <2>;
+ qcom,gpio-standby = <3>;
+ qcom,gpio-req-tbl-num = <0 1 2 3>;
+ qcom,gpio-req-tbl-flags = <1 0 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK0",
+ "CAM_RESET0",
+ "CAM_VANA",
+ "CAM_STANDBY";
+ status = "ok";
+ clocks = <&clock_gcc clk_mclk0_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk0_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ qcom,clock-rates = <19200000 0>;
+ };
+
+ eeprom_spyro1: qcom,eeprom@1 {
+ cell-index = <1>;
+ reg = <0x1>;
+ qcom,eeprom-name = "sunny_8865";
+ compatible = "qcom,eeprom";
+ qcom,slave-addr = <0x6c>;
+ qcom,cci-master = <0>;
+ qcom,num-blocks = <8>;
+
+ qcom,page0 = <1 0x0100 2 0x01 1 1>;
+ qcom,poll0 = <0 0x0 2 0x0 1 0>;
+ qcom,mem0 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page1 = <1 0x5002 2 0x00 1 0>;
+ qcom,poll1 = <0 0x0 2 0x0 1 0>;
+ qcom,mem1 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page2 = <1 0x3d84 2 0xc0 1 0>;
+ qcom,poll2 = <0 0x0 2 0x0 1 0>;
+ qcom,mem2 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page3 = <1 0x3d88 2 0x70 1 0>;
+ qcom,poll3 = <0 0x0 2 0x0 1 0>;
+ qcom,mem3 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page4 = <1 0x3d89 2 0x10 1 0>;
+ qcom,poll4 = <0 0x0 2 0x0 1 0>;
+ qcom,mem4 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page5 = <1 0x3d8a 2 0x70 1 0>;
+ qcom,poll5 = <0 0x0 2 0x0 1 0>;
+ qcom,mem5 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page6 = <1 0x3d8b 2 0xf4 1 0>;
+ qcom,poll6 = <0 0x0 2 0x0 1 0>;
+ qcom,mem6 = <0 0x0 2 0x0 1 0>;
+
+ qcom,page7 = <1 0x3d81 2 0x01 1 10>;
+ qcom,poll7 = <0 0x0 2 0x0 1 1>;
+ qcom,mem7 = <1536 0x7010 2 0 1 0>;
+
+ cam_vdig-supply = <&pm660_l3>;
+ cam_vana-supply = <&pm660_l7>;
+ cam_vio-supply = <&pm660_l6>;
+ cam_vaf-supply = <&pm660_l17>;
+ qcom,cam-vreg-name = "cam_vdig", "cam_vio",
+ "cam_vana", "cam_vaf";
+ qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>;
+ qcom,cam-vreg-max-voltage = <1200000 0 2800000 3200000>;
+ qcom,cam-vreg-op-mode = <105000 0 80000 100000>;
+ qcom,gpio-no-mux = <0>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk2_default
+ &cam_sensor_front1_default>;
+ pinctrl-1 = <&cam_sensor_mclk2_sleep
+ &cam_sensor_front1_sleep>;
+ gpios = <&tlmm 28 0>,
+ <&tlmm 40 0>,
+ <&tlmm 39 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK2",
+ "CAM_RESET2",
+ "CAM_STANDBY2";
+ qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg",
+ "sensor_vreg",
+ "sensor_gpio", "sensor_gpio" , "sensor_clk";
+ qcom,cam-power-seq-val = "cam_vdig", "cam_vana", "cam_vio",
+ "sensor_gpio_reset", "sensor_gpio_standby",
+ "sensor_cam_mclk";
+ qcom,cam-power-seq-cfg-val = <1 1 1 1 1 24000000>;
+ qcom,cam-power-seq-delay = <1 1 1 30 30 5>;
+ status = "disabled";
+ clocks = <&clock_gcc clk_mclk2_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk2_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ qcom,clock-rates = <19200000 0>;
+ };
+
+ qcom,camera@0 {
+ cell-index = <0>;
+ compatible = "qcom,camera";
+ reg = <0x0>;
+ qcom,csiphy-sd-index = <0>;
+ qcom,csid-sd-index = <0>;
+ qcom,mount-angle = <90>;
+ qcom,eeprom-src = <&eeprom_spyro0>;
+ qcom,actuator-src = <&actuator_spyro0>;
+ cam_vio-supply = <&pm660_l14>;
+ cam_vaf-supply = <&L19A>;
+ cam_vdig-supply = <&pm660_l2>;
+ qcom,cam-vreg-name = "cam_vana", "cam_vio",
+ "cam_vdig", "cam_vaf";
+ qcom,cam-vreg-min-voltage = <2800000 1800000 1050000 2850000>;
+ qcom,cam-vreg-max-voltage = <2800000 1800000 1050000 3200000>;
+ qcom,cam-vreg-op-mode = <80000 0 200000 100000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk0_default
+ &cam_sensor_rear_reset
+ &cam_sensor_rear_vana
+ &cam_sensor_rear_standby>;
+ pinctrl-1 = <&cam_sensor_mclk0_sleep
+ &cam_sensor_rear_reset_sleep
+ &cam_sensor_rear_vana_sleep
+ &cam_sensor_rear_standby_sleep>;
+ gpios = <&tlmm 26 0>,
+ <&tlmm 36 0>,
+ <&tlmm 58 0>,
+ <&tlmm 92 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-vana = <2>;
+ qcom,gpio-standby = <3>;
+ qcom,gpio-req-tbl-num = <0 1 2 3>;
+ qcom,gpio-req-tbl-flags = <1 0 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK0",
+ "CAM_RESET0",
+ "CAM_VANA",
+ "CAM_STANDBY";
+ qcom,sensor-position = <0>;
+ qcom,sensor-mode = <0>;
+ qcom,cci-master = <0>;
+ status = "ok";
+ clocks = <&clock_gcc clk_mclk0_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk0_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ qcom,clock-rates = <24000000 0>;
+ };
+
+ qcom,camera@1 {
+ cell-index = <1>;
+ compatible = "qcom,camera";
+ reg = <0x1>;
+ qcom,csiphy-sd-index = <1>;
+ qcom,csid-sd-index = <1>;
+ qcom,mount-angle = <270>;
+ cam_vdig-supply = <&pm660_l3>;
+ cam_vio-supply = <&pm660_l14>;
+ cam_vana-supply = <&pm660_s5>;
+ qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
+ qcom,cam-vreg-min-voltage = <1200000 1800000 1420000>;
+ qcom,cam-vreg-max-voltage = <1200000 1800000 1420000>;
+ qcom,cam-vreg-op-mode = <200000 80000 80000>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk1_default
+ &cam_sensor_front_default>;
+ pinctrl-1 = <&cam_sensor_mclk1_sleep
+ &cam_sensor_front_sleep>;
+ gpios = <&tlmm 27 0>,
+ <&tlmm 33 0>,
+ <&tlmm 66 0>,
+ <&tlmm 38 0>;
+ qcom,gpio-vana= <1>;
+ qcom,gpio-vdig= <2>;
+ qcom,gpio-reset = <3>;
+ qcom,gpio-req-tbl-num = <0 1 2 3>;
+ qcom,gpio-req-tbl-flags = <1 0 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK1",
+ "CAM_AVDD1",
+ "CAM_DVDD1",
+ "CAM_RESET1";
+ qcom,sensor-position = <0x1>;
+ qcom,sensor-mode = <0>;
+ qcom,cci-master = <1>;
+ clocks = <&clock_gcc clk_mclk1_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk1_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ qcom,clock-rates = <24000000 0>;
+ };
+
+ qcom,camera@2 {
+ cell-index = <2>;
+ compatible = "qcom,camera";
+ reg = <0x02>;
+ qcom,csiphy-sd-index = <1>;
+ qcom,csid-sd-index = <1>;
+ qcom,mount-angle = <270>;
+ qcom,eeprom-src = <&eeprom_spyro1>;
+ qcom,actuator-src = <&actuator_spyro1>;
+ cam_vdig-supply = <&pm660_l3>;
+ cam_vana-supply = <&pm660_l7>;
+ cam_vio-supply = <&pm660_l6>;
+ cam_vaf-supply = <&pm660_l19>;
+ qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana",
+ "cam_vaf";
+ qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>;
+ qcom,cam-vreg-max-voltage = <1200000 0 2800000 3200000>;
+ qcom,cam-vreg-op-mode = <105000 0 80000 100000>;
+ qcom,gpio-no-mux = <0>;
+ pinctrl-names = "cam_default", "cam_suspend";
+ pinctrl-0 = <&cam_sensor_mclk2_default
+ &cam_sensor_front1_default>;
+ pinctrl-1 = <&cam_sensor_mclk2_sleep
+ &cam_sensor_front1_sleep>;
+ gpios = <&tlmm 27 0>,
+ <&tlmm 38 0>,
+ <&tlmm 39 0>;
+ qcom,gpio-reset = <1>;
+ qcom,gpio-standby = <2>;
+ qcom,gpio-req-tbl-num = <0 1 2>;
+ qcom,gpio-req-tbl-flags = <1 0 0>;
+ qcom,gpio-req-tbl-label = "CAMIF_MCLK2",
+ "CAM_RESET2",
+ "CAM_STANDBY2";
+ qcom,sensor-position = <1>;
+ qcom,sensor-mode = <0>;
+ qcom,cci-master = <0>;
+ status = "disabled";
+ clocks = <&clock_gcc clk_mclk2_clk_src>,
+ <&clock_gcc clk_gcc_camss_mclk2_clk>;
+ clock-names = "cam_src_clk", "cam_clk";
+ qcom,clock-rates = <24000000 0>;
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-overlay.dts b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-overlay.dts
new file mode 100644
index 0000000..f33fd0e
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-overlay.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/;
+/plugin/;
+
+#include "sdm429-spyro-qrd-evt.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro Overlay";
+ qcom,board-id = <0xb 6>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt.dtsi b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt.dtsi
new file mode 100644
index 0000000..cc10498
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt.dtsi
@@ -0,0 +1,331 @@
+/*
+ * 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 "sdm429-spyro-qrd-mdss-panels.dtsi"
+#include "sdm429-spyro-qrd-evt-camera.dtsi"
+#include "sdm429-spyro-qrd-evt-audio.dtsi"
+
+&gpio_key_active {
+ mux {
+ pins = "gpio91", "gpio127", "gpio128", "gpio35", "gpio126";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio91", "gpio127", "gpio128", "gpio35", "gpio126";
+ drive-strength = <2>;
+ bias-pull-up;
+ };
+};
+
+&gpio_key_suspend {
+ mux {
+ pins = "gpio91", "gpio127", "gpio128", "gpio35", "gpio126";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio91", "gpio127", "gpio128", "gpio35", "gpio126";
+ drive-strength = <2>;
+ bias-pull-up;
+ };
+};
+
+&soc {
+ gpio_keys: gpio_keys {
+ compatible = "gpio-keys";
+ label = "gpio-keys";
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio_key_active>;
+ pinctrl-1 = <&gpio_key_suspend>;
+
+ vol_up: vol_up {
+ label = "volume_up";
+ gpios = <&tlmm 35 0x1>;
+ linux,input-type = <1>;
+ linux,code = <115>;
+ debounce-interval = <15>;
+ linux,can-disable;
+ gpio-key,wakeup;
+ };
+
+ function_1: function_1 {
+ label = "function_1";
+ gpios = <&tlmm 127 0x1>;
+ linux,input-type = <1>;
+ linux,code = <116>;
+ debounce-interval = <15>;
+ linux,can-disable;
+ gpio-key,wakeup;
+ };
+
+ function_2: function_2 {
+ label = "function_2";
+ gpios = <&tlmm 126 0x1>;
+ linux,input-type = <1>;
+ linux,code = <117>;
+ debounce-interval = <15>;
+ linux,can-disable;
+ gpio-key,wakeup;
+ };
+ };
+};
+
+&blsp1_uart2 {
+ status = "ok";
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart_console_active>;
+};
+
+&sdhc_1 {
+ /* device core power supply */
+ vdd-supply = <&L19A>;
+ qcom,vdd-voltage-level = <2900000 3200000>;
+ qcom,vdd-current-level = <200 570000>;
+
+ /* device communication power supply */
+ vdd-io-supply = <&L13A>;
+ qcom,vdd-io-always-on;
+ qcom,vdd-io-lpm-sup;
+ qcom,vdd-io-voltage-level = <1800000 1800000>;
+ qcom,vdd-io-current-level = <0 60000>;
+
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>;
+ pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>;
+
+ qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000
+ 384000000>;
+ qcom,nonremovable;
+ qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v";
+
+ status = "ok";
+};
+
+&sdhc_2 {
+ /* device core power supply for sd card*/
+ vdd-supply = <&vreg_sd_vdd>;
+ qcom,vdd-voltage-level = <2950000 2950000>;
+ qcom,vdd-current-level = <15000 800000>;
+
+ /* device communication power supply for msm_io*/
+ vdd-io-supply = <&vreg_sd_pad>;
+ qcom,vdd-io-voltage-level = <1800000 2950000>;
+ qcom,vdd-io-current-level = <200 22000>;
+
+ pinctrl-names = "active", "sleep";
+ pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>;
+ pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>;
+
+ cd-gpios = <&tlmm 67 0x0>;
+
+ qcom,clk-rates = <400000 20000000 25000000 50000000 100000000
+ 200000000>;
+
+ qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104";
+
+ status = "ok";
+};
+
+&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 0x1400000>;
+};
+
+&wcnss_fw_mem {
+ reg = <0x0 0x8cc00000 0x0 0x700000>;
+};
+
+&i2c_4 {
+ status = "ok";
+
+ tsc@24 {
+ compatible = "cy,cyttsp5_i2c_adapter";
+ reg = <0x24>;
+
+ interrupt-parent = <&tlmm>;
+ interrupts = <65 0x2008>;
+ cy,adapter_id = "cyttsp5_i2c_adapter";
+ vcc_i2c-supply = <&L13A>;
+ vdd-supply = <&L15A>;
+ pinctrl-names = "pmx_ts_active", "pmx_ts_suspend",
+ "pmx_ts_release";
+ pinctrl-0 = <&ts_int_active &ts_reset_active>;
+ pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
+ pinctrl-2 = <&ts_release>;
+
+ cy,core {
+ cy,name = "cyttsp5_core";
+ cy,irq_gpio = <65>;
+ cy,rst_gpio = <64>;
+ cy,hid_desc_register = <1>;
+ cy,flags = <4>;
+ cy,easy_wakeup_gesture = <1>;
+ cy,btn_keys = <172 139 158 217 114 115 212 116>;
+ cy,btn_keys-tag = <0>;
+
+ cy,mt {
+ cy,name = "cyttsp5_mt";
+
+ cy,inp_dev_name = "cyttsp5_mt";
+ cy,flags = <0x28>;
+ cy,abs =
+ <0x35 0 320 0 0
+ 0x36 0 360 0 0
+ 0x3a 0 255 0 0
+ 0xffff 0 255 0 0
+ 0x39 0 15 0 0
+ 0x30 0 255 0 0
+ 0x31 0 255 0 0
+ 0x34 0xffffff81 127 0 0
+ 0x37 0 1 0 0
+ 0x3b 0 255 0 0>;
+
+ cy,vkeys_x = <320>;
+ cy,vkeys_y = <360>;
+
+ cy,virtual_keys =
+ <158 1360 90 160 180
+ 139 1360 270 160 180
+ 172 1360 450 160 180
+ 217 1360 630 160 180>;
+ };
+
+ cy,btn {
+ cy,name = "cyttsp5_btn";
+
+ cy,inp_dev_name = "cyttsp5_btn";
+ };
+
+ cy,proximity {
+ cy,name = "cyttsp5_proximity";
+
+ cy,inp_dev_name = "cyttsp5_proximity";
+ cy,abs = <0x19 0 1 0 0>;
+ };
+ };
+ };
+
+};
+
+&tlmm {
+ pmx_ts_int_active {
+ ts_int_active: ts_int_active {
+ mux {
+ pins = "gpio65";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio65";
+ drive-strength = <8>;
+ bias-pull-up;
+ };
+ };
+ };
+
+ pmx_ts_int_suspend {
+ ts_int_suspend: ts_int_suspend {
+ mux {
+ pins = "gpio65";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio65";
+ drive-strength = <2>;
+ bias-pull-down;
+ };
+ };
+ };
+
+ pmx_ts_reset_active {
+ ts_reset_active: ts_reset_active {
+ mux {
+ pins = "gpio64";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio64";
+ drive-strength = <8>;
+ bias-pull-up;
+ };
+ };
+ };
+
+ pmx_ts_reset_suspend {
+ ts_reset_suspend: ts_reset_suspend {
+ mux {
+ pins = "gpio64";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio64";
+ drive-strength = <2>;
+ bias-pull-down;
+ };
+ };
+ };
+
+ pmx_ts_release {
+ ts_release: ts_release {
+ mux {
+ pins = "gpio65", "gpio64";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio65", "gpio64";
+ drive-strength = <2>;
+ bias-pull-down;
+ };
+ };
+ };
+
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-mdss-panels.dtsi b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-mdss-panels.dtsi
new file mode 100644
index 0000000..247d312
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-mdss-panels.dtsi
@@ -0,0 +1,85 @@
+/*
+ * 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 "dsi-panel-edo-rm67162-qvga-cmd.dtsi"
+
+&soc {
+ dsi_pm660_panel_pwr_supply: dsi_pm660_panel_pwr_supply {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ qcom,panel-supply-entry@0 {
+ reg = <0>;
+ qcom,supply-name = "vdd";
+ qcom,supply-min-voltage = <2800000>;
+ qcom,supply-max-voltage = <2800000>;
+ qcom,supply-enable-load = <100000>;
+ qcom,supply-disable-load = <100>;
+ };
+
+ qcom,panel-supply-entry@1 {
+ reg = <1>;
+ qcom,supply-name = "vddio";
+ qcom,supply-min-voltage = <1800000>;
+ qcom,supply-max-voltage = <1800000>;
+ qcom,supply-enable-load = <100000>;
+ qcom,supply-disable-load = <100>;
+ };
+ };
+};
+
+&cdc_pdm_lines_act {
+ mux {
+ pins = "gpio68", "gpio73", "gpio74";
+ function = "cdc_pdm0";
+ };
+
+ config {
+ pins = "gpio68", "gpio73", "gpio74";
+ drive-strength = <8>;
+ };
+};
+
+&cdc_pdm_lines_sus {
+ mux {
+ pins = "gpio68", "gpio73", "gpio74";
+ function = "cdc_pdm0";
+ };
+
+ config {
+ pins = "gpio68", "gpio73", "gpio74";
+ drive-strength = <2>;
+ bias-disable;
+ };
+};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_edo_rm67162_qvga_cmd>;
+ pinctrl-names = "mdss_default", "mdss_sleep";
+ pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
+ pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
+ qcom,platform-te-gpio = <&tlmm 24 0>;
+ qcom,platform-reset-gpio = <&tlmm 60 0>;
+ qcom,platform-enable-gpio = <&tlmm 69 0>;
+};
+
+&dsi_edo_rm67162_qvga_cmd {
+ /delete-property/ qcom,mdss-dsi-panel-timings;
+ qcom,mdss-dsi-panel-timings-phy-12nm = [06 05 01 0A 00 03 01 0F];
+ qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs";
+ qcom,panel-supply-entries = <&dsi_pm660_panel_pwr_supply>;
+ qcom,esd-check-enabled;
+ qcom,mdss-dsi-panel-status-check-mode = "te_signal_check";
+ qcom,partial-update-enabled;
+ qcom,panel-roi-alignment = <2 2 4 2 320 2>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-wdp-overlay.dts b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-wdp-overlay.dts
new file mode 100644
index 0000000..f70c458
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-wdp-overlay.dts
@@ -0,0 +1,41 @@
+/*
+ * 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/;
+/plugin/;
+
+#include "sdm429-spyro-qrd-evt.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro WDP Overlay";
+ compatible = "qcom,sdm429w-qrd", "qcom,sdm429w", "qcom,qrd";
+ qcom,msm-id = <416 0x0>;
+ qcom,board-id = <0x01000b 6>;
+ qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
+};
+
+&usb_otg {
+ HSUSB_3p3-supply = <&L16A>;
+};
+
+&msm_dig_codec {
+ cdc-vdd-digital-supply = <&pm660_l11>;
+};
+
+&ext_smart_pa {
+ dvdd-supply = <&pm660_l11>;
+};
+
+&sdhc_2 {
+ cd-gpios = <&tlmm 67 0x1>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro-wdp.dts b/arch/arm64/boot/dts/qcom/sdm429-spyro-wdp.dts
new file mode 100644
index 0000000..dd12d18
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro-wdp.dts
@@ -0,0 +1,24 @@
+/*
+ * 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 "sdm429-spyro.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro WDP";
+ compatible = "qcom,sdm429w-qrd", "qcom,sdm429w", "qcom,qrd";
+ qcom,msm-id = <416 0x0>;
+ qcom,board-id = <0x01000b 6>;
+ qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro.dts b/arch/arm64/boot/dts/qcom/sdm429-spyro.dts
new file mode 100644
index 0000000..a869792
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro.dts
@@ -0,0 +1,23 @@
+/*
+ * 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 "sdm429-spyro.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro";
+ compatible = "qcom,sdm429-qrd", "qcom,sdm429", "qcom,qrd";
+ qcom,board-id = <0xb 6>;
+ qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-spyro.dtsi b/arch/arm64/boot/dts/qcom/sdm429-spyro.dtsi
new file mode 100644
index 0000000..80f89d9
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-spyro.dtsi
@@ -0,0 +1,15 @@
+/*
+ * 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 "sdm429.dtsi"
+#include "sdm429w-pm660.dtsi"
diff --git a/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi b/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi
index 450691b..caab464 100644
--- a/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm429w-pm660.dtsi
@@ -339,14 +339,6 @@
/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;
};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi b/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi
index a7a234a..86320c3 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm845-pinctrl.dtsi
@@ -893,6 +893,21 @@
};
};
+ ext_bridge_mux {
+ lt9611_pins: lt9611_pins {
+ mux {
+ pins = "gpio84", "gpio128", "gpio89";
+ function = "gpio";
+ };
+
+ config {
+ pins = "gpio84", "gpio128", "gpio89";
+ bias-disable = <0>; /* no pull */
+ drive-strength = <8>;
+ };
+ };
+ };
+
sec_aux_pcm {
sec_aux_pcm_sleep: sec_aux_pcm_sleep {
mux {
diff --git a/arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi b/arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi
index 7735237..aa3976d 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi
@@ -527,6 +527,29 @@
ibb-supply = <&ibb_regulator>;
};
+ ext_dsi_bridge_display: qcom,dsi-display@19 {
+ compatible = "qcom,dsi-display";
+ label = "ext_dsi_bridge_display";
+ qcom,display-type = "primary";
+
+ qcom,dsi-ctrl = <&mdss_dsi0>;
+ qcom,dsi-phy = <&mdss_dsi_phy0>;
+ clocks = <&mdss_dsi0_pll BYTECLK_MUX_0_CLK>,
+ <&mdss_dsi0_pll PCLK_MUX_0_CLK>;
+ clock-names = "mux_byte_clk", "mux_pixel_clk";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ ext_dsi_out: endpoint {
+ };
+ };
+ };
+ };
+
sde_wb: qcom,wb-display@0 {
compatible = "qcom,wb-display";
cell-index = <0>;
diff --git a/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi b/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi
index e1159d3..cf84ecf 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm845-v2.1-rb3.dtsi
@@ -204,3 +204,96 @@
&ipa_hw {
status="disabled";
};
+
+&dsi_nt35597_truly_dsc_cmd_display {
+ /delete-property/ qcom,dsi-display-active;
+};
+
+&mdss_mdp {
+ bridges = <<9611>;
+};
+
+&soc {
+ lt9611_vcc_eldo: lt9611-gpio-regulator@0 {
+ compatible = "regulator-fixed";
+ regulator-name = "lt9611_vcc_eldo";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <233>;
+ gpio = <&tlmm 89 0>;
+ enable-active-high;
+ };
+};
+
+&qupv3_se10_i2c {
+ status = "ok";
+ lt9611: lt,lt9611@3b {
+ compatible = "lt,lt9611";
+ reg = <0x3b>;
+ interrupt-parent = <&tlmm>;
+ interrupts = <84 0>;
+ interrupt-names = "lt_irq";
+ lt,irq-gpio = <&tlmm 84 0x0>;
+ lt,reset-gpio = <&tlmm 128 0x0>;
+ lt,non-pluggable;
+ lt,preferred-mode = "1920x1080";
+
+ pinctrl-names = "default";
+ pinctrl-0 = <<9611_pins>;
+
+ vdd-supply = <<9611_vcc_eldo>;
+ lt,supply-entries {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ lt,supply-entry@0 {
+ reg = <0>;
+ lt,supply-name = "vdd";
+ lt,supply-min-voltage = <1800000>;
+ lt,supply-max-voltage = <1800000>;
+ lt,supply-enable-load = <200000>;
+ lt,supply-post-on-sleep = <150>;
+ };
+ };
+
+ lt,customize-modes {
+ lt,customize-mode-id@0 {
+ lt,mode-h-active = <1920>;
+ lt,mode-h-front-porch = <88>;
+ lt,mode-h-pulse-width = <44>;
+ lt,mode-h-back-porch = <148>;
+ lt,mode-h-active-high;
+ lt,mode-v-active = <1080>;
+ lt,mode-v-front-porch = <4>;
+ lt,mode-v-pulse-width = <5>;
+ lt,mode-v-back-porch = <36>;
+ lt,mode-v-active-high;
+ lt,mode-refresh-rate = <60>;
+ lt,mode-clock-in-khz = <148500>;
+ };
+ };
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ lt9611_in: endpoint {
+ remote-endpoint = <&ext_dsi_out>;
+ };
+ };
+ };
+ };
+};
+
+&ext_dsi_bridge_display {
+ qcom,dsi-display-active;
+ ports {
+ port@0 {
+ ext_dsi_out: endpoint {
+ remote-endpoint = <<9611_in>;
+ };
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi
index 2d36265..9bf544d 100644
--- a/arch/arm64/boot/dts/qcom/sdm845.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi
@@ -1549,6 +1549,7 @@
vdd_mss-supply = <&pm8005_s2_level>;
vdd_mss-uV = <RPMH_REGULATOR_LEVEL_TURBO>;
qcom,firmware-name = "modem";
+ qcom,sequential-fw-load;
qcom,pil-self-auth;
qcom,sysmon-id = <0>;
qcom,minidump-id = <3>;
diff --git a/arch/arm64/configs/sdm670-perf_defconfig b/arch/arm64/configs/sdm670-perf_defconfig
index 58aabff..d75479e 100755
--- a/arch/arm64/configs/sdm670-perf_defconfig
+++ b/arch/arm64/configs/sdm670-perf_defconfig
@@ -37,7 +37,6 @@
# CONFIG_RD_LZ4 is not set
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
@@ -72,12 +71,12 @@
CONFIG_SWP_EMULATION=y
CONFIG_CP15_BARRIER_EMULATION=y
CONFIG_SETEND_EMULATION=y
+CONFIG_ARM64_SW_TTBR0_PAN=y
# CONFIG_ARM64_VHE is not set
CONFIG_RANDOMIZE_BASE=y
# CONFIG_EFI is not set
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_COMPAT=y
-CONFIG_PM_AUTOSLEEP=y
CONFIG_PM_WAKELOCKS=y
CONFIG_PM_WAKELOCKS_LIMIT=0
# CONFIG_PM_WAKELOCKS_GC is not set
@@ -94,6 +93,7 @@
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_XFRM_USER=y
+CONFIG_XFRM_INTERFACE=y
CONFIG_XFRM_STATISTICS=y
CONFIG_NET_KEY=y
CONFIG_INET=y
@@ -276,6 +276,7 @@
CONFIG_DM_UEVENT=y
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_FEC=y
+CONFIG_DM_BOW=y
CONFIG_NETDEVICES=y
CONFIG_BONDING=y
CONFIG_DUMMY=y
@@ -295,6 +296,7 @@
CONFIG_PPPOPNS=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
+CONFIG_USB_RTL8152=y
CONFIG_USB_LAN78XX=y
CONFIG_USB_USBNET=y
CONFIG_WCNSS_MEM_PRE_ALLOC=y
diff --git a/arch/arm64/configs/sdm670_defconfig b/arch/arm64/configs/sdm670_defconfig
index a9f8f65..1eea891 100755
--- a/arch/arm64/configs/sdm670_defconfig
+++ b/arch/arm64/configs/sdm670_defconfig
@@ -39,7 +39,6 @@
# CONFIG_RD_LZ4 is not set
CONFIG_KALLSYMS_ALL=y
CONFIG_BPF_SYSCALL=y
-# CONFIG_MEMBARRIER is not set
CONFIG_EMBEDDED=y
# CONFIG_COMPAT_BRK is not set
CONFIG_PROFILING=y
@@ -77,11 +76,11 @@
CONFIG_SWP_EMULATION=y
CONFIG_CP15_BARRIER_EMULATION=y
CONFIG_SETEND_EMULATION=y
+CONFIG_ARM64_SW_TTBR0_PAN=y
# CONFIG_ARM64_VHE is not set
CONFIG_RANDOMIZE_BASE=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_COMPAT=y
-CONFIG_PM_AUTOSLEEP=y
CONFIG_PM_WAKELOCKS=y
CONFIG_PM_WAKELOCKS_LIMIT=0
# CONFIG_PM_WAKELOCKS_GC is not set
@@ -99,6 +98,7 @@
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_XFRM_USER=y
+CONFIG_XFRM_INTERFACE=y
CONFIG_XFRM_STATISTICS=y
CONFIG_NET_KEY=y
CONFIG_INET=y
@@ -284,6 +284,7 @@
CONFIG_DM_UEVENT=y
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_FEC=y
+CONFIG_DM_BOW=y
CONFIG_NETDEVICES=y
CONFIG_BONDING=y
CONFIG_DUMMY=y
@@ -301,6 +302,7 @@
CONFIG_PPPOPNS=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
+CONFIG_USB_RTL8152=y
CONFIG_USB_LAN78XX=y
CONFIG_USB_USBNET=y
CONFIG_WCNSS_MEM_PRE_ALLOC=y
diff --git a/arch/arm64/configs/sdm845-perf_defconfig b/arch/arm64/configs/sdm845-perf_defconfig
index 4529bfb..f62a85a 100755
--- a/arch/arm64/configs/sdm845-perf_defconfig
+++ b/arch/arm64/configs/sdm845-perf_defconfig
@@ -419,6 +419,7 @@
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_UPD720X=y
CONFIG_USB_ACM=y
CONFIG_USB_STORAGE=y
CONFIG_USB_DWC3=y
diff --git a/arch/arm64/configs/sdm845_defconfig b/arch/arm64/configs/sdm845_defconfig
old mode 100755
new mode 100644
index c063564..9f6dba1
--- a/arch/arm64/configs/sdm845_defconfig
+++ b/arch/arm64/configs/sdm845_defconfig
@@ -423,6 +423,7 @@
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_UPD720X=y
CONFIG_USB_ACM=y
CONFIG_USB_STORAGE=y
CONFIG_USB_DWC3=y
diff --git a/drivers/char/diag/diagfwd_socket.c b/drivers/char/diag/diagfwd_socket.c
index 401dbb0f..d7d7366 100644
--- a/drivers/char/diag/diagfwd_socket.c
+++ b/drivers/char/diag/diagfwd_socket.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
@@ -496,7 +496,8 @@
if (!atomic_read(&info->opened))
return;
- if (bootup_req[info->peripheral] == PEPIPHERAL_SSR_UP) {
+ if ((bootup_req[info->peripheral] == PEPIPHERAL_SSR_UP) &&
+ (info->port_type == PORT_TYPE_SERVER)) {
DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
"diag: %s is up, stopping cleanup: bootup_req = %d\n",
info->name, (int)bootup_req[info->peripheral]);
diff --git a/drivers/gpu/msm/kgsl_drawobj.c b/drivers/gpu/msm/kgsl_drawobj.c
index a1e0f4c..40b49c3 100644
--- a/drivers/gpu/msm/kgsl_drawobj.c
+++ b/drivers/gpu/msm/kgsl_drawobj.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
@@ -223,8 +223,13 @@
trace_syncpoint_timestamp_expire(event->syncobj,
event->context, event->timestamp);
- drawobj_sync_expire(device, event);
- kgsl_context_put(event->context);
+ /*
+ * Put down the context ref count only if
+ * this thread successfully clears the pending bit mask.
+ */
+ if (drawobj_sync_expire(device, event))
+ kgsl_context_put(event->context);
+
kgsl_drawobj_put(&event->syncobj->base);
}
@@ -254,33 +259,24 @@
static void drawobj_destroy_sync(struct kgsl_drawobj *drawobj)
{
struct kgsl_drawobj_sync *syncobj = SYNCOBJ(drawobj);
- unsigned long pending = 0;
unsigned int i;
/* Zap the canary timer */
del_timer_sync(&syncobj->timer);
/*
- * Copy off the pending list and clear each pending event atomically -
- * this will render any subsequent asynchronous callback harmless.
- * This marks each event for deletion. If any pending fence callbacks
- * run between now and the actual cancel, the associated structures
- * are kfreed only in the cancel call.
- */
- for_each_set_bit(i, &syncobj->pending, KGSL_MAX_SYNCPOINTS) {
- if (test_and_clear_bit(i, &syncobj->pending))
- __set_bit(i, &pending);
- }
-
- /*
* Clear all pending events - this will render any subsequent async
* callbacks harmless
*/
for (i = 0; i < syncobj->numsyncs; i++) {
struct kgsl_drawobj_sync_event *event = &syncobj->synclist[i];
- /* Don't do anything if the event has already expired */
- if (!test_bit(i, &pending))
+ /*
+ * Don't do anything if the event has already expired.
+ * If this thread clears the pending bit mask then it is
+ * responsible for doing context put.
+ */
+ if (!test_and_clear_bit(i, &syncobj->pending))
continue;
switch (event->type) {
@@ -288,6 +284,11 @@
kgsl_cancel_event(drawobj->device,
&event->context->events, event->timestamp,
drawobj_sync_func, event);
+ /*
+ * Do context put here to make sure the context is alive
+ * till this thread cancels kgsl event.
+ */
+ kgsl_context_put(event->context);
break;
case KGSL_CMD_SYNCPOINT_TYPE_FENCE:
kgsl_sync_fence_async_cancel(event->handle);
@@ -300,7 +301,7 @@
* If we cancelled an event, there's a good chance that the context is
* on a dispatcher queue, so schedule to get it removed.
*/
- if (!bitmap_empty(&pending, KGSL_MAX_SYNCPOINTS) &&
+ if (!bitmap_empty(&syncobj->pending, KGSL_MAX_SYNCPOINTS) &&
drawobj->device->ftbl->drawctxt_sched)
drawobj->device->ftbl->drawctxt_sched(drawobj->device,
drawobj->context);
diff --git a/drivers/hwmon/qpnp-adc-voltage.c b/drivers/hwmon/qpnp-adc-voltage.c
index 35d33de..086e706 100644
--- a/drivers/hwmon/qpnp-adc-voltage.c
+++ b/drivers/hwmon/qpnp-adc-voltage.c
@@ -107,8 +107,8 @@
#define QPNP_VADC_CONV_TIMEOUT_ERR 2
#define QPNP_VADC_CONV_TIME_MIN 1000
#define QPNP_VADC_CONV_TIME_MAX 1100
-#define QPNP_ADC_COMPLETION_TIMEOUT HZ
-#define QPNP_VADC_ERR_COUNT 20
+#define QPNP_ADC_COMPLETION_TIMEOUT msecs_to_jiffies(100)
+#define QPNP_VADC_ERR_COUNT 150
#define QPNP_OP_MODE_SHIFT 3
#define QPNP_VADC_THR_LSB_MASK(val) (val & 0xff)
@@ -161,7 +161,8 @@
*/
#define QPNP_VADC_HC1_CONV_TIME_MIN_US 213
#define QPNP_VADC_HC1_CONV_TIME_MAX_US 214
-#define QPNP_VADC_HC1_ERR_COUNT 1600
+#define QPNP_VADC_HC1_ERR_COUNT_POLL 705
+#define QPNP_VADC_HC1_ERR_COUNT 235
#define QPNP_VADC_CAL_DELAY_CTL_1 0x3744
#define QPNP_VADC_CAL_DELAY_MEAS_SLOW 0x73
@@ -363,11 +364,17 @@
return 0;
}
-static int qpnp_vadc_hc_check_conversion_status(struct qpnp_vadc_chip *vadc)
+static int qpnp_vadc_hc_check_conversion_status(struct qpnp_vadc_chip *vadc,
+ bool poll)
{
- int rc = 0, count = 0;
+ int rc = 0, count = 0, retry;
u8 status1 = 0;
+ if (poll)
+ retry = QPNP_VADC_HC1_ERR_COUNT_POLL;
+ else
+ retry = QPNP_VADC_HC1_ERR_COUNT;
+
while (status1 != QPNP_VADC_STATUS1_EOC) {
rc = qpnp_vadc_read_reg(vadc, QPNP_VADC_STATUS1, &status1, 1);
if (rc < 0)
@@ -378,7 +385,7 @@
usleep_range(QPNP_VADC_HC1_CONV_TIME_MIN_US,
QPNP_VADC_HC1_CONV_TIME_MAX_US);
count++;
- if (count > QPNP_VADC_HC1_ERR_COUNT) {
+ if (count > retry) {
pr_err("retry error exceeded\n");
rc = qpnp_vadc_status_debug(vadc);
if (rc < 0)
@@ -429,7 +436,7 @@
int ret;
if (vadc->vadc_poll_eoc) {
- ret = qpnp_vadc_hc_check_conversion_status(vadc);
+ ret = qpnp_vadc_hc_check_conversion_status(vadc, true);
if (ret < 0) {
pr_err("polling mode conversion failed\n");
return ret;
@@ -439,7 +446,7 @@
&vadc->adc->adc_rslt_completion,
QPNP_ADC_COMPLETION_TIMEOUT);
if (!ret) {
- ret = qpnp_vadc_hc_check_conversion_status(vadc);
+ ret = qpnp_vadc_hc_check_conversion_status(vadc, false);
if (ret < 0) {
pr_err("interrupt mode conversion failed\n");
return ret;
diff --git a/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c b/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c
index 6fe8851..64cc510 100644
--- a/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c
+++ b/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c
@@ -4099,7 +4099,7 @@
goto read;
t = wait_event_timeout(cd->wait_q,
(cd->wait_until_wake == 1),
- msecs_to_jiffies(2000));
+ msecs_to_jiffies(20));
if (IS_TMO(t))
cyttsp5_queue_startup(cd);
goto read;
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util_32.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util_32.c
index b5a6f44..c237ad2 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util_32.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util_32.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
@@ -1215,7 +1215,7 @@
for (i = 0; i < stream_cfg_cmd->num_streams; i++) {
if (HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])
- > MAX_NUM_STREAM)
+ >= MAX_NUM_STREAM)
return;
stream_info =
&axi_data->stream_info[
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 531536a..cb46d96 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -1660,6 +1660,19 @@
.tx_fixup = ax88179_tx_fixup,
};
+static const struct driver_info ax88178b_info = {
+ .description = "ASIX AX88178B USB 2.0 Gigabit Ethernet",
+ .bind = ax88179_bind,
+ .unbind = ax88179_unbind,
+ .status = ax88179_status,
+ .link_reset = ax88179_link_reset,
+ .reset = ax88179_reset,
+ .stop = ax88179_stop,
+ .flags = FLAG_ETHER | FLAG_FRAMING_AX,
+ .rx_fixup = ax88179_rx_fixup,
+ .tx_fixup = ax88179_tx_fixup,
+};
+
static const struct driver_info cypress_GX3_info = {
.description = "Cypress GX3 SuperSpeed to Gigabit Ethernet Controller",
.bind = ax88179_bind,
@@ -1735,6 +1748,10 @@
USB_DEVICE(0x0b95, 0x178a),
.driver_info = (unsigned long)&ax88178a_info,
}, {
+ /* ASIX AX88178A 10/100/1000 */
+ USB_DEVICE(0x0b95, 0x178b),
+ .driver_info = (unsigned long)&ax88178b_info,
+}, {
/* Cypress GX3 SuperSpeed to Gigabit Ethernet Bridge Controller */
USB_DEVICE(0x04b4, 0x3610),
.driver_info = (unsigned long)&cypress_GX3_info,
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c
index f8fdefd..6de07dc 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c
@@ -5130,6 +5130,7 @@
ipa3_ctx->use_ipa_teth_bridge = resource_p->use_ipa_teth_bridge;
ipa3_ctx->modem_cfg_emb_pipe_flt = resource_p->modem_cfg_emb_pipe_flt;
ipa3_ctx->ipa_wdi2 = resource_p->ipa_wdi2;
+ ipa3_ctx->ipa_config_is_auto = resource_p->ipa_config_is_auto;
ipa3_ctx->use_64_bit_dma_mask = resource_p->use_64_bit_dma_mask;
ipa3_ctx->wan_rx_ring_size = resource_p->wan_rx_ring_size;
ipa3_ctx->lan_rx_ring_size = resource_p->lan_rx_ring_size;
@@ -5701,6 +5702,7 @@
ipa_drv_res->ipa3_hw_mode = 0;
ipa_drv_res->modem_cfg_emb_pipe_flt = false;
ipa_drv_res->ipa_wdi2 = false;
+ ipa_drv_res->ipa_config_is_auto = false;
ipa_drv_res->ipa_mhi_dynamic_config = false;
ipa_drv_res->use_64_bit_dma_mask = false;
ipa_drv_res->use_bw_vote = false;
@@ -5785,6 +5787,13 @@
ipa_drv_res->ipa_wdi2
? "True" : "False");
+ ipa_drv_res->ipa_config_is_auto =
+ of_property_read_bool(pdev->dev.of_node,
+ "qcom,ipa-config-is-auto");
+ IPADBG(": ipa-config-is-auto = %s\n",
+ ipa_drv_res->ipa_config_is_auto
+ ? "True" : "False");
+
ipa_drv_res->use_64_bit_dma_mask =
of_property_read_bool(pdev->dev.of_node,
"qcom,use-64-bit-dma-mask");
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
index d145a4b..2caa54e 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
@@ -1446,6 +1446,7 @@
* @logbuf: ipc log buffer for high priority messages
* @logbuf_low: ipc log buffer for low priority messages
* @ipa_wdi2: using wdi-2.0
+ * @ipa_config_is_auto: is this AUTO use case
* @use_64_bit_dma_mask: using 64bits dma mask
* @ipa_bus_hdl: msm driver handle for the data path bus
* @ctrl: holds the core specific operations based on
@@ -1547,6 +1548,7 @@
bool use_ipa_teth_bridge;
bool modem_cfg_emb_pipe_flt;
bool ipa_wdi2;
+ bool ipa_config_is_auto;
bool use_64_bit_dma_mask;
/* featurize if memory footprint becomes a concern */
struct ipa3_stats stats;
@@ -1628,6 +1630,7 @@
u32 ee;
bool modem_cfg_emb_pipe_flt;
bool ipa_wdi2;
+ bool ipa_config_is_auto;
bool use_64_bit_dma_mask;
bool use_bw_vote;
u32 wan_rx_ring_size;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
index 3e6b365..03b0c72 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
@@ -144,6 +144,7 @@
#define IPA_v4_0_GROUP_UL_DL (1)
#define IPA_v4_0_MHI_GROUP_DDR (1)
#define IPA_v4_0_MHI_GROUP_DMA (2)
+#define IPA_v4_0_GROUP_CV2X (2)
#define IPA_v4_0_GROUP_UC_RX_Q (3)
#define IPA_v4_0_SRC_GROUP_MAX (4)
#define IPA_v4_0_DST_GROUP_MAX (4)
@@ -216,6 +217,8 @@
IPA_3_5_1,
IPA_4_0,
IPA_4_0_MHI,
+ IPA_4_0_AUTO,
+ IPA_4_0_AUTO_MHI,
IPA_VER_MAX,
};
@@ -305,6 +308,32 @@
[IPA_v4_0_RSRC_GRP_TYPE_SRC_ACK_ENTRIES] = {
{14, 14}, {14, 14}, {14, 14}, {0, 0}, {0, 0}, {0, 0} },
},
+ [IPA_4_0_AUTO] = {
+ /*not-used UL_DL CV2X not-used, other are invalid */
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_PKT_CONTEXTS] = {
+ {0, 0}, {1, 255}, {1, 1}, {0, 0}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRS_DESCRIPTOR_LISTS] = {
+ {0, 0}, {10, 10}, {8, 8}, {0, 0}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_DESCRIPTOR_BUFF] = {
+ {0, 0}, {14, 14}, {8, 8}, {0, 0}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_HPS_DMARS] = {
+ {0, 255}, {0, 255}, {0, 255}, {0, 255}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_ACK_ENTRIES] = {
+ {0, 0}, {20, 20}, {14, 14}, {0, 0}, {0, 0}, {0, 0} },
+ },
+ [IPA_4_0_AUTO_MHI] = {
+ /* PCIE DDR DMA/CV2X not used, other are invalid */
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_PKT_CONTEXTS] = {
+ {4, 4}, {5, 5}, {1, 1}, {0, 0}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRS_DESCRIPTOR_LISTS] = {
+ {10, 10}, {10, 10}, {8, 8}, {0, 0}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_DESCRIPTOR_BUFF] = {
+ {12, 12}, {12, 12}, {8, 8}, {0, 0}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_HPS_DMARS] = {
+ {0, 255}, {0, 255}, {0, 255}, {0, 255}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_SRC_ACK_ENTRIES] = {
+ {14, 14}, {14, 14}, {14, 14}, {0, 0}, {0, 0}, {0, 0} },
+ },
};
static const struct rsrc_min_max ipa3_rsrc_dst_grp_config
@@ -353,6 +382,20 @@
[IPA_v4_0_RSRC_GRP_TYPE_DST_DPS_DMARS] = {
{2, 255}, {1, 255}, {1, 2}, {0, 2}, {0, 0}, {0, 0} },
},
+ [IPA_4_0_AUTO] = {
+ /*PCIE UL/DL/DPL DMA/CV2X, other are invalid */
+ [IPA_v4_0_RSRC_GRP_TYPE_DST_DATA_SECTORS] = {
+ {4, 4}, {4, 4}, {3, 3}, {2, 2}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_DST_DPS_DMARS] = {
+ {2, 255}, {1, 255}, {1, 2}, {0, 2}, {0, 0}, {0, 0} },
+ },
+ [IPA_4_0_AUTO_MHI] = {
+ /*PCIE DDR DMA/CV2X, other are invalid */
+ [IPA_v4_0_RSRC_GRP_TYPE_DST_DATA_SECTORS] = {
+ {4, 4}, {4, 4}, {3, 3}, {2, 2}, {0, 0}, {0, 0} },
+ [IPA_v4_0_RSRC_GRP_TYPE_DST_DPS_DMARS] = {
+ {2, 255}, {1, 255}, {1, 2}, {0, 2}, {0, 0}, {0, 0} },
+ },
};
static const struct rsrc_min_max ipa3_rsrc_rx_grp_config
@@ -387,6 +430,16 @@
[IPA_RSRC_GRP_TYPE_RX_HPS_CMDQ] = {
{ 3, 3 }, { 7, 7 }, { 2, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
},
+ [IPA_4_0_AUTO] = {
+ /*not-used UL_DL CV2X not-used, other are invalid */
+ [IPA_RSRC_GRP_TYPE_RX_HPS_CMDQ] = {
+ {0, 0}, {7, 7}, {2, 2}, {0, 0}, {0, 0}, {0, 0} },
+ },
+ [IPA_4_0_AUTO_MHI] = {
+ /* PCIE DDR DMA/CV2X not used, other are invalid */
+ [IPA_RSRC_GRP_TYPE_RX_HPS_CMDQ] = {
+ { 3, 3 }, { 7, 7 }, { 2, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
+ },
};
static const u32 ipa3_rsrc_rx_grp_hps_weight_config
@@ -415,6 +468,14 @@
/* PCIE DDR DMA unused N/A N/A */
[IPA_RSRC_GRP_TYPE_RX_HPS_WEIGHT_CONFIG] = { 3, 5, 1, 1, 0, 0 },
},
+ [IPA_4_0_AUTO] = {
+ /*not-used UL_DL CV2X not-used, other are invalid */
+ [IPA_RSRC_GRP_TYPE_RX_HPS_WEIGHT_CONFIG] = { 0, 1, 1, 0, 0, 0 },
+ },
+ [IPA_4_0_AUTO_MHI] = {
+ /* PCIE DDR DMA/CV2X not used, other are invalid */
+ [IPA_RSRC_GRP_TYPE_RX_HPS_WEIGHT_CONFIG] = { 3, 5, 1, 0, 0, 0 },
+ },
};
enum ipa_ees {
@@ -1494,6 +1555,417 @@
IPA_DPS_HPS_SEQ_TYPE_INVALID,
QMB_MASTER_SELECT_DDR,
{ 31, 31, 8, 8, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+
+ /* IPA_4_0_AUTO */
+ [IPA_4_0_AUTO][IPA_CLIENT_WLAN1_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_REP_SEQ_TYPE_2PKT_PROC_PASS_NO_DEC_UCP_DMAP,
+ QMB_MASTER_SELECT_DDR,
+ { 6, 2, 8, 16, IPA_EE_UC, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_USB_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_REP_SEQ_TYPE_2PKT_PROC_PASS_NO_DEC_UCP_DMAP,
+ QMB_MASTER_SELECT_DDR,
+ { 0, 0, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_USB2_PROD] = {
+ true, IPA_v4_0_GROUP_CV2X,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY,
+ QMB_MASTER_SELECT_DDR,
+ { 7, 3, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_APPS_LAN_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 8, 11, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_APPS_WAN_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_REP_SEQ_TYPE_2PKT_PROC_PASS_NO_DEC_UCP_DMAP,
+ QMB_MASTER_SELECT_DDR,
+ { 2, 4, 16, 32, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_APPS_CMD_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY,
+ QMB_MASTER_SELECT_DDR,
+ { 5, 7, 20, 24, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_ODU_PROD] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_REP_SEQ_TYPE_2PKT_PROC_PASS_NO_DEC_UCP_DMAP,
+ QMB_MASTER_SELECT_DDR,
+ { 1, 0, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_ETHERNET_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_REP_SEQ_TYPE_2PKT_PROC_PASS_NO_DEC_UCP_DMAP,
+ QMB_MASTER_SELECT_DDR,
+ { 9, 0, 8, 16, IPA_EE_UC, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_Q6_WAN_PROD] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 3, 0, 16, 32, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_Q6_CMD_PROD] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_PKT_PROCESS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 4, 1, 20, 24, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ /* Only for test purpose */
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ {0, 8, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST1_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ {0, 8, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST2_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 1, 0, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST3_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 7, 9, 8, 16, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST4_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ {8, 10, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+
+
+ [IPA_4_0_AUTO][IPA_CLIENT_WLAN1_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 18, 3, 6, 9, IPA_EE_UC, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_WLAN2_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 20, 12, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_WLAN3_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 21, 13, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_USB_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 19, 6, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_USB_DPL_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 15, 10, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_MHI_DPL_CONS] = {
+ false, IPA_v4_0_MHI_GROUP_PCIE,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 12, 2, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_APPS_LAN_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 10, 8, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_APPS_WAN_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 11, 9, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_USB2_CONS] = {
+ true, IPA_v4_0_GROUP_CV2X,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 17, 1, 9, 9, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_ETHERNET_CONS] = {
+ true, IPA_v4_0_ETHERNET,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 22, 1, 9, 9, IPA_EE_UC, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_Q6_LAN_CONS] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 14, 4, 9, 9, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_Q6_WAN_CONS] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 13, 3, 9, 9, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO][IPA_CLIENT_Q6_LTE_WIFI_AGGR_CONS] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 16, 5, 9, 9, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ /* Only for test purpose */
+ /* MBIM aggregation test pipes should have the same QMB as USB_CONS */
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 11, 6, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST1_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 11, 6, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST2_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 12, 2, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST3_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 19, 12, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO][IPA_CLIENT_TEST4_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 21, 14, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ /* Dummy consumer (pipe 31) is used in L2TP rt rule */
+ [IPA_4_0_AUTO][IPA_CLIENT_DUMMY_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 31, 31, 8, 8, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+
+ /* IPA_4_0_AUTO_MHI */
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_APPS_WAN_PROD] = {
+ true, IPA_v4_0_MHI_GROUP_DDR,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 2, 4, 16, 32, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_APPS_CMD_PROD] = {
+ true, IPA_v4_0_MHI_GROUP_DDR,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY,
+ QMB_MASTER_SELECT_DDR,
+ { 5, 7, 20, 24, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MHI_PROD] = {
+ true, IPA_v4_0_MHI_GROUP_PCIE,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_PCIE,
+ { 0, 0, 8, 16, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MHI2_PROD] = {
+ true, IPA_v4_0_GROUP_CV2X,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_PCIE,
+ { 6, 5, 8, 16, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_ETHERNET_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_REP_SEQ_TYPE_2PKT_PROC_PASS_NO_DEC_UCP_DMAP,
+ QMB_MASTER_SELECT_DDR,
+ { 9, 0, 8, 16, IPA_EE_UC, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_Q6_WAN_PROD] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_PKT_PROCESS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 3, 0, 16, 32, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_Q6_CMD_PROD] = {
+ false, IPA_v4_0_MHI_GROUP_PCIE,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_PKT_PROCESS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 4, 1, 20, 24, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MEMCPY_DMA_SYNC_PROD] = {
+ true, IPA_v4_0_MHI_GROUP_DMA,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY,
+ QMB_MASTER_SELECT_DDR,
+ { 7, 3, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MEMCPY_DMA_ASYNC_PROD] = {
+ true, IPA_v4_0_MHI_GROUP_DMA,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY,
+ QMB_MASTER_SELECT_DDR,
+ { 8, 11, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ /* Only for test purpose */
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ {0, 8, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST1_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ {0, 8, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST2_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 1, 0, 8, 16, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST3_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ {7, 9, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST4_PROD] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ true,
+ IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP,
+ QMB_MASTER_SELECT_DDR,
+ { 8, 10, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+
+
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_APPS_LAN_CONS] = {
+ true, IPA_v4_0_MHI_GROUP_DDR,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 10, 8, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_APPS_WAN_CONS] = {
+ true, IPA_v4_0_MHI_GROUP_DDR,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 11, 9, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MHI_CONS] = {
+ true, IPA_v4_0_MHI_GROUP_PCIE,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 17, 1, 17, 17, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MHI2_CONS] = {
+ true, IPA_v4_0_GROUP_CV2X,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 19, 6, 9, 9, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_ETHERNET_CONS] = {
+ true, IPA_v4_0_ETHERNET,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 22, 1, 9, 9, IPA_EE_UC, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_Q6_LAN_CONS] = {
+ false, IPA_v4_0_MHI_GROUP_DDR,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 14, 4, 9, 9, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_Q6_WAN_CONS] = {
+ false, IPA_v4_0_MHI_GROUP_DDR,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 13, 3, 9, 9, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MEMCPY_DMA_SYNC_CONS] = {
+ true, IPA_v4_0_MHI_GROUP_DMA,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 20, 12, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MEMCPY_DMA_ASYNC_CONS] = {
+ true, IPA_v4_0_MHI_GROUP_DMA,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 21, 13, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_Q6_LTE_WIFI_AGGR_CONS] = {
+ false, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 16, 5, 9, 9, IPA_EE_Q6, GSI_USE_PREFETCH_BUFS } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_USB_DPL_CONS] = {
+ false, IPA_v4_0_MHI_GROUP_DDR,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 15, 10, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_MHI_DPL_CONS] = {
+ true, IPA_v4_0_MHI_GROUP_PCIE,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 12, 2, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ /* Only for test purpose */
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 11, 6, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST1_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 11, 6, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST2_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 12, 2, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST3_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 19, 12, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_TEST4_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_PCIE,
+ { 21, 14, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY } },
+ /* Dummy consumer (pipe 31) is used in L2TP rt rule */
+ [IPA_4_0_AUTO_MHI][IPA_CLIENT_DUMMY_CONS] = {
+ true, IPA_v4_0_GROUP_UL_DL,
+ false,
+ IPA_DPS_HPS_SEQ_TYPE_INVALID,
+ QMB_MASTER_SELECT_DDR,
+ { 31, 31, 8, 8, IPA_EE_AP, GSI_USE_PREFETCH_BUFS } },
};
/**
@@ -2131,6 +2603,14 @@
*/
if (ipa3_ctx->ipa_config_is_mhi)
hw_type_index = IPA_4_0_MHI;
+
+ if (ipa3_ctx->ipa_config_is_auto)
+ hw_type_index = IPA_4_0_AUTO;
+
+ if (ipa3_ctx->ipa_config_is_auto &&
+ ipa3_ctx->ipa_config_is_mhi)
+ hw_type_index = IPA_4_0_AUTO_MHI;
+
break;
default:
IPAERR("Incorrect IPA version %d\n", ipa3_ctx->ipa_hw_type);
@@ -4777,6 +5257,8 @@
break;
case IPA_4_0:
case IPA_4_0_MHI:
+ case IPA_4_0_AUTO:
+ case IPA_4_0_AUTO_MHI:
if (src) {
switch (group_index) {
case IPA_v4_0_GROUP_LWA_DL:
@@ -4926,6 +5408,13 @@
src_grp_idx_max = IPA_v4_0_SRC_GROUP_MAX;
dst_grp_idx_max = IPA_v4_0_DST_GROUP_MAX;
break;
+ case IPA_4_0_AUTO:
+ case IPA_4_0_AUTO_MHI:
+ src_rsrc_type_max = IPA_v4_0_RSRC_GRP_TYPE_SRC_MAX;
+ dst_rsrc_type_max = IPA_v4_0_RSRC_GRP_TYPE_DST_MAX;
+ src_grp_idx_max = IPA_v4_0_GROUP_CV2X;
+ dst_grp_idx_max = IPA_v4_0_GROUP_CV2X;
+ break;
default:
IPAERR("invalid hw type index\n");
WARN_ON(1);
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c
index 384ac58..1d5284e 100644
--- a/drivers/soc/qcom/peripheral-loader.c
+++ b/drivers/soc/qcom/peripheral-loader.c
@@ -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
@@ -36,6 +36,7 @@
#include <soc/qcom/subsystem_restart.h>
#include <soc/qcom/secure_buffer.h>
#include <soc/qcom/smem.h>
+#include <linux/kthread.h>
#include <linux/uaccess.h>
#include <asm/setup.h>
@@ -70,6 +71,9 @@
module_param(proxy_timeout_ms, int, 0644);
static bool disable_timeouts;
+
+static struct workqueue_struct *pil_wq;
+
/**
* struct pil_mdt - Representation of <name>.mdt file in memory
* @hdr: ELF32 header
@@ -127,6 +131,7 @@
struct wakeup_source ws;
char wname[32];
struct pil_desc *desc;
+ int num_segs;
struct list_head segs;
phys_addr_t entry_addr;
phys_addr_t base_addr;
@@ -723,6 +728,7 @@
pil_info(desc, "loading from %pa to %pa\n", &priv->region_start,
&priv->region_end);
+ priv->num_segs = 0;
for (i = 0; i < mdt->hdr.e_phnum; i++) {
phdr = &mdt->phdr[i];
if (!segment_is_loadable(phdr))
@@ -733,6 +739,7 @@
return PTR_ERR(seg);
list_add_tail(&seg->list, &priv->segs);
+ priv->num_segs++;
}
list_sort(NULL, &priv->segs, pil_cmp_seg);
@@ -922,6 +929,9 @@
}
}
desc->proxy_unvote_irq = clk_ready;
+
+ desc->sequential_load = of_property_read_bool(ofnode,
+ "qcom,sequential-fw-load");
return 0;
}
@@ -945,6 +955,89 @@
/* Synchronize request_firmware() with suspend */
static DECLARE_RWSEM(pil_pm_rwsem);
+struct pil_seg_data {
+ struct pil_desc *desc;
+ struct pil_seg *seg;
+ struct work_struct load_seg_work;
+ int retval;
+};
+
+static void pil_load_seg_work_fn(struct work_struct *work)
+{
+ struct pil_seg_data *pil_seg_data = container_of(work,
+ struct pil_seg_data,
+ load_seg_work);
+ struct pil_desc *desc = pil_seg_data->desc;
+ struct pil_seg *seg = pil_seg_data->seg;
+
+ pil_seg_data->retval = pil_load_seg(desc, seg);
+}
+
+static int pil_load_segs(struct pil_desc *desc)
+{
+ int ret = 0;
+ int seg_id = 0;
+ struct pil_priv *priv = desc->priv;
+ struct pil_seg_data *pil_seg_data;
+ struct pil_seg *seg;
+ unsigned long *err_map;
+
+ err_map = kcalloc(BITS_TO_LONGS(priv->num_segs), sizeof(unsigned long),
+ GFP_KERNEL);
+ if (!err_map)
+ return -ENOMEM;
+
+ pil_seg_data = kcalloc(priv->num_segs, sizeof(*pil_seg_data),
+ GFP_KERNEL);
+ if (!pil_seg_data) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ /* Initialize and spawn a thread for each segment */
+ list_for_each_entry(seg, &desc->priv->segs, list) {
+ pil_seg_data[seg_id].desc = desc;
+ pil_seg_data[seg_id].seg = seg;
+
+ INIT_WORK(&pil_seg_data[seg_id].load_seg_work,
+ pil_load_seg_work_fn);
+ queue_work(pil_wq, &pil_seg_data[seg_id].load_seg_work);
+
+ seg_id++;
+ }
+
+ bitmap_zero(err_map, priv->num_segs);
+
+ /* Wait for the parallel loads to finish */
+ seg_id = 0;
+ list_for_each_entry(seg, &desc->priv->segs, list) {
+ flush_work(&pil_seg_data[seg_id].load_seg_work);
+
+ /*
+ * Don't exit if one of the thread fails. Wait for others to
+ * complete. Bitmap the return codes we get from the threads.
+ */
+ if (pil_seg_data[seg_id].retval) {
+ pil_err(desc,
+ "Failed to load the segment[%d]. ret = %d\n",
+ seg_id, pil_seg_data[seg_id].retval);
+ __set_bit(seg_id, err_map);
+ }
+
+ seg_id++;
+ }
+
+ kfree(pil_seg_data);
+
+ /* Each segment can fail due to different reason. Send a generic err */
+ if (!bitmap_empty(err_map, priv->num_segs))
+ ret = -EFAULT;
+
+out:
+ kfree(err_map);
+ return ret;
+}
+
/**
* pil_boot() - Load a peripheral image into memory and boot it
* @desc: descriptor from pil_desc_init()
@@ -955,9 +1048,9 @@
{
int ret;
char fw_name[30];
+ struct pil_seg *seg;
const struct pil_mdt *mdt;
const struct elf32_hdr *ehdr;
- struct pil_seg *seg;
const struct firmware *fw;
struct pil_priv *priv = desc->priv;
bool mem_protect = false;
@@ -1066,8 +1159,15 @@
}
trace_pil_event("before_load_seg", desc);
- list_for_each_entry(seg, &desc->priv->segs, list) {
- ret = pil_load_seg(desc, seg);
+
+ if (desc->sequential_load) {
+ list_for_each_entry(seg, &desc->priv->segs, list) {
+ ret = pil_load_seg(desc, seg);
+ if (ret)
+ goto err_deinit_image;
+ }
+ } else {
+ ret = pil_load_segs(desc);
if (ret)
goto err_deinit_image;
}
@@ -1364,6 +1464,11 @@
pr_err("SMEM is not initialized.\n");
return -EPROBE_DEFER;
}
+
+ pil_wq = alloc_workqueue("pil_workqueue", WQ_HIGHPRI | WQ_UNBOUND, 0);
+ if (!pil_wq)
+ pr_warn("pil: Defaulting to sequential firmware loading.\n");
+
out:
return register_pm_notifier(&pil_pm_notifier);
}
@@ -1371,6 +1476,8 @@
static void __exit msm_pil_exit(void)
{
+ if (pil_wq)
+ destroy_workqueue(pil_wq);
unregister_pm_notifier(&pil_pm_notifier);
if (pil_info_base)
iounmap(pil_info_base);
diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h
index 6ea6b2a..9f3e006 100644
--- a/drivers/soc/qcom/peripheral-loader.h
+++ b/drivers/soc/qcom/peripheral-loader.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
@@ -41,6 +41,8 @@
* @modem_ssr: true if modem is restarting, false if booting for first time.
* @clear_fw_region: Clear fw region on failure in loading.
* @subsys_vmid: memprot id for the subsystem.
+ * @sequential_load: Load the firmware blobs sequentially if set. Else, load
+ * them in parallel.
*/
struct pil_desc {
const char *name;
@@ -67,6 +69,7 @@
struct md_ss_toc *minidump_ss;
struct md_ss_toc *minidump_pdr;
int minidump_id;
+ bool sequential_load;
};
/**
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 02839e2..146fe3e 100755
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1284,6 +1284,8 @@
"snps,usb3-u1u2-disable");
dwc->usb2_l1_disable = device_property_read_bool(dev,
"snps,usb2-l1-disable");
+ dwc->normal_eps_in_gsi_mode = device_property_read_bool(dev,
+ "normal-eps-in-gsi-mode");
if (dwc->enable_bus_suspend) {
pm_runtime_set_autosuspend_delay(dev, 500);
pm_runtime_use_autosuspend(dev);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 89d7ee0..fc61099 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -44,6 +44,7 @@
#define DWC3_EP0_BOUNCE_SIZE 512
#define DWC3_ENDPOINTS_NUM 32
#define DWC3_XHCI_RESOURCES_NUM 2
+#define MAX_ERROR_RECOVERY_TRIES 3
#define DWC3_SCRATCHBUF_SIZE 4096 /* each buffer is assumed to be 4KiB */
#define DWC3_EVENT_BUFFERS_SIZE 4096
@@ -620,6 +621,7 @@
* @dbg_ep_events_ts: timestamp for previous event counters
* @fifo_depth: allocated TXFIFO depth
* @ep_cfg_init_params: Used by GSI EP to save EP_CFG init_cmd params
+ * @gsi_db_reg_addr: Address of GSI DB register mapped to this EP
*/
struct dwc3_ep {
struct usb_ep endpoint;
@@ -676,6 +678,7 @@
struct timespec dbg_ep_events_ts;
int fifo_depth;
struct dwc3_gadget_ep_cmd_params ep_cfg_init_params;
+ void __iomem *gsi_db_reg_addr;
};
enum dwc3_phy {
@@ -989,6 +992,8 @@
* @create_reg_debugfs: create debugfs entry to allow dwc3 register dump
* @xhci_imod_value: imod value to use with xhci
* @core_id: usb core id to differentiate different controller
+ * @normal_eps_in_gsi_mode: if true, two normal EPS (1 In, 1 Out) can be used in
+ * GSI mode
*/
struct dwc3 {
struct usb_ctrlrequest *ctrl_req;
@@ -1191,6 +1196,7 @@
u32 xhci_imod_value;
int core_id;
int retries_on_error;
+ bool normal_eps_in_gsi_mode;
};
/* -------------------------------------------------------------------------- */
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index af704b7..a2a4438 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -203,7 +203,7 @@
"ENABLE_GSI", "UPDATE_XFER", "RING_DB",
"END_XFER", "GET_CH_INFO", "GET_XFER_IDX", "PREPARE_TRBS",
"FREE_TRBS", "SET_CLR_BLOCK_DBL", "CHECK_FOR_SUSP",
- "EP_DISABLE" };
+ "EP_DISABLE", "EP_UPDATE_DB" };
/* Input bits to state machine (mdwc->inputs) */
@@ -312,6 +312,8 @@
u64 dummy_gsi_db;
dma_addr_t dummy_gsi_db_dma;
+ u64 dummy_gevntcnt;
+ dma_addr_t dummy_gevntcnt_dma;
};
#define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */
@@ -864,6 +866,7 @@
int last_trb_index = 0;
struct dwc3 *dwc = dep->dwc;
struct usb_gsi_request *request = ch_info->ch_req;
+ struct dwc3_msm *mdwc = dev_get_drvdata(dwc->dev->parent);
/* Provide physical USB addresses for DEPCMD and GEVENTCNT registers */
ch_info->depcmd_low_addr = (u32)(dwc->reg_phys +
@@ -898,14 +901,28 @@
/* Store last 16 bits of LINK TRB address as per GSI hw requirement */
ch_info->last_trb_addr = (dwc3_trb_dma_offset(dep,
&dep->trb_pool[last_trb_index - 1]) & 0x0000FFFF);
- ch_info->gevntcount_low_addr = (u32)(dwc->reg_phys +
- DWC3_GEVNTCOUNT(ep->ep_intr_num));
- ch_info->gevntcount_hi_addr = 0;
+ dev_dbg(dwc->dev, "depcmd_laddr=%x last_trb_addr=%x\n",
+ ch_info->depcmd_low_addr, ch_info->last_trb_addr);
- dev_dbg(dwc->dev,
- "depcmd_laddr=%x last_trb_addr=%x gevtcnt_laddr=%x gevtcnt_haddr=%x",
- ch_info->depcmd_low_addr, ch_info->last_trb_addr,
- ch_info->gevntcount_low_addr, ch_info->gevntcount_hi_addr);
+ /*
+ * Check if NORMAL EP is used with GSI. In that case USB driver
+ * processes events and GSI shouldn't access GEVNTCOUNT(0) register.
+ */
+ if (ep->ep_intr_num) {
+ ch_info->gevntcount_low_addr = (u32)(dwc->reg_phys +
+ DWC3_GEVNTCOUNT(ep->ep_intr_num));
+ ch_info->gevntcount_hi_addr = 0;
+ dev_dbg(dwc->dev, "gevtcnt_laddr=%x gevtcnt_haddr=%x\n",
+ ch_info->gevntcount_low_addr, ch_info->gevntcount_hi_addr);
+ } else {
+ ch_info->gevntcount_low_addr = (u32)mdwc->dummy_gevntcnt_dma;
+ ch_info->gevntcount_hi_addr =
+ (u32)((u64)mdwc->dummy_gevntcnt_dma >> 32);
+ dev_dbg(dwc->dev, "Dummy GEVNTCNT Addr %pK: %llx %x (LSB)\n",
+ &mdwc->dummy_gevntcnt,
+ (unsigned long long)mdwc->dummy_gevntcnt_dma,
+ (u32)mdwc->dummy_gevntcnt_dma);
+ }
}
/*
@@ -929,8 +946,15 @@
}
memset(¶ms, 0, sizeof(params));
- params.param0 = GSI_TRB_ADDR_BIT_53_MASK | GSI_TRB_ADDR_BIT_55_MASK;
- params.param0 |= (ep->ep_intr_num << 16);
+ /*
+ * Check if NORMAL EP is used with GSI. In that case USB driver
+ * updates GSI doorbell and USB GSI wrapper h/w isn't involved.
+ */
+ if (ep->ep_intr_num) {
+ params.param0 = GSI_TRB_ADDR_BIT_53_MASK |
+ GSI_TRB_ADDR_BIT_55_MASK;
+ params.param0 |= (ep->ep_intr_num << 16);
+ }
params.param1 = lower_32_bits(dwc3_trb_dma_offset(dep,
&dep->trb_pool[0]));
cmd = DWC3_DEPCMD_STARTTRANSFER;
@@ -957,7 +981,18 @@
struct dwc3_ep *dep = to_dwc3_ep(ep);
struct dwc3 *dwc = dep->dwc;
struct dwc3_msm *mdwc = dev_get_drvdata(dwc->dev->parent);
- int n = ep->ep_intr_num - 1;
+ int n;
+
+ /*
+ * Check if NORMAL EP is used with GSI. In that case USB driver
+ * updates GSI doorbell and USB GSI wrapper h/w isn't involved.
+ */
+ if (!ep->ep_intr_num) {
+ dev_dbg(mdwc->dev, "%s: is no-op for normal EP\n", __func__);
+ return;
+ }
+
+ n = ep->ep_intr_num - 1;
dwc3_msm_write_reg(mdwc->base, GSI_RING_BASE_ADDR_L(n),
dwc3_trb_dma_offset(dep, &dep->trb_pool[0]));
@@ -991,6 +1026,21 @@
dwc3_msm_read_reg(mdwc->base, GSI_DBL_ADDR_L(n)));
}
+static void dwc3_msm_gsi_db_update(struct dwc3_ep *dep, dma_addr_t offset)
+{
+ struct dwc3 *dwc = dep->dwc;
+ struct dwc3_msm *mdwc = dev_get_drvdata(dwc->dev->parent);
+
+ if (!dep->gsi_db_reg_addr) {
+ dev_err(mdwc->dev, "Failed to update GSI DBL\n");
+ return;
+ }
+
+ writel_relaxed(offset, dep->gsi_db_reg_addr);
+ dev_dbg(mdwc->dev, "Writing TRB addr: %pa to %pK\n",
+ &offset, dep->gsi_db_reg_addr);
+}
+
/*
* Rings Doorbell for GSI Channel
*
@@ -1016,6 +1066,8 @@
return;
}
+ dep->gsi_db_reg_addr = gsi_dbl_address_lsb;
+
gsi_dbl_address_msb = devm_ioremap_nocache(mdwc->dev,
request->db_reg_phs_addr_msb, sizeof(u32));
if (!gsi_dbl_address_msb) {
@@ -1399,6 +1451,15 @@
struct dwc3 *dwc = dep->dwc;
struct dwc3_msm *mdwc = dev_get_drvdata(dwc->dev->parent);
+ /*
+ * Check if NORMAL EP is used with GSI. In that case USB driver
+ * updates GSI doorbell and USB GSI wrapper h/w isn't involved.
+ */
+ if (!ep->ep_intr_num) {
+ dev_dbg(mdwc->dev, "%s: is no-op for normal EP\n", __func__);
+ return;
+ }
+
dwc3_msm_write_reg_field(mdwc->base,
GSI_GENERAL_CFG_REG, GSI_CLK_EN_MASK, 1);
dwc3_msm_write_reg_field(mdwc->base,
@@ -1435,6 +1496,12 @@
else
gsi_enable_ep_events(ep);
+ /* Nothing to be done if NORMAL EP is used with GSI */
+ if (!ep->ep_intr_num) {
+ dev_dbg(mdwc->dev, "%s: is no-op for normal EP\n", __func__);
+ return;
+ }
+
dwc3_msm_write_reg_field(mdwc->base,
GSI_GENERAL_CFG_REG, BLOCK_GSI_WR_GO_MASK, block_db);
}
@@ -1490,6 +1557,7 @@
struct gsi_channel_info *ch_info;
bool block_db;
unsigned long flags;
+ dma_addr_t offset;
dbg_log_string("%s(%d):%s", ep->name, ep->ep_num, gsi_op_to_string(op));
@@ -1555,6 +1623,10 @@
case GSI_EP_OP_DISABLE:
ret = ep->ops->disable(ep);
break;
+ case GSI_EP_OP_UPDATE_DB:
+ offset = *(dma_addr_t *)op_data;
+ dwc3_msm_gsi_db_update(dep, offset);
+ break;
default:
dev_err(mdwc->dev, "%s: Invalid opcode GSI EP\n", __func__);
}
@@ -1950,8 +2022,13 @@
reg |= DWC3_GCTL_CORESOFTRESET;
dwc3_msm_write_reg(mdwc->base, DWC3_GCTL, reg);
- /* restart USB which performs full reset and reconnect */
- schedule_work(&mdwc->restart_usb_work);
+ /*
+ * If the core could not recover after MAX_ERROR_RECOVERY_TRIES,
+ * skip the restart USB work and keep the core in softreset
+ * state.
+ */
+ if (dwc->retries_on_error < MAX_ERROR_RECOVERY_TRIES)
+ schedule_work(&mdwc->restart_usb_work);
break;
case DWC3_CONTROLLER_RESET_EVENT:
dev_dbg(mdwc->dev, "DWC3_CONTROLLER_RESET_EVENT received\n");
@@ -2065,6 +2142,19 @@
dev_err(dwc->dev, "failed to map dummy doorbell buffer\n");
mdwc->dummy_gsi_db_dma = (dma_addr_t)NULL;
}
+
+ /*
+ * Set-up dummy GEVNTCOUNT address to be passed on to GSI for
+ * normal (non HW-accelerated) EPs.
+ */
+ mdwc->dummy_gevntcnt_dma = dma_map_single(dwc->sysdev,
+ &mdwc->dummy_gevntcnt,
+ sizeof(mdwc->dummy_gevntcnt),
+ DMA_FROM_DEVICE);
+ if (dma_mapping_error(dwc->sysdev, mdwc->dummy_gevntcnt_dma)) {
+ dev_err(dwc->dev, "failed to map dummy geventcount\n");
+ mdwc->dummy_gevntcnt_dma = (dma_addr_t)NULL;
+ }
break;
case DWC3_GSI_EVT_BUF_SETUP:
dev_dbg(mdwc->dev, "DWC3_GSI_EVT_BUF_SETUP\n");
@@ -2138,6 +2228,12 @@
dma_free_coherent(dwc->sysdev, evt->length,
evt->buf, evt->dma);
}
+ if (mdwc->dummy_gevntcnt_dma) {
+ dma_unmap_single(dwc->sysdev, mdwc->dummy_gevntcnt_dma,
+ sizeof(mdwc->dummy_gevntcnt),
+ DMA_FROM_DEVICE);
+ mdwc->dummy_gevntcnt_dma = (dma_addr_t)NULL;
+ }
if (mdwc->dummy_gsi_db_dma) {
dma_unmap_single(dwc->sysdev, mdwc->dummy_gsi_db_dma,
sizeof(mdwc->dummy_gsi_db),
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index e8d270d..1235287 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -37,8 +37,6 @@
#include "gadget.h"
#include "io.h"
-#define MAX_ERROR_RECOVERY_TRIES 3
-
static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc, bool remote_wakeup);
static int dwc3_gadget_wakeup_int(struct dwc3 *dwc);
static void dwc3_stop_active_transfers(struct dwc3 *dwc);
@@ -1954,6 +1952,11 @@
reg1 |= DWC3_GEVNTSIZ_INTMASK;
dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg1);
+ /*
+ * Reset the err_evt_seen so that the interrupts on
+ * next connect/session is processed correctly.
+ */
+ dwc->err_evt_seen = false;
dwc->pullups_connected = false;
__dwc3_gadget_ep_disable(dwc->eps[0]);
@@ -2390,8 +2393,8 @@
/* -------------------------------------------------------------------------- */
-#define NUM_GSI_OUT_EPS 1
-#define NUM_GSI_IN_EPS 2
+#define NUM_GSI_OUT_EPS(dwc) (dwc->normal_eps_in_gsi_mode ? 2 : 1)
+#define NUM_GSI_IN_EPS(dwc) (dwc->normal_eps_in_gsi_mode ? 3 : 2)
static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc,
u8 num, u32 direction)
@@ -2399,13 +2402,13 @@
struct dwc3_ep *dep;
u8 i, gsi_ep_count, gsi_ep_index = 0;
- gsi_ep_count = NUM_GSI_OUT_EPS + NUM_GSI_IN_EPS;
+ gsi_ep_count = NUM_GSI_OUT_EPS(dwc) + NUM_GSI_IN_EPS(dwc);
/* OUT GSI EPs based on direction field */
if (gsi_ep_count && !direction)
- gsi_ep_count = NUM_GSI_OUT_EPS;
+ gsi_ep_count = NUM_GSI_OUT_EPS(dwc);
/* IN GSI EPs */
else if (gsi_ep_count && direction)
- gsi_ep_count = NUM_GSI_IN_EPS;
+ gsi_ep_count = NUM_GSI_IN_EPS(dwc);
for (i = 0; i < num; i++) {
u8 epnum = (i << 1) | (direction ? 1 : 0);
@@ -2710,6 +2713,25 @@
return 1;
}
+static void dwc3_gsi_ep_transfer_complete(struct dwc3 *dwc, struct dwc3_ep *dep)
+{
+ struct usb_ep *ep = &dep->endpoint;
+ struct dwc3_trb *trb;
+ dma_addr_t offset;
+
+ trb = &dep->trb_pool[dep->trb_dequeue];
+ while (trb->ctrl & DWC3_TRBCTL_LINK_TRB) {
+ dwc3_ep_inc_trb(&dep->trb_dequeue);
+ trb = &dep->trb_pool[dep->trb_dequeue];
+ }
+
+ if (!(trb->ctrl & DWC3_TRB_CTRL_HWO)) {
+ offset = dwc3_trb_dma_offset(dep, trb);
+ usb_gsi_ep_op(ep, (void *)&offset, GSI_EP_OP_UPDATE_DB);
+ dwc3_ep_inc_trb(&dep->trb_dequeue);
+ }
+}
+
static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
struct dwc3_ep *dep, const struct dwc3_event_depevt *event)
{
@@ -2721,6 +2743,15 @@
if (event->status & DEPEVT_STATUS_BUSERR)
status = -ECONNRESET;
+ /*
+ * Check if NORMAL EP is used with GSI.
+ * In that case dwc3 driver recevies EP events from hardware and
+ * updates GSI doorbell with completed TRB.
+ */
+ if (dep->endpoint.ep_type == EP_TYPE_GSI) {
+ dwc3_gsi_ep_transfer_complete(dwc, dep);
+ return;
+ }
clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status);
if (clean_busy && (!dep->endpoint.desc || is_xfer_complete ||
@@ -3638,12 +3669,10 @@
evt->lpos = (evt->lpos + left) %
DWC3_EVENT_BUFFERS_SIZE;
dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), left);
- if (dwc->retries_on_error < MAX_ERROR_RECOVERY_TRIES) {
- if (dwc3_notify_event(dwc,
+ if (dwc3_notify_event(dwc,
DWC3_CONTROLLER_ERROR_EVENT, 0))
- dwc->err_evt_seen = 0;
- dwc->retries_on_error++;
- }
+ dwc->err_evt_seen = 0;
+ dwc->retries_on_error++;
break;
}
diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c
index ffd5952..d58b20a 100644
--- a/drivers/usb/gadget/function/f_gsi.c
+++ b/drivers/usb/gadget/function/f_gsi.c
@@ -572,9 +572,11 @@
GSI_EP_OP_GET_CH_INFO);
log_event_dbg("%s: USB GSI IN OPS Completed", __func__);
- in_params->client =
- (gsi->prot_id != USB_PROT_DIAG_IPA) ? IPA_CLIENT_USB_CONS :
- IPA_CLIENT_USB_DPL_CONS;
+ if (gsi->prot_id != USB_PROT_DIAG_IPA)
+ in_params->client = (gsi->prot_id != USB_PROT_RMNET_V2X_IPA) ?
+ IPA_CLIENT_USB_CONS : IPA_CLIENT_USB2_CONS;
+ else
+ in_params->client = IPA_CLIENT_USB_DPL_CONS;
in_params->ipa_ep_cfg.mode.mode = IPA_BASIC;
in_params->teth_prot = (enum ipa_usb_teth_prot)gsi->prot_id;
in_params->gevntcount_low_addr =
@@ -627,7 +629,8 @@
usb_gsi_ep_op(d_port->out_ep, (void *)&gsi_channel_info,
GSI_EP_OP_GET_CH_INFO);
log_event_dbg("%s: USB GSI OUT OPS Completed", __func__);
- out_params->client = IPA_CLIENT_USB_PROD;
+ out_params->client = (gsi->prot_id != USB_PROT_RMNET_V2X_IPA) ?
+ IPA_CLIENT_USB_PROD : IPA_CLIENT_USB2_PROD;
out_params->ipa_ep_cfg.mode.mode = IPA_BASIC;
out_params->teth_prot = (enum ipa_usb_teth_prot)gsi->prot_id;
out_params->gevntcount_low_addr =
@@ -1521,6 +1524,7 @@
case GSI_MBIM_GPS_USB_STATUS:
val = atomic_read(&gsi->connected);
if (gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_RMNET_ETHER)
val = gsi->rmnet_dtr_status;
@@ -1701,6 +1705,9 @@
case USB_PROT_RMNET_IPA:
cdev_name = GSI_RMNET_CTRL_NAME;
break;
+ case USB_PROT_RMNET_V2X_IPA:
+ cdev_name = GSI_RMNET_V2X_CTRL_NAME;
+ break;
case USB_PROT_RMNET_ETHER:
cdev_name = ETHER_RMNET_CTRL_NAME;
break;
@@ -2190,6 +2197,7 @@
| USB_CDC_REQ_SET_CONTROL_LINE_STATE:
line_state = (w_value & GSI_CTRL_DTR ? true : false);
if (gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_RMNET_ETHER)
gsi->rmnet_dtr_status = line_state;
log_event_dbg("%s: USB_CDC_REQ_SET_CONTROL_LINE_STATE DTR:%d\n",
@@ -2293,6 +2301,7 @@
/* RNDIS, RMNET and DPL only support alt 0*/
if (intf == gsi->ctrl_id || gsi->prot_id == USB_PROT_RNDIS_IPA ||
gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_DIAG_IPA ||
is_ext_prot_ether(gsi->prot_id))
return 0;
@@ -2414,6 +2423,7 @@
/* Control interface has only altsetting 0 */
if (intf == gsi->ctrl_id || gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_RMNET_ETHER) {
if (alt != 0)
goto fail;
@@ -2450,6 +2460,7 @@
/* for rndis and rmnet alt is always 0 update alt accordingly */
if (gsi->prot_id == USB_PROT_RNDIS_IPA ||
gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_DIAG_IPA ||
is_ext_prot_ether(gsi->prot_id))
alt = 1;
@@ -2480,9 +2491,11 @@
/* Configure EPs for GSI */
if (gsi->d_port.in_ep &&
- gsi->prot_id <= USB_PROT_DIAG_IPA) {
+ gsi->prot_id <= USB_PROT_RMNET_V2X_IPA) {
if (gsi->prot_id == USB_PROT_DIAG_IPA)
gsi->d_port.in_ep->ep_intr_num = 3;
+ else if (gsi->prot_id == USB_PROT_RMNET_V2X_IPA)
+ gsi->d_port.in_ep->ep_intr_num = 0;
else
gsi->d_port.in_ep->ep_intr_num = 2;
usb_gsi_ep_op(gsi->d_port.in_ep,
@@ -2491,8 +2504,11 @@
}
if (gsi->d_port.out_ep &&
- gsi->prot_id <= USB_PROT_DIAG_IPA) {
- gsi->d_port.out_ep->ep_intr_num = 1;
+ gsi->prot_id <= USB_PROT_RMNET_V2X_IPA) {
+ if (gsi->prot_id == USB_PROT_RMNET_V2X_IPA)
+ gsi->d_port.out_ep->ep_intr_num = 0;
+ else
+ gsi->d_port.out_ep->ep_intr_num = 1;
usb_gsi_ep_op(gsi->d_port.out_ep,
&gsi->d_port.out_request,
GSI_EP_OP_CONFIG);
@@ -2587,6 +2603,7 @@
rndis_uninit(gsi->params);
if (gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_RMNET_ETHER)
gsi->rmnet_dtr_status = false;
@@ -2817,7 +2834,7 @@
info->data_nop_desc->bInterfaceNumber = gsi->data_id;
/* allocate instance-specific endpoints */
- if (info->fs_in_desc && gsi->prot_id <= USB_PROT_DIAG_IPA) {
+ if (info->fs_in_desc && gsi->prot_id <= USB_PROT_RMNET_V2X_IPA) {
ep = usb_ep_autoconfig_by_name(cdev->gadget,
info->fs_in_desc, info->in_epname);
if (!ep)
@@ -2835,7 +2852,7 @@
}
}
- if (info->fs_out_desc && gsi->prot_id <= USB_PROT_DIAG_IPA) {
+ if (info->fs_out_desc && gsi->prot_id <= USB_PROT_RMNET_V2X_IPA) {
ep = usb_ep_autoconfig_by_name(cdev->gadget,
info->fs_out_desc, info->out_epname);
if (!ep)
@@ -3011,6 +3028,7 @@
if (gsi->prot_id == USB_PROT_RMNET_IPA ||
+ gsi->prot_id == USB_PROT_RMNET_V2X_IPA ||
gsi->prot_id == USB_PROT_DIAG_IPA ||
is_ext_prot_ether(gsi->prot_id))
gsi->ctrl_id = -ENODEV;
@@ -3222,6 +3240,7 @@
}
break;
case USB_PROT_RMNET_IPA:
+ case USB_PROT_RMNET_V2X_IPA:
case USB_PROT_RMNET_ETHER:
info.string_defs = rmnet_gsi_string_defs;
info.data_desc = &rmnet_gsi_interface_desc;
@@ -3487,6 +3506,7 @@
gsi->function.strings = ecm_gsi_strings;
break;
case USB_PROT_RMNET_IPA:
+ case USB_PROT_RMNET_V2X_IPA:
case USB_PROT_RMNET_ETHER:
gsi->function.name = "rmnet";
gsi->function.strings = rmnet_gsi_strings;
@@ -3885,6 +3905,7 @@
switch (gsi->prot_id) {
case USB_PROT_RMNET_IPA:
+ case USB_PROT_RMNET_V2X_IPA:
case USB_PROT_RMNET_ETHER:
str = gsi->rmnet_dtr_status ? "connected" : "disconnected";
break;
diff --git a/drivers/usb/gadget/function/f_gsi.h b/drivers/usb/gadget/function/f_gsi.h
index b7e8fe8..02be58d 100644
--- a/drivers/usb/gadget/function/f_gsi.h
+++ b/drivers/usb/gadget/function/f_gsi.h
@@ -32,6 +32,7 @@
#include "configfs.h"
#define GSI_RMNET_CTRL_NAME "rmnet_ctrl"
+#define GSI_RMNET_V2X_CTRL_NAME "rmnet_v2x_ctrl"
#define GSI_MBIM_CTRL_NAME "android_mbim"
#define GSI_DPL_CTRL_NAME "dpl_ctrl"
#define ETHER_RMNET_CTRL_NAME "rmnet_ctrl0"
@@ -125,6 +126,7 @@
USB_PROT_RMNET_IPA,
USB_PROT_MBIM_IPA,
USB_PROT_DIAG_IPA,
+ USB_PROT_RMNET_V2X_IPA,
/* non-accelerated */
USB_PROT_RMNET_ETHER,
@@ -339,6 +341,8 @@
return USB_PROT_MBIM_IPA;
if (!strncasecmp(name, "dpl", MAX_INST_NAME_LEN))
return USB_PROT_DIAG_IPA;
+ if (!strncasecmp(name, "rmnet.v2x", MAX_INST_NAME_LEN))
+ return USB_PROT_RMNET_V2X_IPA;
if (!strncasecmp(name, "rmnet.ether", MAX_INST_NAME_LEN))
return USB_PROT_RMNET_ETHER;
if (!strncasecmp(name, "dpl.ether", MAX_INST_NAME_LEN))
diff --git a/drivers/usb/host/xhci-fwdload.c b/drivers/usb/host/xhci-fwdload.c
index f214e03..e2966ec 100644
--- a/drivers/usb/host/xhci-fwdload.c
+++ b/drivers/usb/host/xhci-fwdload.c
@@ -83,13 +83,6 @@
return mapping;
}
-static void upd720x_smmu_deinit(struct device *dev)
-{
- arm_iommu_detach_device(dev);
- arm_iommu_release_mapping(to_dma_iommu_mapping(dev));
-}
-
-
static int upd720x_download_enable(struct pci_dev *pDev)
{
unsigned int read_data;
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 0267bed..418978e 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -67,6 +67,7 @@
GSI_EP_OP_SET_CLR_BLOCK_DBL,
GSI_EP_OP_CHECK_FOR_SUSPEND,
GSI_EP_OP_DISABLE,
+ GSI_EP_OP_UPDATE_DB,
};
/*
diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h
index 96523b5..e64942a 100644
--- a/include/uapi/linux/msm_ipa.h
+++ b/include/uapi/linux/msm_ipa.h
@@ -152,6 +152,11 @@
#define QMI_IPA_MAX_CLIENT_DST_PIPES 4
/**
+ * New feature flag for CV2X config
+ */
+#define IPA_CV2X_SUPPORT
+
+/**
* the attributes of the rule (routing or filtering)
*/
#define IPA_FLT_TOS (1ul << 0)
@@ -326,11 +331,14 @@
/* RESERVERD PROD = 84, */
IPA_CLIENT_WIGIG4_CONS = 85,
+
+ IPA_CLIENT_MHI2_PROD = 86,
+ IPA_CLIENT_MHI2_CONS = 87,
};
#define IPA_CLIENT_DUMMY_CONS IPA_CLIENT_DUMMY_CONS1
#define IPA_CLIENT_WIGIG4_CONS IPA_CLIENT_WIGIG4_CONS
-#define IPA_CLIENT_MAX (IPA_CLIENT_WIGIG4_CONS + 1)
+#define IPA_CLIENT_MAX (IPA_CLIENT_MHI2_CONS + 1)
#define IPA_CLIENT_IS_APPS_CONS(client) \
((client) == IPA_CLIENT_APPS_LAN_CONS || \
diff --git a/kernel/sched/walt.c b/kernel/sched/walt.c
index 48f64aa..9a85525 100644
--- a/kernel/sched/walt.c
+++ b/kernel/sched/walt.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
@@ -323,14 +323,19 @@
int register_cpu_cycle_counter_cb(struct cpu_cycle_counter_cb *cb)
{
+ unsigned long flags;
+
mutex_lock(&cluster_lock);
if (!cb->get_cpu_cycle_counter) {
mutex_unlock(&cluster_lock);
return -EINVAL;
}
+ acquire_rq_locks_irqsave(cpu_possible_mask, &flags);
cpu_cycle_counter_cb = *cb;
use_cycle_counter = true;
+ release_rq_locks_irqrestore(cpu_possible_mask, &flags);
+
mutex_unlock(&cluster_lock);
return 0;