Merge "ARM: dts: msm: Add support for second qcrypto device for 8974"
diff --git a/Documentation/devicetree/bindings/crypto/msm/qcedev.txt b/Documentation/devicetree/bindings/crypto/msm/qcedev.txt
index 3ca9080..fc94be4 100644
--- a/Documentation/devicetree/bindings/crypto/msm/qcedev.txt
+++ b/Documentation/devicetree/bindings/crypto/msm/qcedev.txt
@@ -12,6 +12,7 @@
- qcom,msm_bus,active-only: Boolean flag for context of request (actve/dual)
- qcom,msm_bus,num_paths: The paths for source and destination ports
- qcom,msm_bus,vectors: Vectors for bus topology.
+ - qcom,ce-device: Device number.
Optional properties:
- qcom,ce-hw-shared : optional, indicates if the hardware is shared between EE.
@@ -27,6 +28,7 @@
interrupts = <0 235 0>;
qcom,bam-pipe-pair = <0>;
qcom,ce-hw-instance = <1>;
+ qcom,ce-device = <0>;
qcom,ce-hw-shared;
qcom,msm-bus,name = "qcedev-noc";
qcom,msm-bus,num-cases = <2>;
diff --git a/Documentation/devicetree/bindings/crypto/msm/qcrypto.txt b/Documentation/devicetree/bindings/crypto/msm/qcrypto.txt
index 1bb4659..6561b6a 100644
--- a/Documentation/devicetree/bindings/crypto/msm/qcrypto.txt
+++ b/Documentation/devicetree/bindings/crypto/msm/qcrypto.txt
@@ -12,6 +12,7 @@
- qcom,msm_bus,active-only: Boolean flag for context of request (actve/dual)
- qcom,msm_bus,num_paths: The paths for source and destination ports
- qcom,msm_bus,vectors: Vectors for bus topology.
+ - qcom,ce-device: Device number.
Optional properties:
- qcom,ce-hw-shared : optional, indicates if the hardware is shared between EE.
@@ -34,6 +35,7 @@
interrupts = <0 235 0>;
qcom,bam-pipe-pair = <1>;
qcom,ce-hw-instance = <1>;
+ qcom,ce-device = <0>;
qcom,ce-hw-shared;
qcom,msm-bus,name = "qcrypto-noc";
qcom,msm-bus,num-cases = <2>;
diff --git a/Documentation/devicetree/bindings/qseecom/qseecom.txt b/Documentation/devicetree/bindings/qseecom/qseecom.txt
index 9e582e2..c0426a7 100644
--- a/Documentation/devicetree/bindings/qseecom/qseecom.txt
+++ b/Documentation/devicetree/bindings/qseecom/qseecom.txt
@@ -4,6 +4,7 @@
- compatible : Should be "qcom,qseecom"
- reg : should contain memory region address reserved for loading secure apps.
- qcom,disk-encrypt-pipe-pair : indicates what CE HW pipe pair is used for disk encryption
+- qcom,file-encrypt-pipe-pair : indicates what CE HW pipe pair is used for file encryption
- qcom,hlos-ce-hw-instance : indicates what CE HW is used by HLOS crypto driver
- qcom,qsee-ce-hw-instance : indicates what CE HW is used by secure domain (TZ) crypto driver
- qcom, msm_bus,name: Should be "qseecom-noc"
@@ -12,7 +13,9 @@
- qcom, msm_bus,vectors: Vectors for bus topology.
Optional properties:
- - qcom,support-bus-scaling : optional, indicates if driver support scaling the bus for crypto operation.
+ - qcom,support-bus-scaling : indicates if driver support scaling the bus for crypto operation.
+ - qcom,support-fde : indicates if driver support key managing for full disk encryption feature.
+ - qcom,support-pfe : indicates if driver support key managing for per file encryption feature.
Example:
qcom,qseecom@fe806000 {
@@ -20,8 +23,11 @@
reg = <0x7f00000 0x500000>;
reg-names = "secapp-region";
qcom,disk-encrypt-pipe-pair = <2>;
+ qcom,file-encrypt-pipe-pair = <0>;
qcom,hlos-ce-hw-instance = <1>;
qcom,qsee-ce-hw-instance = <0>;
+ qcom,support-fde;
+ qcom,support-pfe;
qcom,msm_bus,name = "qseecom-noc";
qcom,msm_bus,num_cases = <4>;
qcom,msm_bus,active_only = <0>;
diff --git a/arch/arm/boot/dts/apq8074-v1.dtsi b/arch/arm/boot/dts/apq8074-v1.dtsi
index 59e7f7f..a74674b 100644
--- a/arch/arm/boot/dts/apq8074-v1.dtsi
+++ b/arch/arm/boot/dts/apq8074-v1.dtsi
@@ -31,6 +31,7 @@
qcom,msm-bus,num-cases = <4>;
qcom,msm-bus,active-only = <0>;
qcom,msm-bus,num-paths = <1>;
+ qcom,support-fde;
qcom,msm-bus,vectors-KBps =
<55 512 0 0>,
<55 512 3936000 393600>,
diff --git a/arch/arm/boot/dts/apq8074-v2.0-1.dtsi b/arch/arm/boot/dts/apq8074-v2.0-1.dtsi
index 3575c92..2b2af09 100644
--- a/arch/arm/boot/dts/apq8074-v2.0-1.dtsi
+++ b/arch/arm/boot/dts/apq8074-v2.0-1.dtsi
@@ -31,6 +31,7 @@
qcom,msm-bus,num-cases = <4>;
qcom,msm-bus,active-only = <0>;
qcom,msm-bus,num-paths = <1>;
+ qcom,support-fde;
qcom,msm-bus,vectors-KBps =
<55 512 0 0>,
<55 512 3936000 393600>,
diff --git a/arch/arm/boot/dts/apq8074-v2.2.dtsi b/arch/arm/boot/dts/apq8074-v2.2.dtsi
index 18f00c5..8f46270 100644
--- a/arch/arm/boot/dts/apq8074-v2.2.dtsi
+++ b/arch/arm/boot/dts/apq8074-v2.2.dtsi
@@ -31,6 +31,7 @@
qcom,msm-bus,num-cases = <4>;
qcom,msm-bus,active-only = <0>;
qcom,msm-bus,num-paths = <1>;
+ qcom,support-fde;
qcom,msm-bus,vectors-KBps =
<55 512 0 0>,
<55 512 3936000 393600>,
diff --git a/arch/arm/boot/dts/dsi-panel-generic-720p-cmd.dtsi b/arch/arm/boot/dts/dsi-panel-generic-720p-cmd.dtsi
index 14d4c35..214c7f8 100644
--- a/arch/arm/boot/dts/dsi-panel-generic-720p-cmd.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-generic-720p-cmd.dtsi
@@ -75,5 +75,6 @@
qcom,mdss-dsi-mdp-trigger = "none";
qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
qcom,mdss-dsi-reset-sequence = <1 20>, <0 200>, <1 20>;
+ qcom,partial-update-enabled;
};
};
diff --git a/arch/arm/boot/dts/dsi-panel-jdi-1080p-video.dtsi b/arch/arm/boot/dts/dsi-panel-jdi-1080p-video.dtsi
index 917c637..17b39fc 100644
--- a/arch/arm/boot/dts/dsi-panel-jdi-1080p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-jdi-1080p-video.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -30,8 +30,8 @@
qcom,mdss-dsi-h-back-porch = <64>;
qcom,mdss-dsi-h-pulse-width = <16>;
qcom,mdss-dsi-h-sync-skew = <0>;
- qcom,mdss-dsi-v-back-porch = <4>;
- qcom,mdss-dsi-v-front-porch = <3>;
+ qcom,mdss-dsi-v-back-porch = <16>;
+ qcom,mdss-dsi-v-front-porch = <4>;
qcom,mdss-dsi-v-pulse-width = <1>;
qcom,mdss-dsi-h-left-border = <0>;
qcom,mdss-dsi-h-right-border = <0>;
@@ -57,7 +57,7 @@
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
- qcom,mdss-dsi-panel-timings = [e1 37 25 00 67 6b 2a 3a 59 03 04 00];
+ qcom,mdss-dsi-panel-timings = [e7 36 24 00 66 6a 2a 3a 2d 03 04 00];
qcom,mdss-dsi-t-clk-post = <0x04>;
qcom,mdss-dsi-t-clk-pre = <0x1b>;
qcom,mdss-dsi-bl-min-level = <1>;
diff --git a/arch/arm/boot/dts/msm8226.dtsi b/arch/arm/boot/dts/msm8226.dtsi
index 5576b2b..c31f2d3 100644
--- a/arch/arm/boot/dts/msm8226.dtsi
+++ b/arch/arm/boot/dts/msm8226.dtsi
@@ -1335,6 +1335,7 @@
qcom,msm-bus,num-cases = <4>;
qcom,msm-bus,active-only = <0>;
qcom,msm-bus,num-paths = <1>;
+ qcom,support-fde;
qcom,msm-bus,vectors-KBps =
<55 512 0 0>,
<55 512 0 0>,
@@ -1350,6 +1351,7 @@
interrupts = <0 207 0>;
qcom,bam-pipe-pair = <2>;
qcom,ce-hw-instance = <0>;
+ qcom,ce-device = <0>;
qcom,ce-hw-shared;
qcom,msm-bus,name = "qcrypto-noc";
qcom,msm-bus,num-cases = <2>;
@@ -1368,6 +1370,7 @@
interrupts = <0 207 0>;
qcom,bam-pipe-pair = <1>;
qcom,ce-hw-instance = <0>;
+ qcom,ce-device = <0>;
qcom,ce-hw-shared;
qcom,msm-bus,name = "qcedev-noc";
qcom,msm-bus,num-cases = <2>;
diff --git a/arch/arm/boot/dts/msm8610-camera-sensor-cdp-mtp.dtsi b/arch/arm/boot/dts/msm8610-camera-sensor-cdp-mtp.dtsi
index 07b5da3..1d47a94 100644
--- a/arch/arm/boot/dts/msm8610-camera-sensor-cdp-mtp.dtsi
+++ b/arch/arm/boot/dts/msm8610-camera-sensor-cdp-mtp.dtsi
@@ -192,8 +192,8 @@
reg = <0x6d>;
qcom,slave-id = <0x20 0x0 0x9724>;
qcom,csiphy-sd-index = <1>;
- qcom,csid-sd-index = <0>;
- qcom,mount-angle = <90>;
+ qcom,csid-sd-index = <1>;
+ qcom,mount-angle = <270>;
qcom,sensor-name = "ov9724";
cam_vdig-supply = <&pm8110_l4>;
cam_vana-supply = <&pm8110_l19>;
@@ -204,7 +204,7 @@
qcom,cam-vreg-max-voltage = <1200000 0 2850000>;
qcom,cam-vreg-op-mode = <200000 0 80000>;
qcom,gpio-no-mux = <0>;
- gpios = <&msmgpio 14 0>,
+ gpios = <&msmgpio 13 0>,
<&msmgpio 15 0>,
<&msmgpio 8 0>;
qcom,gpio-reset = <1>;
@@ -218,7 +218,7 @@
qcom,gpio-set-tbl-flags = <0 2>;
qcom,gpio-set-tbl-delay = <1000 4000>;
qcom,csi-lane-assign = <0xe4>;
- qcom,csi-lane-mask = <0x1>;
+ qcom,csi-lane-mask = <0x3>;
qcom,sensor-position = <1>;
qcom,sensor-mode = <1>;
qcom,cci-master = <0>;
diff --git a/arch/arm/boot/dts/msm8610.dtsi b/arch/arm/boot/dts/msm8610.dtsi
index 53d2d4f..2938c69 100644
--- a/arch/arm/boot/dts/msm8610.dtsi
+++ b/arch/arm/boot/dts/msm8610.dtsi
@@ -1005,6 +1005,7 @@
interrupts = <0 207 0>;
qcom,bam-pipe-pair = <2>;
qcom,ce-hw-instance = <1>;
+ qcom,ce-device = <0>;
qcom,ce-hw-shared;
qcom,msm-bus,name = "qcrypto-noc";
qcom,msm-bus,num-cases = <2>;
@@ -1023,6 +1024,7 @@
interrupts = <0 207 0>;
qcom,bam-pipe-pair = <1>;
qcom,ce-hw-instance = <1>;
+ qcom,ce-device = <0>;
qcom,ce-hw-shared;
qcom,msm-bus,name = "qcedev-noc";
qcom,msm-bus,num-cases = <2>;
diff --git a/arch/arm/boot/dts/msm8974.dtsi b/arch/arm/boot/dts/msm8974.dtsi
index 96d3b84..b85af9f 100644
--- a/arch/arm/boot/dts/msm8974.dtsi
+++ b/arch/arm/boot/dts/msm8974.dtsi
@@ -2037,12 +2037,15 @@
reg = <0x7b00000 0x500000>;
reg-names = "secapp-region";
qcom,disk-encrypt-pipe-pair = <2>;
+ qcom,file-encrypt-pipe-pair = <0>;
qcom,hlos-ce-hw-instance = <1>;
qcom,qsee-ce-hw-instance = <0>;
qcom,support-bus-scaling;
qcom,msm-bus,name = "qseecom-noc";
qcom,msm-bus,num-cases = <4>;
qcom,msm-bus,num-paths = <1>;
+ qcom,support-fde;
+ qcom,support-pfe;
qcom,msm-bus,vectors-KBps =
<55 512 0 0>,
<55 512 0 0>,
@@ -2144,6 +2147,7 @@
interrupts = <0 236 0>;
qcom,bam-pipe-pair = <1>;
qcom,ce-hw-instance = <1>;
+ qcom,ce-device = <0>;
qcom,msm-bus,name = "qcedev-noc";
qcom,msm-bus,num-cases = <2>;
qcom,msm-bus,num-paths = <1>;
@@ -2160,6 +2164,7 @@
interrupts = <0 236 0>;
qcom,bam-pipe-pair = <2>;
qcom,ce-hw-instance = <1>;
+ qcom,ce-device = <0>;
qcom,clk-mgmt-sus-res;
qcom,msm-bus,name = "qcrypto-noc";
qcom,msm-bus,num-cases = <2>;
diff --git a/arch/arm/common/cpaccess.c b/arch/arm/common/cpaccess.c
index cca0b39..6fd54ef 100644
--- a/arch/arm/common/cpaccess.c
+++ b/arch/arm/common/cpaccess.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2010-2014, 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
@@ -84,9 +84,10 @@
*/
static void do_write_il2(void *ret)
{
- *(unsigned long *)ret =
- set_get_l2_indirect_reg(per_cpu(cp_param.il2index, cpu),
+ set_l2_indirect_reg(per_cpu(cp_param.il2index, cpu),
per_cpu(cp_param.write_value, cpu));
+ *(unsigned long *)ret =
+ get_l2_indirect_reg(per_cpu(cp_param.il2index, cpu));
}
/*
diff --git a/arch/arm/configs/msm8610-perf_defconfig b/arch/arm/configs/msm8610-perf_defconfig
index 9c583e3..55bc185 100644
--- a/arch/arm/configs/msm8610-perf_defconfig
+++ b/arch/arm/configs/msm8610-perf_defconfig
@@ -345,6 +345,7 @@
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_SUSPEND=y
+CONFIG_USB_MON=y
CONFIG_USB_ICE40_HCD=m
CONFIG_USB_CCID_BRIDGE=y
CONFIG_USB_STORAGE=y
diff --git a/arch/arm/configs/msm8610_defconfig b/arch/arm/configs/msm8610_defconfig
index 6e86676..2a2988b 100644
--- a/arch/arm/configs/msm8610_defconfig
+++ b/arch/arm/configs/msm8610_defconfig
@@ -368,6 +368,7 @@
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_SUSPEND=y
+CONFIG_USB_MON=y
CONFIG_USB_ICE40_HCD=m
CONFIG_USB_CCID_BRIDGE=y
CONFIG_USB_STORAGE=y
diff --git a/arch/arm/mach-msm/include/mach/msm-krait-l2-accessors.h b/arch/arm/mach-msm/include/mach/msm-krait-l2-accessors.h
index 45d000b..5e927cf 100644
--- a/arch/arm/mach-msm/include/mach/msm-krait-l2-accessors.h
+++ b/arch/arm/mach-msm/include/mach/msm-krait-l2-accessors.h
@@ -1,8 +1,5 @@
-#ifndef __ASM_ARCH_MSM_MSM_KRAIT_L2_ACCESSORS_H
-#define __ASM_ARCH_MSM_MSM_KRAIT_L2_ACCESSORS_H
-
/*
- * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -14,6 +11,9 @@
* GNU General Public License for more details.
*/
+#ifndef __ASM_ARCH_MSM_MSM_KRAIT_L2_ACCESSORS_H
+#define __ASM_ARCH_MSM_MSM_KRAIT_L2_ACCESSORS_H
+
#define MAX_L2_PERIOD ((1ULL << 32) - 1)
#define MAX_KRAIT_L2_CTRS 10
@@ -66,17 +66,12 @@
#ifdef CONFIG_ARCH_MSM_KRAIT
extern void set_l2_indirect_reg(u32 reg_addr, u32 val);
extern u32 get_l2_indirect_reg(u32 reg_addr);
-extern u32 set_get_l2_indirect_reg(u32 reg_addr, u32 val);
#else
static inline void set_l2_indirect_reg(u32 reg_addr, u32 val) {}
static inline u32 get_l2_indirect_reg(u32 reg_addr)
{
return 0;
}
-static inline u32 set_get_l2_indirect_reg(u32 reg_addr, u32 val)
-{
- return 0;
-}
#endif
#endif
diff --git a/arch/arm/mach-msm/include/mach/msm_rtb.h b/arch/arm/mach-msm/include/mach/msm_rtb.h
index 19d171e..b33e8b6 100644
--- a/arch/arm/mach-msm/include/mach/msm_rtb.h
+++ b/arch/arm/mach-msm/include/mach/msm_rtb.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012, 2014 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
@@ -25,6 +25,8 @@
LOGK_HOTPLUG = 4,
LOGK_CTXID = 5,
LOGK_TIMESTAMP = 6,
+ LOGK_L2CPREAD = 7,
+ LOGK_L2CPWRITE = 8,
};
#define LOGTYPE_NOPC 0x80
diff --git a/arch/arm/mach-msm/include/mach/qcrypto.h b/arch/arm/mach-msm/include/mach/qcrypto.h
index bb8048f..f9608b3 100644
--- a/arch/arm/mach-msm/include/mach/qcrypto.h
+++ b/arch/arm/mach-msm/include/mach/qcrypto.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -24,6 +24,11 @@
#define QCRYPTO_CTX_XTS_DU_SIZE_512B 0x00000100
#define QCRYPTO_CTX_XTS_DU_SIZE_1KB 0x00000200
+
+int qcrypto_cipher_set_device(struct ablkcipher_request *req, unsigned int dev);
+int qcrypto_ahash_set_device(struct ahash_request *req, unsigned int dev);
+int qcrypto_aead_set_device(struct aead_request *req, unsigned int dev);
+
int qcrypto_cipher_set_flag(struct ablkcipher_request *req, unsigned int flags);
int qcrypto_ahash_set_flag(struct ahash_request *req, unsigned int flags);
int qcrypto_aead_set_flag(struct aead_request *req, unsigned int flags);
diff --git a/arch/arm/mach-msm/msm-krait-l2-accessors.c b/arch/arm/mach-msm/msm-krait-l2-accessors.c
index 7498e7f..0faf112 100644
--- a/arch/arm/mach-msm/msm-krait-l2-accessors.c
+++ b/arch/arm/mach-msm/msm-krait-l2-accessors.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2012, 2014, 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
@@ -13,38 +13,19 @@
#include <linux/spinlock.h>
#include <linux/module.h>
+#include <mach/msm_rtb.h>
#include <asm/mach-types.h>
#include <asm/cputype.h>
DEFINE_RAW_SPINLOCK(l2_access_lock);
-u32 set_get_l2_indirect_reg(u32 reg_addr, u32 val)
-{
- unsigned long flags;
- u32 ret_val;
-
- raw_spin_lock_irqsave(&l2_access_lock, flags);
- mb();
- asm volatile ("mcr p15, 3, %[l2cpselr], c15, c0, 6\n\t"
- "isb\n\t"
- "mcr p15, 3, %[l2cpdr], c15, c0, 7\n\t"
- "isb\n\t"
- "mrc p15, 3, %[l2cpdr_read], c15, c0, 7\n\t"
- : [l2cpdr_read]"=r" (ret_val)
- : [l2cpselr]"r" (reg_addr), [l2cpdr]"r" (val)
- );
- raw_spin_unlock_irqrestore(&l2_access_lock, flags);
-
- return ret_val;
-}
-EXPORT_SYMBOL(set_get_l2_indirect_reg);
-
void set_l2_indirect_reg(u32 reg_addr, u32 val)
{
unsigned long flags;
raw_spin_lock_irqsave(&l2_access_lock, flags);
mb();
+ uncached_logk(LOGK_L2CPWRITE, (void *)reg_addr);
asm volatile ("mcr p15, 3, %[l2cpselr], c15, c0, 6\n\t"
"isb\n\t"
"mcr p15, 3, %[l2cpdr], c15, c0, 7\n\t"
@@ -62,6 +43,7 @@
unsigned long flags;
raw_spin_lock_irqsave(&l2_access_lock, flags);
+ uncached_logk(LOGK_L2CPREAD, (void *)reg_addr);
asm volatile ("mcr p15, 3, %[l2cpselr], c15, c0, 6\n\t"
"isb\n\t"
"mrc p15, 3, %[l2cpdr], c15, c0, 7\n\t"
diff --git a/arch/arm/mach-msm/ocmem_sched.c b/arch/arm/mach-msm/ocmem_sched.c
index cbf7933..8e25bb2 100644
--- a/arch/arm/mach-msm/ocmem_sched.c
+++ b/arch/arm/mach-msm/ocmem_sched.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, 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
@@ -2104,7 +2104,6 @@
down_write(&req->rw_sem);
- mutex_lock(&allocation_mutex);
retry_allocate:
/* Take the scheduler mutex */
@@ -2114,12 +2113,14 @@
if (rc == OP_EVICT) {
+ mutex_lock(&allocation_mutex);
ret = run_evict(req);
if (ret == 0) {
rc = sched_restore(req);
if (rc < 0) {
pr_err("Failed to restore for req %p\n", req);
+ mutex_unlock(&allocation_mutex);
goto err_allocate_fail;
}
req->edata = NULL;
@@ -2127,14 +2128,14 @@
pr_debug("Attempting to re-allocate req %p\n", req);
req->req_start = 0x0;
req->req_end = 0x0;
+ mutex_unlock(&allocation_mutex);
goto retry_allocate;
} else {
+ mutex_unlock(&allocation_mutex);
goto err_allocate_fail;
}
}
- mutex_unlock(&allocation_mutex);
-
if (rc == OP_FAIL) {
inc_ocmem_stat(zone_of(req), NR_ALLOCATION_FAILS);
goto err_allocate_fail;
@@ -2159,7 +2160,6 @@
up_write(&req->rw_sem);
return 0;
err_allocate_fail:
- mutex_unlock(&allocation_mutex);
up_write(&req->rw_sem);
return -EINVAL;
}
diff --git a/arch/arm/mach-msm/pm-boot.c b/arch/arm/mach-msm/pm-boot.c
index 3559510..0d4840f 100644
--- a/arch/arm/mach-msm/pm-boot.c
+++ b/arch/arm/mach-msm/pm-boot.c
@@ -343,4 +343,4 @@
{
return platform_driver_register(&msm_pm_boot_driver);
}
-module_init(msm_pm_boot_module_init);
+postcore_initcall(msm_pm_boot_module_init);
diff --git a/arch/arm/mach-msm/smd_tty.c b/arch/arm/mach-msm/smd_tty.c
index 9cb26e1..e1c5162 100644
--- a/arch/arm/mach-msm/smd_tty.c
+++ b/arch/arm/mach-msm/smd_tty.c
@@ -28,6 +28,7 @@
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
+#include <linux/suspend.h>
#include <mach/msm_smd.h>
#include <mach/subsystem_restart.h>
@@ -40,6 +41,7 @@
#define MAX_SMD_TTYS 37
#define MAX_TTY_BUF_SIZE 2048
#define TTY_PUSH_WS_DELAY 500
+#define TTY_PUSH_WS_POST_SUSPEND_DELAY 100
#define MAX_RA_WAKE_LOCK_NAME_LEN 32
#define SMD_TTY_PROBE_WAIT_TIMEOUT 3000
#define SMD_TTY_LOG_PAGES 2
@@ -63,6 +65,10 @@
static struct delayed_work smd_tty_probe_work;
static int smd_tty_probe_done;
+static bool smd_tty_in_suspend;
+static bool smd_tty_read_in_suspend;
+static struct wakeup_source read_in_suspend_ws;
+
/**
* struct smd_tty_info - context for an individual SMD TTY device
*
@@ -297,6 +303,9 @@
*/
__pm_wakeup_event(&info->pending_ws, TTY_PUSH_WS_DELAY);
+ if (smd_tty_in_suspend)
+ smd_tty_read_in_suspend = true;
+
tty_flip_buffer_push(tty);
}
@@ -696,6 +705,32 @@
return -ENODEV;
}
+static int smd_tty_pm_notifier(struct notifier_block *nb,
+ unsigned long event, void *unused)
+{
+ switch (event) {
+ case PM_SUSPEND_PREPARE:
+ smd_tty_read_in_suspend = false;
+ smd_tty_in_suspend = true;
+ break;
+
+ case PM_POST_SUSPEND:
+ smd_tty_in_suspend = false;
+ if (smd_tty_read_in_suspend) {
+ smd_tty_read_in_suspend = false;
+ __pm_wakeup_event(&read_in_suspend_ws,
+ TTY_PUSH_WS_POST_SUSPEND_DELAY);
+ }
+ break;
+ }
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block smd_tty_pm_nb = {
+ .notifier_call = smd_tty_pm_notifier,
+ .priority = 0,
+};
+
/**
* smd_tty_log_init()- Init function for IPC logging
*
@@ -836,6 +871,11 @@
}
}
INIT_DELAYED_WORK(&loopback_work, loopback_probe_worker);
+
+ ret = register_pm_notifier(&smd_tty_pm_nb);
+ if (ret)
+ pr_err("%s: power state notif error %d\n", __func__, ret);
+
return 0;
out:
@@ -918,6 +958,10 @@
}
INIT_DELAYED_WORK(&loopback_work, loopback_probe_worker);
+ ret = register_pm_notifier(&smd_tty_pm_nb);
+ if (ret)
+ pr_err("%s: power state notif error %d\n", __func__, ret);
+
return 0;
error:
@@ -1002,6 +1046,7 @@
schedule_delayed_work(&smd_tty_probe_work,
msecs_to_jiffies(SMD_TTY_PROBE_WAIT_TIMEOUT));
+ wakeup_source_init(&read_in_suspend_ws, "SMDTTY_READ_IN_SUSPEND");
return 0;
}
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 4ff4b3e..935bb9a 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -308,7 +308,7 @@
static int __init atomic_pool_init(void)
{
struct dma_pool *pool = &atomic_pool;
- pgprot_t prot = pgprot_dmacoherent(pgprot_kernel);
+ pgprot_t prot = pgprot_dmacoherent(PAGE_KERNEL);
unsigned long nr_pages = pool->size >> PAGE_SHIFT;
unsigned long *bitmap;
struct page *page;
@@ -550,7 +550,7 @@
void *cpu_addr, size_t size)
{
if (!PageHighMem(page))
- __dma_remap(page, size, pgprot_kernel, false);
+ __dma_remap(page, size, PAGE_KERNEL, false);
else
__dma_free_remap(cpu_addr, size, true);
dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT);
@@ -657,7 +657,7 @@
void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
gfp_t gfp, struct dma_attrs *attrs)
{
- pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel);
+ pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL);
void *memory;
bool no_kernel_mapping = dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING,
attrs);
@@ -1151,7 +1151,7 @@
static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,
dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs)
{
- pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel);
+ pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL);
struct page **pages;
void *addr = NULL;
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 669b10e..269ae80 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -307,7 +307,8 @@
.domain = DOMAIN_KERNEL,
},
[MT_MEMORY_DMA_READY] = {
- .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY,
+ .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
+ L_PTE_XN,
.prot_l1 = PMD_TYPE_TABLE,
.domain = DOMAIN_KERNEL,
},
diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c
index 0395681..6312bcd 100644
--- a/drivers/base/dma-contiguous.c
+++ b/drivers/base/dma-contiguous.c
@@ -508,7 +508,7 @@
pageno = bitmap_find_next_zero_area(cma->bitmap, cma->count,
start, count, mask);
if (pageno >= cma->count) {
- mutex_unlock(&cma_mutex);
+ mutex_unlock(&cma->lock);
break;
}
bitmap_set(cma->bitmap, pageno, count);
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index e96d577..3a964a5 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -1250,6 +1250,8 @@
pcpu->hispeed_validate_time =
pcpu->floor_validate_time;
down_write(&pcpu->enable_sem);
+ del_timer_sync(&pcpu->cpu_timer);
+ del_timer_sync(&pcpu->cpu_slack_timer);
cpufreq_interactive_timer_start(j);
pcpu->governor_enabled = 1;
up_write(&pcpu->enable_sem);
diff --git a/drivers/crypto/msm/ota_crypto.c b/drivers/crypto/msm/ota_crypto.c
index 5051a3a..6ecf5b2 100644
--- a/drivers/crypto/msm/ota_crypto.c
+++ b/drivers/crypto/msm/ota_crypto.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2010-2014, 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
@@ -674,50 +674,50 @@
struct ota_qce_dev *p;
pstat = &_qcota_stat;
- len = snprintf(_debug_read_buf, DEBUG_MAX_RW_BUF - 1,
+ len = scnprintf(_debug_read_buf, DEBUG_MAX_RW_BUF - 1,
"\nQualcomm OTA crypto accelerator Statistics:\n");
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F8 request : %d\n",
pstat->f8_req);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F8 operation success : %d\n",
pstat->f8_op_success);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F8 operation fail : %d\n",
pstat->f8_op_fail);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F8 MP request : %d\n",
pstat->f8_mp_req);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F8 MP operation success: %d\n",
pstat->f8_mp_op_success);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F8 MP operation fail : %d\n",
pstat->f8_mp_op_fail);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F9 request : %d\n",
pstat->f9_req);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F9 operation success : %d\n",
pstat->f9_op_success);
- len += snprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
+ len += scnprintf(_debug_read_buf + len, DEBUG_MAX_RW_BUF - len - 1,
" F9 operation fail : %d\n",
pstat->f9_op_fail);
spin_lock_irqsave(&podev->lock, flags);
list_for_each_entry(p, &podev->qce_dev, qlist) {
- len += snprintf(
+ len += scnprintf(
_debug_read_buf + len,
DEBUG_MAX_RW_BUF - len - 1,
" Engine %d Req : %d\n",
p->unit,
p->totalReq
);
- len += snprintf(
+ len += scnprintf(
_debug_read_buf + len,
DEBUG_MAX_RW_BUF - len - 1,
" Engine %d Req Error : %d\n",
diff --git a/drivers/crypto/msm/qce.h b/drivers/crypto/msm/qce.h
index 73438d0..ff90db7 100644
--- a/drivers/crypto/msm/qce.h
+++ b/drivers/crypto/msm/qce.h
@@ -123,6 +123,7 @@
bool use_sw_hmac_algo;
bool use_sw_aes_ccm_algo;
bool clk_mgmt_sus_res;
+ unsigned int ce_device;
};
/* Sha operation parameters */
diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c
index 62fd948..f9f6646 100644
--- a/drivers/crypto/msm/qce50.c
+++ b/drivers/crypto/msm/qce50.c
@@ -223,12 +223,14 @@
pce_dev->ce_sps.ce_burst_size = MAX_CE_BAM_BURST_SIZE;
dev_info(pce_dev->pdev,
+ "CE device = 0x%x\n, "
"IO base, CE = 0x%x\n, "
"Consumer (IN) PIPE %d, "
"Producer (OUT) PIPE %d\n"
"IO base BAM = 0x%x\n"
"BAM IRQ %d\n"
"Engines Availability = 0x%x\n",
+ (uint32_t) pce_dev->ce_sps.ce_device,
(uint32_t) pce_dev->iobase,
pce_dev->ce_sps.dest_pipe_index,
pce_dev->ce_sps.src_pipe_index,
@@ -5116,6 +5118,15 @@
} else {
pr_warn("bam_pipe_pair=0x%x", pce_dev->ce_sps.pipe_pair_index);
}
+ if (of_property_read_u32((&pdev->dev)->of_node,
+ "qcom,ce-device",
+ &pce_dev->ce_sps.ce_device)) {
+ pr_err("Fail to get CE device information.\n");
+ return -EINVAL;
+ } else {
+ pr_warn("ce-device =0x%x", pce_dev->ce_sps.ce_device);
+ }
+
pce_dev->ce_sps.dest_pipe_index = 2 * pce_dev->ce_sps.pipe_pair_index;
pce_dev->ce_sps.src_pipe_index = pce_dev->ce_sps.dest_pipe_index + 1;
@@ -5453,6 +5464,7 @@
pce_dev->use_sw_hmac_algo;
ce_support->use_sw_aes_ccm_algo =
pce_dev->use_sw_aes_ccm_algo;
+ ce_support->ce_device = pce_dev->ce_sps.ce_device;
return 0;
}
EXPORT_SYMBOL(qce_hw_support);
diff --git a/drivers/crypto/msm/qce50.h b/drivers/crypto/msm/qce50.h
index fc387aa..78bfdee 100644
--- a/drivers/crypto/msm/qce50.h
+++ b/drivers/crypto/msm/qce50.h
@@ -176,6 +176,7 @@
struct sps_event_notify notify;
struct scatterlist *src;
struct scatterlist *dst;
+ uint32_t ce_device;
unsigned int pipe_pair_index;
unsigned int src_pipe_index;
unsigned int dest_pipe_index;
diff --git a/drivers/crypto/msm/qcrypto.c b/drivers/crypto/msm/qcrypto.c
index 48dc6ec..5530589 100644
--- a/drivers/crypto/msm/qcrypto.c
+++ b/drivers/crypto/msm/qcrypto.c
@@ -109,6 +109,7 @@
u32 total_req;
u32 err_req;
u32 unit;
+ u32 ce_device;
int res; /* execution result */
unsigned int signature;
uint32_t high_bw_req_count;
@@ -173,6 +174,29 @@
#endif
}
+static struct crypto_engine *_qrypto_find_pengine_device(struct crypto_priv *cp,
+ unsigned int device)
+{
+ struct crypto_engine *entry = NULL;
+ unsigned long flags;
+
+ spin_lock_irqsave(&cp->lock, flags);
+ list_for_each_entry(entry, &cp->engine_list, elist) {
+ if (entry->ce_device == device)
+ break;
+ }
+ spin_unlock_irqrestore(&cp->lock, flags);
+
+ if (((entry != NULL) && (entry->ce_device != device)) ||
+ (entry == NULL)) {
+ pr_err("Device node for CE device %d NOT FOUND!!\n",
+ device);
+ return NULL;
+ }
+
+ return entry;
+}
+
static void qcrypto_unlock_ce(struct work_struct *work)
{
int response = 0;
@@ -3346,6 +3370,52 @@
return 0;
}
+
+int qcrypto_cipher_set_device(struct ablkcipher_request *req, unsigned int dev)
+{
+ struct qcrypto_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
+ struct crypto_priv *cp = ctx->cp;
+ struct crypto_engine *pengine = NULL;
+
+ pengine = _qrypto_find_pengine_device(cp, dev);
+ if (pengine == NULL)
+ return -ENODEV;
+ ctx->pengine = pengine;
+
+ return 0;
+};
+EXPORT_SYMBOL(qcrypto_cipher_set_device);
+
+int qcrypto_aead_set_device(struct aead_request *req, unsigned int dev)
+{
+ struct qcrypto_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
+ struct crypto_priv *cp = ctx->cp;
+ struct crypto_engine *pengine = NULL;
+
+ pengine = _qrypto_find_pengine_device(cp, dev);
+ if (pengine == NULL)
+ return -ENODEV;
+ ctx->pengine = pengine;
+
+ return 0;
+};
+EXPORT_SYMBOL(qcrypto_aead_set_device);
+
+int qcrypto_ahash_set_device(struct ahash_request *req, unsigned int dev)
+{
+ struct qcrypto_sha_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
+ struct crypto_priv *cp = ctx->cp;
+ struct crypto_engine *pengine = NULL;
+
+ pengine = _qrypto_find_pengine_device(cp, dev);
+ if (pengine == NULL)
+ return -ENODEV;
+ ctx->pengine = pengine;
+
+ return 0;
+};
+EXPORT_SYMBOL(qcrypto_ahash_set_device);
+
int qcrypto_cipher_set_flag(struct ablkcipher_request *req, unsigned int flags)
{
struct qcrypto_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
@@ -3961,6 +4031,9 @@
msm_bus_cl_get_pdata(pdev);
if (!cp->platform_support.bus_scale_table)
pr_warn("bus_scale_table is NULL\n");
+
+ pengine->ce_device = cp->ce_support.ce_device;
+
} else {
platform_support =
(struct msm_ce_hw_support *)pdev->dev.platform_data;
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index 66d6878..e69743b 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -679,7 +679,7 @@
rc = vb2_reqbufs(&q->vb2_bufq, b);
mutex_unlock(&q->lock);
if (rc)
- dprintk(VIDC_ERR, "Failed to get reqbufs, %d\n", rc);
+ dprintk(VIDC_DBG, "Failed to get reqbufs, %d\n", rc);
return rc;
}
diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c
index 030aa29..3db79a2 100644
--- a/drivers/media/platform/msm/vidc/msm_venc.c
+++ b/drivers/media/platform/msm/vidc/msm_venc.c
@@ -2733,7 +2733,7 @@
rc = vb2_reqbufs(&q->vb2_bufq, b);
mutex_unlock(&q->lock);
if (rc)
- dprintk(VIDC_ERR, "Failed to get reqbufs, %d\n", rc);
+ dprintk(VIDC_DBG, "Failed to get reqbufs, %d\n", rc);
return rc;
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index 9dbecfb..7960298 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -1293,7 +1293,6 @@
{
struct list_head *ptr, *next;
struct vb2_buf_entry *entry;
- struct internal_buf *buf;
if (inst) {
mutex_lock(&inst->lock);
if (!list_empty(&inst->pendingq)) {
@@ -1305,37 +1304,28 @@
}
}
if (!list_empty(&inst->internalbufs)) {
- list_for_each_safe(ptr, next, &inst->internalbufs) {
- buf = list_entry(ptr, struct internal_buf,
- list);
- list_del(&buf->list);
- mutex_unlock(&inst->lock);
- msm_comm_smem_free(inst, buf->handle);
- kfree(buf);
- mutex_lock(&inst->lock);
- }
+ mutex_unlock(&inst->lock);
+ if (msm_comm_release_scratch_buffers(inst))
+ dprintk(VIDC_ERR,
+ "Failed to release scratch buffers\n");
+
+ mutex_lock(&inst->lock);
}
if (!list_empty(&inst->persistbufs)) {
- list_for_each_safe(ptr, next, &inst->persistbufs) {
- buf = list_entry(ptr, struct internal_buf,
- list);
- list_del(&buf->list);
- mutex_unlock(&inst->lock);
- msm_comm_smem_free(inst, buf->handle);
- kfree(buf);
- mutex_lock(&inst->lock);
- }
+ mutex_unlock(&inst->lock);
+ if (msm_comm_release_persist_buffers(inst))
+ dprintk(VIDC_ERR,
+ "Failed to release persist buffers\n");
+
+ mutex_lock(&inst->lock);
}
if (!list_empty(&inst->outputbufs)) {
- list_for_each_safe(ptr, next, &inst->outputbufs) {
- buf = list_entry(ptr, struct internal_buf,
- list);
- list_del(&buf->list);
- mutex_unlock(&inst->lock);
- msm_comm_smem_free(inst, buf->handle);
- kfree(buf);
- mutex_lock(&inst->lock);
- }
+ mutex_unlock(&inst->lock);
+ if (msm_comm_release_output_buffers(inst))
+ dprintk(VIDC_ERR,
+ "Failed to release output buffers\n");
+
+ mutex_lock(&inst->lock);
}
if (inst->extradata_handle) {
mutex_unlock(&inst->lock);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index 3430311..96a13ab 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -1798,7 +1798,7 @@
msm_vidc_print_running_insts(inst->core);
inst->state = MSM_VIDC_CORE_INVALID;
msm_comm_recover_from_session_error(inst);
- return -ENOMEM;
+ return -EBUSY;
}
hdev = inst->core->device;
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.h b/drivers/media/platform/msm/vidc/msm_vidc_common.h
index e2f7b61..07dae8c 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.h
@@ -37,6 +37,7 @@
int msm_comm_flush(struct msm_vidc_inst *inst, u32 flags);
int msm_comm_release_scratch_buffers(struct msm_vidc_inst *inst);
int msm_comm_release_persist_buffers(struct msm_vidc_inst *inst);
+int msm_comm_release_output_buffers(struct msm_vidc_inst *inst);
int msm_comm_force_cleanup(struct msm_vidc_inst *inst);
enum hal_extradata_id msm_comm_get_hal_extradata_index(
enum v4l2_mpeg_vidc_extradata index);
diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c
index 5eb359e..156ce24 100644
--- a/drivers/mfd/wcd9xxx-core.c
+++ b/drivers/mfd/wcd9xxx-core.c
@@ -1719,7 +1719,6 @@
{
struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev);
- dev_info(wcd9xxx->dev, "%s: device down\n", __func__);
if (!wcd9xxx) {
pr_err("%s: wcd9xxx is NULL\n", __func__);
return -EINVAL;
diff --git a/drivers/mfd/wcd9xxx-irq.c b/drivers/mfd/wcd9xxx-irq.c
index 7644984..d9cf60a 100644
--- a/drivers/mfd/wcd9xxx-irq.c
+++ b/drivers/mfd/wcd9xxx-irq.c
@@ -615,6 +615,10 @@
static int virq_to_phyirq(struct wcd9xxx_core_resource *wcd9xxx_res, int virq)
{
struct irq_data *irq_data = irq_get_irq_data(virq);
+ if (unlikely(!irq_data)) {
+ pr_err("%s: irq_data is NULL", __func__);
+ return -EINVAL;
+ }
return irq_data->hwirq;
}
@@ -664,6 +668,10 @@
} else {
dev_dbg(&pdev->dev, "%s: virq = %d\n", __func__, irq);
domain = irq_find_host(pdev->dev.of_node);
+ if (unlikely(!domain)) {
+ pr_err("%s: domain is NULL", __func__);
+ return -EINVAL;
+ }
data = (struct wcd9xxx_irq_drv_data *)domain->host_data;
data->irq = irq;
wmb();
@@ -679,6 +687,10 @@
struct wcd9xxx_irq_drv_data *data;
domain = irq_find_host(pdev->dev.of_node);
+ if (unlikely(!domain)) {
+ pr_err("%s: domain is NULL", __func__);
+ return -EINVAL;
+ }
data = (struct wcd9xxx_irq_drv_data *)domain->host_data;
data->irq = 0;
wmb();
diff --git a/drivers/mfd/wcd9xxx-slimslave.c b/drivers/mfd/wcd9xxx-slimslave.c
index 81262b58..4f42181 100644
--- a/drivers/mfd/wcd9xxx-slimslave.c
+++ b/drivers/mfd/wcd9xxx-slimslave.c
@@ -499,7 +499,8 @@
/* This function is called with mutex acquired */
int wcd9xxx_tx_vport_validation(u32 vtable, u32 port_id,
- struct wcd9xxx_codec_dai_data *codec_dai)
+ struct wcd9xxx_codec_dai_data *codec_dai,
+ u32 num_codec_dais)
{
struct wcd9xxx_ch *ch;
int ret = 0;
@@ -508,18 +509,25 @@
pr_debug("%s: vtable 0x%x port_id %u size %d\n", __func__,
vtable, port_id, size);
for_each_set_bit(index, (unsigned long *)&vtable, size) {
- list_for_each_entry(ch,
- &codec_dai[index].wcd9xxx_ch_list,
- list) {
- pr_debug("%s: index %u ch->port %u vtable 0x%x\n",
- __func__, index, ch->port, vtable);
- if (ch->port == port_id) {
- pr_err("%s: TX%u is used by AIF%u_CAP Mixer\n",
- __func__, port_id + 1,
- (index + 1)/2);
- ret = -EINVAL;
- break;
+ if (index < num_codec_dais) {
+ list_for_each_entry(ch,
+ &codec_dai[index].wcd9xxx_ch_list,
+ list) {
+ pr_debug("%s: index %u ch->port %u vtable 0x%x\n",
+ __func__, index, ch->port,
+ vtable);
+ if (ch->port == port_id) {
+ pr_err("%s: TX%u is used by AIF%u_CAP Mixer\n",
+ __func__, port_id + 1,
+ (index + 1)/2);
+ ret = -EINVAL;
+ break;
+ }
}
+ } else {
+ pr_err("%s: Invalid index %d of codec dai",
+ __func__, index);
+ ret = -EINVAL;
}
if (ret)
break;
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 7ad51e6..a9d6949 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -127,6 +127,7 @@
uint32_t qsee_ce_hw_instance;
uint32_t hlos_ce_hw_instance;
uint32_t disk_encrypt_pipe;
+ uint32_t file_encrypt_pipe;
};
struct qseecom_clk {
@@ -166,6 +167,8 @@
struct qseecom_clk ce_drv;
bool support_bus_scaling;
+ bool support_fde;
+ bool support_pfe;
uint32_t cumulative_mode;
enum qseecom_bandwidth_request_mode current_mode;
struct timer_list bw_scale_down_timer;
@@ -2688,16 +2691,28 @@
int ret;
switch (usage) {
case QSEOS_KM_USAGE_DISK_ENCRYPTION:
- if (qseecom.ce_info.disk_encrypt_pipe == 0xFF ||
- qseecom.ce_info.hlos_ce_hw_instance == 0xFF) {
- pr_err("nfo unavailable: disk encr pipe %d ce_hw %d\n",
- qseecom.ce_info.disk_encrypt_pipe,
- qseecom.ce_info.hlos_ce_hw_instance);
- ret = -EINVAL;
- } else {
+ if (qseecom.support_fde) {
*pipe = qseecom.ce_info.disk_encrypt_pipe;
*ce_hw = qseecom.ce_info.hlos_ce_hw_instance;
ret = 0;
+
+ } else {
+ pr_err("info unavailable: disk encr pipe %d ce_hw %d\n",
+ qseecom.ce_info.disk_encrypt_pipe,
+ qseecom.ce_info.hlos_ce_hw_instance);
+ ret = -EINVAL;
+ }
+ break;
+ case QSEOS_KM_USAGE_FILE_ENCRYPTION:
+ if (qseecom.support_pfe) {
+ *pipe = qseecom.ce_info.file_encrypt_pipe;
+ *ce_hw = qseecom.ce_info.hlos_ce_hw_instance;
+ ret = 0;
+ } else {
+ pr_err("info unavailable: file encr pipe %d ce_hw %d\n",
+ qseecom.ce_info.file_encrypt_pipe,
+ qseecom.ce_info.hlos_ce_hw_instance);
+ ret = -EINVAL;
}
break;
default:
@@ -3511,6 +3526,8 @@
break;
}
case QSEECOM_IOCTL_CREATE_KEY_REQ: {
+ if (!(qseecom.support_pfe || qseecom.support_fde))
+ pr_err("Features requiring key init not supported\n");
if (data->type != QSEECOM_GENERIC) {
pr_err("create key req: invalid handle (%d)\n",
data->type);
@@ -3532,6 +3549,8 @@
break;
}
case QSEECOM_IOCTL_WIPE_KEY_REQ: {
+ if (!(qseecom.support_pfe || qseecom.support_fde))
+ pr_err("Features requiring key init not supported\n");
if (data->type != QSEECOM_GENERIC) {
pr_err("wipe key req: invalid handle (%d)\n",
data->type);
@@ -3552,6 +3571,8 @@
break;
}
case QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ: {
+ if (!(qseecom.support_pfe || qseecom.support_fde))
+ pr_err("Features requiring key init not supported\n");
if (data->type != QSEECOM_GENERIC) {
pr_err("update key req: invalid handle (%d)\n",
data->type);
@@ -3838,6 +3859,8 @@
qseecom.cumulative_mode = 0;
qseecom.current_mode = INACTIVE;
qseecom.support_bus_scaling = false;
+ qseecom.support_fde = false;
+ qseecom.support_pfe = false;
qseecom.ce_drv.ce_core_clk = NULL;
qseecom.ce_drv.ce_clk = NULL;
@@ -3924,23 +3947,62 @@
"qcom,support-bus-scaling");
pr_warn("support_bus_scaling=0x%x",
qseecom.support_bus_scaling);
- if (of_property_read_u32((&pdev->dev)->of_node,
+ qseecom.support_fde =
+ of_property_read_bool((&pdev->dev)->of_node,
+ "qcom,support-fde");
+ if (qseecom.support_fde) {
+ if (of_property_read_u32((&pdev->dev)->of_node,
"qcom,disk-encrypt-pipe-pair",
&qseecom.ce_info.disk_encrypt_pipe)) {
- pr_err("Fail to get disk-encrypt pipe pair information.\n");
- qseecom.ce_info.disk_encrypt_pipe = 0xff;
- rc = -EINVAL;
- goto exit_destroy_ion_client;
+ pr_err("Fail to get FDE pipe information.\n");
+ rc = -EINVAL;
+ goto exit_destroy_ion_client;
+ } else {
+ pr_warn("disk-encrypt-pipe-pair=0x%x",
+ qseecom.ce_info.disk_encrypt_pipe);
+ }
} else {
- pr_warn("bam_pipe_pair=0x%x",
- qseecom.ce_info.disk_encrypt_pipe);
+ pr_warn("Device does not support FDE");
+ qseecom.ce_info.disk_encrypt_pipe = 0xff;
+ }
+ qseecom.support_pfe =
+ of_property_read_bool((&pdev->dev)->of_node,
+ "qcom,support-pfe");
+ if (qseecom.support_pfe) {
+ if (of_property_read_u32((&pdev->dev)->of_node,
+ "qcom,file-encrypt-pipe-pair",
+ &qseecom.ce_info.disk_encrypt_pipe)) {
+ pr_err("Fail to get PFE pipe information.\n");
+ rc = -EINVAL;
+ goto exit_destroy_ion_client;
+ } else {
+ pr_warn("file-encrypt-pipe-pair=0x%x",
+ qseecom.ce_info.file_encrypt_pipe);
+ }
+ } else {
+ pr_warn("Device does not support PFE");
+ qseecom.ce_info.file_encrypt_pipe = 0xff;
+ }
+ if (qseecom.support_pfe || qseecom.support_fde) {
+ if (of_property_read_u32((&pdev->dev)->of_node,
+ "qcom,hlos-ce-hw-instance",
+ &qseecom.ce_info.hlos_ce_hw_instance)) {
+ pr_err("Fail: get hlos ce hw instanc info\n");
+ rc = -EINVAL;
+ goto exit_destroy_ion_client;
+ } else {
+ pr_warn("hlos-ce-hw-instance=0x%x",
+ qseecom.ce_info.hlos_ce_hw_instance);
+ }
+ } else {
+ pr_warn("Device does not support PFE/FDE");
+ qseecom.ce_info.hlos_ce_hw_instance = 0xff;
}
if (of_property_read_u32((&pdev->dev)->of_node,
"qcom,qsee-ce-hw-instance",
&qseecom.ce_info.qsee_ce_hw_instance)) {
pr_err("Fail to get qsee ce hw instance information.\n");
- qseecom.ce_info.qsee_ce_hw_instance = 0xff;
rc = -EINVAL;
goto exit_destroy_ion_client;
} else {
@@ -3948,18 +4010,6 @@
qseecom.ce_info.qsee_ce_hw_instance);
}
- if (of_property_read_u32((&pdev->dev)->of_node,
- "qcom,hlos-ce-hw-instance",
- &qseecom.ce_info.hlos_ce_hw_instance)) {
- pr_err("Fail to get hlos ce hw instance information.\n");
- qseecom.ce_info.hlos_ce_hw_instance = 0xff;
- rc = -EINVAL;
- goto exit_destroy_ion_client;
- } else {
- pr_warn("hlos-ce-hw-instance=0x%x",
- qseecom.ce_info.hlos_ce_hw_instance);
- }
-
qseecom.qsee.instance = qseecom.ce_info.qsee_ce_hw_instance;
qseecom.ce_drv.instance = qseecom.ce_info.hlos_ce_hw_instance;
@@ -3967,7 +4017,8 @@
if (ret)
goto exit_destroy_ion_client;
- if (qseecom.qsee.instance != qseecom.ce_drv.instance) {
+ if ((qseecom.qsee.instance != qseecom.ce_drv.instance) &&
+ (qseecom.support_pfe || qseecom.support_fde)) {
ret = __qseecom_init_clk(CLK_CE_DRV);
if (ret) {
__qseecom_deinit_clk(CLK_QSEE);
@@ -4097,7 +4148,8 @@
/* register client for bus scaling */
if (pdev->dev.of_node) {
__qseecom_deinit_clk(CLK_QSEE);
- if (qseecom.qsee.instance != qseecom.ce_drv.instance)
+ if ((qseecom.qsee.instance != qseecom.ce_drv.instance) &&
+ (qseecom.support_pfe || qseecom.support_fde))
__qseecom_deinit_clk(CLK_CE_DRV);
}
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 6de1cde..9d07631 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -3108,9 +3108,6 @@
MMC_FIXUP(CID_NAME_ANY, CID_MANFID_HYNIX, CID_OEMID_ANY, add_quirk_mmc,
MMC_QUIRK_BROKEN_DATA_TIMEOUT),
- /* Disable cache for this cards */
- MMC_FIXUP("H8G2d", CID_MANFID_HYNIX, CID_OEMID_ANY, add_quirk_mmc,
- MMC_QUIRK_CACHE_DISABLE),
END_FIXUP
};
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 63952e7..88655c6 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -66,6 +66,14 @@
MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX,
0x014a, add_quirk, MMC_QUIRK_BROKEN_HPI, 5),
+ /*
+ * Some Hynix cards exhibit data corruption over reboots if cache is
+ * enabled. Disable cache for all versions until a class of cards that
+ * show this behavior is identified.
+ */
+ MMC_FIXUP("H8G2d", CID_MANFID_HYNIX, CID_OEMID_ANY, add_quirk_mmc,
+ MMC_QUIRK_CACHE_DISABLE),
+
END_FIXUP
};
@@ -1580,11 +1588,6 @@
card->ext_csd.cache_ctrl = 1;
}
}
- if (card->quirks & MMC_QUIRK_CACHE_DISABLE) {
- pr_warn("%s: This is Hynix card, cache disabled!\n",
- mmc_hostname(card->host));
- card->ext_csd.cache_ctrl = 0;
- }
if ((host->caps2 & MMC_CAP2_PACKED_WR &&
card->ext_csd.max_packed_writes > 0) ||
diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c
index d3d8d0e..0f3eaea 100644
--- a/drivers/net/wireless/wcnss/wcnss_wlan.c
+++ b/drivers/net/wireless/wcnss/wcnss_wlan.c
@@ -409,6 +409,7 @@
u16 unsafe_ch_count;
u16 unsafe_ch_list[WCNSS_MAX_CH_NUM];
void *wcnss_notif_hdle;
+ u8 is_shutdown;
} *penv = NULL;
static ssize_t wcnss_wlan_macaddr_store(struct device *dev,
@@ -1129,12 +1130,20 @@
int wcnss_device_ready(void)
{
- if (penv && penv->pdev && penv->nv_downloaded)
+ if (penv && penv->pdev && penv->nv_downloaded &&
+ !wcnss_device_is_shutdown())
return 1;
return 0;
}
EXPORT_SYMBOL(wcnss_device_ready);
+int wcnss_device_is_shutdown(void)
+{
+ if (penv && penv->is_shutdown)
+ return 1;
+ return 0;
+}
+EXPORT_SYMBOL(wcnss_device_is_shutdown);
struct resource *wcnss_wlan_get_memory_map(struct device *dev)
{
@@ -2523,6 +2532,10 @@
if (SUBSYS_POWERUP_FAILURE == code)
wcnss_pronto_log_debug_regs();
+ else if (SUBSYS_BEFORE_SHUTDOWN == code)
+ penv->is_shutdown = 1;
+ else if (SUBSYS_AFTER_POWERUP == code)
+ penv->is_shutdown = 0;
return NOTIFY_DONE;
}
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c
index 6ebe06a..697ac40 100644
--- a/drivers/video/msm/mdss/mdp3_ctrl.c
+++ b/drivers/video/msm/mdss/mdp3_ctrl.c
@@ -1618,6 +1618,7 @@
{
struct mdp_overlay_list ovlist;
struct mdp3_session_data *mdp3_session = mfd->mdp.private1;
+ struct mdp_overlay *req_list;
struct mdp_overlay *req;
int rc;
@@ -1634,12 +1635,15 @@
return -EINVAL;
}
- if (copy_from_user(req, ovlist.overlay_list[0], sizeof(*req)))
+ if (copy_from_user(&req_list, ovlist.overlay_list, sizeof(struct mdp_overlay*)))
+ return -EFAULT;
+
+ if (copy_from_user(req, req_list, sizeof(*req)))
return -EFAULT;
rc = mdp3_overlay_set(mfd, req);
if (!IS_ERR_VALUE(rc)) {
- if (copy_to_user(ovlist.overlay_list[0], req, sizeof(*req)))
+ if (copy_to_user(req_list, req, sizeof(*req)))
return -EFAULT;
}
diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c
index 6de0df6..553ae09 100644
--- a/drivers/video/msm/mdss/mdss_dsi.c
+++ b/drivers/video/msm/mdss/mdss_dsi.c
@@ -443,7 +443,9 @@
{
int ret = 0;
struct mdss_panel_data *pdata = NULL;
+ struct mipi_panel_info *pinfo = NULL;
u32 lane_status = 0;
+ u32 active_lanes = 0;
if (!ctrl_pdata) {
pr_err("%s: invalid input\n", __func__);
@@ -451,6 +453,11 @@
}
pdata = &ctrl_pdata->panel_data;
+ if (!pdata) {
+ pr_err("%s: Invalid panel data\n", __func__);
+ return -EINVAL;
+ }
+ pinfo = &pdata->panel_info.mipi;
if (!__mdss_dsi_ulps_feature_enabled(pdata)) {
pr_debug("%s: ULPS feature not supported. enable=%d\n",
@@ -486,8 +493,19 @@
*/
MIPI_OUTP(ctrl_pdata->ctrl_base + 0x0AC, 0x01F);
usleep(100);
+
+ /* Check to make sure that all active data lanes are in ULPS */
+ if (pinfo->data_lane3)
+ active_lanes |= BIT(11);
+ if (pinfo->data_lane2)
+ active_lanes |= BIT(10);
+ if (pinfo->data_lane1)
+ active_lanes |= BIT(9);
+ if (pinfo->data_lane0)
+ active_lanes |= BIT(8);
+ active_lanes |= BIT(12); /* clock lane */
lane_status = MIPI_INP(ctrl_pdata->ctrl_base + 0xA8);
- if (lane_status & 0x1F00) {
+ if (lane_status & active_lanes) {
pr_err("%s: ULPS entry req failed. Lane status=0x%08x\n",
__func__, lane_status);
ret = -EINVAL;
diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h
index adee7b50..beb3cac 100644
--- a/drivers/video/msm/mdss/mdss_mdp.h
+++ b/drivers/video/msm/mdss/mdss_mdp.h
@@ -575,6 +575,7 @@
int mux, int stage);
int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe, int params_changed);
int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe);
+void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer);
int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg);
int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl);
int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl);
diff --git a/drivers/video/msm/mdss/mdss_mdp_ctl.c b/drivers/video/msm/mdss/mdss_mdp_ctl.c
index 2c1beab..96e9bc7 100644
--- a/drivers/video/msm/mdss/mdss_mdp_ctl.c
+++ b/drivers/video/msm/mdss/mdss_mdp_ctl.c
@@ -423,7 +423,7 @@
static inline int mdss_mdp_perf_is_overlap(u32 y00, u32 y01, u32 y10, u32 y11)
{
- return (y10 < y00 && y11 >= y01) || (y10 >= y00 && y10 <= y01);
+ return (y10 < y00 && y11 >= y01) || (y10 >= y00 && y10 < y01);
}
static inline int cmpu32(const void *a, const void *b)
@@ -529,7 +529,7 @@
pr_debug("v_region[%d]%d\n", i, v_region[i]);
if (v_region[i] == v_region[i-1])
continue;
- y0 = (v_region[i-1]) ? v_region[i-1] + 1 : 0;
+ y0 = v_region[i-1];
y1 = v_region[i];
for (j = 0; j < num_pipes; j++) {
if (!bw_overlap[j])
@@ -2241,6 +2241,33 @@
return 0;
}
+/**
+ * mdss_mdp_mixer_unstage_all() - Unstage all pipes from mixer
+ * @mixer: Mixer from which to unstage all pipes
+ *
+ * Unstage any pipes that are currently attached to mixer.
+ *
+ * NOTE: this will not update the pipe structure, and thus a full
+ * deinitialization or reconfiguration of all pipes is expected after this call.
+ */
+void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer)
+{
+ struct mdss_mdp_pipe *tmp;
+ int i;
+
+ if (!mixer)
+ return;
+
+ for (i = 0; i < MDSS_MDP_MAX_STAGE; i++) {
+ tmp = mixer->stage_pipe[i];
+ if (tmp) {
+ mixer->stage_pipe[i] = NULL;
+ mixer->params_changed++;
+ tmp->params_changed++;
+ }
+ }
+}
+
int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe)
{
struct mdss_mdp_ctl *ctl;
diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c
index 7628380..ce4f814 100644
--- a/drivers/video/msm/mdss/mdss_mdp_overlay.c
+++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c
@@ -48,6 +48,7 @@
#define MEM_PROTECT_SD_CTRL 0xF
#define INVALID_PIPE_INDEX 0xFFFF
+#define OVERLAY_MAX 10
struct sd_ctrl_req {
unsigned int enable;
@@ -58,6 +59,7 @@
static int mdss_mdp_overlay_fb_parse_dt(struct msm_fb_data_type *mfd);
static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd);
static int mdss_mdp_overlay_splash_parse_dt(struct msm_fb_data_type *mfd);
+static void __overlay_kickoff_requeue(struct msm_fb_data_type *mfd);
static int mdss_mdp_overlay_sd_ctrl(struct msm_fb_data_type *mfd,
unsigned int enable)
@@ -763,6 +765,8 @@
{
struct mdss_mdp_pipe *pipe, *tmp;
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
+ struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
+ bool recovery_mode = false;
LIST_HEAD(destroy_pipes);
mutex_lock(&mfd->lock);
@@ -771,7 +775,27 @@
list_move(&pipe->cleanup_list, &destroy_pipes);
/* make sure pipe fetch has been halted before freeing buffer */
- mdss_mdp_pipe_fetch_halt(pipe);
+ if (mdss_mdp_pipe_fetch_halt(pipe)) {
+ /*
+ * if pipe is not able to halt. Enter recovery mode,
+ * by un-staging any pipes that are attached to mixer
+ * so that any freed pipes that are not able to halt
+ * can be staged in solid fill mode and be reset
+ * with next vsync
+ */
+ if (!recovery_mode) {
+ recovery_mode = true;
+ mdss_mdp_mixer_unstage_all(ctl->mixer_left);
+ mdss_mdp_mixer_unstage_all(ctl->mixer_right);
+ }
+ pipe->params_changed++;
+ mdss_mdp_pipe_queue_data(pipe, NULL);
+ }
+ }
+
+ if (recovery_mode) {
+ pr_warn("performing recovery sequence for fb%d\n", mfd->index);
+ __overlay_kickoff_requeue(mfd);
}
__mdss_mdp_overlay_free_list_purge(mfd);
@@ -970,51 +994,22 @@
activate_event_timer(mdp5_data->cpu_pm_hdl, wakeup_time);
}
-int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
- struct mdp_display_commit *data)
+static int __overlay_queue_pipes(struct msm_fb_data_type *mfd)
{
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
struct mdss_mdp_pipe *pipe;
struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
struct mdss_mdp_ctl *tmp;
int ret = 0;
- int sd_in_pipe = 0;
-
- if (!ctl) {
- pr_warn("kickoff on fb=%d without a ctl attched\n", mfd->index);
- return ret;
- }
-
- if (ctl->shared_lock)
- mutex_lock(ctl->shared_lock);
-
- mutex_lock(&mdp5_data->ov_lock);
- mutex_lock(&mfd->lock);
/*
- * check if there is a secure display session
+ * Setup pipe in solid fill before unstaging,
+ * to ensure no fetches are happening after dettach or reattach.
*/
- list_for_each_entry(pipe, &mdp5_data->pipes_used, used_list) {
- if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) {
- sd_in_pipe |= 1;
- pr_debug("Secure pipe: %u : %08X\n",
- pipe->num, pipe->flags);
- }
+ list_for_each_entry(pipe, &mdp5_data->pipes_cleanup, cleanup_list) {
+ mdss_mdp_pipe_queue_data(pipe, NULL);
+ mdss_mdp_mixer_pipe_unstage(pipe);
}
- /*
- * If there is no secure display session and sd_enabled, disable the
- * secure display session
- */
- if (!sd_in_pipe && mdp5_data->sd_enabled) {
- if (0 == mdss_mdp_overlay_sd_ctrl(mfd, 0))
- mdp5_data->sd_enabled = 0;
- }
-
- mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_BEGIN);
- mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
-
- if (data)
- mdss_mdp_set_roi(ctl, data);
list_for_each_entry(pipe, &mdp5_data->pipes_used, used_list) {
struct mdss_mdp_data *buf;
@@ -1044,17 +1039,13 @@
if (ret) {
pr_err("can't reset DMA pipe ret=%d ctl=%d\n",
ret, ctl->num);
- mutex_unlock(&mfd->lock);
- goto commit_fail;
+ return ret;
}
tmp = mdss_mdp_ctl_mixer_switch(ctl,
MDSS_MDP_WB_CTL_TYPE_LINE);
- if (!tmp) {
- mutex_unlock(&mfd->lock);
- ret = -EINVAL;
- goto commit_fail;
- }
+ if (!tmp)
+ return -EINVAL;
pipe->mixer = mdss_mdp_mixer_get(tmp,
MDSS_MDP_MIXER_MUX_DEFAULT);
}
@@ -1083,6 +1074,73 @@
}
}
+ return 0;
+}
+
+static void __overlay_kickoff_requeue(struct msm_fb_data_type *mfd)
+{
+ struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
+
+ mdss_mdp_display_commit(ctl, NULL);
+ mdss_mdp_display_wait4comp(ctl);
+
+ __overlay_queue_pipes(mfd);
+
+ mdss_mdp_display_commit(ctl, NULL);
+ mdss_mdp_display_wait4comp(ctl);
+}
+
+int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
+ struct mdp_display_commit *data)
+{
+ struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
+ struct mdss_mdp_pipe *pipe;
+ struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
+ int ret = 0;
+ int sd_in_pipe = 0;
+
+ if (ctl->shared_lock)
+ mutex_lock(ctl->shared_lock);
+
+ mutex_lock(&mdp5_data->ov_lock);
+ mutex_lock(&mfd->lock);
+
+ /*
+ * check if there is a secure display session
+ */
+ list_for_each_entry(pipe, &mdp5_data->pipes_used, used_list) {
+ if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) {
+ sd_in_pipe = 1;
+ pr_debug("Secure pipe: %u : %08X\n",
+ pipe->num, pipe->flags);
+ }
+ }
+ /*
+ * If there is no secure display session and sd_enabled, disable the
+ * secure display session
+ */
+ if (!sd_in_pipe && mdp5_data->sd_enabled) {
+ if (0 == mdss_mdp_overlay_sd_ctrl(mfd, 0))
+ mdp5_data->sd_enabled = 0;
+ }
+
+ mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_BEGIN);
+ mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
+
+ if (data)
+ mdss_mdp_set_roi(ctl, data);
+
+ /*
+ * Setup pipe in solid fill before unstaging,
+ * to ensure no fetches are happening after dettach or reattach.
+ */
+ list_for_each_entry(pipe, &mdp5_data->pipes_cleanup, cleanup_list) {
+ mdss_mdp_pipe_queue_data(pipe, NULL);
+ mdss_mdp_mixer_pipe_unstage(pipe);
+ }
+
+ ret = __overlay_queue_pipes(mfd);
+
if (mfd->panel.type == WRITEBACK_PANEL)
ret = mdss_mdp_wb_kickoff(mfd);
else
@@ -1148,7 +1206,6 @@
&mdp5_data->pipes_cleanup);
}
mutex_unlock(&mfd->lock);
- mdss_mdp_mixer_pipe_unstage(pipe);
mdss_mdp_pipe_unmap(pipe);
if (destroy_pipe)
mdss_mdp_pipe_destroy(pipe);
@@ -2359,20 +2416,32 @@
void __user *argp)
{
struct mdp_overlay_list ovlist;
+ struct mdp_overlay *req_list[OVERLAY_MAX];
struct mdp_overlay *overlays;
int i, ret;
if (copy_from_user(&ovlist, argp, sizeof(ovlist)))
return -EFAULT;
+ if (ovlist.num_overlays >= OVERLAY_MAX) {
+ pr_err("Number of overlays exceeds max\n");
+ return -EINVAL;
+ }
+
overlays = kmalloc(ovlist.num_overlays * sizeof(*overlays), GFP_KERNEL);
if (!overlays) {
pr_err("Unable to allocate memory for overlays\n");
return -ENOMEM;
}
+ if (copy_from_user(req_list, ovlist.overlay_list,
+ sizeof(struct mdp_overlay*) * ovlist.num_overlays)) {
+ ret = -EFAULT;
+ goto validate_exit;
+ }
+
for (i = 0; i < ovlist.num_overlays; i++) {
- if (copy_from_user(overlays + i, ovlist.overlay_list[i],
+ if (copy_from_user(overlays + i, req_list[i],
sizeof(struct mdp_overlay))) {
ret = -EFAULT;
goto validate_exit;
@@ -2382,7 +2451,7 @@
ret = __handle_overlay_prepare(mfd, &ovlist, overlays);
if (!IS_ERR_VALUE(ret)) {
for (i = 0; i < ovlist.num_overlays; i++) {
- if (copy_to_user(ovlist.overlay_list[i], overlays + i,
+ if (copy_to_user(req_list[i], overlays + i,
sizeof(struct mdp_overlay))) {
ret = -EFAULT;
goto validate_exit;
diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c
index 37b71c7..96f9c06 100644
--- a/drivers/video/msm/mdss/mdss_mdp_pp.c
+++ b/drivers/video/msm/mdss/mdss_mdp_pp.c
@@ -3330,8 +3330,11 @@
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
sum = pp_hist_read(v_base, hist_info);
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false);
- if (expect_sum && sum != expect_sum)
+ if (expect_sum && sum != expect_sum) {
+ pr_debug("hist error: bin sum incorrect! (%d/%d)\n",
+ sum, expect_sum);
ret = -ENODATA;
+ }
} else {
spin_unlock_irqrestore(&hist_info->hist_lock, flag);
}
@@ -3398,6 +3401,9 @@
temp_ret = ret;
ret = pp_hist_collect(hist, hists[i], ctl_base,
exp_sum);
+ if (ret)
+ pr_debug("hist error: dspp[%d] collect %d\n",
+ dspp_num, ret);
}
for (i = 0; i < hist_cnt; i++) {
/* reset read requests and re-intialize completions */
@@ -3495,6 +3501,10 @@
temp_ret = ret;
ret = pp_hist_collect(hist, hist_info, ctl_base,
exp_sum);
+ if (ret)
+ pr_debug("hist error: pipe[%d] collect: %d\n",
+ pipe->num, ret);
+
mdss_mdp_pipe_unmap(pipe);
}
for (i = pipe_num; i < MDSS_PP_ARG_NUM; i++) {
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 48609bc..6577ae3 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -43,6 +43,7 @@
#include <linux/kthread.h>
#include <linux/freezer.h>
+#include <linux/ratelimit.h>
#include "ext4.h"
#include "ext4_extents.h"
@@ -667,7 +668,7 @@
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
- printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
+ printk_ratelimited("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
va_end(args);
}
diff --git a/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h b/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h
index 066a423..263552b 100644
--- a/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h
+++ b/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -112,5 +112,6 @@
int wcd9xxx_rx_vport_validation(u32 port_id,
struct list_head *codec_dai_list);
int wcd9xxx_tx_vport_validation(u32 vtable, u32 port_id,
- struct wcd9xxx_codec_dai_data *codec_dai);
+ struct wcd9xxx_codec_dai_data *codec_dai,
+ u32 num_codec_dais);
#endif /* __WCD9310_SLIMSLAVE_H_ */
diff --git a/include/linux/qseecom.h b/include/linux/qseecom.h
index b7ba63a..b8adebb 100644
--- a/include/linux/qseecom.h
+++ b/include/linux/qseecom.h
@@ -127,6 +127,7 @@
enum qseecom_key_management_usage_type {
QSEOS_KM_USAGE_DISK_ENCRYPTION = 0x01,
+ QSEOS_KM_USAGE_FILE_ENCRYPTION = 0x02,
QSEOS_KM_USAGE_MAX
};
diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h
index 9badfa3..8836e4a 100644
--- a/include/linux/wcnss_wlan.h
+++ b/include/linux/wcnss_wlan.h
@@ -77,6 +77,7 @@
void wcnss_riva_log_debug_regs(void);
void wcnss_pronto_log_debug_regs(void);
int wcnss_device_ready(void);
+int wcnss_device_is_shutdown(void);
void wcnss_riva_dump_pmic_regs(void);
int wcnss_xo_auto_detect_enabled(void);
u32 wcnss_get_wlan_rx_buff_count(void);
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index be427c5..3d4b1e2 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -560,7 +560,7 @@
static int do_balance_runtime(struct rt_rq *rt_rq)
{
struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq);
- struct root_domain *rd = cpu_rq(smp_processor_id())->rd;
+ struct root_domain *rd = rq_of_rt_rq(rt_rq)->rd;
int i, weight, more = 0;
u64 rt_period;
diff --git a/sound/soc/codecs/wcd9304.c b/sound/soc/codecs/wcd9304.c
index a68722c..aec228a 100644
--- a/sound/soc/codecs/wcd9304.c
+++ b/sound/soc/codecs/wcd9304.c
@@ -1368,7 +1368,7 @@
if (wcd9xxx_tx_vport_validation(
vport_check_table[dai_id],
port_id,
- sitar_p->dai)) {
+ sitar_p->dai, NUM_CODEC_DAIS)) {
dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n",
__func__, port_id + 1);
mutex_unlock(&codec->mutex);
diff --git a/sound/soc/codecs/wcd9306.c b/sound/soc/codecs/wcd9306.c
index 89e54bb..f59456e 100644
--- a/sound/soc/codecs/wcd9306.c
+++ b/sound/soc/codecs/wcd9306.c
@@ -1513,6 +1513,7 @@
u16 tx_mux_ctl_reg;
u8 adc_dmic_sel = 0x0;
int ret = 0;
+ char *srch = NULL;
if (ucontrol->value.enumerated.item[0] > e->max - 1)
return -EINVAL;
@@ -1531,8 +1532,12 @@
ret = -EINVAL;
goto out;
}
-
- ret = kstrtouint(strpbrk(dec_name, "1234"), 10, &decimator);
+ srch = strpbrk(dec_name, "1234");
+ if (srch == NULL) {
+ pr_err("%s: Invalid decimator name %s\n", __func__, dec_name);
+ return -EINVAL;
+ }
+ ret = kstrtouint(srch, 10, &decimator);
if (ret < 0) {
pr_err("%s: Invalid decimator = %s\n", __func__, dec_name);
ret = -EINVAL;
@@ -1700,7 +1705,7 @@
if (wcd9xxx_tx_vport_validation(
vtable,
port_id,
- tapan_p->dai)) {
+ tapan_p->dai, NUM_CODEC_DAIS)) {
dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n",
__func__, port_id + 1);
mutex_unlock(&codec->mutex);
@@ -2023,8 +2028,15 @@
s32 *dmic_clk_cnt;
unsigned int dmic;
int ret;
+ char *srch = NULL;
- ret = kstrtouint(strpbrk(w->name, "1234"), 10, &dmic);
+ srch = strpbrk(w->name, "1234");
+ if (srch == NULL) {
+ pr_err("%s: Invalid widget name %s\n", __func__, w->name);
+ return -EINVAL;
+ }
+
+ ret = kstrtouint(srch, 10, &dmic);
if (ret < 0) {
pr_err("%s: Invalid DMIC line on the codec\n", __func__);
return -EINVAL;
@@ -2356,6 +2368,7 @@
u16 dec_reset_reg, tx_vol_ctl_reg, tx_mux_ctl_reg;
u8 dec_hpf_cut_of_freq;
int offset;
+ char *srch = NULL;
dev_dbg(codec->dev, "%s %d\n", __func__, event);
@@ -2371,8 +2384,12 @@
ret = -EINVAL;
goto out;
}
-
- ret = kstrtouint(strpbrk(dec_name, "123456789"), 10, &decimator);
+ srch = strpbrk(dec_name, "123456789");
+ if (srch == NULL) {
+ pr_err("%s: Invalid decimator name %s\n", __func__, dec_name);
+ return -EINVAL;
+ }
+ ret = kstrtouint(srch, 10, &decimator);
if (ret < 0) {
pr_err("%s: Invalid decimator = %s\n", __func__, dec_name);
ret = -EINVAL;
@@ -3316,7 +3333,7 @@
dev_dbg(dai->codec->dev, "%s(): substream = %s stream = %d\n",
__func__, substream->name, substream->stream);
- if (dai->id <= NUM_CODEC_DAIS) {
+ if (dai->id < NUM_CODEC_DAIS) {
if (tapan->dai[dai->id].ch_mask) {
active = 1;
dev_dbg(dai->codec->dev, "%s(): Codec DAI: chmask[%d] = 0x%lx\n",
@@ -3435,7 +3452,7 @@
{
struct tapan_priv *tapan = snd_soc_codec_get_drvdata(dai->codec);
struct wcd9xxx *core = dev_get_drvdata(dai->codec->dev->parent);
- if (!tx_slot && !rx_slot) {
+ if (!tx_slot || !rx_slot) {
pr_err("%s: Invalid\n", __func__);
return -EINVAL;
}
@@ -4852,9 +4869,9 @@
struct snd_soc_codec *codec = tapan->codec;
struct wcd9xxx_pdata *pdata = tapan->resmgr.pdata;
int k1, k2, k3, rc = 0;
- u8 txfe_bypass = pdata->amic_settings.txfe_enable;
- u8 txfe_buff = pdata->amic_settings.txfe_buff;
- u8 flag = pdata->amic_settings.use_pdata;
+ u8 txfe_bypass;
+ u8 txfe_buff;
+ u8 flag;
u8 i = 0, j = 0;
u8 val_txfe = 0, value = 0;
u8 dmic_sample_rate_value = 0;
@@ -4866,6 +4883,9 @@
rc = -ENODEV;
goto done;
}
+ txfe_bypass = pdata->amic_settings.txfe_enable;
+ txfe_buff = pdata->amic_settings.txfe_buff;
+ flag = pdata->amic_settings.use_pdata;
/* Make sure settings are correct */
if ((pdata->micbias.ldoh_v > WCD9XXX_LDOH_3P0_V) ||
diff --git a/sound/soc/codecs/wcd9310.c b/sound/soc/codecs/wcd9310.c
index 725c51f..727a6d6 100644
--- a/sound/soc/codecs/wcd9310.c
+++ b/sound/soc/codecs/wcd9310.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, 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
@@ -2032,7 +2032,7 @@
if (wcd9xxx_tx_vport_validation(
vtable,
port_id,
- tabla_p->dai)) {
+ tabla_p->dai, NUM_CODEC_DAIS)) {
dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n",
__func__, port_id + 1);
mutex_unlock(&codec->mutex);
diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c
index 9ef2ea4..50681f7 100644
--- a/sound/soc/codecs/wcd9320.c
+++ b/sound/soc/codecs/wcd9320.c
@@ -1130,6 +1130,24 @@
static const struct snd_kcontrol_new class_h_dsm_mux =
SOC_DAPM_ENUM("CLASS_H_DSM MUX Mux", class_h_dsm_enum);
+static const char * const rx1_interpolator_text[] = {
+ "ZERO", "RX1 MIX2"
+};
+static const struct soc_enum rx1_interpolator_enum =
+ SOC_ENUM_SINGLE(TAIKO_A_CDC_CLK_RX_B1_CTL, 0, 2, rx1_interpolator_text);
+
+static const struct snd_kcontrol_new rx1_interpolator =
+ SOC_DAPM_ENUM("RX1 INTERP Mux", rx1_interpolator_enum);
+
+static const char * const rx2_interpolator_text[] = {
+ "ZERO", "RX2 MIX2"
+};
+static const struct soc_enum rx2_interpolator_enum =
+ SOC_ENUM_SINGLE(TAIKO_A_CDC_CLK_RX_B1_CTL, 1, 2, rx2_interpolator_text);
+
+static const struct snd_kcontrol_new rx2_interpolator =
+ SOC_DAPM_ENUM("RX2 INTERP Mux", rx2_interpolator_enum);
+
static const char *const taiko_conn_mad_text[] = {
"ADC_MB", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6", "NOTUSED1",
"DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", "DMIC6", "NOTUSED2",
@@ -2194,7 +2212,7 @@
if (wcd9xxx_tx_vport_validation(
vtable,
port_id,
- taiko_p->dai)) {
+ taiko_p->dai, NUM_CODEC_DAIS)) {
dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n",
__func__, port_id + 1);
mutex_unlock(&codec->mutex);
@@ -3241,6 +3259,7 @@
case SND_SOC_DAPM_POST_PMD:
snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_RDAC_CLK_EN_CTL,
0x02, 0x00);
+ break;
}
return 0;
}
@@ -3743,8 +3762,11 @@
{"CLASS_H_DSM MUX", "DSM_HPHL_RX1", "RX1 CHAIN"},
- {"RX1 CHAIN", NULL, "RX1 MIX2"},
- {"RX2 CHAIN", NULL, "RX2 MIX2"},
+ {"RX1 INTERP", NULL, "RX1 MIX2"},
+ {"RX1 CHAIN", NULL, "RX1 INTERP"},
+ {"RX2 INTERP", NULL, "RX2 MIX2"},
+ {"RX2 CHAIN", NULL, "RX2 INTERP"},
+
{"RX1 MIX2", NULL, "ANC1 MUX"},
{"RX2 MIX2", NULL, "ANC2 MUX"},
@@ -5509,12 +5531,9 @@
SND_SOC_DAPM_MIXER("RX2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("RX7 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
- SND_SOC_DAPM_MIXER_E("RX1 MIX2", TAIKO_A_CDC_CLK_RX_B1_CTL, 0, 0, NULL,
- 0, taiko_codec_enable_interpolator, SND_SOC_DAPM_PRE_PMU |
- SND_SOC_DAPM_POST_PMU),
- SND_SOC_DAPM_MIXER_E("RX2 MIX2", TAIKO_A_CDC_CLK_RX_B1_CTL, 1, 0, NULL,
- 0, taiko_codec_enable_interpolator, SND_SOC_DAPM_PRE_PMU |
- SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_MIXER("RX1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("RX2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
+
SND_SOC_DAPM_MIXER_E("RX3 MIX1", TAIKO_A_CDC_CLK_RX_B1_CTL, 2, 0, NULL,
0, taiko_codec_enable_interpolator, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU),
@@ -5531,6 +5550,12 @@
0, taiko_codec_enable_interpolator, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_MUX_E("RX1 INTERP", TAIKO_A_CDC_CLK_RX_B1_CTL, 0, 0,
+ &rx1_interpolator, taiko_codec_enable_interpolator,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_MUX_E("RX2 INTERP", TAIKO_A_CDC_CLK_RX_B1_CTL, 1, 0,
+ &rx2_interpolator, taiko_codec_enable_interpolator,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_MIXER("RX1 CHAIN", TAIKO_A_CDC_RX1_B6_CTL, 5, 0, NULL, 0),
SND_SOC_DAPM_MIXER("RX2 CHAIN", TAIKO_A_CDC_RX2_B6_CTL, 5, 0, NULL, 0),
diff --git a/sound/soc/codecs/wcd9xxx-common.c b/sound/soc/codecs/wcd9xxx-common.c
index eb3a0ba..675e378 100644
--- a/sound/soc/codecs/wcd9xxx-common.c
+++ b/sound/soc/codecs/wcd9xxx-common.c
@@ -552,7 +552,13 @@
__func__);
goto ret;
}
- for (i = 0; i < ARRAY_SIZE(imped_index); i++) {
+ if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) {
+ pr_debug("%s, detected impedance is greater than 32164 Ohm\n",
+ __func__);
+ i = ARRAY_SIZE(imped_index) - 1;
+ goto ret;
+ }
+ for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) {
if (imped >= imped_index[i].imped_val &&
imped < imped_index[i + 1].imped_val)
break;
@@ -569,7 +575,7 @@
int i = 0;
int index = 0;
index = get_impedance_index(imped);
- if (index > ARRAY_SIZE(imped_index)) {
+ if (index >= ARRAY_SIZE(imped_index)) {
pr_err("%s, invalid imped = %d\n", __func__, imped);
return;
}
diff --git a/sound/soc/codecs/wcd9xxx-mbhc.c b/sound/soc/codecs/wcd9xxx-mbhc.c
index 4426e4a..0abd123 100644
--- a/sound/soc/codecs/wcd9xxx-mbhc.c
+++ b/sound/soc/codecs/wcd9xxx-mbhc.c
@@ -1608,7 +1608,7 @@
continue;
}
- if ((i > 0) && (d->_type != dprev->_type)) {
+ if ((i > 0) && (dprev != NULL) && (d->_type != dprev->_type)) {
pr_debug("%s: Invalid, inconsistent types\n", __func__);
type = PLUG_TYPE_INVALID;
goto exit;
diff --git a/sound/soc/msm/apq8074.c b/sound/soc/msm/apq8074.c
index 4e79109..3a143aa 100644
--- a/sound/soc/msm/apq8074.c
+++ b/sound/soc/msm/apq8074.c
@@ -1913,9 +1913,24 @@
},
/* LSM FE */
{
- .name = "Listen Audio Service",
- .stream_name = "Listen Audio Service",
- .cpu_dai_name = "LSM",
+ .name = "Listen 1 Audio Service",
+ .stream_name = "Listen 1 Audio Service",
+ .cpu_dai_name = "LSM1",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM1,
+ },
+ {
+ .name = "Listen 2 Audio Service",
+ .stream_name = "Listen 2 Audio Service",
+ .cpu_dai_name = "LSM2",
.platform_name = "msm-lsm-client",
.dynamic = 1,
.trigger = { SND_SOC_DPCM_TRIGGER_POST,
@@ -1925,7 +1940,97 @@
.ignore_pmdown_time = 1,
.codec_dai_name = "snd-soc-dummy-dai",
.codec_name = "snd-soc-dummy",
- .be_id = MSM_FRONTEND_DAI_LSM1,
+ .be_id = MSM_FRONTEND_DAI_LSM2,
+ },
+ {
+ .name = "Listen 3 Audio Service",
+ .stream_name = "Listen 3 Audio Service",
+ .cpu_dai_name = "LSM3",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM3,
+ },
+ {
+ .name = "Listen 4 Audio Service",
+ .stream_name = "Listen 4 Audio Service",
+ .cpu_dai_name = "LSM4",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM4,
+ },
+ {
+ .name = "Listen 5 Audio Service",
+ .stream_name = "Listen 5 Audio Service",
+ .cpu_dai_name = "LSM5",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM5,
+ },
+ {
+ .name = "Listen 6 Audio Service",
+ .stream_name = "Listen 6 Audio Service",
+ .cpu_dai_name = "LSM6",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM6,
+ },
+ {
+ .name = "Listen 7 Audio Service",
+ .stream_name = "Listen 7 Audio Service",
+ .cpu_dai_name = "LSM7",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM7,
+ },
+ {
+ .name = "Listen 8 Audio Service",
+ .stream_name = "Listen 8 Audio Service",
+ .cpu_dai_name = "LSM8",
+ .platform_name = "msm-lsm-client",
+ .dynamic = 1,
+ .trigger = { SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST },
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .be_id = MSM_FRONTEND_DAI_LSM8,
},
/* Backend BT/FM DAI Links */
{
diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c
index 143508f..cdfd042 100644
--- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c
@@ -167,6 +167,10 @@
pr_debug("%s: volume_l %d volume_r %d\n",
__func__, volume_l, volume_r);
+ if (!cstream || !cstream->runtime) {
+ pr_err("%s: session not active\n", __func__);
+ return -EPERM;
+ }
prtd = cstream->runtime->private_data;
if (prtd && prtd->audio_client) {
if (volume_l != volume_r) {
@@ -646,6 +650,7 @@
kzalloc(sizeof(struct msm_compr_audio_effects), GFP_KERNEL);
if (!pdata->audio_effects[rtd->dai_link->be_id]) {
pr_err("%s: Could not allocate memory for effects\n", __func__);
+ pdata->cstream[rtd->dai_link->be_id] = NULL;
kfree(prtd);
return -ENOMEM;
}
@@ -654,6 +659,8 @@
if (!pdata->dec_params[rtd->dai_link->be_id]) {
pr_err("%s: Could not allocate memory for dec params\n",
__func__);
+ kfree(pdata->audio_effects[rtd->dai_link->be_id]);
+ pdata->cstream[rtd->dai_link->be_id] = NULL;
kfree(prtd);
return -ENOMEM;
}
@@ -663,6 +670,7 @@
pr_err("%s: Could not allocate memory for client\n", __func__);
kfree(pdata->audio_effects[rtd->dai_link->be_id]);
kfree(pdata->dec_params[rtd->dai_link->be_id]);
+ pdata->cstream[rtd->dai_link->be_id] = NULL;
kfree(prtd);
return -ENOMEM;
}
diff --git a/sound/soc/msm/qdsp6v2/q6lsm.c b/sound/soc/msm/qdsp6v2/q6lsm.c
index a88b733..61222fe 100644
--- a/sound/soc/msm/qdsp6v2/q6lsm.c
+++ b/sound/soc/msm/qdsp6v2/q6lsm.c
@@ -783,7 +783,7 @@
client->lsm_cal_size = lsm_cal.cal_size;
memcpy((client->sound_model.data + pad_zero +
client->sound_model.size),
- (uint32_t *)lsm_cal.cal_kvaddr, len);
+ (uint32_t *)lsm_cal.cal_kvaddr, lsm_cal.cal_size);
} else {
rc = -EBUSY;
goto fail;