Merge "Merge android-4.9.160 (fd5657a) into msm-4.9"
diff --git a/Documentation/devicetree/bindings/input/sensors/smi130.txt b/Documentation/devicetree/bindings/input/sensors/smi130.txt
new file mode 100644
index 0000000..79179ba
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/sensors/smi130.txt
@@ -0,0 +1,56 @@
+The SMI130 is a highly integrated, low power inertial measurement unit (IMU)
+that provides precise acceleration and angular rate (gyroscopic) measurement.
+
+To enable driver probing, add the smi130_gyro and smi130_acc node to the platform
+device tree as described below.
+
+Required properties:
+
+- compatible: "smi130_gyro", "smi130_acc"
+- reg: the I2C address or SPI chip select the device will respond to
+- interrupt-parent: phandle to the parent interrupt controller as documented in [interrupts][4]
+- interrupts: interrupt mapping for IRQ as documented in [interrupts][4]
+
+Recommended properties for SPI bus usage:
+- spi-max-frequency: maximum SPI bus frequency as documented in [SPI][3]
+
+Optional properties:
+- smi130_gyro,gpio_irq: MEMS sensor interrupt line to use (default 1)
+
+I2C example (based on Raspberry PI 3):
+
+ &i2c0 {
+ status = "ok";
+ #address-cells = <0x1>;
+ #size-cells = <0x0>;
+ smi130_gyro@68 {
+ compatible = "smi130_gyro";
+ reg = <0x68>;
+ interrupt-parent = <&gpio>;
+ interrupts = <26 IRQ_TYPE_EDGE_RISING>;
+ };
+ smi130_acc@18 {
+ compatible = "smi130_acc";
+ reg = <0x18>;
+ interrupt-parent = <&gpio>;
+ interrupts = <25 IRQ_TYPE_EDGE_RISING>;
+ };
+
+SPI example (based on Raspberry PI 3):
+
+ &spi0 {
+ status = "ok";
+ #address-cells = <0x1>;
+ #size-cells = <0x0>;
+ smi130_gyro@68 {
+ compatible = "smi130_gyro";
+ reg = <0x68>;
+ interrupt-parent = <&gpio>;
+ interrupts = <26 IRQ_TYPE_EDGE_RISING>;
+ };
+ smi130_acc@18 {
+ compatible = "smi130_acc";
+ reg = <0x18>;
+ interrupt-parent = <&gpio>;
+ interrupts = <25 IRQ_TYPE_EDGE_RISING>;
+ };
diff --git a/Documentation/devicetree/bindings/platform/msm/qcom-geni-se.txt b/Documentation/devicetree/bindings/platform/msm/qcom-geni-se.txt
index 7da95f8..a42f491 100644
--- a/Documentation/devicetree/bindings/platform/msm/qcom-geni-se.txt
+++ b/Documentation/devicetree/bindings/platform/msm/qcom-geni-se.txt
@@ -13,6 +13,9 @@
Optional properties:
- qcom,iommu-s1-bypass: Boolean flag to bypass IOMMU stage 1 translation.
+- qcom,msm-bus,num-paths: Number of paths to put vote for.
+- qcom,msm-bus,vectors-bus-ids: Master and slave Endpoint IDs for DDR
+ and Corex/2x paths.
Optional subnodes:
qcom,iommu_qupv3_geni_se_cb: Child node representing the QUPV3 context
diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-cdp.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-cdp.dtsi
index c836f94..7996564 100644
--- a/arch/arm/boot/dts/qcom/sdxpoorwills-cdp.dtsi
+++ b/arch/arm/boot/dts/qcom/sdxpoorwills-cdp.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -129,6 +129,7 @@
smb1381_charger: qcom,smb1381-charger@1000 {
compatible = "qcom,smb138x-charger";
qcom,use-extcon;
+ dpdm-supply = <&usb2_phy>;
};
};
diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-mtp.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-mtp.dtsi
index a6d2463..df7f8fa 100644
--- a/arch/arm/boot/dts/qcom/sdxpoorwills-mtp.dtsi
+++ b/arch/arm/boot/dts/qcom/sdxpoorwills-mtp.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -129,6 +129,7 @@
smb1381_charger: qcom,smb1381-charger@1000 {
compatible = "qcom,smb138x-charger";
qcom,use-extcon;
+ dpdm-supply = <&usb2_phy>;
};
};
diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-v2.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-v2.dtsi
index a3431cf..eea825f 100644
--- a/arch/arm/boot/dts/qcom/sdxpoorwills-v2.dtsi
+++ b/arch/arm/boot/dts/qcom/sdxpoorwills-v2.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -34,3 +34,76 @@
&clock_gcc {
compatible = "qcom,gcc-sdxpoorwills-v2", "syscon";
};
+
+&pcie0 {
+ qcom,pcie-phy-ver = <0x2111>;
+
+ qcom,phy-sequence = <0x0840 0x03 0x0
+ 0x0094 0x08 0x0
+ 0x0154 0x35 0x0
+ 0x0058 0x0f 0x0
+ 0x00a4 0x42 0x0
+ 0x0110 0x24 0x0
+ 0x01bc 0x11 0x0
+ 0x00bc 0x82 0x0
+ 0x00d4 0x03 0x0
+ 0x00d0 0x55 0x0
+ 0x00cc 0x55 0x0
+ 0x00b0 0x1a 0x0
+ 0x00ac 0x0a 0x0
+ 0x0158 0x01 0x0
+ 0x0074 0x06 0x0
+ 0x007c 0x16 0x0
+ 0x0084 0x36 0x0
+ 0x01b0 0x1e 0x0
+ 0x01ac 0xb9 0x0
+ 0x0010 0x00 0x0
+ 0x001c 0x31 0x0
+ 0x0020 0x01 0x0
+ 0x0024 0xde 0x0
+ 0x0028 0x07 0x0
+ 0x0050 0x07 0x0
+ 0x029c 0x12 0x0
+ 0x0284 0x05 0x0
+ 0x051c 0x03 0x0
+ 0x0518 0x1c 0x0
+ 0x0524 0x14 0x0
+ 0x04ec 0x0e 0x0
+ 0x04f0 0x4a 0x0
+ 0x04f4 0x0f 0x0
+ 0x05b4 0x04 0x0
+ 0x0434 0x7f 0x0
+ 0x0444 0x70 0x0
+ 0x0510 0x17 0x0
+ 0x04d8 0x01 0x0
+ 0x0598 0xd4 0x0
+ 0x059c 0x54 0x0
+ 0x05a0 0xdb 0x0
+ 0x05a4 0xb9 0x0
+ 0x05a8 0x31 0x0
+ 0x0584 0x24 0x0
+ 0x0588 0xe4 0x0
+ 0x058c 0xec 0x0
+ 0x0590 0xb9 0x0
+ 0x0594 0x36 0x0
+ 0x0570 0xef 0x0
+ 0x0574 0xef 0x0
+ 0x0578 0x2f 0x0
+ 0x057c 0xd3 0x0
+ 0x0580 0x40 0x0
+ 0x04fc 0x00 0x0
+ 0x04f8 0xc0 0x0
+ 0x0414 0x04 0x0
+ 0x09a4 0x01 0x0
+ 0x0c90 0x00 0x0
+ 0x0c40 0x01 0x0
+ 0x0c48 0x01 0x0
+ 0x0048 0x90 0x0
+ 0x0c1c 0xc1 0x0
+ 0x0988 0x66 0x0
+ 0x0998 0x08 0x0
+ 0x08dc 0x0d 0x0
+ 0x09ec 0x01 0x0
+ 0x0800 0x00 0x0
+ 0x0844 0x03 0x0>;
+};
diff --git a/arch/arm/configs/sdxpoorwills-auto-perf_defconfig b/arch/arm/configs/sdxpoorwills-auto-perf_defconfig
index 51b15ef..5eb2495 100644
--- a/arch/arm/configs/sdxpoorwills-auto-perf_defconfig
+++ b/arch/arm/configs/sdxpoorwills-auto-perf_defconfig
@@ -143,6 +143,8 @@
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_NAT=y
+CONFIG_IP6_NF_TARGET_MASQUERADE=y
CONFIG_BRIDGE_NF_EBTABLES=y
CONFIG_BRIDGE_EBT_BROUTE=y
CONFIG_BRIDGE_EBT_T_FILTER=y
@@ -225,12 +227,12 @@
CONFIG_USB_NET_SMSC75XX=y
CONFIG_USB_NET_SMSC95XX=y
CONFIG_WCNSS_MEM_PRE_ALLOC=y
-CONFIG_CNSS=y
-CONFIG_CNSS_SDIO=y
-CONFIG_CNSS_PCI=y
+CONFIG_CNSS2=y
+CONFIG_CNSS2_DEBUG=y
+CONFIG_CNSS2_QMI=y
CONFIG_CLD_HL_SDIO_CORE=y
CONFIG_CLD_LL_CORE=y
-CONFIG_CNSS_LOGGER=y
+CONFIG_CNSS_GENL=y
# CONFIG_INPUT_MOUSEDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_KEYBOARD is not set
@@ -239,6 +241,7 @@
CONFIG_INPUT_QPNP_POWER_ON=y
CONFIG_INPUT_UINPUT=y
CONFIG_INPUT_GPIO=m
+CONFIG_SMI130=y
CONFIG_BOSCH_DRIVER_LOG_FUNC=y
CONFIG_SENSORS_SMI_ACC2X2=y
CONFIG_SENSORS_SMI_ACC2X2_ENABLE_INT2=y
diff --git a/arch/arm/configs/sdxpoorwills-auto_defconfig b/arch/arm/configs/sdxpoorwills-auto_defconfig
index 28e0067..32556b0 100644
--- a/arch/arm/configs/sdxpoorwills-auto_defconfig
+++ b/arch/arm/configs/sdxpoorwills-auto_defconfig
@@ -145,6 +145,8 @@
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_NAT=y
+CONFIG_IP6_NF_TARGET_MASQUERADE=y
CONFIG_BRIDGE_NF_EBTABLES=y
CONFIG_BRIDGE_EBT_BROUTE=y
CONFIG_BRIDGE_EBT_T_FILTER=y
@@ -219,12 +221,12 @@
CONFIG_USB_NET_SMSC75XX=y
CONFIG_USB_NET_SMSC95XX=y
CONFIG_WCNSS_MEM_PRE_ALLOC=y
-CONFIG_CNSS=y
-CONFIG_CNSS_SDIO=y
-CONFIG_CNSS_PCI=y
+CONFIG_CNSS2=y
+CONFIG_CNSS2_DEBUG=y
+CONFIG_CNSS2_QMI=y
CONFIG_CLD_HL_SDIO_CORE=y
CONFIG_CLD_LL_CORE=y
-CONFIG_CNSS_LOGGER=y
+CONFIG_CNSS_GENL=y
# CONFIG_INPUT_MOUSEDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_KEYBOARD is not set
@@ -233,6 +235,7 @@
CONFIG_INPUT_QPNP_POWER_ON=y
CONFIG_INPUT_UINPUT=y
CONFIG_INPUT_GPIO=m
+CONFIG_SMI130=y
CONFIG_BOSCH_DRIVER_LOG_FUNC=y
CONFIG_SENSORS_SMI_ACC2X2=y
CONFIG_SENSORS_SMI_ACC2X2_ENABLE_INT2=y
diff --git a/arch/arm/configs/spyro-perf_defconfig b/arch/arm/configs/spyro-perf_defconfig
index fbbd197d..b8849db 100644
--- a/arch/arm/configs/spyro-perf_defconfig
+++ b/arch/arm/configs/spyro-perf_defconfig
@@ -570,6 +570,7 @@
CONFIG_PHY_QCOM_UFS=y
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_BINDER_IPC_32BIT=y
CONFIG_SENSORS_SSC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_EXT4_FS=y
diff --git a/arch/arm/configs/spyro_defconfig b/arch/arm/configs/spyro_defconfig
index 4b9c19f..6fb2cf4 100644
--- a/arch/arm/configs/spyro_defconfig
+++ b/arch/arm/configs/spyro_defconfig
@@ -571,6 +571,7 @@
CONFIG_PHY_QCOM_UFS=y
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_BINDER_IPC_32BIT=y
CONFIG_SENSORS_SSC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_EXT4_FS=y
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index f620d6b..4529a60 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -361,7 +361,8 @@
msm8953-iot-mtp-overlay.dtbo \
msm8953-ext-codec-mtp-overlay.dtbo \
msm8953-ext-codec-rcm-overlay.dtbo \
- msm8953-cdp-1200p-overlay.dtbo
+ msm8953-cdp-1200p-overlay.dtbo \
+ msm8953-no-pmi-overlay.dtbo
dtbo-$(CONFIG_ARCH_SDM450) += msm8953-mtp-overlay.dtbo \
msm8953-cdp-overlay.dtbo \
@@ -370,7 +371,8 @@
msm8953-iot-mtp-overlay.dtbo \
sdm450-cdp-s2-overlay.dtbo \
sdm450-mtp-s3-overlay.dtbo \
- sdm450-qrd-sku4-overlay.dtbo
+ sdm450-qrd-sku4-overlay.dtbo\
+ sdm450-no-pmi-overlay.dtbo
dtbo-$(CONFIG_ARCH_SDM632) += sdm632-rumi-overlay.dtbo \
sdm450-cdp-s2-overlay.dtbo \
@@ -389,7 +391,8 @@
dtbo-$(CONFIG_ARCH_SDM429) += sdm429-mtp-overlay.dtbo \
sdm429-cdp-overlay.dtbo \
- sdm429-qrd-overlay.dtbo
+ sdm429-qrd-overlay.dtbo \
+ sdm429-qrd-spyro-evt-overlay.dtbo
msm8940-mtp-overlay.dtbo-base := msm8940-pmi8950.dtb \
msm8940-pmi8937.dtb \
@@ -461,6 +464,9 @@
msm8953-ext-codec-rcm-overlay.dtbo-base := msm8953.dtb \
apq8053.dtb
msm8953-cdp-1200p-overlay.dtbo-base := msm8953.dtb
+
+msm8953-no-pmi-overlay.dtbo-base := msm8953-no-pmi.dtb
+
sdm450-cdp-s2-overlay.dtbo-base := sdm450-pmi632.dtb \
sdm632.dtb \
sdm632-pm8004.dtb \
@@ -473,6 +479,9 @@
sdm450-qrd-sku4-overlay.dtbo-base := sdm450-pmi632.dtb \
sdm632.dtb \
sdm632-pm8004.dtb
+
+sdm450-no-pmi-overlay.dtbo-base := sdm450-no-pmi.dtb
+
sdm632-rumi-overlay.dtbo-base := sdm632.dtb
sdm632-ext-codec-cdp-s3-overlay.dtbo-base := sdm632.dtb \
sdm632-pm8004.dtb
@@ -502,6 +511,8 @@
msm8937-interposer-sdm429.dtb
sdm429-qrd-overlay.dtbo-base := sdm429.dtb \
msm8937-interposer-sdm429.dtb
+sdm429-qrd-spyro-evt-overlay.dtbo-base := sdm429.dtb \
+ msm8937-interposer-sdm429.dtb
else
dtb-$(CONFIG_ARCH_MSM8953) += msm8953-cdp.dtb \
msm8953-mtp.dtb \
@@ -535,7 +546,8 @@
msm8953-pmi8940-ext-codec-mtp.dtb \
msm8953-pmi8937-ext-codec-mtp.dtb \
msm8953-pmi632-cdp-s2.dtb \
- apq8053-batcam.dtb
+ apq8053-batcam.dtb \
+ msm8953-no-pmi.dtb
dtb-$(CONFIG_ARCH_MSM8937) += msm8937-pmi8950-mtp.dtb \
msm8937-interposer-sdm439-cdp.dtb \
@@ -598,7 +610,8 @@
sdm450-pmi632-cdp-s2.dtb \
sdm450-pmi632-mtp-s3.dtb \
sda450-pmi632-cdp-s2.dtb \
- sda450-pmi632-mtp-s3.dtb
+ sda450-pmi632-mtp-s3.dtb \
+ sdm450-no-pmi.dtb
dtb-$(CONFIG_ARCH_SDM632) += sdm632-rumi.dtb \
sdm632-cdp-s2.dtb \
@@ -630,7 +643,8 @@
sdm429-cdp.dtb \
sdm429-qrd.dtb \
sda429-mtp.dtb \
- sda429-cdp.dtb
+ sda429-cdp.dtb \
+ sdm429-qrd-spyro-evt.dtb
endif
diff --git a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi
index c2efa2d..61b2309 100644
--- a/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -156,7 +156,6 @@
qcom,csiphy-sd-index = <0>;
qcom,csid-sd-index = <0>;
qcom,mount-angle = <270>;
- qcom,led-flash-src = <&led_flash0>;
qcom,eeprom-src = <&eeprom0>;
qcom,actuator-src = <&actuator0>;
cam_vio-supply = <&pm8953_l6>;
diff --git a/arch/arm64/boot/dts/qcom/msm8953-mtp.dts b/arch/arm64/boot/dts/qcom/msm8953-mtp.dts
index 539ac59..9b20013 100644
--- a/arch/arm64/boot/dts/qcom/msm8953-mtp.dts
+++ b/arch/arm64/boot/dts/qcom/msm8953-mtp.dts
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -49,3 +49,8 @@
qcom,chg-led-sw-controls;
qcom,chg-led-support;
};
+&cci {
+ qcom,camera@0 {
+ qcom,led-flash-src = <&led_flash0>;
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8953-no-pmi.dts b/arch/arm64/boot/dts/qcom/msm8953-no-pmi.dts
new file mode 100644
index 0000000..fa9ccbb
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8953-no-pmi.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 "msm8953.dtsi"
+#include "msm8953-mtp.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. msm8953 + NO PMI SOC";
+ compatible = "qcom,msm8953";
+ qcom,pmic-id = <0x010016 0x0 0x0 0x0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/qcs605-lc.dtsi b/arch/arm64/boot/dts/qcom/qcs605-lc.dtsi
index 5ab4360..01cf661 100644
--- a/arch/arm64/boot/dts/qcom/qcs605-lc.dtsi
+++ b/arch/arm64/boot/dts/qcom/qcs605-lc.dtsi
@@ -411,3 +411,51 @@
&apps_smmu {
/delete-property/ qcom,actlr;
};
+
+&msm_fastrpc_compute_cb1 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb2 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb3 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb4 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb5 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb6 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb7 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb8 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb9 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb10 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb11 {
+ /delete-property/ dma-coherent;
+};
+
+&msm_fastrpc_compute_cb12 {
+ /delete-property/ dma-coherent;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt-overlay.dts b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt-overlay.dts
new file mode 100644
index 0000000..a90c4ba
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-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-qrd-spyro-evt.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro Overlay";
+ qcom,board-id = <0xb 6>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dts b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dts
new file mode 100644
index 0000000..951720e
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.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.dtsi"
+#include "sdm429-qrd-spyro-evt.dtsi"
+
+/ {
+ model = "Qualcomm Technologies, Inc. SDM429 QRD Spyro";
+ compatible = "qcom,sdm429-qrd", "qcom,sdm429", "qcom,qrd";
+ qcom,board-id = <0xb 6>;
+ qcom,pmic-id = <0x010016 0x25 0x0 0x0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi
new file mode 100644
index 0000000..c255ee2
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm429-qrd-spyro-evt.dtsi
@@ -0,0 +1,18 @@
+/*
+ * 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 "sdm439-qrd.dtsi"
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_hx8399c_hd_vid>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm439-pmi632.dtsi b/arch/arm64/boot/dts/qcom/sdm439-pmi632.dtsi
index 9c4120c..446b373 100644
--- a/arch/arm64/boot/dts/qcom/sdm439-pmi632.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm439-pmi632.dtsi
@@ -134,6 +134,26 @@
thermal-governor = "step_wise";
trips {
+ quiet_batt_439_trip1: quiet-batt-trip1 {
+ temperature = <38000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+ quiet_batt_439_trip2: quiet-batt-trip2 {
+ temperature = <40000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+ quiet_batt_439_trip3: quiet-batt-trip3 {
+ temperature = <42000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+ quiet_batt_439_trip4: quiet-batt-trip4 {
+ temperature = <44000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
quiet_modem_439_trip1: quiet-modem-trip0 {
temperature = <44000>;
hysteresis = <4000>;
@@ -144,19 +164,19 @@
hysteresis = <4000>;
type = "passive";
};
- quiet_cpus_439_trip: quiet-cpus-trip {
- temperature = <48000>;
- hysteresis = <0>;
+ quiet_batt_439_trip5: quiet-batt-trip5 {
+ temperature = <46000>;
+ hysteresis = <2000>;
type = "passive";
};
- quiet_modem_439_trip3: quiet-modem-trip2 {
+ quiet_439_batt_trip6_mdm_trip3: quiet-bt-trp6-mdm-trp3 {
temperature = <48000>;
hysteresis = <2000>;
type = "passive";
};
- quiet_batt_439_trip1: quiet-batt-trip1 {
+ quiet_cpus_439_trip: quiet-cpus-trip {
temperature = <48000>;
- hysteresis = <4000>;
+ hysteresis = <0>;
type = "passive";
};
quiet_gpu_439_trip: quiet-gpu-trip {
@@ -164,32 +184,16 @@
hysteresis = <0>;
type = "passive";
};
- quiet_batt_439_trip2: quiet-batt-trip2 {
+ quiet_batt_439_trip7: quiet-batt-trip7 {
temperature = <50000>;
hysteresis = <2000>;
type = "passive";
};
- quiet_batt_439_trip3: quiet-batt-trip3 {
- temperature = <52000>;
- hysteresis = <2000>;
- type = "passive";
- };
-
- quiet_batt_439_trip4: quiet-batt-trip4 {
- temperature = <54000>;
- hysteresis = <2000>;
- type = "passive";
- };
quiet_modem_439_trip4: quiet-modem-trip3 {
temperature = <55000>;
hysteresis = <5000>;
type = "passive";
};
- quiet_batt_439_trip5: quiet-batt-trip5 {
- temperature = <56000>;
- hysteresis = <2000>;
- type = "passive";
- };
};
cooling-maps {
@@ -254,7 +258,7 @@
cooling-device = <&modem_pa 1 1>;
};
modem_lvl2 {
- trip = <&quiet_modem_439_trip3>;
+ trip = <&quiet_439_batt_trip6_mdm_trip3>;
cooling-device = <&modem_pa 2 2>;
};
modem_lvl3 {
@@ -281,6 +285,15 @@
trip = <&quiet_batt_439_trip5>;
cooling-device = <&pmi632_charger 5 5>;
};
+ battery_lvl6 {
+ trip = <&quiet_439_batt_trip6_mdm_trip3>;
+ cooling-device = <&pmi632_charger 6 6>;
+ };
+ battery_lvl7 {
+ trip = <&quiet_batt_439_trip7>;
+ cooling-device = <&pmi632_charger 7 7>;
+ };
+
};
};
diff --git a/arch/arm64/boot/dts/qcom/sdm450-no-pmi.dts b/arch/arm64/boot/dts/qcom/sdm450-no-pmi.dts
new file mode 100644
index 0000000..71a9eef
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sdm450-no-pmi.dts
@@ -0,0 +1,69 @@
+/*
+ * 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 "sdm450.dtsi"
+#include "msm8953-mtp.dtsi"
+/ {
+ model = "Qualcomm Technologies, Inc. SDM450 + NO PMI MTP S3";
+ compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp";
+ qcom,board-id = <8 3>;
+ qcom,pmic-id = <0x010016 0x0 0x0 0x0>;
+};
+
+&eeprom0 {
+ cam_vdig-supply = <&pm8953_l23>;
+};
+
+&camera0 {
+ cam_vdig-supply = <&pm8953_l23>;
+};
+
+&pm8953_gpios {
+ bklt_en {
+ bklt_en_default: bklt_en_default {
+ pins = "gpio4";
+ function = "normal";
+ power-source = <0>;
+ output-high;
+ };
+ };
+};
+
+&pm8953_pwm {
+ status = "ok";
+};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_hx8399c_truly_vid>;
+ pinctrl-names = "mdss_default", "mdss_sleep";
+ pinctrl-0 = <&mdss_dsi_active &mdss_te_active &bklt_en_default>;
+ pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
+ qcom,platform-bklight-en-gpio = <&pm8953_gpios 4 0>;
+
+};
+
+&dsi_truly_1080_vid {
+ qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
+ qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
+ qcom,mdss-dsi-bl-pmic-bank-select = <0>;
+ qcom,mdss-dsi-pwm-gpio = <&pm8953_gpios 8 0>;
+};
+
+&dsi_hx8399c_truly_vid {
+ qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
+ qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
+ qcom,mdss-dsi-bl-pmic-bank-select = <0>;
+ qcom,mdss-dsi-pwm-gpio = <&pm8953_gpios 8 0>;
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm670-vidc.dtsi b/arch/arm64/boot/dts/qcom/sdm670-vidc.dtsi
index 9c53592..1259893 100644
--- a/arch/arm64/boot/dts/qcom/sdm670-vidc.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670-vidc.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -80,7 +80,7 @@
<&apps_smmu 0x10a0 0x8>,
<&apps_smmu 0x10b0 0x0>;
buffer-types = <0xfff>;
- virtual-addr-pool = <0x79000000 0x28000000>;
+ virtual-addr-pool = <0x79000000 0x87000000>;
};
secure_bitstream_cb {
@@ -180,7 +180,7 @@
<&apps_smmu 0x10a0 0x8>,
<&apps_smmu 0x10b0 0x0>;
buffer-types = <0xfff>;
- virtual-addr-pool = <0x79000000 0x28000000>;
+ virtual-addr-pool = <0x79000000 0x87000000>;
};
secure_bitstream_cb {
diff --git a/arch/arm64/boot/dts/qcom/sdm670.dtsi b/arch/arm64/boot/dts/qcom/sdm670.dtsi
index 50ea44a..5dbf55a 100644
--- a/arch/arm64/boot/dts/qcom/sdm670.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -2493,75 +2493,75 @@
qcom,fastrpc-adsp-audio-pdr;
qcom,fastrpc-adsp-sensors-pdr;
- qcom,msm_fastrpc_compute_cb1 {
+ msm_fastrpc_compute_cb1: qcom,msm_fastrpc_compute_cb1 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
iommus = <&apps_smmu 0x1421 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb2 {
+ msm_fastrpc_compute_cb2: qcom,msm_fastrpc_compute_cb2 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
iommus = <&apps_smmu 0x1422 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb3 {
+ msm_fastrpc_compute_cb3: qcom,msm_fastrpc_compute_cb3 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
iommus = <&apps_smmu 0x1423 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb4 {
+ msm_fastrpc_compute_cb4: qcom,msm_fastrpc_compute_cb4 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
iommus = <&apps_smmu 0x1424 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb5 {
+ msm_fastrpc_compute_cb5: qcom,msm_fastrpc_compute_cb5 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
iommus = <&apps_smmu 0x1425 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb6 {
+ msm_fastrpc_compute_cb6: qcom,msm_fastrpc_compute_cb6 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
iommus = <&apps_smmu 0x1426 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb7 {
+ msm_fastrpc_compute_cb7: qcom,msm_fastrpc_compute_cb7 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
qcom,secure-context-bank;
iommus = <&apps_smmu 0x1429 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb8 {
+ msm_fastrpc_compute_cb8: qcom,msm_fastrpc_compute_cb8 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "cdsprpc-smd";
qcom,secure-context-bank;
iommus = <&apps_smmu 0x142A 0x30>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb9 {
+ msm_fastrpc_compute_cb9: qcom,msm_fastrpc_compute_cb9 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "adsprpc-smd";
iommus = <&apps_smmu 0x1803 0x0>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb10 {
+ msm_fastrpc_compute_cb10: qcom,msm_fastrpc_compute_cb10 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "adsprpc-smd";
iommus = <&apps_smmu 0x1804 0x0>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb11 {
+ msm_fastrpc_compute_cb11: qcom,msm_fastrpc_compute_cb11 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "adsprpc-smd";
iommus = <&apps_smmu 0x1805 0x0>;
dma-coherent;
};
- qcom,msm_fastrpc_compute_cb12 {
+ msm_fastrpc_compute_cb12: qcom,msm_fastrpc_compute_cb12 {
compatible = "qcom,msm-fastrpc-compute-cb";
label = "adsprpc-smd";
iommus = <&apps_smmu 0x1806 0x0>;
diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig
index 12bf81e..cc52953a 100755
--- a/arch/arm64/configs/msm8937-perf_defconfig
+++ b/arch/arm64/configs/msm8937-perf_defconfig
@@ -106,10 +106,12 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
+CONFIG_INET_UDP_DIAG=y
CONFIG_INET_DIAG_DESTROY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
@@ -218,6 +220,7 @@
CONFIG_NET_CLS_U32=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -287,6 +290,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig
index f0be5da..f3ed5a7 100755
--- a/arch/arm64/configs/msm8937_defconfig
+++ b/arch/arm64/configs/msm8937_defconfig
@@ -110,10 +110,12 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
+CONFIG_INET_UDP_DIAG=y
CONFIG_INET_DIAG_DESTROY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
@@ -223,6 +225,7 @@
CONFIG_NET_CLS_U32=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -293,6 +296,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
diff --git a/arch/arm64/configs/msm8953-perf_defconfig b/arch/arm64/configs/msm8953-perf_defconfig
index 4c83f0b..4099bd0 100755
--- a/arch/arm64/configs/msm8953-perf_defconfig
+++ b/arch/arm64/configs/msm8953-perf_defconfig
@@ -105,10 +105,12 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
+CONFIG_INET_UDP_DIAG=y
CONFIG_INET_DIAG_DESTROY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
@@ -217,6 +219,7 @@
CONFIG_NET_CLS_U32=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -286,6 +289,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
diff --git a/arch/arm64/configs/msm8953_defconfig b/arch/arm64/configs/msm8953_defconfig
index f13954f..c7441f4 100755
--- a/arch/arm64/configs/msm8953_defconfig
+++ b/arch/arm64/configs/msm8953_defconfig
@@ -109,10 +109,12 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
+CONFIG_INET_UDP_DIAG=y
CONFIG_INET_DIAG_DESTROY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
@@ -222,6 +224,7 @@
CONFIG_NET_CLS_U32=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -293,6 +296,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
diff --git a/arch/arm64/configs/sdm670-perf_defconfig b/arch/arm64/configs/sdm670-perf_defconfig
index b8e8ad4..4112115 100755
--- a/arch/arm64/configs/sdm670-perf_defconfig
+++ b/arch/arm64/configs/sdm670-perf_defconfig
@@ -104,6 +104,7 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
@@ -219,6 +220,7 @@
CONFIG_NET_CLS_U32=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -288,6 +290,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
diff --git a/arch/arm64/configs/sdm670_defconfig b/arch/arm64/configs/sdm670_defconfig
index 2c13cea..9316ac0 100755
--- a/arch/arm64/configs/sdm670_defconfig
+++ b/arch/arm64/configs/sdm670_defconfig
@@ -109,6 +109,7 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
@@ -226,6 +227,7 @@
CONFIG_NET_CLS_U32=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -294,6 +296,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
diff --git a/arch/arm64/configs/sdm845-perf_defconfig b/arch/arm64/configs/sdm845-perf_defconfig
index 73358b0..ca073a7 100755
--- a/arch/arm64/configs/sdm845-perf_defconfig
+++ b/arch/arm64/configs/sdm845-perf_defconfig
@@ -104,6 +104,7 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
@@ -218,6 +219,7 @@
CONFIG_NET_SCH_INGRESS=y
CONFIG_NET_CLS_FW=y
CONFIG_NET_CLS_U32=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -283,6 +285,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
@@ -423,6 +426,7 @@
CONFIG_USB_PD_POLICY=y
CONFIG_QPNP_USB_PDPHY=y
CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y
CONFIG_USB_EHSET_TEST_FIXTURE=y
CONFIG_USB_LINK_LAYER_TEST=y
diff --git a/arch/arm64/configs/sdm845_defconfig b/arch/arm64/configs/sdm845_defconfig
index 81f05ee..9bea57c 100755
--- a/arch/arm64/configs/sdm845_defconfig
+++ b/arch/arm64/configs/sdm845_defconfig
@@ -107,6 +107,7 @@
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
+CONFIG_NET_IPGRE_DEMUX=y
CONFIG_NET_IPVTI=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
@@ -222,6 +223,7 @@
CONFIG_NET_SCH_INGRESS=y
CONFIG_NET_CLS_FW=y
CONFIG_NET_CLS_U32=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_CMP=y
CONFIG_NET_EMATCH_NBYTE=y
@@ -289,6 +291,7 @@
CONFIG_PPP_MPPE=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=y
+CONFIG_PPTP=y
CONFIG_PPPOL2TP=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
@@ -427,6 +430,7 @@
CONFIG_USB_PD_POLICY=y
CONFIG_QPNP_USB_PDPHY=y
CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y
CONFIG_USB_EHSET_TEST_FIXTURE=y
CONFIG_USB_LINK_LAYER_TEST=y
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index c410c9e..c5c710d 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -273,7 +273,7 @@
* memory spans, randomize the linear region as well.
*/
if (memstart_offset_seed > 0 && range >= ARM64_MEMSTART_ALIGN) {
- range = range / ARM64_MEMSTART_ALIGN + 1;
+ range /= ARM64_MEMSTART_ALIGN;
memstart_addr -= ARM64_MEMSTART_ALIGN *
((range * memstart_offset_seed) >> 16);
}
diff --git a/drivers/gpu/drm/msm/dp/dp_catalog.c b/drivers/gpu/drm/msm/dp/dp_catalog.c
index bfe98b5..5396a35 100644
--- a/drivers/gpu/drm/msm/dp/dp_catalog.c
+++ b/drivers/gpu/drm/msm/dp/dp_catalog.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -780,12 +780,10 @@
}
static void dp_catalog_ctrl_config_msa(struct dp_catalog_ctrl *ctrl,
- u32 rate, u32 stream_rate_khz,
- bool fixed_nvid)
+ u32 rate, u32 stream_rate_khz)
{
u32 pixel_m, pixel_n;
u32 mvid, nvid;
- u64 mvid_calc;
u32 const nvid_fixed = 0x8000;
u32 const link_rate_hbr2 = 540000;
u32 const link_rate_hbr3 = 810000;
@@ -798,44 +796,31 @@
}
catalog = dp_catalog_get_priv(ctrl);
- if (fixed_nvid) {
- pr_debug("use fixed NVID=0x%x\n", nvid_fixed);
- nvid = nvid_fixed;
+ io_data = catalog->io.dp_mmss_cc;
- pr_debug("link rate=%dkbps, stream_rate_khz=%uKhz",
- rate, stream_rate_khz);
+ pixel_m = dp_read(catalog, io_data, MMSS_DP_PIXEL_M);
+ pixel_n = dp_read(catalog, io_data, MMSS_DP_PIXEL_N);
+ pr_debug("pixel_m=0x%x, pixel_n=0x%x\n", pixel_m, pixel_n);
- /*
- * For intermediate results, use 64 bit arithmetic to avoid
- * loss of precision.
- */
- mvid_calc = (u64) stream_rate_khz * nvid;
- mvid_calc = div_u64(mvid_calc, rate);
+ mvid = (pixel_m & 0xFFFF) * 5;
+ nvid = (0xFFFF & (~pixel_n)) + (pixel_m & 0xFFFF);
- /*
- * truncate back to 32 bits as this final divided value will
- * always be within the range of a 32 bit unsigned int.
- */
- mvid = (u32) mvid_calc;
- } else {
- io_data = catalog->io.dp_mmss_cc;
+ if (nvid < nvid_fixed) {
+ u32 temp;
- pixel_m = dp_read(catalog, io_data, MMSS_DP_PIXEL_M);
- pixel_n = dp_read(catalog, io_data, MMSS_DP_PIXEL_N);
- pr_debug("pixel_m=0x%x, pixel_n=0x%x\n", pixel_m, pixel_n);
-
- mvid = (pixel_m & 0xFFFF) * 5;
- nvid = (0xFFFF & (~pixel_n)) + (pixel_m & 0xFFFF);
-
- pr_debug("rate = %d\n", rate);
-
- if (link_rate_hbr2 == rate)
- nvid *= 2;
-
- if (link_rate_hbr3 == rate)
- nvid *= 3;
+ temp = (nvid_fixed / nvid) * nvid;
+ mvid = (nvid_fixed / nvid) * mvid;
+ nvid = temp;
}
+ pr_debug("rate = %d\n", rate);
+
+ if (link_rate_hbr2 == rate)
+ nvid *= 2;
+
+ if (link_rate_hbr3 == rate)
+ nvid *= 3;
+
io_data = catalog->io.dp_link;
pr_debug("mvid=0x%x, nvid=0x%x\n", mvid, nvid);
dp_write(catalog, io_data, DP_SOFTWARE_MVID, mvid);
diff --git a/drivers/gpu/drm/msm/dp/dp_catalog.h b/drivers/gpu/drm/msm/dp/dp_catalog.h
index 743468d..dbcbd8b 100644
--- a/drivers/gpu/drm/msm/dp/dp_catalog.h
+++ b/drivers/gpu/drm/msm/dp/dp_catalog.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -94,7 +94,7 @@
void (*mainlink_ctrl)(struct dp_catalog_ctrl *ctrl, bool enable);
void (*config_misc)(struct dp_catalog_ctrl *ctrl, u32 cc, u32 tb);
void (*config_msa)(struct dp_catalog_ctrl *ctrl, u32 rate,
- u32 stream_rate_khz, bool fixed_nvid);
+ u32 stream_rate_khz);
void (*set_pattern)(struct dp_catalog_ctrl *ctrl, u32 pattern);
void (*reset)(struct dp_catalog_ctrl *ctrl);
void (*usb_reset)(struct dp_catalog_ctrl *ctrl, bool flip);
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
index 8e88964..befbc5c 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1177,24 +1177,6 @@
pr_debug("Host deinitialized successfully\n");
}
-static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl)
-{
- u8 *dpcd = ctrl->panel->dpcd;
-
- /*
- * For better interop experience, used a fixed NVID=0x8000
- * whenever connected to a VGA dongle downstream.
- */
- if (dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT) {
- u8 type = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
- DP_DWN_STRM_PORT_TYPE_MASK;
- if (type == DP_DWN_STRM_PORT_TYPE_ANALOG)
- return true;
- }
-
- return false;
-}
-
static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl)
{
int ret = 0;
@@ -1247,8 +1229,7 @@
ctrl->catalog->config_msa(ctrl->catalog,
drm_dp_bw_code_to_link_rate(
- ctrl->link->link_params.bw_code),
- ctrl->pixel_rate, dp_ctrl_use_fixed_nvid(ctrl));
+ ctrl->link->link_params.bw_code), ctrl->pixel_rate);
reinit_completion(&ctrl->idle_comp);
@@ -1414,8 +1395,7 @@
while (--link_train_max_retries && !atomic_read(&ctrl->aborted)) {
ctrl->catalog->config_msa(ctrl->catalog,
drm_dp_bw_code_to_link_rate(
- ctrl->link->link_params.bw_code),
- ctrl->pixel_rate, dp_ctrl_use_fixed_nvid(ctrl));
+ ctrl->link->link_params.bw_code), ctrl->pixel_rate);
rc = dp_ctrl_setup_main_link(ctrl, true);
if (!rc)
diff --git a/drivers/gpu/drm/msm/dp/dp_debug.c b/drivers/gpu/drm/msm/dp/dp_debug.c
index 6e6efa5..64945cf 100644
--- a/drivers/gpu/drm/msm/dp/dp_debug.c
+++ b/drivers/gpu/drm/msm/dp/dp_debug.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -49,6 +49,7 @@
struct device *dev;
struct work_struct sim_work;
struct dp_debug dp_debug;
+ struct mutex lock;
};
static int dp_debug_get_edid_buf(struct dp_debug_private *debug)
@@ -98,6 +99,8 @@
if (!debug)
return -ENODEV;
+ mutex_lock(&debug->lock);
+
if (*ppos)
goto bail;
@@ -148,6 +151,7 @@
if (!debug->dp_debug.sim_mode)
debug->panel->set_edid(debug->panel, edid);
+ mutex_unlock(&debug->lock);
return rc;
}
@@ -166,6 +170,8 @@
if (!debug)
return -ENODEV;
+ mutex_lock(&debug->lock);
+
if (*ppos)
goto bail;
@@ -230,6 +236,7 @@
else
debug->panel->set_dpcd(debug->panel, dpcd);
+ mutex_unlock(&debug->lock);
return rc;
}
@@ -873,6 +880,8 @@
if (*ppos)
return 0;
+ mutex_lock(&debug->lock);
+
/* Leave room for termination char */
len = min_t(size_t, count, SZ_8 - 1);
if (copy_from_user(buf, user_buff, len))
@@ -906,9 +915,11 @@
debug->aux->set_sim_mode(debug->aux, debug->dp_debug.sim_mode,
debug->edid, debug->dpcd);
end:
+ mutex_unlock(&debug->lock);
return len;
error:
devm_kfree(debug->dev, debug->edid);
+ mutex_unlock(&debug->lock);
return len;
}
@@ -1272,6 +1283,8 @@
dp_debug->hdisplay = 0;
dp_debug->vrefresh = 0;
+ mutex_init(&debug->lock);
+
rc = dp_debug_init(dp_debug);
if (rc) {
devm_kfree(dev, debug);
@@ -1308,6 +1321,8 @@
dp_debug_deinit(dp_debug);
+ mutex_destroy(&debug->lock);
+
if (debug->edid)
devm_kfree(debug->dev, debug->edid);
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 83e100c..fbf140b 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -123,6 +123,7 @@
PLANE_PROP_SRC_CONFIG,
PLANE_PROP_FB_TRANSLATION_MODE,
PLANE_PROP_MULTIRECT_MODE,
+ PLANE_PROP_LAYOUT,
/* total # of properties */
PLANE_PROP_COUNT
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.c b/drivers/gpu/drm/msm/sde/sde_connector.c
index 85b9f7e..7fcba3e 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.c
+++ b/drivers/gpu/drm/msm/sde/sde_connector.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
@@ -48,6 +48,9 @@
{SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC, "sde_dualpipemerge_dsc"},
{SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE, "sde_dualpipe_dscmerge"},
{SDE_RM_TOPOLOGY_PPSPLIT, "sde_ppsplit"},
+ {SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE, "sde_quadpipemerge"},
+ {SDE_RM_TOPOLOGY_QUADPIPE_DSCMERGE, "sde_quadpipe_dscmerge"},
+ {SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC, "sde_quadpipe_3dmerge_dsc"}
};
static const struct drm_prop_enum_list e_topology_control[] = {
{SDE_RM_TOPCTL_RESERVE_LOCK, "reserve_lock"},
diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.c b/drivers/gpu/drm/msm/sde/sde_crtc.c
index e0094d7..2c7f758 100644
--- a/drivers/gpu/drm/msm/sde/sde_crtc.c
+++ b/drivers/gpu/drm/msm/sde/sde_crtc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -1229,7 +1229,7 @@
{
struct sde_crtc *sde_crtc;
struct sde_crtc_state *crtc_state;
- const struct sde_rect *roi[CRTC_DUAL_MIXERS];
+ const struct sde_rect *roi[MAX_MIXERS_PER_CRTC];
if (!crtc || !state)
return -EINVAL;
@@ -1237,7 +1237,7 @@
sde_crtc = to_sde_crtc(crtc);
crtc_state = to_sde_crtc_state(state);
- if (sde_crtc->num_mixers > CRTC_DUAL_MIXERS) {
+ if (sde_crtc->num_mixers > MAX_MIXERS_PER_CRTC) {
SDE_ERROR("%s: unsupported number of mixers: %d\n",
sde_crtc->name, sde_crtc->num_mixers);
return -EINVAL;
@@ -1429,7 +1429,7 @@
struct sde_crtc_state *crtc_state;
const struct sde_rect *lm_roi;
struct sde_hw_mixer *hw_lm;
- int lm_idx, lm_horiz_position;
+ int lm_idx;
if (!crtc)
return;
@@ -1437,7 +1437,6 @@
sde_crtc = to_sde_crtc(crtc);
crtc_state = to_sde_crtc_state(crtc->state);
- lm_horiz_position = 0;
for (lm_idx = 0; lm_idx < sde_crtc->num_mixers; lm_idx++) {
struct sde_hw_mixer_cfg cfg;
@@ -1452,11 +1451,10 @@
hw_lm->cfg.out_width = lm_roi->w;
hw_lm->cfg.out_height = lm_roi->h;
- hw_lm->cfg.right_mixer = lm_horiz_position;
cfg.out_width = lm_roi->w;
cfg.out_height = lm_roi->h;
- cfg.right_mixer = lm_horiz_position++;
+ cfg.right_mixer = hw_lm->cfg.right_mixer;
cfg.flags = 0;
hw_lm->ops.setup_mixer_out(hw_lm, &cfg);
}
@@ -1605,6 +1603,8 @@
sde_plane_pipe(plane);
stage_cfg->multirect_index[pstate->stage][stage_idx] =
pstate->multirect_index;
+ stage_cfg->layout_index[pstate->stage][stage_idx] =
+ sde_plane_get_property(pstate, PLANE_PROP_LAYOUT);
SDE_EVT32(DRMID(crtc), DRMID(plane), stage_idx,
sde_plane_pipe(plane) - SSPP_VIG0, pstate->stage,
@@ -1724,7 +1724,7 @@
SDE_DEBUG("%s\n", sde_crtc->name);
- if (sde_crtc->num_mixers > CRTC_DUAL_MIXERS) {
+ if (sde_crtc->num_mixers > MAX_MIXERS_PER_CRTC) {
SDE_ERROR("invalid number mixers: %d\n", sde_crtc->num_mixers);
return;
}
@@ -1784,6 +1784,7 @@
mixer[i].flush_mask);
ctl->ops.setup_blendstage(ctl, mixer[i].hw_lm->idx,
+ mixer[i].hw_lm->cfg.flags,
&sde_crtc->stage_cfg);
}
@@ -2068,7 +2069,7 @@
}
if (!sde_crtc->num_mixers ||
- sde_crtc->num_mixers > CRTC_DUAL_MIXERS) {
+ sde_crtc->num_mixers > MAX_MIXERS_PER_CRTC) {
SDE_ERROR("%s: invalid number mixers: %d\n",
sde_crtc->name, sde_crtc->num_mixers);
SDE_EVT32(DRMID(&sde_crtc->base), sde_crtc->num_mixers,
@@ -2961,31 +2962,46 @@
struct sde_rm *rm = &sde_kms->rm;
struct sde_crtc_mixer *mixer;
struct sde_hw_ctl *last_valid_ctl = NULL;
- int i;
struct sde_rm_hw_iter lm_iter, ctl_iter, dspp_iter, ds_iter;
+ u64 mixer_per_ctl = 0;
+ u32 reuse_ctl = 0;
+ int i;
sde_rm_init_hw_iter(&lm_iter, enc->base.id, SDE_HW_BLK_LM);
sde_rm_init_hw_iter(&ctl_iter, enc->base.id, SDE_HW_BLK_CTL);
sde_rm_init_hw_iter(&dspp_iter, enc->base.id, SDE_HW_BLK_DSPP);
sde_rm_init_hw_iter(&ds_iter, enc->base.id, SDE_HW_BLK_DS);
+ reuse_ctl = sde_rm_get_hw_count(rm, enc->base.id, SDE_HW_BLK_CTL);
+ mixer_per_ctl = sde_rm_get_hw_count(rm, enc->base.id, SDE_HW_BLK_LM);
+
+ do_div(mixer_per_ctl, reuse_ctl);
+ if (!mixer_per_ctl) {
+ SDE_DEBUG("no valid lm/ctl count:%d\n", reuse_ctl);
+ return;
+ }
+ reuse_ctl = 0;
/* Set up all the mixers and ctls reserved by this encoder */
for (i = sde_crtc->num_mixers; i < ARRAY_SIZE(sde_crtc->mixers); i++) {
mixer = &sde_crtc->mixers[i];
if (!sde_rm_get_hw(rm, &lm_iter))
break;
+
mixer->hw_lm = (struct sde_hw_mixer *)lm_iter.hw;
/* CTL may be <= LMs, if <, multiple LMs controlled by 1 CTL */
- if (!sde_rm_get_hw(rm, &ctl_iter)) {
- SDE_DEBUG("no ctl assigned to lm %d, using previous\n",
+ if (reuse_ctl || !sde_rm_get_hw(rm, &ctl_iter)) {
+ SDE_DEBUG("no ctl assigned to lm %d using previous\n",
mixer->hw_lm->idx - LM_0);
mixer->hw_ctl = last_valid_ctl;
} else {
mixer->hw_ctl = (struct sde_hw_ctl *)ctl_iter.hw;
last_valid_ctl = mixer->hw_ctl;
+ reuse_ctl = mixer_per_ctl;
}
+ if (reuse_ctl)
+ reuse_ctl--;
/* Shouldn't happen, mixers are always >= ctls */
if (!mixer->hw_ctl) {
@@ -2994,6 +3010,14 @@
return;
}
+ if (sde_crtc->num_mixers < mixer_per_ctl)
+ mixer->hw_lm->cfg.flags |= SDE_MIXER_LAYOUT_LEFT;
+ else
+ mixer->hw_lm->cfg.flags |= SDE_MIXER_LAYOUT_RIGHT;
+
+ mixer->hw_lm->cfg.right_mixer =
+ (sde_crtc->num_mixers & 1) ? true : false;
+
/* Dspp may be null */
(void) sde_rm_get_hw(rm, &dspp_iter);
mixer->hw_dspp = (struct sde_hw_dspp *)dspp_iter.hw;
@@ -4814,12 +4838,21 @@
struct sde_rect left_rect, right_rect;
int32_t left_pid, right_pid;
int32_t stage;
+ int32_t left_layout, right_layout;
prv_pstate = &pstates[i - 1];
cur_pstate = &pstates[i];
if (prv_pstate->stage != cur_pstate->stage)
continue;
+ left_layout = sde_plane_get_property(prv_pstate->sde_pstate,
+ PLANE_PROP_LAYOUT);
+ right_layout = sde_plane_get_property(cur_pstate->sde_pstate,
+ PLANE_PROP_LAYOUT);
+
+ if (left_layout != right_layout)
+ continue;
+
stage = cur_pstate->stage;
left_pid = prv_pstate->sde_pstate->base.plane->base.id;
diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.h b/drivers/gpu/drm/msm/sde/sde_crtc.h
index 4700a6c..6124ebf 100644
--- a/drivers/gpu/drm/msm/sde/sde_crtc.h
+++ b/drivers/gpu/drm/msm/sde/sde_crtc.h
@@ -230,7 +230,7 @@
u32 num_ctls;
u32 num_mixers;
bool mixers_swapped;
- struct sde_crtc_mixer mixers[CRTC_DUAL_MIXERS];
+ struct sde_crtc_mixer mixers[MAX_MIXERS_PER_CRTC];
struct drm_pending_vblank_event *event;
u32 vsync_count;
@@ -280,7 +280,7 @@
spinlock_t event_lock;
bool misr_enable;
u32 misr_frame_count;
- u32 misr_data[CRTC_DUAL_MIXERS];
+ u32 misr_data[MAX_MIXERS_PER_CRTC];
bool enable_sui_enhancement;
@@ -405,8 +405,8 @@
bool is_ppsplit;
struct sde_rect crtc_roi;
- struct sde_rect lm_bounds[CRTC_DUAL_MIXERS];
- struct sde_rect lm_roi[CRTC_DUAL_MIXERS];
+ struct sde_rect lm_bounds[MAX_MIXERS_PER_CRTC];
+ struct sde_rect lm_roi[MAX_MIXERS_PER_CRTC];
struct msm_roi_list user_roi_list;
struct msm_property_state property_state;
@@ -483,8 +483,7 @@
if (cstate->num_ds_enabled)
mixer_width = cstate->ds_cfg[0].lm_width;
else
- mixer_width = (sde_crtc->num_mixers == CRTC_DUAL_MIXERS ?
- mode->hdisplay / CRTC_DUAL_MIXERS : mode->hdisplay);
+ mixer_width = mode->hdisplay / sde_crtc->num_mixers;
return mixer_width;
}
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.c b/drivers/gpu/drm/msm/sde/sde_encoder.c
index 122f319..814b08b 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -1406,6 +1406,9 @@
return -EINVAL;
}
+ params->num_channels =
+ sde_rm_get_topology_num_encoders(topology);
+
SDE_DEBUG_ENC(sde_enc, "topology:%d\n", topology);
SDE_EVT32(DRMID(&sde_enc->base), topology,
sde_enc->cur_conn_roi.x,
@@ -1432,6 +1435,7 @@
ret = _sde_encoder_dsc_2_lm_2_enc_1_intf(sde_enc, params);
break;
case SDE_RM_TOPOLOGY_DUALPIPE_DSC:
+ case SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC:
ret = _sde_encoder_dsc_2_lm_2_enc_2_intf(sde_enc, params);
break;
default:
@@ -4124,7 +4128,8 @@
/* only enable border color on LM */
if (phys_enc->hw_ctl->ops.setup_blendstage)
phys_enc->hw_ctl->ops.setup_blendstage(
- phys_enc->hw_ctl, hw_lm->idx, NULL);
+ phys_enc->hw_ctl, hw_lm->cfg.flags,
+ hw_lm->idx, NULL);
}
if (!lm_valid) {
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.h b/drivers/gpu/drm/msm/sde/sde_encoder.h
index c40db41..a4cf467 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder.h
+++ b/drivers/gpu/drm/msm/sde/sde_encoder.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -58,11 +58,13 @@
* @is_primary: set to true if the display is primary display
* @affected_displays: bitmask, bit set means the ROI of the commit lies within
* the bounds of the physical display at the bit index
+ * @num_channels: Add number of encoder channels
*/
struct sde_encoder_kickoff_params {
u32 inline_rotate_prefill;
u32 is_primary;
unsigned long affected_displays;
+ u32 num_channels;
};
/**
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys.h b/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
index 953106e..163a36d 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2019 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -547,6 +547,12 @@
topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC))
return BLEND_3D_H_ROW_INT;
+ if ((phys_enc->split_role == ENC_ROLE_MASTER ||
+ phys_enc->split_role == ENC_ROLE_SLAVE) &&
+ ((topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE) ||
+ (topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC)))
+ return BLEND_3D_H_ROW_INT;
+
return BLEND_3D_NONE;
}
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c
index 455e25c..f6d395c 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.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
@@ -521,7 +521,10 @@
topology = sde_connector_get_topology_name(phys_enc->connector);
if ((topology == SDE_RM_TOPOLOGY_DUALPIPE_DSC) ||
- (topology == SDE_RM_TOPOLOGY_DUALPIPE))
+ (topology == SDE_RM_TOPOLOGY_DUALPIPE) ||
+ (topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE) ||
+ (topology == SDE_RM_TOPOLOGY_QUADPIPE_DSCMERGE) ||
+ (topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC))
return true;
return false;
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_ad4.c b/drivers/gpu/drm/msm/sde/sde_hw_ad4.c
index e60defd..aabca31 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_ad4.c
+++ b/drivers/gpu/drm/msm/sde/sde_hw_ad4.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -293,7 +293,7 @@
}
if (!cfg->hw_cfg->num_of_mixers ||
- cfg->hw_cfg->num_of_mixers > CRTC_DUAL_MIXERS) {
+ cfg->hw_cfg->num_of_mixers > MAX_MIXERS_PER_CRTC) {
DRM_ERROR("invalid mixer cnt %d\n",
cfg->hw_cfg->num_of_mixers);
return -EINVAL;
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_catalog.c b/drivers/gpu/drm/msm/sde/sde_hw_catalog.c
index 750cd57..84b731e 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_catalog.c
+++ b/drivers/gpu/drm/msm/sde/sde_hw_catalog.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
@@ -523,7 +523,7 @@
static struct sde_prop_type mixer_prop[] = {
{MIXER_OFF, "qcom,sde-mixer-off", true, PROP_TYPE_U32_ARRAY},
{MIXER_LEN, "qcom,sde-mixer-size", false, PROP_TYPE_U32},
- {MIXER_PAIR_MASK, "qcom,sde-mixer-pair-mask", true,
+ {MIXER_PAIR_MASK, "qcom,sde-mixer-pair-mask", false,
PROP_TYPE_U32_ARRAY},
{MIXER_BLOCKS, "qcom,sde-mixer-blocks", false, PROP_TYPE_NODE},
{MIXER_DISP, "qcom,sde-mixer-display-pref", false,
@@ -1460,7 +1460,7 @@
goto end;
}
mixer->sblk = sblk;
-
+ mixer->lm_pair_mask = 0xFFFFFFFF;
mixer->base = mixer_base;
mixer->len = PROP_VALUE_ACCESS(prop_value, MIXER_LEN, 0);
mixer->id = LM_0 + i;
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_catalog.h b/drivers/gpu/drm/msm/sde/sde_hw_catalog.h
index 52bdc78..604d04b9 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_catalog.h
+++ b/drivers/gpu/drm/msm/sde/sde_hw_catalog.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -59,6 +59,7 @@
#define MAX_IMG_HEIGHT 0x3fff
#define CRTC_DUAL_MIXERS 2
+#define MAX_MIXERS_PER_CRTC 4
#define SDE_COLOR_PROCESS_VER(MAJOR, MINOR) \
((((MAJOR) & 0xFFFF) << 16) | (((MINOR) & 0xFFFF)))
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_ctl.c b/drivers/gpu/drm/msm/sde/sde_hw_ctl.c
index 2146611..1738626 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_ctl.c
+++ b/drivers/gpu/drm/msm/sde/sde_hw_ctl.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
@@ -410,7 +410,7 @@
}
static void sde_hw_ctl_setup_blendstage(struct sde_hw_ctl *ctx,
- enum sde_lm lm, struct sde_hw_stage_cfg *stage_cfg)
+ enum sde_lm lm, int flags, struct sde_hw_stage_cfg *stage_cfg)
{
struct sde_hw_blk_reg_map *c = &ctx->hw;
u32 mixercfg = 0, mixercfg_ext = 0, mix, ext;
@@ -443,6 +443,12 @@
enum sde_sspp_multirect_index rect_index =
stage_cfg->multirect_index[i][j];
+ enum sde_sspp_layout_index layout_index =
+ stage_cfg->layout_index[i][j];
+
+ if (layout_index && (flags != layout_index))
+ continue;
+
switch (stage_cfg->stage[i][j]) {
case SSPP_VIG0:
if (rect_index == SDE_SSPP_RECT_1) {
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_ctl.h b/drivers/gpu/drm/msm/sde/sde_hw_ctl.h
index 75631dd8..25d3a07 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_ctl.h
+++ b/drivers/gpu/drm/msm/sde/sde_hw_ctl.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -53,6 +53,8 @@
enum sde_sspp stage[SDE_STAGE_MAX][PIPES_PER_STAGE];
enum sde_sspp_multirect_index multirect_index
[SDE_STAGE_MAX][PIPES_PER_STAGE];
+ enum sde_sspp_layout_index layout_index
+ [SDE_STAGE_MAX][PIPES_PER_STAGE];
};
/**
@@ -246,7 +248,7 @@
* @cfg : blend stage configuration
*/
void (*setup_blendstage)(struct sde_hw_ctl *ctx,
- enum sde_lm lm, struct sde_hw_stage_cfg *cfg);
+ enum sde_lm lm, int flags, struct sde_hw_stage_cfg *cfg);
void (*setup_sbuf_cfg)(struct sde_hw_ctl *ctx,
struct sde_ctl_sbuf_cfg *cfg);
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_lm.h b/drivers/gpu/drm/msm/sde/sde_hw_lm.h
index 8a146bd..99ec7b9 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_lm.h
+++ b/drivers/gpu/drm/msm/sde/sde_hw_lm.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -17,6 +17,9 @@
#include "sde_hw_util.h"
#include "sde_hw_blk.h"
+#define SDE_MIXER_LAYOUT_LEFT 0x1
+#define SDE_MIXER_LAYOUT_RIGHT 0x2
+
struct sde_hw_mixer;
struct sde_hw_mixer_cfg {
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_sspp.h b/drivers/gpu/drm/msm/sde/sde_hw_sspp.h
index fdf215f..0e50d82 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_sspp.h
+++ b/drivers/gpu/drm/msm/sde/sde_hw_sspp.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -106,6 +106,13 @@
u32 noise_thr;
};
+
+enum sde_sspp_layout_index {
+ SDE_SSPP_NONE = 0,
+ SDE_SSPP_LEFT,
+ SDE_SSPP_RIGHT,
+};
+
struct sde_hw_pixel_ext {
/* scaling factors are enabled for this input layer */
uint8_t enable_pxl_ext;
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index a10bdf2..2307dad 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014-2018 The Linux Foundation. All rights reserved.
+ * Copyright (C) 2014-2019 The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -3826,6 +3826,7 @@
break;
case PLANE_PROP_MULTIRECT_MODE:
case PLANE_PROP_COLOR_FILL:
+ case PLANE_PROP_LAYOUT:
/* potentially need to refresh everything */
pstate->dirty = SDE_PLANE_DIRTY_ALL;
break;
@@ -4249,6 +4250,11 @@
{SDE_SSPP_MULTIRECT_PARALLEL, "parallel"},
{SDE_SSPP_MULTIRECT_TIME_MX, "serial"},
};
+ static const struct drm_prop_enum_list e_layout_index[] = {
+ {SDE_SSPP_NONE, "none"},
+ {SDE_SSPP_LEFT, "left"},
+ {SDE_SSPP_RIGHT, "right"},
+ };
const struct sde_format_extended *format_list;
struct sde_kms_info *info;
struct sde_plane *psde = to_sde_plane(plane);
@@ -4371,6 +4377,9 @@
msm_property_install_enum(&psde->property_info, "src_config", 0x0, 1,
e_src_config, ARRAY_SIZE(e_src_config), PLANE_PROP_SRC_CONFIG);
+ msm_property_install_enum(&psde->property_info, "sspp_layout", 0x0, 0,
+ e_layout_index, ARRAY_SIZE(e_layout_index), PLANE_PROP_LAYOUT);
+
if (psde->pipe_hw->ops.setup_solidfill)
msm_property_install_range(&psde->property_info, "color_fill",
0, 0, 0xFFFFFFFF, 0, PLANE_PROP_COLOR_FILL);
diff --git a/drivers/gpu/drm/msm/sde/sde_rm.c b/drivers/gpu/drm/msm/sde/sde_rm.c
index 90c05e6..d4f82fe 100644
--- a/drivers/gpu/drm/msm/sde/sde_rm.c
+++ b/drivers/gpu/drm/msm/sde/sde_rm.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
@@ -57,6 +57,9 @@
{ SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC, 2, 1, 1, 1, false },
{ SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE, 2, 2, 1, 1, false },
{ SDE_RM_TOPOLOGY_PPSPLIT, 1, 0, 2, 1, true },
+ { SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE, 4, 0, 2, 2, true },
+ { SDE_RM_TOPOLOGY_QUADPIPE_DSCMERGE, 4, 4, 2, 2, true },
+ { SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC, 4, 2, 2, 2, true },
};
/**
@@ -187,6 +190,44 @@
return SDE_RM_TOPOLOGY_NONE;
}
+int sde_rm_get_hw_count(struct sde_rm *rm, uint32_t enc_id,
+ enum sde_hw_blk_type type)
+{
+ struct list_head *blk_list;
+ struct sde_rm_hw_blk *blk;
+ int count = 0;
+
+ mutex_lock(&rm->rm_lock);
+ if (!rm || type >= SDE_HW_BLK_MAX) {
+ SDE_ERROR("invalid rm/type %d\n", type);
+ count = -EINVAL;
+ goto exit;
+ }
+
+ blk_list = &rm->hw_blks[type];
+ list_for_each_entry(blk, blk_list, list) {
+ struct sde_rm_rsvp *rsvp = blk->rsvp;
+
+ if (rsvp && rsvp->enc_id == enc_id)
+ count++;
+ }
+
+exit:
+ mutex_unlock(&rm->rm_lock);
+ return count;
+}
+
+int sde_rm_get_topology_num_encoders(enum sde_rm_topology_name topology)
+{
+ int i;
+
+ for (i = 0; i < SDE_RM_TOPOLOGY_MAX; i++)
+ if (g_top_table[i].top_name == topology)
+ return g_top_table[i].num_comp_enc;
+
+ return 0;
+}
+
static bool _sde_rm_get_hw_locked(struct sde_rm *rm, struct sde_rm_hw_iter *i)
{
struct list_head *blk_list;
@@ -1327,7 +1368,7 @@
/**
* _sde_rm_get_ctl_lm_for_cont_splash - retrieve the current LM blocks
* @ctl: Pointer to CTL hardware block
- * @max_lm_cnt: number of LM blocks supported in the hw
+ * @max_lm_cnt: max mixer index supported in the hw
* @lm_cnt: number of LM blocks already active
* @lm_ids: pointer to store the active LM block IDs
* @top: pointer to the current "ctl_top" structure
@@ -1408,6 +1449,7 @@
int index = 0, ctl_top_cnt;
struct sde_kms *sde_kms = NULL;
struct sde_hw_mdp *hw_mdp;
+ int max_mixer_idx = 0;
if (!priv || !rm || !cat || !splash_data) {
SDE_ERROR("invalid input parameters\n");
@@ -1432,6 +1474,16 @@
return -EINVAL;
}
+ /*
+ * max_mixer_idx is used to loop through all available mixers
+ * to check mixers programmed in splash. For some targets
+ * max_mixer_idx value might be more than mixer count, hence
+ * use mixer index instead of mixer count to loop through all
+ * the mixers.
+ */
+ if (cat->mixer_count > 0)
+ max_mixer_idx = cat->mixer[cat->mixer_count-1].id;
+
sde_rm_init_hw_iter(&iter_c, 0, SDE_HW_BLK_CTL);
while (_sde_rm_get_hw_locked(rm, &iter_c)) {
struct sde_hw_ctl *ctl = to_sde_hw_ctl(iter_c.blk->hw);
@@ -1442,7 +1494,7 @@
splash_data->lm_cnt +=
_sde_rm_get_ctl_lm_for_cont_splash
(ctl,
- cat->mixer_count,
+ max_mixer_idx,
splash_data->lm_cnt,
splash_data->lm_ids,
&splash_data->top[index], index);
diff --git a/drivers/gpu/drm/msm/sde/sde_rm.h b/drivers/gpu/drm/msm/sde/sde_rm.h
index 11f4b6f..27d8ac2 100644
--- a/drivers/gpu/drm/msm/sde/sde_rm.h
+++ b/drivers/gpu/drm/msm/sde/sde_rm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017, 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
@@ -31,6 +31,9 @@
* @SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC: 2 LM, 2 PP, 3DMux, 1 DSC, 1 INTF/WB
* @SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE: 2 LM, 2 PP, 2 DSC Merge, 1 INTF/WB
* @SDE_RM_TOPOLOGY_PPSPLIT: 1 LM, 2 PPs, 2 INTF/WB
+ * @SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE 4 LM, 4 PP, 3DMux, 2 INTF
+ * @SDE_RM_TOPOLOGY_QUADPIPE_DSCMERE 4 LM, 4 PP, 4 DSC Merge, 2 INTF
+ * @SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC 4 LM, 4 PP, 3DMux, 2 DSC, 2 INTF
*/
enum sde_rm_topology_name {
SDE_RM_TOPOLOGY_NONE = 0,
@@ -42,6 +45,9 @@
SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC,
SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE,
SDE_RM_TOPOLOGY_PPSPLIT,
+ SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE,
+ SDE_RM_TOPOLOGY_QUADPIPE_DSCMERGE,
+ SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC,
SDE_RM_TOPOLOGY_MAX,
};
@@ -114,6 +120,12 @@
enum sde_rm_topology_name sde_rm_get_topology_name(
struct msm_display_topology topology);
+/**
+ * sde_rm_get_topology_num_encoders - get number of encoders in given topology
+ * @topology: topology name
+ * @Return: number of encoders in given topology
+ */
+int sde_rm_get_topology_num_encoders(enum sde_rm_topology_name topology);
/**
* sde_rm_init - Read hardware catalog and create reservation tracking objects
@@ -199,6 +211,8 @@
*/
bool sde_rm_get_hw(struct sde_rm *rm, struct sde_rm_hw_iter *iter);
+int sde_rm_get_hw_count(struct sde_rm *rm, uint32_t enc_id,
+ enum sde_hw_blk_type type);
/**
* sde_rm_check_property_topctl - validate property bitmask before it is set
* @val: user's proposed topology control bitmask
diff --git a/drivers/input/sensors/smi130/Kconfig b/drivers/input/sensors/smi130/Kconfig
index 0dd0b39..97db6cdb 100644
--- a/drivers/input/sensors/smi130/Kconfig
+++ b/drivers/input/sensors/smi130/Kconfig
@@ -1,6 +1,16 @@
#
# Makefile for Bosch sensors driver.
#
+menuconfig SMI130
+ bool "Enable smi130 drivers"
+ help
+ Say Y here, and a list of smi130 drivers will be displayed.
+ This option does not affect the kernel.
+
+ If unsure, say N.
+
+if SMI130
+
config BOSCH_DRIVER_LOG_FUNC
tristate "Bosch Sensortec driver smart log function support"
depends on (I2C || SPI_MASTER) && SYSFS
@@ -116,6 +126,4 @@
help
If you say yes here, you get support for Bosch Sensortec's
sensor driver of SMI_ACC4XY with mag sensor support.
-
-
-
+endif
diff --git a/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_intf.c b/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_intf.c
index e4ec08b..f753b34 100644
--- a/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_intf.c
+++ b/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_intf.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -166,8 +166,7 @@
struct cam_hw_intf *hw;
uint32_t hw_index = 0;
- if ((!data) || (!data->identifier) || (!data->base_array) ||
- (!data->base_array_cnt))
+ if (!data || !data->base_array_cnt)
return -EINVAL;
if (get_cdm_mgr_refcount()) {
diff --git a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
index 7308644..0e30253 100644
--- a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -715,7 +715,8 @@
ife_out_res->hw_res[0] = vfe_acquire.vfe_out.rsrc_node;
ife_out_res->is_dual_vfe = 0;
ife_out_res->res_id = vfe_out_res_id;
- ife_out_res->res_type = CAM_ISP_RESOURCE_VFE_OUT;
+ ife_out_res->res_type = (enum cam_ife_hw_mgr_res_type)
+ CAM_ISP_RESOURCE_VFE_OUT;
ife_src_res->child[ife_src_res->num_children++] = ife_out_res;
return 0;
@@ -805,7 +806,8 @@
ife_out_res->hw_res[j]->res_id);
}
- ife_out_res->res_type = CAM_ISP_RESOURCE_VFE_OUT;
+ ife_out_res->res_type = (enum cam_ife_hw_mgr_res_type)
+ CAM_ISP_RESOURCE_VFE_OUT;
ife_out_res->res_id = out_port->res_type;
ife_out_res->parent = ife_src_res;
ife_src_res->child[ife_src_res->num_children++] = ife_out_res;
@@ -918,7 +920,8 @@
CAM_ERR(CAM_ISP, "Wrong IFE CSID Resource Node");
goto err;
}
- ife_src_res->res_type = vfe_acquire.rsrc_type;
+ ife_src_res->res_type = (enum cam_ife_hw_mgr_res_type)
+ vfe_acquire.rsrc_type;
ife_src_res->res_id = vfe_acquire.vfe_in.res_id;
ife_src_res->is_dual_vfe = csid_res->is_dual_vfe;
@@ -1150,7 +1153,8 @@
goto end;
}
- csid_res->res_type = CAM_ISP_RESOURCE_PIX_PATH;
+ csid_res->res_type = (enum cam_ife_hw_mgr_res_type)
+ CAM_ISP_RESOURCE_PIX_PATH;
csid_res->res_id = CAM_IFE_PIX_PATH_RES_IPP;
if (in_port->usage_type)
diff --git a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c
index f2c243e..66142db 100644
--- a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.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
@@ -23,6 +23,7 @@
#include "cam_debug_util.h"
static struct cam_mem_table tbl;
+static atomic_t cam_mem_mgr_state = ATOMIC_INIT(CAM_MEM_MGR_UNINITIALIZED);
static int cam_mem_util_map_cpu_va(struct ion_handle *hdl,
uintptr_t *vaddr,
@@ -108,6 +109,7 @@
tbl.bufq[i].buf_handle = -1;
}
mutex_init(&tbl.m_lock);
+ atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_INITIALIZED);
return rc;
bitmap_fail:
@@ -151,6 +153,11 @@
{
int rc = 0, idx;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
idx = CAM_MEM_MGR_GET_HDL_IDX(buf_handle);
if (idx >= CAM_MEM_BUFQ_MAX || idx <= 0)
return -EINVAL;
@@ -191,6 +198,10 @@
uintptr_t kvaddr = 0;
size_t klen = 0;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
if (!buf_handle || !vaddr_ptr || !len)
return -EINVAL;
@@ -242,6 +253,11 @@
uint32_t ion_cache_ops;
unsigned long ion_flag = 0;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!cmd)
return -EINVAL;
@@ -518,6 +534,11 @@
dma_addr_t hw_vaddr = 0;
size_t len;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!cmd) {
CAM_ERR(CAM_MEM, " Invalid argument");
return -EINVAL;
@@ -616,6 +637,11 @@
dma_addr_t hw_vaddr = 0;
size_t len = 0;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!cmd || (cmd->fd < 0)) {
CAM_ERR(CAM_MEM, "Invalid argument");
return -EINVAL;
@@ -801,6 +827,7 @@
void cam_mem_mgr_deinit(void)
{
+ atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_UNINITIALIZED);
cam_mem_mgr_cleanup_table();
mutex_lock(&tbl.m_lock);
bitmap_zero(tbl.bitmap, tbl.bits);
@@ -889,6 +916,11 @@
int idx;
int rc;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!cmd) {
CAM_ERR(CAM_MEM, "Invalid argument");
return -EINVAL;
@@ -936,6 +968,11 @@
enum cam_smmu_region_id region = CAM_SMMU_REGION_SHARED;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!inp || !out) {
CAM_ERR(CAM_MEM, "Invalid params");
return -EINVAL;
@@ -1054,6 +1091,11 @@
int32_t idx;
int rc;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!inp) {
CAM_ERR(CAM_MEM, "Invalid argument");
return -EINVAL;
@@ -1103,6 +1145,11 @@
int32_t smmu_hdl = 0;
int32_t num_hdl = 0;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!inp || !out) {
CAM_ERR(CAM_MEM, "Invalid param(s)");
return -EINVAL;
@@ -1195,6 +1242,11 @@
int rc;
int32_t smmu_hdl;
+ if (!atomic_read(&cam_mem_mgr_state)) {
+ CAM_ERR(CAM_CRM, "failed. mem_mgr not initialized");
+ return -EINVAL;
+ }
+
if (!inp) {
CAM_ERR(CAM_MEM, "Invalid argument");
return -EINVAL;
diff --git a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h
index 92c366d..73f0eb3 100644
--- a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h
+++ b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h
@@ -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
@@ -20,6 +20,12 @@
#define CAM_MEM_BUFQ_MAX 1024
+/* Enum for possible mem mgr states */
+enum cam_mem_mgr_state {
+ CAM_MEM_MGR_UNINITIALIZED,
+ CAM_MEM_MGR_INITIALIZED,
+};
+
/*Enum for possible SMMU operations */
enum cam_smmu_mapping_client {
CAM_SMMU_MAPPING_USER,
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
index cb0bcc2..03c7d7b 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -31,6 +31,7 @@
bool protect, int32_t offset)
{
struct scm_desc desc = {0};
+ int result = -1;
if (offset >= CSIPHY_MAX_INSTANCES)
return -EINVAL;
@@ -38,8 +39,19 @@
desc.args[0] = protect;
desc.args[1] = csiphy_dev->csiphy_cpas_cp_reg_mask[offset];
- if (scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS, SECURE_SYSCALL_ID_2),
- &desc)) {
+ /*
+ * If SECURE_SYSCALL_ID_2 is not supported
+ * then fallback to SECURE_SYSCALL_ID
+ */
+ result = scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS, SECURE_SYSCALL_ID_2),
+ &desc);
+ if (result == -EOPNOTSUPP) {
+ desc.args[1] = csiphy_dev->soc_info.index;
+ CAM_ERR(CAM_CSIPHY, "SCM CALL 7 not supported fallback to 6");
+ result = scm_call2(SCM_SIP_FNID(SCM_SVC_CAMERASS,
+ SECURE_SYSCALL_ID), &desc);
+ }
+ if (result) {
CAM_ERR(CAM_CSIPHY, "scm call to hypervisor failed");
return -EINVAL;
}
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
index 8c075f5..9ed9536 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -438,7 +438,7 @@
if (flash_ctrl->switch_trigger)
cam_res_mgr_led_trigger_event(
flash_ctrl->switch_trigger,
- LED_SWITCH_ON);
+ (enum led_brightness)LED_SWITCH_ON);
return 0;
}
@@ -452,7 +452,7 @@
if (flash_ctrl->switch_trigger)
cam_res_mgr_led_trigger_event(flash_ctrl->switch_trigger,
- LED_SWITCH_OFF);
+ (enum led_brightness)LED_SWITCH_OFF);
flash_ctrl->flash_state = CAM_FLASH_STATE_START;
return 0;
@@ -1280,6 +1280,16 @@
flash_operation_info =
(struct cam_flash_set_on_off *) cmd_buf;
+ if (!flash_operation_info) {
+ CAM_ERR(CAM_FLASH,
+ "flash_operation_info Null");
+ return -EINVAL;
+ }
+ if (flash_operation_info->count >
+ CAM_FLASH_MAX_LED_TRIGGERS) {
+ CAM_ERR(CAM_FLASH, "led count out of limit");
+ return -EINVAL;
+ }
fctrl->nrt_info.cmn_attr.count =
flash_operation_info->count;
fctrl->nrt_info.cmn_attr.request_id = 0;
@@ -1355,6 +1365,11 @@
"flash_operation_info Null");
return -EINVAL;
}
+ if (flash_operation_info->count >
+ CAM_FLASH_MAX_LED_TRIGGERS) {
+ CAM_ERR(CAM_FLASH, "led count out of limit");
+ return -EINVAL;
+ }
flash_data->opcode = flash_operation_info->opcode;
flash_data->cmn_attr.count =
@@ -1387,6 +1402,17 @@
CAM_DBG(CAM_FLASH, "Widget Flash Operation");
flash_operation_info =
(struct cam_flash_set_on_off *) cmd_buf;
+ if (!flash_operation_info) {
+ CAM_ERR(CAM_FLASH,
+ "flash_operation_info Null");
+ return -EINVAL;
+ }
+ if (flash_operation_info->count >
+ CAM_FLASH_MAX_LED_TRIGGERS) {
+ CAM_ERR(CAM_FLASH, "led count out of limit");
+ return -EINVAL;
+ }
+
fctrl->nrt_info.cmn_attr.count =
flash_operation_info->count;
fctrl->nrt_info.cmn_attr.request_id = 0;
@@ -1426,6 +1452,17 @@
case CAMERA_SENSOR_FLASH_CMD_TYPE_RER: {
rc = 0;
flash_rer_info = (struct cam_flash_set_rer *)cmd_buf;
+ if (!flash_rer_info) {
+ CAM_ERR(CAM_FLASH,
+ "flash_rer_info Null");
+ return -EINVAL;
+ }
+ if (flash_rer_info->count >
+ CAM_FLASH_MAX_LED_TRIGGERS) {
+ CAM_ERR(CAM_FLASH, "led count out of limit");
+ return -EINVAL;
+ }
+
fctrl->nrt_info.cmn_attr.cmd_type =
CAMERA_SENSOR_FLASH_CMD_TYPE_RER;
fctrl->nrt_info.opcode = flash_rer_info->opcode;
diff --git a/drivers/media/platform/msm/camera/cam_smmu/cam_smmu_api.c b/drivers/media/platform/msm/camera/cam_smmu/cam_smmu_api.c
index 56209c6..7a489d7 100644
--- a/drivers/media/platform/msm/camera/cam_smmu/cam_smmu_api.c
+++ b/drivers/media/platform/msm/camera/cam_smmu/cam_smmu_api.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -3005,7 +3005,7 @@
cam_smmu_clean_kernel_buffer_list(idx);
}
- if (&iommu_cb_set.cb_info[idx].is_secure) {
+ if (iommu_cb_set.cb_info[idx].is_secure) {
if (iommu_cb_set.cb_info[idx].secure_count == 0) {
mutex_unlock(&iommu_cb_set.cb_info[idx].lock);
return -EPERM;
diff --git a/drivers/media/platform/msm/vidc/hfi_response_handler.c b/drivers/media/platform/msm/vidc/hfi_response_handler.c
index 225bd23..b50e641 100644
--- a/drivers/media/platform/msm/vidc/hfi_response_handler.c
+++ b/drivers/media/platform/msm/vidc/hfi_response_handler.c
@@ -1706,13 +1706,9 @@
cmd_done.size = sizeof(struct msm_vidc_cb_cmd_done);
cmd_done.session_id = (void *)(uintptr_t)pkt->session_id;
cmd_done.status = hfi_map_err_status(pkt->error_type);
- if (pkt->rg_buffer_info) {
- cmd_done.data.buffer_info =
+ cmd_done.data.buffer_info =
*(struct hal_buffer_info *)pkt->rg_buffer_info;
- cmd_done.size = sizeof(struct hal_buffer_info);
- } else {
- dprintk(VIDC_ERR, "invalid payload in rel_buff_done\n");
- }
+ cmd_done.size = sizeof(struct hal_buffer_info);
info->response_type = HAL_SESSION_RELEASE_BUFFER_DONE;
info->response.cmd = cmd_done;
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 66c1ee8..29c84b6 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -2701,6 +2701,7 @@
bool unload = false;
bool found_app = false;
bool found_dead_app = false;
+ bool scm_called = false;
if (!data) {
pr_err("Invalid/uninitialized device handle\n");
@@ -2759,11 +2760,12 @@
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, &req,
sizeof(struct qseecom_unload_app_ireq),
&resp, sizeof(resp));
+ scm_called = true;
if (ret) {
pr_err("scm_call to unload app (id = %d) failed\n",
req.app_id);
ret = -EFAULT;
- goto unload_exit;
+ goto scm_exit;
} else {
pr_warn("App id %d now unloaded\n", req.app_id);
}
@@ -2771,7 +2773,7 @@
pr_err("app (%d) unload_failed!!\n",
data->client.app_id);
ret = -EFAULT;
- goto unload_exit;
+ goto scm_exit;
}
if (resp.result == QSEOS_RESULT_SUCCESS)
pr_debug("App (%d) is unloaded!!\n",
@@ -2781,11 +2783,35 @@
if (ret) {
pr_err("process_incomplete_cmd fail err: %d\n",
ret);
- goto unload_exit;
+ goto scm_exit;
}
}
}
+scm_exit:
+ if (scm_called) {
+ /* double check if this app_entry still exists */
+ bool doublecheck = false;
+
+ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags1);
+ list_for_each_entry(ptr_app,
+ &qseecom.registered_app_list_head, list) {
+ if ((ptr_app->app_id == data->client.app_id) &&
+ (!strcmp((void *)ptr_app->app_name,
+ (void *)data->client.app_name))) {
+ doublecheck = true;
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&qseecom.registered_app_list_lock,
+ flags1);
+ if (!doublecheck) {
+ pr_warn("app %d(%s) entry is already removed\n",
+ data->client.app_id,
+ (char *)data->client.app_name);
+ found_app = false;
+ }
+ }
unload_exit:
if (found_app) {
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags1);
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 7b221c3..5f1abe7 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -5432,6 +5432,7 @@
struct sdhci_host *host = dev_get_drvdata(dev);
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_msm_host *msm_host = pltfm_host->priv;
+ struct mmc_host *mmc = host->mmc;
int ret = 0;
int sdio_cfg = 0;
ktime_t start = ktime_get();
@@ -5447,6 +5448,8 @@
}
ret = sdhci_msm_runtime_suspend(dev);
out:
+ /* cancel any clock gating work scheduled by mmc_host_clk_release() */
+ cancel_delayed_work_sync(&mmc->clk_gate_work);
sdhci_msm_disable_controller_clock(host);
if (host->mmc->card && mmc_card_sdio(host->mmc->card)) {
sdio_cfg = sdhci_msm_cfg_sdio_wakeup(host, true);
diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c
index df8f4ad..e3c076e 100644
--- a/drivers/net/wireless/cnss2/pci.c
+++ b/drivers/net/wireless/cnss2/pci.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
@@ -1523,40 +1523,6 @@
m3_mem->size = 0;
}
-int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv)
-{
- int ret;
- struct cnss_plat_data *plat_priv;
-
- if (!pci_priv)
- return -ENODEV;
-
- plat_priv = pci_priv->plat_priv;
- if (!plat_priv)
- return -ENODEV;
-
- if (test_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state)) {
- cnss_pr_err("RDDM already collected 0x%x, return\n",
- pci_priv->mhi_state);
- return 0;
- }
-
- ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_TRIGGER_RDDM);
- if (ret) {
- cnss_pr_err("Failed to trigger RDDM, err = %d\n", ret);
- cnss_schedule_recovery(&pci_priv->pci_dev->dev,
- CNSS_REASON_DEFAULT);
- return 0;
- }
-
- if (!test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state)) {
- mod_timer(&plat_priv->fw_boot_timer,
- jiffies + msecs_to_jiffies(FW_ASSERT_TIMEOUT));
- }
-
- return 0;
-}
-
void cnss_pci_fw_boot_timeout_hdlr(struct cnss_pci_data *pci_priv)
{
if (!pci_priv)
@@ -1885,21 +1851,32 @@
pci_disable_device(pci_dev);
}
-static int cnss_mhi_pm_runtime_get(struct mhi_controller *mhi_ctrl, void *priv)
+#ifndef CONFIG_MHI_BUS
+void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic)
{
- struct cnss_pci_data *pci_priv = priv;
-
- return pm_runtime_get(&pci_priv->pci_dev->dev);
}
-static void cnss_mhi_pm_runtime_put_noidle(struct mhi_controller *mhi_ctrl,
- void *priv)
+static inline int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
{
- struct cnss_pci_data *pci_priv = priv;
-
- pm_runtime_put_noidle(&pci_priv->pci_dev->dev);
+ return -EINVAL;
}
+static inline void cnss_pci_unregister_mhi(struct cnss_pci_data *pci_priv)
+{
+}
+
+inline int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv,
+ enum cnss_mhi_state mhi_state)
+{
+ return -EINVAL;
+}
+
+inline int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv)
+{
+ return -EINVAL;
+}
+
+#else
static char *cnss_mhi_state_to_str(enum cnss_mhi_state mhi_state)
{
switch (mhi_state) {
@@ -1926,6 +1903,21 @@
}
};
+static int cnss_mhi_pm_runtime_get(struct mhi_controller *mhi_ctrl, void *priv)
+{
+ struct cnss_pci_data *pci_priv = priv;
+
+ return pm_runtime_get(&pci_priv->pci_dev->dev);
+}
+
+static void cnss_mhi_pm_runtime_put_noidle(struct mhi_controller *mhi_ctrl,
+ void *priv)
+{
+ struct cnss_pci_data *pci_priv = priv;
+
+ pm_runtime_put_noidle(&pci_priv->pci_dev->dev);
+}
+
void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic)
{
struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
@@ -2002,34 +1994,6 @@
complete(&plat_priv->rddm_complete);
}
-void cnss_pci_clear_dump_info(struct cnss_pci_data *pci_priv)
-{
- struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
-
- plat_priv->ramdump_info_v2.dump_data.nentries = 0;
- plat_priv->ramdump_info_v2.dump_data_valid = false;
-}
-
-static int cnss_mhi_link_status(struct mhi_controller *mhi_ctrl, void *priv)
-{
- struct cnss_pci_data *pci_priv = priv;
- u16 device_id;
-
- if (!pci_priv) {
- cnss_pr_err("pci_priv is NULL\n");
- return -EINVAL;
- }
-
- pci_read_config_word(pci_priv->pci_dev, PCI_DEVICE_ID, &device_id);
- if (device_id != pci_priv->device_id) {
- cnss_pr_err("PCI device ID mismatch, link possibly down, current read ID: 0x%x, record ID: 0x%x\n",
- device_id, pci_priv->device_id);
- return -EIO;
- }
-
- return 0;
-}
-
static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv,
enum MHI_CB reason)
{
@@ -2172,87 +2136,6 @@
kfree(mhi_ctrl->irq);
}
-static int cnss_pci_check_mhi_state_bit(struct cnss_pci_data *pci_priv,
- enum cnss_mhi_state mhi_state)
-{
- switch (mhi_state) {
- case CNSS_MHI_INIT:
- if (!test_bit(CNSS_MHI_INIT, &pci_priv->mhi_state))
- return 0;
- break;
- case CNSS_MHI_DEINIT:
- case CNSS_MHI_POWER_ON:
- if (test_bit(CNSS_MHI_INIT, &pci_priv->mhi_state) &&
- !test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state))
- return 0;
- break;
- case CNSS_MHI_FORCE_POWER_OFF:
- if (test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state))
- return 0;
- break;
- case CNSS_MHI_POWER_OFF:
- case CNSS_MHI_SUSPEND:
- if (test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state) &&
- !test_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state))
- return 0;
- break;
- case CNSS_MHI_RESUME:
- if (test_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state))
- return 0;
- break;
- case CNSS_MHI_TRIGGER_RDDM:
- if (test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state) &&
- !test_bit(CNSS_MHI_TRIGGER_RDDM, &pci_priv->mhi_state))
- return 0;
- break;
- case CNSS_MHI_RDDM_DONE:
- return 0;
- default:
- cnss_pr_err("Unhandled MHI state: %s(%d)\n",
- cnss_mhi_state_to_str(mhi_state), mhi_state);
- }
-
- cnss_pr_err("Cannot set MHI state %s(%d) in current MHI state (0x%lx)\n",
- cnss_mhi_state_to_str(mhi_state), mhi_state,
- pci_priv->mhi_state);
-
- return -EINVAL;
-}
-
-static void cnss_pci_set_mhi_state_bit(struct cnss_pci_data *pci_priv,
- enum cnss_mhi_state mhi_state)
-{
- switch (mhi_state) {
- case CNSS_MHI_INIT:
- set_bit(CNSS_MHI_INIT, &pci_priv->mhi_state);
- break;
- case CNSS_MHI_DEINIT:
- clear_bit(CNSS_MHI_INIT, &pci_priv->mhi_state);
- break;
- case CNSS_MHI_POWER_ON:
- set_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state);
- break;
- case CNSS_MHI_POWER_OFF:
- case CNSS_MHI_FORCE_POWER_OFF:
- clear_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state);
- clear_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state);
- break;
- case CNSS_MHI_SUSPEND:
- set_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state);
- break;
- case CNSS_MHI_RESUME:
- clear_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state);
- break;
- case CNSS_MHI_TRIGGER_RDDM:
- break;
- case CNSS_MHI_RDDM_DONE:
- set_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state);
- break;
- default:
- cnss_pr_err("Unhandled MHI state (%d)\n", mhi_state);
- }
-}
-
int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv,
enum cnss_mhi_state mhi_state)
{
@@ -2326,6 +2209,147 @@
return ret;
}
+static int cnss_mhi_link_status(struct mhi_controller *mhi_ctrl, void *priv)
+{
+ struct cnss_pci_data *pci_priv = priv;
+ u16 device_id;
+
+ if (!pci_priv) {
+ cnss_pr_err("pci_priv is NULL\n");
+ return -EINVAL;
+ }
+
+ pci_read_config_word(pci_priv->pci_dev, PCI_DEVICE_ID, &device_id);
+ if (device_id != pci_priv->device_id) {
+ cnss_pr_err("PCI device ID mismatch, link possibly down, current read ID: 0x%x, record ID: 0x%x\n",
+ device_id, pci_priv->device_id);
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static int cnss_pci_check_mhi_state_bit(struct cnss_pci_data *pci_priv,
+ enum cnss_mhi_state mhi_state)
+{
+ switch (mhi_state) {
+ case CNSS_MHI_INIT:
+ if (!test_bit(CNSS_MHI_INIT, &pci_priv->mhi_state))
+ return 0;
+ break;
+ case CNSS_MHI_DEINIT:
+ case CNSS_MHI_POWER_ON:
+ if (test_bit(CNSS_MHI_INIT, &pci_priv->mhi_state) &&
+ !test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state))
+ return 0;
+ break;
+ case CNSS_MHI_FORCE_POWER_OFF:
+ if (test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state))
+ return 0;
+ break;
+ case CNSS_MHI_POWER_OFF:
+ case CNSS_MHI_SUSPEND:
+ if (test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state) &&
+ !test_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state))
+ return 0;
+ break;
+ case CNSS_MHI_RESUME:
+ if (test_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state))
+ return 0;
+ break;
+ case CNSS_MHI_TRIGGER_RDDM:
+ if (test_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state) &&
+ !test_bit(CNSS_MHI_TRIGGER_RDDM, &pci_priv->mhi_state))
+ return 0;
+ break;
+ case CNSS_MHI_RDDM_DONE:
+ return 0;
+ default:
+ cnss_pr_err("Unhandled MHI state: %s(%d)\n",
+ cnss_mhi_state_to_str(mhi_state), mhi_state);
+ }
+
+ cnss_pr_err("Cannot set MHI state %s(%d) in current MHI state (0x%lx)\n",
+ cnss_mhi_state_to_str(mhi_state), mhi_state,
+ pci_priv->mhi_state);
+
+ return -EINVAL;
+}
+
+static int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv)
+{
+ int ret;
+ struct cnss_plat_data *plat_priv;
+
+ if (!pci_priv)
+ return -ENODEV;
+
+ plat_priv = pci_priv->plat_priv;
+ if (!plat_priv)
+ return -ENODEV;
+
+ if (test_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state))
+ return 0;
+
+ ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_TRIGGER_RDDM);
+ if (ret) {
+ cnss_pr_err("Failed to trigger RDDM, err = %d\n", ret);
+ cnss_schedule_recovery(&pci_priv->pci_dev->dev,
+ CNSS_REASON_DEFAULT);
+ return ret;
+ }
+
+ if (!test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state)) {
+ mod_timer(&plat_priv->fw_boot_timer,
+ jiffies + msecs_to_jiffies(FW_ASSERT_TIMEOUT));
+ }
+
+ return 0;
+}
+#endif
+
+void cnss_pci_clear_dump_info(struct cnss_pci_data *pci_priv)
+{
+ struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
+
+ plat_priv->ramdump_info_v2.dump_data.nentries = 0;
+ plat_priv->ramdump_info_v2.dump_data_valid = false;
+}
+
+static void cnss_pci_set_mhi_state_bit(struct cnss_pci_data *pci_priv,
+ enum cnss_mhi_state mhi_state)
+{
+ switch (mhi_state) {
+ case CNSS_MHI_INIT:
+ set_bit(CNSS_MHI_INIT, &pci_priv->mhi_state);
+ break;
+ case CNSS_MHI_DEINIT:
+ clear_bit(CNSS_MHI_INIT, &pci_priv->mhi_state);
+ break;
+ case CNSS_MHI_POWER_ON:
+ set_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state);
+ break;
+ case CNSS_MHI_POWER_OFF:
+ case CNSS_MHI_FORCE_POWER_OFF:
+ clear_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state);
+ clear_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state);
+ break;
+ case CNSS_MHI_SUSPEND:
+ set_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state);
+ break;
+ case CNSS_MHI_RESUME:
+ clear_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state);
+ break;
+ case CNSS_MHI_TRIGGER_RDDM:
+ break;
+ case CNSS_MHI_RDDM_DONE:
+ set_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state);
+ break;
+ default:
+ cnss_pr_err("Unhandled MHI state (%d)\n", mhi_state);
+ }
+}
+
int cnss_pci_start_mhi(struct cnss_pci_data *pci_priv)
{
int ret = 0;
diff --git a/drivers/net/wireless/cnss2/pci.h b/drivers/net/wireless/cnss2/pci.h
index 32dd323..debb554 100644
--- a/drivers/net/wireless/cnss2/pci.h
+++ b/drivers/net/wireless/cnss2/pci.h
@@ -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
@@ -69,7 +69,9 @@
void __iomem *bar;
struct cnss_msi_config *msi_config;
u32 msi_ep_base_data;
+#ifdef CONFIG_MHI_BUS
struct mhi_controller *mhi_ctrl;
+#endif
unsigned long mhi_state;
};
diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c
index d799480..601f09f 100644
--- a/drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c
+++ b/drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1462,7 +1462,7 @@
int cnt = 0;
int i;
- for (i = 0; i < IPA_EVENT_MAX_NUM; i++) {
+ for (i = 0; i < ARRAY_SIZE(ipa_event_name); i++) {
nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
"msg[%u:%27s] W:%u R:%u\n", i,
ipa_event_name[i],
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c
index 335e796..b68be36 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c
@@ -1551,7 +1551,7 @@
int cnt = 0;
int i;
- for (i = 0; i < IPA_EVENT_MAX_NUM; i++) {
+ for (i = 0; i < ARRAY_SIZE(ipa3_event_name); i++) {
nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
"msg[%u:%27s] W:%u R:%u\n", i,
ipa3_event_name[i],
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c
index fd3206e..ed2a43d 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c
@@ -1242,7 +1242,7 @@
tbl = __ipa3_find_rt_tbl(rules->ip, rules->rt_tbl_name);
if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) {
IPAERR_RL("failed finding rt tbl name = %s\n",
- rules->rt_tbl_name ? rules->rt_tbl_name : "");
+ (rules->rt_tbl_name != NULL) ? rules->rt_tbl_name : "");
ret = -EINVAL;
goto bail;
}
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c
index 016b4f3..d72334e 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_nat.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -17,7 +17,6 @@
#define IPA_64_LOW_32_MASK (0xFFFFFFFF)
#define IPA_64_HIGH_32_MASK (0xFFFFFFFF00000000ULL)
-#define IPAHAL_NAT_INVALID_PROTOCOL (0xFF)
static const char *ipahal_nat_type_to_str[IPA_NAT_MAX] = {
__stringify(IPAHAL_NAT_IPV4),
diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
index a5599f3..6a477f2 100644
--- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -728,7 +728,8 @@
retval = -EFAULT;
}
- req->install_status = QMI_RESULT_SUCCESS_V01;
+ req->install_status = (enum ipa_qmi_result_type_v01)
+ QMI_RESULT_SUCCESS_V01;
req->rule_id_valid = 1;
req->rule_id_len = rmnet_ipa3_ctx->num_q6_rules;
for (i = 0; i < rmnet_ipa3_ctx->num_q6_rules; i++) {
diff --git a/drivers/platform/msm/qcom-geni-se.c b/drivers/platform/msm/qcom-geni-se.c
index 45b269b..df6059c 100644
--- a/drivers/platform/msm/qcom-geni-se.c
+++ b/drivers/platform/msm/qcom-geni-se.c
@@ -44,6 +44,11 @@
static unsigned long default_bus_bw_set[] = {0, 19200000, 50000000,
100000000, 150000000, 200000000, 236000000};
+struct bus_vectors {
+ int src;
+ int dst;
+};
+
/**
* @struct geni_se_device - Data structure to represent the QUPv3 Core
* @dev: Device pointer of the QUPv3 core.
@@ -53,18 +58,32 @@
* @iommu_s1_bypass: Bypass IOMMU stage 1 translation.
* @base: Base address of this instance of QUPv3 core.
* @bus_bw: Client handle to the bus bandwidth request.
+ * @bus_bw_noc: Client handle to the QUP clock and DDR path bus
+ bandwidth request.
* @bus_mas_id: Master Endpoint ID for bus BW request.
* @bus_slv_id: Slave Endpoint ID for bus BW request.
* @geni_dev_lock: Lock to protect the bus ab & ib values, list.
* @ab_list_head: Sorted resource list based on average bus BW.
* @ib_list_head: Sorted resource list based on instantaneous bus BW.
+ * @ab_list_head_noc: Sorted resource list based on average DDR path bus BW.
+ * @ib_list_head_noc: Sorted resource list based on instantaneous DDR path
+ bus BW.
* @cur_ab: Current Bus Average BW request value.
* @cur_ib: Current Bus Instantaneous BW request value.
+ * @cur_ab_noc: Current DDR Bus Average BW request value.
+ * @cur_ib_noc: Current DDR Bus Instantaneous BW request value.
* @bus_bw_set: Clock plan for the bus driver.
+ * @bus_bw_set_noc: Clock plan for DDR path.
* @cur_bus_bw_idx: Current index within the bus clock plan.
+ * @cur_bus_bw_idx_noc: Current index within the DDR path clock plan.
* @num_clk_levels: Number of valid clock levels in clk_perf_tbl.
* @clk_perf_tbl: Table of clock frequency input to Serial Engine clock.
- * @log_ctx: Logging context to hold the debug information
+ * @log_ctx: Logging context to hold the debug information.
+ * @vectors: Structure to store Master End and Slave End IDs for
+ QUPv3 clock and DDR path bus BW request.
+ * @num_paths: Two paths. QUPv3 clock and DDR paths.
+ * @num_usecases: One usecase to vote for both QUPv3 clock and DDR paths.
+ * @pdata: To register our client handle with the ICB driver.
*/
struct geni_se_device {
struct device *dev;
@@ -74,19 +93,31 @@
bool iommu_s1_bypass;
void __iomem *base;
struct msm_bus_client_handle *bus_bw;
+ uint32_t bus_bw_noc;
u32 bus_mas_id;
u32 bus_slv_id;
struct mutex geni_dev_lock;
struct list_head ab_list_head;
struct list_head ib_list_head;
+ struct list_head ab_list_head_noc;
+ struct list_head ib_list_head_noc;
unsigned long cur_ab;
unsigned long cur_ib;
+ unsigned long cur_ab_noc;
+ unsigned long cur_ib_noc;
int bus_bw_set_size;
+ int bus_bw_set_size_noc;
unsigned long *bus_bw_set;
+ unsigned long *bus_bw_set_noc;
int cur_bus_bw_idx;
+ int cur_bus_bw_idx_noc;
unsigned int num_clk_levels;
unsigned long *clk_perf_tbl;
void *log_ctx;
+ struct bus_vectors *vectors;
+ int num_paths;
+ int num_usecases;
+ struct msm_bus_scale_pdata *pdata;
};
/* Offset of QUPV3 Hardware Version Register */
@@ -649,11 +680,37 @@
return bus_bw_update;
}
+static bool geni_se_check_bus_bw_noc(struct geni_se_device *geni_se_dev)
+{
+ int i;
+ int new_bus_bw_idx = geni_se_dev->bus_bw_set_size_noc - 1;
+ unsigned long new_bus_bw;
+ bool bus_bw_update = false;
+
+ new_bus_bw = max(geni_se_dev->cur_ib_noc, geni_se_dev->cur_ab_noc) /
+ DEFAULT_BUS_WIDTH;
+
+ for (i = 0; i < geni_se_dev->bus_bw_set_size_noc; i++) {
+ if (geni_se_dev->bus_bw_set_noc[i] >= new_bus_bw) {
+ new_bus_bw_idx = i;
+ break;
+ }
+ }
+
+ if (geni_se_dev->cur_bus_bw_idx_noc != new_bus_bw_idx) {
+ geni_se_dev->cur_bus_bw_idx_noc = new_bus_bw_idx;
+ bus_bw_update = true;
+ }
+
+ return bus_bw_update;
+}
+
static int geni_se_rmv_ab_ib(struct geni_se_device *geni_se_dev,
struct se_geni_rsc *rsc)
{
struct se_geni_rsc *tmp;
bool bus_bw_update = false;
+ bool bus_bw_update_noc = false;
int ret = 0;
if (unlikely(list_empty(&rsc->ab_list) || list_empty(&rsc->ib_list)))
@@ -672,14 +729,56 @@
geni_se_dev->cur_ib = 0;
bus_bw_update = geni_se_check_bus_bw(geni_se_dev);
- if (bus_bw_update)
+
+ if (geni_se_dev->num_paths == 2) {
+ geni_se_dev->pdata->usecase[1].vectors[0].ab =
+ geni_se_dev->cur_ab;
+ geni_se_dev->pdata->usecase[1].vectors[0].ib =
+ geni_se_dev->cur_ib;
+ }
+
+ if (bus_bw_update && geni_se_dev->num_paths != 2)
ret = msm_bus_scale_update_bw(geni_se_dev->bus_bw,
geni_se_dev->cur_ab,
geni_se_dev->cur_ib);
GENI_SE_DBG(geni_se_dev->log_ctx, false, NULL,
- "%s: %s: cur_ab_ib(%lu:%lu) req_ab_ib(%lu:%lu) %d\n",
- __func__, dev_name(rsc->ctrl_dev), geni_se_dev->cur_ab,
- geni_se_dev->cur_ib, rsc->ab, rsc->ib, bus_bw_update);
+ "%s: %s: cur_ab_ib(%lu:%lu) req_ab_ib(%lu:%lu) %d\n",
+ __func__, dev_name(rsc->ctrl_dev), geni_se_dev->cur_ab,
+ geni_se_dev->cur_ib, rsc->ab, rsc->ib, bus_bw_update);
+
+
+ if (geni_se_dev->num_paths == 2) {
+ if (unlikely(list_empty(&rsc->ab_list_noc) ||
+ list_empty(&rsc->ib_list_noc)))
+ return -EINVAL;
+
+ list_del_init(&rsc->ab_list_noc);
+ geni_se_dev->cur_ab_noc -= rsc->ab_noc;
+
+ list_del_init(&rsc->ib_list_noc);
+ tmp = list_first_entry_or_null(&geni_se_dev->ib_list_head_noc,
+ struct se_geni_rsc, ib_list_noc);
+ if (tmp && tmp->ib_noc != geni_se_dev->cur_ib_noc)
+ geni_se_dev->cur_ib_noc = tmp->ib_noc;
+ else if (!tmp && geni_se_dev->cur_ib_noc)
+ geni_se_dev->cur_ib_noc = 0;
+
+ bus_bw_update_noc = geni_se_check_bus_bw_noc(geni_se_dev);
+
+ geni_se_dev->pdata->usecase[1].vectors[1].ab =
+ geni_se_dev->cur_ab_noc;
+ geni_se_dev->pdata->usecase[1].vectors[1].ib =
+ geni_se_dev->cur_ib_noc;
+
+ if (bus_bw_update_noc || bus_bw_update)
+ ret = msm_bus_scale_client_update_request
+ (geni_se_dev->bus_bw_noc, 1);
+ GENI_SE_DBG(geni_se_dev->log_ctx, false, NULL,
+ "%s: %s: cur_ab_ib_noc(%lu:%lu) req_ab_ib_noc(%lu:%lu) %d\n",
+ __func__, dev_name(rsc->ctrl_dev),
+ geni_se_dev->cur_ab_noc, geni_se_dev->cur_ib_noc,
+ rsc->ab_noc, rsc->ib_noc, bus_bw_update_noc);
+ }
mutex_unlock(&geni_se_dev->geni_dev_lock);
return ret;
}
@@ -700,7 +799,8 @@
return -EINVAL;
geni_se_dev = dev_get_drvdata(rsc->wrapper_dev);
- if (unlikely(!geni_se_dev || !geni_se_dev->bus_bw))
+ if (unlikely(!geni_se_dev || !(geni_se_dev->bus_bw ||
+ geni_se_dev->bus_bw_noc)))
return -ENODEV;
clk_disable_unprepare(rsc->se_clk);
@@ -711,6 +811,7 @@
if (ret)
GENI_SE_ERR(geni_se_dev->log_ctx, false, NULL,
"%s: Error %d during bus_bw_update\n", __func__, ret);
+
return ret;
}
EXPORT_SYMBOL(se_geni_clks_off);
@@ -731,7 +832,9 @@
return -EINVAL;
geni_se_dev = dev_get_drvdata(rsc->wrapper_dev);
- if (unlikely(!geni_se_dev || !geni_se_dev->bus_bw))
+ if (unlikely(!geni_se_dev ||
+ !(geni_se_dev->bus_bw ||
+ geni_se_dev->bus_bw_noc)))
return -ENODEV;
ret = se_geni_clks_off(rsc);
@@ -751,10 +854,13 @@
{
struct se_geni_rsc *tmp = NULL;
struct list_head *ins_list_head;
+ struct list_head *ins_list_head_noc;
bool bus_bw_update = false;
+ bool bus_bw_update_noc = false;
int ret = 0;
mutex_lock(&geni_se_dev->geni_dev_lock);
+
list_add(&rsc->ab_list, &geni_se_dev->ab_list_head);
geni_se_dev->cur_ab += rsc->ab;
@@ -770,14 +876,57 @@
geni_se_dev->cur_ib = rsc->ib;
bus_bw_update = geni_se_check_bus_bw(geni_se_dev);
- if (bus_bw_update)
+
+ if (geni_se_dev->num_paths == 2) {
+ geni_se_dev->pdata->usecase[1].vectors[0].ab =
+ geni_se_dev->cur_ab;
+ geni_se_dev->pdata->usecase[1].vectors[0].ib =
+ geni_se_dev->cur_ib;
+ }
+
+ if (bus_bw_update && geni_se_dev->num_paths != 2)
ret = msm_bus_scale_update_bw(geni_se_dev->bus_bw,
geni_se_dev->cur_ab,
geni_se_dev->cur_ib);
GENI_SE_DBG(geni_se_dev->log_ctx, false, NULL,
- "%s: %s: cur_ab_ib(%lu:%lu) req_ab_ib(%lu:%lu) %d\n",
- __func__, dev_name(rsc->ctrl_dev), geni_se_dev->cur_ab,
- geni_se_dev->cur_ib, rsc->ab, rsc->ib, bus_bw_update);
+ "%s: %s: cur_ab_ib(%lu:%lu) req_ab_ib(%lu:%lu) %d\n",
+ __func__, dev_name(rsc->ctrl_dev),
+ geni_se_dev->cur_ab, geni_se_dev->cur_ib,
+ rsc->ab, rsc->ib, bus_bw_update);
+
+
+ if (geni_se_dev->num_paths == 2) {
+
+ list_add(&rsc->ab_list_noc, &geni_se_dev->ab_list_head_noc);
+ geni_se_dev->cur_ab_noc += rsc->ab_noc;
+ ins_list_head_noc = &geni_se_dev->ib_list_head_noc;
+
+ list_for_each_entry(tmp, &geni_se_dev->ib_list_head_noc,
+ ib_list_noc) {
+ if (tmp->ib < rsc->ib)
+ break;
+ ins_list_head_noc = &tmp->ib_list_noc;
+ }
+ list_add(&rsc->ib_list_noc, ins_list_head_noc);
+
+ if (ins_list_head_noc == &geni_se_dev->ib_list_head_noc)
+ geni_se_dev->cur_ib_noc = rsc->ib_noc;
+
+ bus_bw_update_noc = geni_se_check_bus_bw_noc(geni_se_dev);
+
+ geni_se_dev->pdata->usecase[1].vectors[1].ab =
+ geni_se_dev->cur_ab_noc;
+ geni_se_dev->pdata->usecase[1].vectors[1].ib =
+ geni_se_dev->cur_ib_noc;
+ if (bus_bw_update_noc || bus_bw_update)
+ ret = msm_bus_scale_client_update_request
+ (geni_se_dev->bus_bw_noc, 1);
+ GENI_SE_DBG(geni_se_dev->log_ctx, false, NULL,
+ "%s: %s: cur_ab_ib_noc(%lu:%lu) req_ab_ib_noc(%lu:%lu) %d\n",
+ __func__, dev_name(rsc->ctrl_dev),
+ geni_se_dev->cur_ab_noc, geni_se_dev->cur_ib_noc,
+ rsc->ab_noc, rsc->ib_noc, bus_bw_update_noc);
+ }
mutex_unlock(&geni_se_dev->geni_dev_lock);
return ret;
}
@@ -888,21 +1037,42 @@
if (unlikely(!geni_se_dev))
return -EPROBE_DEFER;
- if (unlikely(IS_ERR_OR_NULL(geni_se_dev->bus_bw))) {
- geni_se_dev->bus_bw = msm_bus_scale_register(
- geni_se_dev->bus_mas_id,
- geni_se_dev->bus_slv_id,
- (char *)dev_name(geni_se_dev->dev),
- false);
- if (IS_ERR_OR_NULL(geni_se_dev->bus_bw)) {
- GENI_SE_ERR(geni_se_dev->log_ctx, false, NULL,
- "%s: Error creating bus client\n", __func__);
- return (int)PTR_ERR(geni_se_dev->bus_bw);
+ if (geni_se_dev->num_paths == 2) {
+ if (unlikely(!(geni_se_dev->bus_bw_noc))) {
+ geni_se_dev->bus_bw_noc =
+ msm_bus_scale_register_client(geni_se_dev->pdata);
+ if (!(geni_se_dev->bus_bw_noc)) {
+ GENI_SE_ERR(geni_se_dev->log_ctx,
+ false, NULL,
+ "%s: Error creating bus client\n", __func__);
+ return -EFAULT;
+ }
}
+
+ rsc->ab = ab;
+ rsc->ib = ab;
+ rsc->ab_noc = 0;
+ rsc->ib_noc = ib;
+ INIT_LIST_HEAD(&rsc->ab_list_noc);
+ INIT_LIST_HEAD(&rsc->ib_list_noc);
+ } else {
+ if (unlikely(IS_ERR_OR_NULL(geni_se_dev->bus_bw))) {
+ geni_se_dev->bus_bw = msm_bus_scale_register(
+ geni_se_dev->bus_mas_id,
+ geni_se_dev->bus_slv_id,
+ (char *)dev_name(geni_se_dev->dev),
+ false);
+ if (IS_ERR_OR_NULL(geni_se_dev->bus_bw)) {
+ GENI_SE_ERR(geni_se_dev->log_ctx,
+ false, NULL,
+ "%s: Error creating bus client\n", __func__);
+ return (int)PTR_ERR(geni_se_dev->bus_bw);
+ }
+ }
+ rsc->ab = ab;
+ rsc->ib = ib;
}
- rsc->ab = ab;
- rsc->ib = ib;
INIT_LIST_HEAD(&rsc->ab_list);
INIT_LIST_HEAD(&rsc->ib_list);
geni_se_iommu_map_and_attach(geni_se_dev);
@@ -1429,6 +1599,87 @@
{}
};
+static struct msm_bus_scale_pdata *ab_ib_register(struct platform_device *pdev,
+ struct geni_se_device *host)
+{
+ int rc = 0;
+ struct device *dev = &pdev->dev;
+ int i = 0, j, len;
+ bool mem_err = false;
+ const uint32_t *vec_arr = NULL;
+ struct msm_bus_scale_pdata *pdata = NULL;
+ struct msm_bus_paths *usecase = NULL;
+
+ vec_arr = of_get_property(dev->of_node,
+ "qcom,msm-bus,vectors-bus-ids", &len);
+ if (vec_arr == NULL) {
+ pr_err("Error: Vector array not found\n");
+ rc = 1;
+ goto out;
+ }
+
+ if (len != host->num_paths * sizeof(uint32_t) * 2) {
+ pr_err("Error: Length-error on getting vectors\n");
+ rc = 1;
+ goto out;
+ }
+
+
+ pdata = devm_kzalloc(dev, sizeof(struct msm_bus_scale_pdata),
+ GFP_KERNEL);
+ if (!pdata) {
+ mem_err = true;
+ goto out;
+ }
+
+ pdata->name = (char *)dev_name(host->dev);
+
+ pdata->num_usecases = 2;
+
+ pdata->active_only = 0;
+
+ usecase = devm_kzalloc(dev, (sizeof(struct msm_bus_paths) *
+ pdata->num_usecases), GFP_KERNEL);
+ if (!usecase) {
+ mem_err = true;
+ goto out;
+ }
+
+ for (i = 0; i < pdata->num_usecases; i++) {
+ usecase[i].num_paths = host->num_paths;
+ usecase[i].vectors = devm_kzalloc(dev, host->num_paths *
+ sizeof(struct msm_bus_vectors), GFP_KERNEL);
+ if (!usecase[i].vectors) {
+ mem_err = true;
+ pr_err("Error: Mem alloc failure in vectors\n");
+ goto out;
+ }
+
+ for (j = 0; j < host->num_paths; j++) {
+ int index = (j * 2);
+
+ usecase[i].vectors[j].src =
+ be32_to_cpu(vec_arr[index]);
+ usecase[i].vectors[j].dst =
+ be32_to_cpu(vec_arr[index + 1]);
+ usecase[i].vectors[j].ab = 0;
+ usecase[i].vectors[j].ib = 0;
+ }
+ }
+
+ pdata->usecase = usecase;
+
+ return pdata;
+out:
+ if (mem_err) {
+ for ( ; i > 0; i--)
+ kfree(usecase[i-1].vectors);
+ kfree(usecase);
+ kfree(pdata);
+ }
+ return NULL;
+}
+
static int geni_se_iommu_probe(struct device *dev)
{
struct geni_se_device *geni_se_dev;
@@ -1457,6 +1708,15 @@
struct resource *res;
struct geni_se_device *geni_se_dev;
+ ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+ if (ret) {
+ ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+ if (ret) {
+ dev_err(&pdev->dev, "could not set DMA mask\n");
+ return ret;
+ }
+ }
+
if (of_device_is_compatible(dev->of_node, "qcom,qupv3-geni-se-cb"))
return geni_se_iommu_probe(dev);
@@ -1480,28 +1740,57 @@
}
geni_se_dev->dev = dev;
- ret = of_property_read_u32(dev->of_node, "qcom,bus-mas-id",
- &geni_se_dev->bus_mas_id);
- if (ret) {
- dev_err(dev, "%s: Error missing bus master id\n", __func__);
- devm_iounmap(dev, geni_se_dev->base);
- devm_kfree(dev, geni_se_dev);
+
+ ret = of_property_read_u32(dev->of_node, "qcom,msm-bus,num-paths",
+ &geni_se_dev->num_paths);
+ if (!ret) {
+ geni_se_dev->pdata = ab_ib_register(pdev, geni_se_dev);
+ if (geni_se_dev->pdata == NULL) {
+ dev_err(dev,
+ "%s: Error missing bus master and slave id\n",
+ __func__);
+ devm_iounmap(dev, geni_se_dev->base);
+ devm_kfree(dev, geni_se_dev);
+ }
}
- ret = of_property_read_u32(dev->of_node, "qcom,bus-slv-id",
+
+ else {
+ geni_se_dev->num_paths = 1;
+ ret = of_property_read_u32(dev->of_node, "qcom,bus-mas-id",
+ &geni_se_dev->bus_mas_id);
+ if (ret) {
+ dev_err(dev, "%s: Error missing bus master id\n",
+ __func__);
+ devm_iounmap(dev, geni_se_dev->base);
+ devm_kfree(dev, geni_se_dev);
+ }
+ ret = of_property_read_u32(dev->of_node, "qcom,bus-slv-id",
&geni_se_dev->bus_slv_id);
- if (ret) {
- dev_err(dev, "%s: Error missing bus slave id\n", __func__);
- devm_iounmap(dev, geni_se_dev->base);
- devm_kfree(dev, geni_se_dev);
+ if (ret) {
+ dev_err(dev, "%s: Error missing bus slave id\n",
+ __func__);
+ devm_iounmap(dev, geni_se_dev->base);
+ devm_kfree(dev, geni_se_dev);
+ }
}
geni_se_dev->iommu_s1_bypass = of_property_read_bool(dev->of_node,
"qcom,iommu-s1-bypass");
geni_se_dev->bus_bw_set = default_bus_bw_set;
- geni_se_dev->bus_bw_set_size = ARRAY_SIZE(default_bus_bw_set);
+ geni_se_dev->bus_bw_set_size =
+ ARRAY_SIZE(default_bus_bw_set);
+ if (geni_se_dev->num_paths == 2) {
+ geni_se_dev->bus_bw_set_noc = default_bus_bw_set;
+ geni_se_dev->bus_bw_set_size_noc =
+ ARRAY_SIZE(default_bus_bw_set);
+ }
mutex_init(&geni_se_dev->iommu_lock);
INIT_LIST_HEAD(&geni_se_dev->ab_list_head);
INIT_LIST_HEAD(&geni_se_dev->ib_list_head);
+ if (geni_se_dev->num_paths == 2) {
+ INIT_LIST_HEAD(&geni_se_dev->ab_list_head_noc);
+ INIT_LIST_HEAD(&geni_se_dev->ib_list_head_noc);
+ }
mutex_init(&geni_se_dev->geni_dev_lock);
geni_se_dev->log_ctx = ipc_log_context_create(NUM_LOG_PAGES,
dev_name(geni_se_dev->dev), 0);
diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c
index 05a8c66..465e079 100644
--- a/drivers/platform/msm/sps/sps.c
+++ b/drivers/platform/msm/sps/sps.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-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
@@ -675,7 +675,8 @@
/* Search for the target BAM device */
bam = sps_h2bam(dev);
if (bam == NULL) {
- pr_err("sps:Can't find any BAM with handle 0x%lx.", dev);
+ pr_err("sps:Can't find any BAM with handle 0x%pK.",
+ (void *)dev);
mutex_unlock(&sps->lock);
return SPS_ERROR;
}
@@ -1226,7 +1227,7 @@
{
struct sps_bam *bam;
- SPS_DBG1(sps, "sps:%s: BAM handle:0x%lx.", __func__, h);
+ SPS_DBG1(sps, "sps:%s: BAM handle:0x%pK.", __func__, (void *)h);
if (h == SPS_DEV_HANDLE_MEM || h == SPS_DEV_HANDLE_INVALID)
return NULL;
@@ -1236,7 +1237,7 @@
return bam;
}
- SPS_ERR(sps, "sps:Can't find BAM device for handle 0x%lx.", h);
+ SPS_ERR(sps, "sps:Can't find BAM device for handle 0x%pK.", (void *)h);
return NULL;
}
@@ -1341,16 +1342,17 @@
bam = sps_h2bam(dev);
if (bam == NULL) {
- SPS_ERR(sps, "sps:Invalid BAM device handle: 0x%lx", dev);
+ SPS_ERR(sps, "sps:Invalid BAM device handle: 0x%pK",
+ (void *)dev);
result = SPS_ERROR;
goto exit_err;
}
mutex_lock(&bam->lock);
- SPS_DBG2(bam, "sps:sps_connect: bam %pa src 0x%lx dest 0x%lx mode %s",
+ SPS_DBG2(bam, "sps:sps_connect: bam %pa src 0x%pK dest 0x%pK mode %s",
BAM_ID(bam),
- connect->source,
- connect->destination,
+ (void *)connect->source,
+ (void *)connect->destination,
connect->mode == SPS_MODE_SRC ? "SRC" : "DEST");
/* Allocate resources for the specified connection */
@@ -1414,10 +1416,10 @@
}
SPS_DBG2(bam,
- "sps:sps_disconnect: bam %pa src 0x%lx dest 0x%lx mode %s",
+ "sps:sps_disconnect: bam %pa src 0x%pK dest 0x%pK mode %s",
BAM_ID(bam),
- pipe->connect.source,
- pipe->connect.destination,
+ (void *)pipe->connect.source,
+ (void *)pipe->connect.destination,
pipe->connect.mode == SPS_MODE_SRC ? "SRC" : "DEST");
result = SPS_ERROR;
@@ -1813,7 +1815,8 @@
/* Search for the target BAM device */
bam = sps_h2bam(dev);
if (bam == NULL) {
- SPS_ERR(sps, "sps:Invalid BAM device handle: 0x%lx", dev);
+ SPS_ERR(sps, "sps:Invalid BAM device handle: 0x%pK",
+ (void *)dev);
result = SPS_ERROR;
goto exit_err;
}
@@ -1824,7 +1827,8 @@
result = sps_bam_reset(bam);
mutex_unlock(&bam->lock);
if (result) {
- SPS_ERR(sps, "sps:Fail to reset BAM device: 0x%lx", dev);
+ SPS_ERR(sps, "sps:Fail to reset BAM device: 0x%pK",
+ (void *)dev);
goto exit_err;
}
diff --git a/drivers/platform/msm/sps/sps_bam.c b/drivers/platform/msm/sps/sps_bam.c
index 7d6a7eb..475e9db 100644
--- a/drivers/platform/msm/sps/sps_bam.c
+++ b/drivers/platform/msm/sps/sps_bam.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-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
@@ -895,8 +895,8 @@
else
iova = bam_pipe->connect.source_iova;
SPS_DBG2(dev,
- "sps:BAM %pa pipe %d uses IOVA 0x%lx.\n",
- BAM_ID(dev), pipe_index, iova);
+ "sps:BAM %pa pipe %d uses IOVA 0x%pK.\n",
+ BAM_ID(dev), pipe_index, (void *)iova);
hw_params.peer_phys_addr = (u32)iova;
} else {
hw_params.peer_phys_addr = peer_bam->props.phys_addr;
@@ -918,9 +918,9 @@
hw_params.data_base =
(phys_addr_t)bam_pipe->connect.data.iova;
SPS_DBG2(dev,
- "sps:BAM %pa pipe %d uses IOVA 0x%lx for data FIFO.\n",
+ "sps:BAM %pa pipe %d uses IOVA 0x%pK for data FIFO.\n",
BAM_ID(dev), pipe_index,
- bam_pipe->connect.data.iova);
+ (void *)(bam_pipe->connect.data.iova));
} else {
hw_params.data_base = map->data.phys_base;
}
@@ -971,9 +971,9 @@
hw_params.desc_base =
(phys_addr_t)bam_pipe->connect.desc.iova;
SPS_DBG2(dev,
- "sps:BAM %pa pipe %d uses IOVA 0x%lx for desc FIFO.\n",
+ "sps:BAM %pa pipe %d uses IOVA 0x%pK for desc FIFO.\n",
BAM_ID(dev), pipe_index,
- bam_pipe->connect.desc.iova);
+ (void *)(bam_pipe->connect.desc.iova));
} else {
hw_params.desc_base = map->desc.phys_base;
}
@@ -1424,8 +1424,9 @@
u32 next_write;
static int show_recom;
- SPS_DBG(dev, "sps:BAM %pa pipe %d addr 0x%x size 0x%x flags 0x%x\n",
- BAM_ID(dev), pipe_index, addr, size, flags);
+ SPS_DBG(dev, "sps:BAM %pa pipe %d addr 0x%pK size 0x%x flags 0x%x\n",
+ BAM_ID(dev), pipe_index,
+ (void *)(long)addr, size, flags);
/* Is this a BAM-to-BAM or satellite connection? */
if ((pipe->state & (BAM_STATE_BAM2BAM | BAM_STATE_REMOTE))) {
@@ -1951,8 +1952,8 @@
user = &pipe->sys.user_ptrs[offset / sizeof(struct sps_iovec)];
for (;;) {
SPS_DBG(dev,
- "sps:%s; pipe index:%d; iovec addr:0x%x; size:0x%x; flags:0x%x; enabled:0x%x; *user is %s NULL.\n",
- __func__, pipe->pipe_index, cache->addr,
+ "sps:%s; pipe index:%d; iovec addr:0x%pK; size:0x%x; flags:0x%x; enabled:0x%x; *user is %s NULL.\n",
+ __func__, pipe->pipe_index, (void *)(long)cache->addr,
cache->size, cache->flags, enabled,
(*user == NULL) ? "" : "not");
@@ -2240,8 +2241,8 @@
pipe->sys.acked_offset = 0;
SPS_DBG(dev,
- "sps:%s; pipe index:%d; iovec addr:0x%x; size:0x%x; flags:0x%x; acked_offset:0x%x.\n",
- __func__, pipe->pipe_index, desc->addr,
+ "sps:%s; pipe index:%d; iovec addr:0x%pK; size:0x%x; flags:0x%x; acked_offset:0x%x.\n",
+ __func__, pipe->pipe_index, (void *)(long)desc->addr,
desc->size, desc->flags, pipe->sys.acked_offset);
return 0;
diff --git a/drivers/platform/msm/sps/sps_dma.c b/drivers/platform/msm/sps/sps_dma.c
index abdcabc..0cc42839 100644
--- a/drivers/platform/msm/sps/sps_dma.c
+++ b/drivers/platform/msm/sps/sps_dma.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, 2015, 2017, The Linux Foundation. All rights
+/* Copyright (c) 2011-2013, 2015, 2017, 2019, The Linux Foundation. All rights
* reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -381,7 +381,7 @@
dev = sps_dma_find_device(h);
if (dev == NULL) {
- SPS_ERR(sps, "sps:BAM-DMA: not registered: %lx", h);
+ SPS_ERR(sps, "sps:BAM-DMA: not registered: %pK", (void *)h);
result = SPS_ERROR;
goto exit_err;
}
@@ -547,8 +547,8 @@
dev = sps_dma_find_device(alloc->dev);
if (dev == NULL) {
- SPS_ERR(sps, "sps:BAM-DMA: invalid BAM handle: %lx",
- alloc->dev);
+ SPS_ERR(sps, "sps:BAM-DMA: invalid BAM handle: %pK",
+ (void *)alloc->dev);
goto exit_err;
}
@@ -621,7 +621,8 @@
dev = sps_dma_find_device(chan->dev);
if (dev == NULL) {
- SPS_ERR(sps, "sps:BAM-DMA: invalid BAM handle: %lx", chan->dev);
+ SPS_ERR(sps, "sps:BAM-DMA: invalid BAM handle: %pK",
+ (void *)chan->dev);
result = SPS_ERROR;
goto exit_err;
}
diff --git a/drivers/platform/msm/sps/sps_mem.c b/drivers/platform/msm/sps/sps_mem.c
index 105135a0..f5e026b 100644
--- a/drivers/platform/msm/sps/sps_mem.c
+++ b/drivers/platform/msm/sps/sps_mem.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, 2015, 2017, The Linux Foundation.
+/* Copyright (c) 2011-2013, 2015, 2017, 2019, The Linux Foundation.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -75,8 +75,8 @@
return SPS_ADDR_INVALID;
}
- SPS_DBG3(sps, "sps:sps_mem_alloc_io.phys=%pa.virt=0x%lx.size=0x%x.",
- &phys_addr, virt_addr, bytes);
+ SPS_DBG3(sps, "sps:sps_mem_alloc_io.phys=%pa.virt=0x%pK.size=0x%x.",
+ &phys_addr, (void *)virt_addr, bytes);
return phys_addr;
}
@@ -92,8 +92,8 @@
iomem_offset = phys_addr - iomem_phys;
virt_addr = (uintptr_t) iomem_virt + iomem_offset;
- SPS_DBG3(sps, "sps:sps_mem_free_io.phys=%pa.virt=0x%lx.size=0x%x.",
- &phys_addr, virt_addr, bytes);
+ SPS_DBG3(sps, "sps:sps_mem_free_io.phys=%pa.virt=0x%pK.size=0x%x.",
+ &phys_addr, (void *)virt_addr, bytes);
gen_pool_free(pool, virt_addr, bytes);
total_free += bytes;
diff --git a/drivers/platform/msm/sps/sps_rm.c b/drivers/platform/msm/sps/sps_rm.c
index 276b847..ef6029a 100644
--- a/drivers/platform/msm/sps/sps_rm.c
+++ b/drivers/platform/msm/sps/sps_rm.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2015, 2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2015, 2017, 2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -380,8 +380,8 @@
map->src.bam = sps_h2bam(map->src.dev);
if (map->src.bam == NULL) {
if (map->src.dev != SPS_DEV_HANDLE_MEM) {
- SPS_ERR(sps, "sps:Invalid BAM handle: %pa",
- &map->src.dev);
+ SPS_ERR(sps, "sps:Invalid BAM handle: %pK",
+ (void *)(&map->src.dev));
goto exit_err;
}
map->src.pipe_index = SPS_BAM_PIPE_INVALID;
@@ -389,8 +389,8 @@
map->dest.bam = sps_h2bam(map->dest.dev);
if (map->dest.bam == NULL) {
if (map->dest.dev != SPS_DEV_HANDLE_MEM) {
- SPS_ERR(sps, "sps:Invalid BAM handle: %pa",
- &map->dest.dev);
+ SPS_ERR(sps, "sps:Invalid BAM handle: %pK",
+ (void *)(&map->dest.dev));
goto exit_err;
}
map->dest.pipe_index = SPS_BAM_PIPE_INVALID;
@@ -399,8 +399,8 @@
/* Check the BAM device for the pipe */
if ((dir == SPS_MODE_SRC && map->src.bam == NULL) ||
(dir != SPS_MODE_SRC && map->dest.bam == NULL)) {
- SPS_ERR(sps, "sps:Invalid BAM endpt: dir %d src %pa dest %pa",
- dir, &map->src.dev, &map->dest.dev);
+ SPS_ERR(sps, "sps:Invalid BAM endpt: dir %d src %pK dest %pK",
+ dir, (void *)(&map->src.dev), (void *)(&map->dest.dev));
goto exit_err;
}
diff --git a/drivers/power/supply/qcom/qg-soc.c b/drivers/power/supply/qcom/qg-soc.c
index a4da904..e25e142 100644
--- a/drivers/power/supply/qcom/qg-soc.c
+++ b/drivers/power/supply/qcom/qg-soc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -118,6 +118,8 @@
static bool is_scaling_required(struct qpnp_qg *chip)
{
+ bool usb_present = is_usb_present(chip);
+
if (!chip->profile_loaded)
return false;
@@ -133,11 +135,16 @@
/* SOC has not changed */
return false;
-
- if (chip->catch_up_soc > chip->msoc && !is_usb_present(chip))
+ if (chip->catch_up_soc > chip->msoc && !usb_present)
/* USB is not present and SOC has increased */
return false;
+ if (chip->catch_up_soc > chip->msoc && usb_present &&
+ (chip->charge_status != POWER_SUPPLY_STATUS_CHARGING &&
+ chip->charge_status != POWER_SUPPLY_STATUS_FULL))
+ /* USB is present, but not charging */
+ return false;
+
return true;
}
diff --git a/drivers/power/supply/qcom/qpnp-fg-gen3.c b/drivers/power/supply/qcom/qpnp-fg-gen3.c
index d7ee5bd..28c7abb 100644
--- a/drivers/power/supply/qcom/qpnp-fg-gen3.c
+++ b/drivers/power/supply/qcom/qpnp-fg-gen3.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -4325,6 +4325,7 @@
#define DEFAULT_ESR_CHG_TIMER_RETRY 8
#define DEFAULT_ESR_CHG_TIMER_MAX 16
+#define VOLTAGE_MODE_SAT_CLEAR_BIT BIT(3)
static int fg_hw_init(struct fg_chip *chip)
{
int rc;
@@ -4548,6 +4549,14 @@
return rc;
}
+ rc = fg_sram_masked_write(chip, ESR_EXTRACTION_ENABLE_WORD,
+ ESR_EXTRACTION_ENABLE_OFFSET,
+ VOLTAGE_MODE_SAT_CLEAR_BIT,
+ VOLTAGE_MODE_SAT_CLEAR_BIT,
+ FG_IMA_DEFAULT);
+ if (rc < 0)
+ return rc;
+
fg_encode(chip->sp, FG_SRAM_ESR_TIGHT_FILTER,
chip->dt.esr_tight_flt_upct, buf);
rc = fg_sram_write(chip, chip->sp[FG_SRAM_ESR_TIGHT_FILTER].addr_word,
diff --git a/drivers/soc/qcom/bg_rsb.c b/drivers/soc/qcom/bg_rsb.c
index e653139..dd8e45c 100644
--- a/drivers/soc/qcom/bg_rsb.c
+++ b/drivers/soc/qcom/bg_rsb.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -22,13 +22,13 @@
#include <linux/platform_device.h>
#include <soc/qcom/glink.h>
#include <linux/input.h>
+#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/regulator/consumer.h>
#include <soc/qcom/subsystem_restart.h>
#include <soc/qcom/subsystem_notif.h>
-
#include "bgrsb.h"
#define BGRSB_GLINK_INTENT_SIZE 0x04
@@ -841,7 +841,6 @@
}
return 0;
}
-
static int store_enable(struct device *pdev, struct device_attribute *attr,
const char *buff, size_t count)
{
@@ -850,13 +849,16 @@
char *arr = kstrdup(buff, GFP_KERNEL);
if (!arr)
- goto err_ret;
+ return -ENOMEM;
+
+ if (!dev->is_cnfgrd) {
+ kfree(arr);
+ return -ENOMEDIUM;
+ }
rc = split_bg_work(dev, arr);
if (rc != 0)
pr_err("Not able to process request\n");
-
-err_ret:
return count;
}
diff --git a/drivers/soc/qcom/msm_smem.c b/drivers/soc/qcom/msm_smem.c
index 959aab9..dd49784 100644
--- a/drivers/soc/qcom/msm_smem.c
+++ b/drivers/soc/qcom/msm_smem.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
@@ -155,7 +155,7 @@
/* Identifier is a constant, set to SMEM_TARG_INFO_IDENTIFIER. */
uint32_t identifier;
uint32_t size;
- phys_addr_t phys_base_addr;
+ uint64_t phys_base_addr;
uint32_t max_items;
};
@@ -1317,7 +1317,7 @@
LOG_ERR("%s failed: invalid TARGET INFO magic\n", __func__);
return -ENODEV;
}
- smem_ram_phys = smem_targ_info->phys_base_addr;
+ smem_ram_phys = (phys_addr_t)smem_targ_info->phys_base_addr;
smem_ram_size = smem_targ_info->size;
if (smem_targ_info->max_items)
smem_max_items = smem_targ_info->max_items;
diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c
index bbcc715..b6214eb 100644
--- a/drivers/soc/qcom/socinfo.c
+++ b/drivers/soc/qcom/socinfo.c
@@ -603,8 +603,8 @@
/* SDM710 ID */
[360] = {MSM_CPU_SDM710, "SDM710"},
- /* SDMNOBELIUM ID */
- [393] = {MSM_CPU_SDMNOBELIUM, "SDMNOBELIUM"},
+ /* SDM712 ID */
+ [393] = {MSM_CPU_SDM712, "SDM712"},
/* SXR1120 ID */
[370] = {MSM_CPU_SXR1120, "SXR1120"},
@@ -1561,9 +1561,9 @@
dummy_socinfo.id = 360;
strlcpy(dummy_socinfo.build_id, "sdm710 - ",
sizeof(dummy_socinfo.build_id));
- } else if (early_machine_is_sdmnobelium()) {
+ } else if (early_machine_is_sdm712()) {
dummy_socinfo.id = 393;
- strlcpy(dummy_socinfo.build_id, "sdmnobelium - ",
+ strlcpy(dummy_socinfo.build_id, "sdm712 - ",
sizeof(dummy_socinfo.build_id));
} else if (early_machine_is_sda670()) {
dummy_socinfo.id = 337;
diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c
index 5c71628..28a5841 100644
--- a/drivers/staging/android/ion/ion_system_heap.c
+++ b/drivers/staging/android/ion/ion_system_heap.c
@@ -2,7 +2,7 @@
* drivers/staging/android/ion/ion_system_heap.c
*
* Copyright (C) 2011 Google, Inc.
- * Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2019, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -275,6 +275,9 @@
struct page_info *info;
int i;
+ if (buffer->flags & ION_FLAG_POOL_FORCE_ALLOC)
+ goto force_alloc;
+
info = kmalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return NULL;
@@ -306,6 +309,7 @@
}
kfree(info);
+force_alloc:
return alloc_largest_available(heap, buffer, size, max_order);
}
diff --git a/drivers/staging/android/ion/msm/msm_ion.c b/drivers/staging/android/ion/msm/msm_ion.c
index d59655e..1218606 100644
--- a/drivers/staging/android/ion/msm/msm_ion.c
+++ b/drivers/staging/android/ion/msm/msm_ion.c
@@ -838,7 +838,7 @@
data.flush_data.offset;
end = start + data.flush_data.length;
- if (check_vaddr_bounds(start, end)) {
+ if (start && check_vaddr_bounds(start, end)) {
pr_err("%s: virtual address %pK is out of bounds\n",
__func__, data.flush_data.vaddr);
ret = -EINVAL;
diff --git a/drivers/tty/serial/msm_geni_serial.c b/drivers/tty/serial/msm_geni_serial.c
index 2b26187..06ae22b 100644
--- a/drivers/tty/serial/msm_geni_serial.c
+++ b/drivers/tty/serial/msm_geni_serial.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018, The Linux foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1932,6 +1932,13 @@
geni_serial_write_term_regs(uport, port->loopback, tx_trans_cfg,
tx_parity_cfg, rx_trans_cfg, rx_parity_cfg, bits_per_char,
stop_bit_len, ser_clk_cfg);
+
+ if (termios->c_cflag & CRTSCTS) {
+ geni_write_reg_nolog(0x0, uport->membase, SE_UART_MANUAL_RFR);
+ IPC_LOG_MSG(port->ipc_log_misc, "%s: Manual flow off\n",
+ __func__);
+ }
+
IPC_LOG_MSG(port->ipc_log_misc, "%s: baud %d\n", __func__, baud);
IPC_LOG_MSG(port->ipc_log_misc, "Tx: trans_cfg%d parity %d\n",
tx_trans_cfg, tx_parity_cfg);
diff --git a/drivers/usb/phy/phy-msm-snps-hs.c b/drivers/usb/phy/phy-msm-snps-hs.c
index 558a8aa..d6013f7 100644
--- a/drivers/usb/phy/phy-msm-snps-hs.c
+++ b/drivers/usb/phy/phy-msm-snps-hs.c
@@ -19,6 +19,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/io.h>
+#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
@@ -29,6 +30,8 @@
#include <linux/reset.h>
#define USB2_PHY_USB_PHY_UTMI_CTRL0 (0x3c)
+#define OPMODE_MASK (0x3 << 3)
+#define OPMODE_NONDRIVING (0x1 << 3)
#define SLEEPM BIT(0)
#define USB2_PHY_USB_PHY_UTMI_CTRL5 (0x50)
@@ -63,6 +66,7 @@
#define TOGGLE_2WR BIT(6)
#define USB2_PHY_USB_PHY_CFG0 (0x94)
+#define UTMI_PHY_DATAPATH_CTRL_OVERRIDE_EN BIT(0)
#define UTMI_PHY_CMN_CTRL_OVERRIDE_EN BIT(1)
#define USB2_PHY_USB_PHY_REFCLK_CTRL (0xa0)
@@ -98,10 +102,15 @@
bool power_enabled;
bool suspended;
bool cable_connected;
+ bool dpdm_enable;
int *param_override_seq;
int param_override_seq_cnt;
+ struct mutex phy_lock;
+ struct regulator_desc dpdm_rdesc;
+ struct regulator_dev *dpdm_rdev;
+
/* emulation targets specific */
void __iomem *emu_phy_base;
int *emu_init_seq;
@@ -450,14 +459,20 @@
(phy->phy.flags & PHY_HOST_MODE)) {
msm_hsphy_enable_clocks(phy, false);
} else {/* Cable disconnect */
- msm_hsphy_enable_clocks(phy, false);
- msm_hsphy_enable_power(phy, false);
+ mutex_lock(&phy->phy_lock);
+ if (!phy->dpdm_enable) {
+ msm_hsphy_enable_clocks(phy, false);
+ msm_hsphy_enable_power(phy, false);
+ } else {
+ dev_dbg(uphy->dev, "dpdm reg still active. Keep clocks/ldo ON\n");
+ }
+ mutex_unlock(&phy->phy_lock);
}
phy->suspended = true;
} else { /* Bus resume and cable connect */
- msm_hsphy_enable_clocks(phy, true);
- phy->suspended = false;
- }
+ msm_hsphy_enable_clocks(phy, true);
+ phy->suspended = false;
+ }
return 0;
}
@@ -482,6 +497,114 @@
return 0;
}
+static int msm_hsphy_dpdm_regulator_enable(struct regulator_dev *rdev)
+{
+ int ret = 0;
+ struct msm_hsphy *phy = rdev_get_drvdata(rdev);
+
+ dev_dbg(phy->phy.dev, "%s dpdm_enable:%d\n",
+ __func__, phy->dpdm_enable);
+
+ mutex_lock(&phy->phy_lock);
+ if (!phy->dpdm_enable) {
+ ret = msm_hsphy_enable_power(phy, true);
+ if (ret) {
+ mutex_unlock(&phy->phy_lock);
+ return ret;
+ }
+
+ msm_hsphy_enable_clocks(phy, true);
+ msm_hsphy_reset(phy);
+
+ /*
+ * For PMIC charger detection, place PHY in UTMI non-driving
+ * mode which leaves Dp and Dm lines in high-Z state.
+ */
+ msm_usb_write_readback(phy->base, USB2_PHY_USB_PHY_HS_PHY_CTRL2,
+ USB2_SUSPEND_N_SEL | USB2_SUSPEND_N,
+ USB2_SUSPEND_N_SEL | USB2_SUSPEND_N);
+ msm_usb_write_readback(phy->base, USB2_PHY_USB_PHY_UTMI_CTRL0,
+ OPMODE_MASK, OPMODE_NONDRIVING);
+ msm_usb_write_readback(phy->base, USB2_PHY_USB_PHY_CFG0,
+ UTMI_PHY_DATAPATH_CTRL_OVERRIDE_EN,
+ UTMI_PHY_DATAPATH_CTRL_OVERRIDE_EN);
+
+ phy->dpdm_enable = true;
+ }
+ mutex_unlock(&phy->phy_lock);
+
+ return ret;
+}
+
+static int msm_hsphy_dpdm_regulator_disable(struct regulator_dev *rdev)
+{
+ int ret = 0;
+ struct msm_hsphy *phy = rdev_get_drvdata(rdev);
+
+ dev_dbg(phy->phy.dev, "%s dpdm_enable:%d\n",
+ __func__, phy->dpdm_enable);
+
+ mutex_lock(&phy->phy_lock);
+ if (phy->dpdm_enable) {
+ if (!phy->cable_connected) {
+ msm_hsphy_enable_clocks(phy, false);
+ ret = msm_hsphy_enable_power(phy, false);
+ if (ret < 0) {
+ mutex_unlock(&phy->phy_lock);
+ return ret;
+ }
+ }
+ phy->dpdm_enable = false;
+ }
+ mutex_unlock(&phy->phy_lock);
+
+ return ret;
+}
+
+static int msm_hsphy_dpdm_regulator_is_enabled(struct regulator_dev *rdev)
+{
+ struct msm_hsphy *phy = rdev_get_drvdata(rdev);
+
+ dev_dbg(phy->phy.dev, "%s dpdm_enable:%d\n",
+ __func__, phy->dpdm_enable);
+
+ return phy->dpdm_enable;
+}
+
+static struct regulator_ops msm_hsphy_dpdm_regulator_ops = {
+ .enable = msm_hsphy_dpdm_regulator_enable,
+ .disable = msm_hsphy_dpdm_regulator_disable,
+ .is_enabled = msm_hsphy_dpdm_regulator_is_enabled,
+};
+
+static int msm_hsphy_regulator_init(struct msm_hsphy *phy)
+{
+ struct device *dev = phy->phy.dev;
+ struct regulator_config cfg = {};
+ struct regulator_init_data *init_data;
+
+ init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL);
+ if (!init_data)
+ return -ENOMEM;
+
+ init_data->constraints.valid_ops_mask |= REGULATOR_CHANGE_STATUS;
+ phy->dpdm_rdesc.owner = THIS_MODULE;
+ phy->dpdm_rdesc.type = REGULATOR_VOLTAGE;
+ phy->dpdm_rdesc.ops = &msm_hsphy_dpdm_regulator_ops;
+ phy->dpdm_rdesc.name = kbasename(dev->of_node->full_name);
+
+ cfg.dev = dev;
+ cfg.init_data = init_data;
+ cfg.driver_data = phy;
+ cfg.of_node = dev->of_node;
+
+ phy->dpdm_rdev = devm_regulator_register(dev, &phy->dpdm_rdesc, &cfg);
+ if (IS_ERR(phy->dpdm_rdev))
+ return PTR_ERR(phy->dpdm_rdev);
+
+ return 0;
+}
+
static int msm_hsphy_probe(struct platform_device *pdev)
{
struct msm_hsphy *phy;
@@ -649,6 +772,7 @@
goto err_ret;
}
+ mutex_init(&phy->phy_lock);
platform_set_drvdata(pdev, phy);
if (phy->emu_init_seq)
@@ -664,6 +788,12 @@
if (ret)
return ret;
+ ret = msm_hsphy_regulator_init(phy);
+ if (ret) {
+ usb_remove_phy(&phy->phy);
+ return ret;
+ }
+
return 0;
err_ret:
diff --git a/drivers/video/fbdev/msm/mdp3.c b/drivers/video/fbdev/msm/mdp3.c
index b6db0ee..1210968 100644
--- a/drivers/video/fbdev/msm/mdp3.c
+++ b/drivers/video/fbdev/msm/mdp3.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.
* Copyright (C) 2007 Google Incorporated
*
* This software is licensed under the terms of the GNU General Public
@@ -916,17 +916,6 @@
return panic_config;
}
-int mdp3_enable_panic_ctrl(void)
-{
- int rc = 0;
-
- if (MDP3_REG_READ(MDP3_PANIC_ROBUST_CTRL) == 0) {
- pr_err("%s: Enable Panic Control\n", __func__);
- MDP3_REG_WRITE(MDP3_PANIC_ROBUST_CTRL, BIT(0));
- }
- return rc;
-}
-
int mdp3_qos_remapper_setup(struct mdss_panel_data *panel)
{
int rc = 0;
diff --git a/drivers/video/fbdev/msm/mdp3.h b/drivers/video/fbdev/msm/mdp3.h
index 6b56052..3ab4652 100644
--- a/drivers/video/fbdev/msm/mdp3.h
+++ b/drivers/video/fbdev/msm/mdp3.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, 2016-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, 2016-2019, The Linux Foundation. All rights reserved.
* Copyright (C) 2007 Google Incorporated
*
* This program is free software; you can redistribute it and/or modify
@@ -281,7 +281,6 @@
void mdp3_calc_dma_res(struct mdss_panel_info *panel_info, u64 *clk_rate,
u64 *ab, u64 *ib, uint32_t bpp);
void mdp3_clear_irq(u32 interrupt_mask);
-int mdp3_enable_panic_ctrl(void);
void mdss_spi_panel_bl_ctrl_update(struct mdss_panel_data *pdata, u32 bl_level);
diff --git a/drivers/video/fbdev/msm/mdp3_ctrl.c b/drivers/video/fbdev/msm/mdp3_ctrl.c
index 2238e2d..ca85e95 100644
--- a/drivers/video/fbdev/msm/mdp3_ctrl.c
+++ b/drivers/video/fbdev/msm/mdp3_ctrl.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
@@ -958,14 +958,12 @@
mdp3_session->in_splash_screen) {
/* Turn on panel so that it can exit low power mode */
mdp3_clk_enable(1, 0);
- rc = panel->event_handler(panel,
+ rc = panel->event_handler(panel,
MDSS_EVENT_LINK_READY, NULL);
- rc |= panel->event_handler(panel,
+ rc |= panel->event_handler(panel,
MDSS_EVENT_UNBLANK, NULL);
- rc |= panel->event_handler(panel,
+ rc |= panel->event_handler(panel,
MDSS_EVENT_PANEL_ON, NULL);
- if (mdss_fb_is_power_on_lp(mfd))
- rc |= mdp3_enable_panic_ctrl();
mdp3_clk_enable(0, 0);
}
}
diff --git a/drivers/vservices/protocol/block/client.c b/drivers/vservices/protocol/block/client.c
index 702a30a8..bd499f3 100644
--- a/drivers/vservices/protocol/block/client.c
+++ b/drivers/vservices/protocol/block/client.c
@@ -93,7 +93,7 @@
to_client_driver(vsdrv)->client;
vs_service_state_lock(service);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
_vs_client_block_req_open(state);
@@ -119,7 +119,7 @@
if (client->closed)
client->closed(state);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
vs_service_state_unlock(service);
}
@@ -134,7 +134,7 @@
to_client_driver(vsdrv)->client;
vs_service_state_lock_bh(service);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
_vs_client_block_req_open(state);
@@ -160,7 +160,7 @@
if (client->closed)
client->closed(state);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
vs_service_state_unlock_bh(service);
}
@@ -265,7 +265,7 @@
return PTR_ERR(state);
state->service = vs_get_service(service);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
dev_set_drvdata(&service->dev, state);
diff --git a/drivers/vservices/protocol/block/server.c b/drivers/vservices/protocol/block/server.c
index a4a7d1a..f0c55d1 100644
--- a/drivers/vservices/protocol/block/server.c
+++ b/drivers/vservices/protocol/block/server.c
@@ -59,8 +59,7 @@
to_server_driver(vsdrv)->server;
vs_service_state_lock(service);
- state->state = VSERVICE_BLOCK_RESET_STATE;
-
+ memset(&(state->state), 0, sizeof(state->state));
vs_service_state_unlock(service);
}
@@ -83,7 +82,7 @@
if (server->closed)
server->closed(state);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
vs_service_state_unlock(service);
}
@@ -98,7 +97,7 @@
to_server_driver(vsdrv)->server;
vs_service_state_lock_bh(service);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
vs_service_state_unlock_bh(service);
}
@@ -122,7 +121,7 @@
if (server->closed)
server->closed(state);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
vs_service_state_unlock_bh(service);
}
@@ -237,7 +236,7 @@
return PTR_ERR(state);
state->service = vs_get_service(service);
- state->state = VSERVICE_BLOCK_RESET_STATE;
+ memset(&(state->state), 0, sizeof(state->state));
dev_set_drvdata(&service->dev, state);
diff --git a/include/linux/qcom-geni-se.h b/include/linux/qcom-geni-se.h
index 83c2028..cf12ca6 100644
--- a/include/linux/qcom-geni-se.h
+++ b/include/linux/qcom-geni-se.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -46,9 +46,16 @@
* @m_ahb_clk: Handle to the primary AHB clock.
* @s_ahb_clk: Handle to the secondary AHB clock.
* @ab_list: List Head of Average bus banwidth list.
+ * @ab_list_noc: List Head of Average DDR path bus
+ bandwidth list.
* @ab: Average bus bandwidth request value.
+ * @ab_noc: Average DDR path bus bandwidth request value.
* @ib_list: List Head of Instantaneous bus banwidth list.
+ * @ib_list_noc: List Head of Instantaneous DDR path bus
+ bandwidth list.
* @ib: Instantaneous bus bandwidth request value.
+ * @ib_noc: Instantaneous DDR path bus bandwidth
+ request value.
* @geni_pinctrl: Handle to the pinctrl configuration.
* @geni_gpio_active: Handle to the default/active pinctrl state.
* @geni_gpi_sleep: Handle to the sleep pinctrl state.
@@ -60,9 +67,13 @@
struct clk *m_ahb_clk;
struct clk *s_ahb_clk;
struct list_head ab_list;
+ struct list_head ab_list_noc;
unsigned long ab;
+ unsigned long ab_noc;
struct list_head ib_list;
+ struct list_head ib_list_noc;
unsigned long ib;
+ unsigned long ib_noc;
struct pinctrl *geni_pinctrl;
struct pinctrl_state *geni_gpio_active;
struct pinctrl_state *geni_gpio_sleep;
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index b059fd2..5ba3a46 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -63,9 +63,10 @@
extern unsigned int sysctl_numa_balancing_scan_size;
#ifdef CONFIG_SCHED_DEBUG
-extern unsigned int sysctl_sched_migration_cost;
-extern unsigned int sysctl_sched_nr_migrate;
-extern unsigned int sysctl_sched_time_avg;
+extern __read_mostly unsigned int sysctl_sched_migration_cost;
+extern __read_mostly unsigned int sysctl_sched_nr_migrate;
+extern __read_mostly unsigned int sysctl_sched_time_avg;
+
extern unsigned int sysctl_sched_shares_window;
int sched_proc_update_handler(struct ctl_table *table, int write,
diff --git a/include/soc/qcom/socinfo.h b/include/soc/qcom/socinfo.h
index c7dcf36..862153e 100644
--- a/include/soc/qcom/socinfo.h
+++ b/include/soc/qcom/socinfo.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-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
@@ -114,7 +114,7 @@
of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,sxr1120")
#define early_machine_is_msm8953() \
of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8953")
-#define early_machine_is_sdmnobelium() \
+#define early_machine_is_sdm712() \
of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,sdm670")
#define early_machine_is_msm8937() \
of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8937")
@@ -201,7 +201,7 @@
#define early_machine_is_sda429() 0
#define early_machine_is_mdm9650() 0
#define early_machine_is_qm215() 0
-#define early_machine_is_sdmnobelium() 0
+#define early_machine_is_sdm712() 0
#endif
#define PLATFORM_SUBTYPE_MDM 1
@@ -279,7 +279,7 @@
MSM_CPU_8940,
MSM_CPU_9607,
MSM_CPU_SDM439,
- MSM_CPU_SDMNOBELIUM,
+ MSM_CPU_SDM712,
MSM_CPU_SDM429,
MSM_CPU_SDA439,
MSM_CPU_SDA429,
diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h
index ebb8dbe..e9896f3 100644
--- a/include/uapi/linux/msm_ipa.h
+++ b/include/uapi/linux/msm_ipa.h
@@ -36,6 +36,11 @@
#define IPA_DFLT_RT_TBL_NAME "ipa_dflt_rt"
/**
+ * name for default value of invalid protocol of NAT
+ */
+#define IPAHAL_NAT_INVALID_PROTOCOL 0xFF
+
+/**
* commands supported by IPA driver
*/
#define IPA_IOCTL_ADD_HDR 0
@@ -307,12 +312,25 @@
/* RESERVERD PROD = 74, */
IPA_CLIENT_MHI_DPL_CONS = 75,
- /* RESERVED PROD 76, */
- IPA_CLIENT_DUMMY_CONS1 = 77
+ /* RESERVED PROD = 76, */
+ IPA_CLIENT_DUMMY_CONS1 = 77,
+
+ IPA_CLIENT_WIGIG_PROD = 78,
+ IPA_CLIENT_WIGIG1_CONS = 79,
+
+ /* RESERVERD PROD = 80, */
+ IPA_CLIENT_WIGIG2_CONS = 81,
+
+ /* RESERVERD PROD = 82, */
+ IPA_CLIENT_WIGIG3_CONS = 83,
+
+ /* RESERVERD PROD = 84, */
+ IPA_CLIENT_WIGIG4_CONS = 85,
};
#define IPA_CLIENT_DUMMY_CONS IPA_CLIENT_DUMMY_CONS1
-#define IPA_CLIENT_MAX (IPA_CLIENT_DUMMY_CONS + 1)
+#define IPA_CLIENT_WIGIG4_CONS IPA_CLIENT_WIGIG4_CONS
+#define IPA_CLIENT_MAX (IPA_CLIENT_WIGIG4_CONS + 1)
#define IPA_CLIENT_IS_APPS_CONS(client) \
((client) == IPA_CLIENT_APPS_LAN_CONS || \
@@ -548,7 +566,11 @@
#define IPA_GSB_EVENT_MAX IPA_GSB_EVENT_MAX
};
-#define IPA_EVENT_MAX_NUM (IPA_GSB_EVENT_MAX)
+#define WIGIG_CLIENT_CONNECT (IPA_GSB_EVENT_MAX)
+#define WIGIG_FST_SWITCH (WIGIG_CLIENT_CONNECT + 1)
+#define WIGIG_EVENT_MAX (WIGIG_FST_SWITCH + 1)
+
+#define IPA_EVENT_MAX_NUM (WIGIG_EVENT_MAX)
#define IPA_EVENT_MAX ((int)IPA_EVENT_MAX_NUM)
/**
diff --git a/include/uapi/sound/compress_params.h b/include/uapi/sound/compress_params.h
index 8c84053..c7d5b34 100644
--- a/include/uapi/sound/compress_params.h
+++ b/include/uapi/sound/compress_params.h
@@ -55,6 +55,9 @@
#define SND_DEC_DDP_MAX_PARAMS 18
+/* Maximum PCM channels */
+#define MAX_PCM_DECODE_CHANNELS 32
+
/* AUDIO CODECS SUPPORTED */
#define MAX_NUM_CODECS 32
#define MAX_NUM_CODEC_DESCRIPTORS 32
@@ -406,6 +409,15 @@
__u32 nap;
};
+/** struct snd_dec_pcm - codec options for PCM format
+ * @num_channels: Number of channels
+ * @ch_map: Channel map for the above corresponding channels
+ */
+struct snd_dec_pcm {
+ __u32 num_channels;
+ __u8 ch_map[MAX_PCM_DECODE_CHANNELS];
+} __attribute__((packed, aligned(4)));
+
union snd_codec_options {
struct snd_enc_wma wma;
struct snd_enc_vorbis vorbis;
@@ -418,6 +430,7 @@
struct snd_dec_alac alac;
struct snd_dec_ape ape;
struct snd_dec_aptx aptx_dec;
+ struct snd_dec_pcm pcm_dec;
};
/** struct snd_codec_desc - description of codec capabilities
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 2cfbe3f..f187917 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1286,9 +1286,10 @@
lladdr || !dev->addr_len);
if (neigh) {
if (neigh_probe_enable) {
- if (!(neigh->nud_state == NUD_REACHABLE)) {
+ if (neigh->nud_state != NUD_REACHABLE &&
+ neigh->nud_state != NUD_PERMANENT) {
neigh_update(neigh, lladdr, NUD_STALE,
- NEIGH_UPDATE_F_OVERRIDE);
+ NEIGH_UPDATE_F_OVERRIDE);
write_lock(&neigh->lock);
neigh_probe(neigh);
neigh_update_notify(neigh);
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 4be66e4..93fbace 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -536,14 +536,13 @@
tcp_enter_loss(sk);
+ icsk->icsk_retransmits++;
if (tcp_retransmit_skb(sk, tcp_write_queue_head(sk), 1) > 0) {
/* Retransmission failed because of local congestion,
- * do not backoff.
+ * Let senders fight for local resources conservatively.
*/
- if (!icsk->icsk_retransmits)
- icsk->icsk_retransmits = 1;
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
- min(icsk->icsk_rto, TCP_RESOURCE_PROBE_INTERVAL),
+ TCP_RESOURCE_PROBE_INTERVAL,
TCP_RTO_MAX);
goto out;
}
@@ -564,7 +563,6 @@
* the 120 second clamps though!
*/
icsk->icsk_backoff++;
- icsk->icsk_retransmits++;
out_reset_timer:
/* If stream is thin, use linear timeouts. Since 'icsk_backoff' is
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 7858b30..627af8a 100644
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -213,14 +213,20 @@
# assume that RTIC_MP_O generation may fail
RTIC_MP_O=
+ local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
+ ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
+
${RTIC_MPGEN} --objcopy="${OBJCOPY}" --objdump="${OBJDUMP}" \
--binpath='' --vmlinux=${1} --config=${KCONFIG_CONFIG} && \
- cat rtic_mp.c | ${CC} -c -o ${2} -x c - && \
+ cat rtic_mp.c | ${CC} ${aflags} -c -o ${2} -x c - && \
cp rtic_mp.c ${4} && \
${NM} --print-size --size-sort ${2} > ${3} && \
- RTIC_MP_O=${2}
+ RTIC_MP_O=${2} || echo “RTIC MP generation has failed”
# NM - save generated variable sizes for verification
# RTIC_MP_O is our retval - great success if set to generated .o file
+ # Echo statement above prints the error message in case any of the
+ # above RTIC MP generation commands fail and it ensures rtic mp failure
+ # does not cause kernel compilation to fail.
}
# Create map file with all symbols from ${1}
@@ -378,7 +384,11 @@
# Update RTIC MP object by replacing the place holder
# with actual MP data of the same size
# Also double check that object size did not change
-if [ ! -z ${RTIC_MPGEN+x} ]; then
+# Note: Check initilally if RTIC_MP_O is not empty or uninitialized,
+# as incase RTIC_MPGEN is set and failure occurs in RTIC_MP_O
+# generation, below check for comparing object sizes fails
+# due to an empty RTIC_MP_O object.
+if [ ! -z ${RTIC_MP_O} ]; then
rtic_mp "${kallsyms_vmlinux}" rtic_mp.o .tmp_rtic_mp_sz2 \
.tmp_rtic_mp2.c
if ! cmp -s .tmp_rtic_mp_sz1 .tmp_rtic_mp_sz2; then