Merge "ARM: dts: msm8610: change hi256 pmic pin"
diff --git a/arch/arm/boot/dts/msm8610-qrd-skuaa.dtsi b/arch/arm/boot/dts/msm8610-qrd-skuaa.dtsi
new file mode 100644
index 0000000..ae28e2c
--- /dev/null
+++ b/arch/arm/boot/dts/msm8610-qrd-skuaa.dtsi
@@ -0,0 +1,64 @@
+/* Copyright (c) 2013, 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/ "msm8610-qrd.dtsi"
+
+&soc {
+    sound {
+        qcom,model = "msm8x10-skuaa-snd-card";
+
+        qcom,audio-routing =
+            "RX_BIAS", "MCLK",
+            "INT_LDO_H", "MCLK",
+            "Lineout amp", "LINEOUT",
+            "MIC BIAS Internal1", "Handset Mic",
+            "MIC BIAS Internal2", "Headset Mic",
+            "AMIC1", "MIC BIAS Internal1",
+            "AMIC2", "MIC BIAS Internal2";
+
+        qcom,ext-spk-amp-gpio = <&msmgpio 92 0x0>;
+    };
+
+	qcom,dsi_v2_hx8379a_wvga_video {
+		qcom,cont-splash-enabled;
+	};
+
+	usb@f9a55000 {
+		qcom,hsusb-otg-phy-init-seq =
+		<0x44 0x80 0x6a 0x81 0x34 0x82 0x13 0x83 0xffffffff>;
+	};
+};
+
+/ {
+	qrd_batterydata: qcom,battery-data {
+		qcom,rpull-up-kohm = <100>;
+		qcom,vref-batt-therm = <1800000>;
+
+		/include/ "batterydata-qrd-4v2-1300mah.dtsi"
+	};
+};
+
+&pm8110_bms {
+	status = "ok";
+	qcom,battery-data = <&qrd_batterydata>;
+};
+
+&pm8110_chg {
+	qcom,battery-data = <&qrd_batterydata>;
+};
+
+&pm8110_vadc {
+	chan@30 {
+		label = "batt_therm";
+		qcom,scale-function = <7>;
+	};
+};
diff --git a/arch/arm/boot/dts/msm8610-qrd-skuab.dtsi b/arch/arm/boot/dts/msm8610-qrd-skuab.dtsi
new file mode 100644
index 0000000..649bc71
--- /dev/null
+++ b/arch/arm/boot/dts/msm8610-qrd-skuab.dtsi
@@ -0,0 +1,114 @@
+/* Copyright (c) 2013, 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/ "msm8610-qrd.dtsi"
+
+&soc {
+    sound {
+        qcom,model = "msm8x10-skuab-snd-card";
+
+        qcom,audio-routing =
+            "RX_BIAS", "MCLK",
+            "INT_LDO_H", "MCLK",
+            "Lineout amp", "LINEOUT",
+            "MIC BIAS Internal1", "Handset Mic",
+            "MIC BIAS Internal2", "Headset Mic",
+            "AMIC1", "MIC BIAS Internal1",
+            "AMIC2", "MIC BIAS Internal2";
+
+        qcom,ext-spk-amp-gpio = <&msmgpio 92 0x0>;
+    };
+    i2c@f9923000{
+		focaltech@38{
+			compatible = "focaltech,5x06";
+			reg = <0x38>;
+			interrupt-parent = <&msmgpio>;
+			interrupts = <1 0x2>;
+			vdd-supply = <&pm8110_l19>;
+			vcc_i2c-supply = <&pm8110_l14>;
+			focaltech,family-id = <0x06>;
+			focaltech,reset-gpio = <&msmgpio 0 0x00>;
+			focaltech,irq-gpio = <&msmgpio 1 0x00>;
+			focaltech,display-coords = <0 0 480 854>;
+			focaltech,panel-coords = <0 0 480 946>;
+			focaltech,button-map= <139 102 158>;
+			focaltech,no-force-update;
+			focaltech,i2c-pull-up;
+		};
+	};
+	gen-vkeys {
+		compatible = "qcom,gen-vkeys";
+		label = "ft5x06_ts";
+		qcom,disp-maxx = <480>;
+		qcom,disp-maxy = <854>;
+		qcom,panel-maxx = <481>;
+		qcom,panel-maxy = <946>;
+		qcom,key-codes = <139 102 158>;
+		qcom,y-offset = <0>;
+	};
+    i2c@f9925000 {
+		fsl@1c {
+			compatible = "fsl,mma8x5x";
+			reg = <0x1c>;
+			interrupt-parent = <&msmgpio>;
+			interrupts = <81 0x2>;
+			vdd-supply = <&pm8110_l19>;
+			vio-supply = <&pm8110_l14>;
+			fsl,irq-gpio = <&msmgpio 81 0x00>;
+			fsl,sensors-position = <1>;
+		};
+		stk@48 {
+			compatible = "stk,stk3x1x";
+			reg = <0x48>;
+			interrupt-parent = <&msmgpio>;
+			interrupts = <80 0x2>;
+			vdd-supply = <&pm8110_l19>;
+			vio-supply = <&pm8110_l14>;
+			stk,irq-gpio = <&msmgpio 80 0x02>;
+			stk,transmittance = <340>;
+			stk,state-reg = <0x00>;
+			stk,psctrl-reg = <0x71>;
+			stk,alsctrl-reg = <0x38>;
+			stk,ledctrl-reg = <0xFF>;
+			stk,wait-reg = <0x07>;
+			stk,ps-thdh = <150>;
+			stk,ps-thdl = <100>;
+		};
+	};
+
+	usb@f9a55000 {
+               qcom,hsusb-otg-phy-init-seq =
+                       <0x44 0x80 0x6a 0x81 0x34 0x82 0x23 0x83 0xffffffff>;
+	};
+
+	qcom,dsi_v2_otm8018b_fwvga_video {
+		qcom,cont-splash-enabled;
+	};
+};
+
+/ {
+	qrd_batterydata: qcom,battery-data {
+		qcom,rpull-up-kohm = <100>;
+		qcom,vref-batt-therm = <1800000>;
+
+		/include/ "batterydata-qrd-4v2-1800mah.dtsi"
+	};
+};
+
+&pm8110_bms {
+	status = "ok";
+	qcom,battery-data = <&qrd_batterydata>;
+};
+
+&pm8110_chg {
+	qcom,battery-data = <&qrd_batterydata>;
+};
diff --git a/arch/arm/boot/dts/msm8610-v1-pm.dtsi b/arch/arm/boot/dts/msm8610-v1-pm.dtsi
index bd0aa0f..2a619db 100644
--- a/arch/arm/boot/dts/msm8610-v1-pm.dtsi
+++ b/arch/arm/boot/dts/msm8610-v1-pm.dtsi
@@ -24,7 +24,7 @@
 		qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
 		qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 26 30 0f];
-		qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 07 60 3b 76 76
+		qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 26 30 0f];
 	};
 
@@ -41,7 +41,7 @@
 		qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
 		qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 26 30 0f];
-		qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 07 60 3b 76 76
+		qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 26 30 0f];
 		};
 
@@ -58,7 +58,7 @@
 		qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
 		qcom,saw2-spm-cmd-spc = [00 20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 06 26 30 0f];
-		qcom,saw2-spm-cmd-pc = [00 20 10 80 30 90 5b 60 07 60 3b 76 76
+		qcom,saw2-spm-cmd-pc = [00 20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 06 26 30 0f];
 	};
 
@@ -75,7 +75,7 @@
 		qcom,saw2-spm-cmd-wfi = [60 03 60 0b 0f];
 		qcom,saw2-spm-cmd-spc = [20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 26 30 0f];
-		qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 07 60 3b 76 76
+		qcom,saw2-spm-cmd-pc = [20 10 80 30 90 5b 60 03 60 3b 76 76
 				0b 94 5b 80 10 26 30 0f];
 	};
 
@@ -168,12 +168,33 @@
 			<53 104>, /* mdss_irq */
 			<62 222>, /* ee0_krait_hlos_spmi_periph_irq */
 			<2 216>, /* tsens_upper_lower_int */
+			<0xff 18>,  /* APC_qgicQTmrSecPhysIrptReq */
+			<0xff 19>,  /* APC_qgicQTmrNonSecPhysIrptReq */
+			<0xff 35>,  /* WDT_barkInt */
+			<0xff 40>,  /* qtmr_phy_irq[0] */
+			<0xff 47>,  /* rbif_irq[0] */
 			<0xff 56>,  /* q6_wdog_expired_irq */
 			<0xff 57>,  /* mss_to_apps_irq(0) */
 			<0xff 58>,  /* mss_to_apps_irq(1) */
 			<0xff 59>,  /* mss_to_apps_irq(2) */
 			<0xff 60>,  /* mss_to_apps_irq(3) */
 			<0xff 61>,  /* mss_a2_bam_irq */
+			<0xff 63>,  /* wcd9xxx_irq */
+			<0xff 65>,  /* o_gc_sys_irq[0] */
+			<0xff 74>,  /* venus0_mmu_cirpt[1] */
+			<0xff 75>,  /* venus0_mmu_cirpt[0] */
+			<0xff 78>,  /* mdss_mmu_cirpt[0] */
+			<0xff 79>,  /* mdss_mmu_cirpt[1] */
+			<0xff 97>,  /* camss_vfe_mmu_cirpt[1] */
+			<0xff 102>, /* camss_jpeg_mmu_cirpt[1] */
+			<0xff 109>, /* ocmem_dm_nonsec_irq */
+			<0xff 131>, /* blsp1_qup_5_irq */
+			<0xff 141>, /* blsp1_uart_3_irq */
+			<0xff 155>, /* sdc1_irq(0) */
+			<0xff 157>, /* sdc2_irq(0) */
+			<0xff 161>, /* lpass_irq_out_spare[4] */
+			<0xff 162>, /* lpass_irq_out_spare[5]*/
+			<0xff 170>, /* sdc1_pwr_cmd_irq */
 			<0xff 173>, /* o_wcss_apss_smd_hi */
 			<0xff 174>, /* o_wcss_apss_smd_med */
 			<0xff 175>, /* o_wcss_apss_smd_low */
@@ -182,10 +203,6 @@
 			<0xff 178>, /* o_wcss_apss_wlan_rx_data_avail */
 			<0xff 179>, /* o_wcss_apss_asic_intr */
 			<0xff 181>, /* o_wcss_apss_wdog_bite_and_reset_rdy */
-			<0xff 161>, /* lpass_irq_out_spare[4] */
-			<0xff 162>, /* lpass_irq_out_spare[5]*/
-			<0xff 234>, /* lpass_irq_out_spare[6]*/
-			<0xff 235>, /* lpass_irq_out_spare[7]*/
 			<0xff 188>, /* lpass_irq_out_apcs(0) */
 			<0xff 189>, /* lpass_irq_out_apcs(1) */
 			<0xff 190>, /* lpass_irq_out_apcs(2) */
@@ -200,12 +217,16 @@
 			<0xff 205>, /* rpm_ipc(25) */
 			<0xff 206>, /* rpm_ipc(26) */
 			<0xff 207>, /* rpm_ipc(27) */
+			<0xff 234>, /* lpass_irq_out_spare[6]*/
+			<0xff 235>, /* lpass_irq_out_spare[7]*/
+			<0xff 240>, /* summary_irq_kpss */
+			<0xff 253>, /* sdc2_pwr_cmd_irq */
 			<0xff 258>, /* rpm_ipc(28) */
 			<0xff 259>, /* rpm_ipc(29) */
-			<0xff 275>, /* rpm_ipc(30) */
-			<0xff 276>, /* rpm_ipc(31) */
 			<0xff 269>, /* rpm_wdog_expired_irq */
-			<0xff 240>; /* summary_irq_kpss */
+			<0xff 270>, /* blsp1_bam_irq[0] */
+			<0xff 275>, /* rpm_ipc(30) */
+			<0xff 276>; /* rpm_ipc(31) */
 
 		qcom,gpio-parent = <&msmgpio>;
 		qcom,gpio-map = <3  1>,
diff --git a/arch/arm/boot/dts/msm8610-v1-qrd-skuaa.dts b/arch/arm/boot/dts/msm8610-v1-qrd-skuaa.dts
index 5abe5c0..ba53acc 100644
--- a/arch/arm/boot/dts/msm8610-v1-qrd-skuaa.dts
+++ b/arch/arm/boot/dts/msm8610-v1-qrd-skuaa.dts
@@ -13,43 +13,12 @@
 /dts-v1/;
 
 /include/ "msm8610-v1.dtsi"
-/include/ "msm8610-qrd.dtsi"
+/include/ "msm8610-qrd-skuaa.dtsi"
 /include/ "dsi-v2-panel-hx8379a-wvga-video.dtsi"
 /include/ "msm8610-qrd-camera-sensor.dtsi"
 
 / {
-	model = "Qualcomm MSM 8610 QRD";
+	model = "Qualcomm MSM 8610v1 QRD SKUAA";
 	compatible = "qcom,msm8610-qrd", "qcom,msm8610", "qcom,qrd";
 	qcom,board-id = <11 1>, <11 0>;
-	qcom,msm-id = <147 0>, <165 0>, <161 0>, <162 0>,
-				  <163 0>, <164 0>, <166 0>;
-};
-
-&soc {
-    sound {
-        qcom,model = "msm8x10-skuaa-snd-card";
-
-        qcom,audio-routing =
-            "RX_BIAS", "MCLK",
-            "INT_LDO_H", "MCLK",
-            "Lineout amp", "LINEOUT",
-            "MIC BIAS Internal1", "Handset Mic",
-            "MIC BIAS Internal2", "Headset Mic",
-            "AMIC1", "MIC BIAS Internal1",
-            "AMIC2", "MIC BIAS Internal2";
-
-        qcom,ext-spk-amp-gpio = <&msmgpio 92 0x0>;
-    };
-};
-
-&pm8110_bms {
-	status = "ok";
-	qcom,batt-type = <5>;
-};
-
-&pm8110_vadc {
-	chan@30 {
-		label = "batt_therm";
-		qcom,scale-function = <7>;
-	};
 };
diff --git a/arch/arm/boot/dts/msm8610-v1-qrd-skuab.dts b/arch/arm/boot/dts/msm8610-v1-qrd-skuab.dts
index d7a446d..5e19997 100644
--- a/arch/arm/boot/dts/msm8610-v1-qrd-skuab.dts
+++ b/arch/arm/boot/dts/msm8610-v1-qrd-skuab.dts
@@ -13,115 +13,12 @@
 /dts-v1/;
 
 /include/ "msm8610-v1.dtsi"
-/include/ "msm8610-qrd.dtsi"
+/include/ "msm8610-qrd-skuab.dtsi"
 /include/ "dsi-v2-panel-otm8018b-fwvga-video.dtsi"
 /include/ "msm8612-qrd-camera-sensor.dtsi"
 
 / {
-	model = "Qualcomm MSM 8610 QRD";
+	model = "Qualcomm MSM 8610v1 QRD SKUAB";
 	compatible = "qcom,msm8610-qrd", "qcom,msm8610", "qcom,qrd";
 	qcom,board-id = <11 3>;
-	qcom,msm-id = <147 0>, <165 0>, <161 0>, <162 0>,
-				  <163 0>, <164 0>, <166 0>;
-};
-
-&soc {
-    sound {
-        qcom,model = "msm8x10-skuab-snd-card";
-
-        qcom,audio-routing =
-            "RX_BIAS", "MCLK",
-            "INT_LDO_H", "MCLK",
-            "Lineout amp", "LINEOUT",
-            "MIC BIAS Internal1", "Handset Mic",
-            "MIC BIAS Internal2", "Headset Mic",
-            "AMIC1", "MIC BIAS Internal1",
-            "AMIC2", "MIC BIAS Internal2";
-
-        qcom,ext-spk-amp-gpio = <&msmgpio 92 0x0>;
-    };
-    i2c@f9923000{
-		focaltech@38{
-			compatible = "focaltech,5x06";
-			reg = <0x38>;
-			interrupt-parent = <&msmgpio>;
-			interrupts = <1 0x2>;
-			vdd-supply = <&pm8110_l19>;
-			vcc_i2c-supply = <&pm8110_l14>;
-			focaltech,family-id = <0x06>;
-			focaltech,reset-gpio = <&msmgpio 0 0x00>;
-			focaltech,irq-gpio = <&msmgpio 1 0x00>;
-			focaltech,display-coords = <0 0 480 854>;
-			focaltech,panel-coords = <0 0 480 946>;
-			focaltech,button-map= <139 102 158>;
-			focaltech,no-force-update;
-			focaltech,i2c-pull-up;
-		};
-	};
-	gen-vkeys {
-		compatible = "qcom,gen-vkeys";
-		label = "ft5x06_ts";
-		qcom,disp-maxx = <480>;
-		qcom,disp-maxy = <854>;
-		qcom,panel-maxx = <481>;
-		qcom,panel-maxy = <946>;
-		qcom,key-codes = <139 102 158>;
-		qcom,y-offset = <0>;
-	};
-    i2c@f9925000 {
-		fsl@1c {
-			compatible = "fsl,mma8x5x";
-			reg = <0x1c>;
-			interrupt-parent = <&msmgpio>;
-			interrupts = <81 0x2>;
-			vdd-supply = <&pm8110_l19>;
-			vio-supply = <&pm8110_l14>;
-			fsl,irq-gpio = <&msmgpio 81 0x00>;
-			fsl,sensors-position = <1>;
-		};
-		stk@48 {
-			compatible = "stk,stk3x1x";
-			reg = <0x48>;
-			interrupt-parent = <&msmgpio>;
-			interrupts = <80 0x2>;
-			vdd-supply = <&pm8110_l19>;
-			vio-supply = <&pm8110_l14>;
-			stk,irq-gpio = <&msmgpio 80 0x02>;
-			stk,transmittance = <100>;
-			stk,state-reg = <0x00>;
-			stk,psctrl-reg = <0x71>;
-			stk,alsctrl-reg = <0x3e>;
-			stk,ledctrl-reg = <0xFF>;
-			stk,wait-reg = <0x07>;
-			stk,ps-thdh = <150>;
-			stk,ps-thdl = <100>;
-		};
-	};
-
-	usb@f9a55000 {
-               qcom,hsusb-otg-phy-init-seq =
-                       <0x44 0x80 0x6a 0x81 0x34 0x82 0x23 0x83 0xffffffff>;
-	};
-
-	qcom,dsi_v2_otm8018b_fwvga_video {
-		status = "ok";
-	};
-};
-
-/ {
-	qrd_batterydata: qcom,battery-data {
-		qcom,rpull-up-kohm = <100>;
-		qcom,vref-batt-therm = <1800000>;
-
-		/include/ "batterydata-qrd-4v2-1800mah.dtsi"
-	};
-};
-
-&pm8110_bms {
-	status = "ok";
-	qcom,battery-data = <&qrd_batterydata>;
-};
-
-&pm8110_chg {
-	qcom,battery-data = <&qrd_batterydata>;
 };
diff --git a/arch/arm/boot/dts/msm8610-v1.dtsi b/arch/arm/boot/dts/msm8610-v1.dtsi
index 6050a75..9d8c411 100644
--- a/arch/arm/boot/dts/msm8610-v1.dtsi
+++ b/arch/arm/boot/dts/msm8610-v1.dtsi
@@ -18,3 +18,8 @@
 
 /include/ "msm8610.dtsi"
 /include/ "msm8610-v1-pm.dtsi"
+
+/ {
+	qcom,msm-id = <147 0>, <165 0>, <161 0>, <162 0>,
+			<163 0>, <164 0>, <166 0>;
+};
diff --git a/arch/arm/boot/dts/msm8610-v2-pm.dtsi b/arch/arm/boot/dts/msm8610-v2-pm.dtsi
index dba3da4..e593b31 100644
--- a/arch/arm/boot/dts/msm8610-v2-pm.dtsi
+++ b/arch/arm/boot/dts/msm8610-v2-pm.dtsi
@@ -176,6 +176,7 @@
 			<0xff 59>,  /* mss_to_apps_irq(2) */
 			<0xff 60>,  /* mss_to_apps_irq(3) */
 			<0xff 61>,  /* mss_a2_bam_irq */
+			<0xff 63>,  /* wcd9xxx_irq */
 			<0xff 173>, /* o_wcss_apss_smd_hi */
 			<0xff 174>, /* o_wcss_apss_smd_med */
 			<0xff 175>, /* o_wcss_apss_smd_low */
diff --git a/arch/arm/boot/dts/msm8610-v2-qrd-skuaa.dts b/arch/arm/boot/dts/msm8610-v2-qrd-skuaa.dts
index 6ad8cb5..677365f 100644
--- a/arch/arm/boot/dts/msm8610-v2-qrd-skuaa.dts
+++ b/arch/arm/boot/dts/msm8610-v2-qrd-skuaa.dts
@@ -13,15 +13,13 @@
 /dts-v1/;
 
 /include/ "msm8610-v2.dtsi"
-/include/ "msm8610-qrd.dtsi"
+/include/ "msm8610-qrd-skuaa.dtsi"
 /include/ "dsi-v2-panel-hx8379a-wvga-video.dtsi"
 /include/ "msm8610-qrd-camera-sensor.dtsi"
 
 / {
-	model = "Qualcomm MSM 8610v2 QRD";
+	model = "Qualcomm MSM 8610v2 QRD SKUAA";
 	compatible = "qcom,msm8610-qrd", "qcom,msm8610", "qcom,qrd";
 	qcom,board-id = <11 1>, <11 0>;
-	qcom,msm-id = <147 0x10001>, <165 0x10001>, <161 0x10001>, <162 0x10001>,
-				  <163 0x10001>, <164 0x10001>, <166 0x10001>;
 };
 
diff --git a/arch/arm/boot/dts/msm8610-v2-qrd-skuab.dts b/arch/arm/boot/dts/msm8610-v2-qrd-skuab.dts
index 225be06..ccc38fc 100644
--- a/arch/arm/boot/dts/msm8610-v2-qrd-skuab.dts
+++ b/arch/arm/boot/dts/msm8610-v2-qrd-skuab.dts
@@ -13,12 +13,12 @@
 /dts-v1/;
 
 /include/ "msm8610-v2.dtsi"
-/include/ "msm8610-qrd.dtsi"
+/include/ "msm8610-qrd-skuab.dtsi"
+/include/ "dsi-v2-panel-otm8018b-fwvga-video.dtsi"
+/include/ "msm8612-qrd-camera-sensor.dtsi"
 
 / {
-	model = "Qualcomm MSM 8610v2 QRD";
+	model = "Qualcomm MSM 8610v2 QRD SKUAB";
 	compatible = "qcom,msm8610-qrd", "qcom,msm8610", "qcom,qrd";
 	qcom,board-id = <11 3>;
-	qcom,msm-id = <147 0x10001>, <165 0x10001>, <161 0x10001>, <162 0x10001>,
-				  <163 0x10001>, <164 0x10001>, <166 0x10001>;
 };
diff --git a/arch/arm/boot/dts/msm8610-v2.dtsi b/arch/arm/boot/dts/msm8610-v2.dtsi
index 89d8f74..a1f466a 100644
--- a/arch/arm/boot/dts/msm8610-v2.dtsi
+++ b/arch/arm/boot/dts/msm8610-v2.dtsi
@@ -18,3 +18,8 @@
 
 /include/ "msm8610.dtsi"
 /include/ "msm8610-v2-pm.dtsi"
+
+/ {
+	qcom,msm-id = <147 0x10001>, <165 0x10001>, <161 0x10001>, <162 0x10001>,
+				  <163 0x10001>, <164 0x10001>, <166 0x10001>;
+};
diff --git a/arch/arm/configs/msm8610_defconfig b/arch/arm/configs/msm8610_defconfig
index 9788e7c..aad3540 100644
--- a/arch/arm/configs/msm8610_defconfig
+++ b/arch/arm/configs/msm8610_defconfig
@@ -70,6 +70,7 @@
 CONFIG_MSM_RTB_SEPARATE_CPUS=y
 CONFIG_MSM_ENABLE_WDOG_DEBUG_CONTROL=y
 CONFIG_MSM_BOOT_STATS=y
+CONFIG_MSM_XPU_ERR_FATAL=y
 CONFIG_STRICT_MEMORY_RWX=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c
index e3a3f54..db66d27 100644
--- a/arch/arm/mach-msm/acpuclock-krait.c
+++ b/arch/arm/mach-msm/acpuclock-krait.c
@@ -62,7 +62,11 @@
 
 	regval = get_l2_indirect_reg(sc->l2cpmr_iaddr);
 	regval &= ~0x3;
-	regval |= (pri_src_sel & 0x3);
+	regval |= pri_src_sel;
+	if (sc != &drv.scalable[L2]) {
+		regval &= ~(0x3 << 8);
+		regval |= pri_src_sel << 8;
+	}
 	set_l2_indirect_reg(sc->l2cpmr_iaddr, regval);
 	/* Wait for switch to complete. */
 	mb();
@@ -76,7 +80,11 @@
 
 	regval = get_l2_indirect_reg(sc->l2cpmr_iaddr);
 	regval &= ~(0x3 << 2);
-	regval |= ((sec_src_sel & 0x3) << 2);
+	regval |= sec_src_sel << 2;
+	if (sc != &drv.scalable[L2]) {
+		regval &= ~(0x3 << 10);
+		regval |= sec_src_sel << 10;
+	}
 	set_l2_indirect_reg(sc->l2cpmr_iaddr, regval);
 	/* Wait for switch to complete. */
 	mb();
@@ -785,6 +793,8 @@
 	/* Set PRI_SRC_SEL_HFPLL_DIV2 divider to div-2. */
 	regval = get_l2_indirect_reg(sc->l2cpmr_iaddr);
 	regval &= ~(0x3 << 6);
+	if (sc != &drv.scalable[L2])
+		regval &= ~(0x3 << 14);
 	set_l2_indirect_reg(sc->l2cpmr_iaddr, regval);
 
 	/* Enable and switch to the target clock source. */
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_arb.c b/arch/arm/mach-msm/msm_bus/msm_bus_arb.c
index 3ff7530..058e409 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_arb.c
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_arb.c
@@ -652,15 +652,6 @@
 			MSM_BUS_DBG("ab: %llu ib: %llu\n", curr_bw, curr_clk);
 		}
 
-		if (index == 0) {
-			/* This check protects the bus driver from clients
-			 * that can leave non-zero requests after
-			 * unregistering.
-			 * */
-			req_clk = 0;
-			req_bw = 0;
-		}
-
 		if (!pdata->active_only) {
 			ret = update_path(src, pnode, req_clk, req_bw,
 				curr_clk, curr_bw, 0, pdata->active_only);
@@ -782,11 +773,47 @@
  */
 void msm_bus_scale_unregister_client(uint32_t cl)
 {
+	int i;
 	struct msm_bus_client *client = (struct msm_bus_client *)(cl);
+	bool warn = false;
 	if (IS_ERR_OR_NULL(client))
 		return;
-	if (client->curr != 0)
+
+	for (i = 0; i < client->pdata->usecase->num_paths; i++) {
+		if ((client->pdata->usecase[0].vectors[i].ab) ||
+			(client->pdata->usecase[0].vectors[i].ib)) {
+			warn = true;
+			break;
+		}
+	}
+
+	if (warn) {
+		int num_paths = client->pdata->usecase->num_paths;
+		int ab[num_paths], ib[num_paths];
+		WARN(1, "%s called unregister with non-zero vectors\n",
+			client->pdata->name);
+
+		/*
+		 * Save client values and zero them out to
+		 * cleanly unregister
+		 */
+		for (i = 0; i < num_paths; i++) {
+			ab[i] = client->pdata->usecase[0].vectors[i].ab;
+			ib[i] = client->pdata->usecase[0].vectors[i].ib;
+			client->pdata->usecase[0].vectors[i].ab = 0;
+			client->pdata->usecase[0].vectors[i].ib = 0;
+		}
+
 		msm_bus_scale_client_update_request(cl, 0);
+
+		/* Restore client vectors if required for re-registering. */
+		for (i = 0; i < num_paths; i++) {
+			client->pdata->usecase[0].vectors[i].ab = ab[i];
+			client->pdata->usecase[0].vectors[i].ib = ib[i];
+		}
+	} else if (client->curr != 0)
+		msm_bus_scale_client_update_request(cl, 0);
+
 	MSM_BUS_DBG("Unregistering client %d\n", cl);
 	mutex_lock(&msm_bus_lock);
 	msm_bus_scale_client_reset_pnodes(cl);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c
index 9aca234..229fdb2 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c
@@ -440,7 +440,7 @@
 	case CSID_CFG: {
 		struct msm_camera_csid_params csid_params;
 		struct msm_camera_csid_vc_cfg *vc_cfg = NULL;
-		int32_t i = 0;
+		int8_t i = 0;
 		if (copy_from_user(&csid_params,
 			(void *)cdata->cfg.csid_params,
 			sizeof(struct msm_camera_csid_params))) {
@@ -448,6 +448,13 @@
 			rc = -EFAULT;
 			break;
 		}
+		if (csid_params.lut_params.num_cid < 1 ||
+			csid_params.lut_params.num_cid > 16) {
+			pr_err("%s: %d num_cid outside range\n",
+				 __func__, __LINE__);
+			rc = -EINVAL;
+			break;
+		}
 		for (i = 0; i < csid_params.lut_params.num_cid; i++) {
 			vc_cfg = kzalloc(csid_params.lut_params.num_cid *
 				sizeof(struct msm_camera_csid_vc_cfg),
diff --git a/drivers/media/platform/msm/camera_v2/sensor/hi256.c b/drivers/media/platform/msm/camera_v2/sensor/hi256.c
index 3288e9c..835230e 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/hi256.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/hi256.c
@@ -122,8 +122,10 @@
 	{0x72, 0x81},
 	{0x30, 0x0c},
 	{0x31, 0x80},
-	{0x03, 0x00},
-	{0x01, 0xf0},
+	{0x03, 0x20},
+	{0x10, 0x9c},
+	{0x03, 0x22},
+	{0x10, 0xe9},
 };
 
 static struct msm_camera_i2c_reg_conf hi256_start_settings[] = {
@@ -165,9 +167,9 @@
 	{0x26, 0x06},
 	{0x27, 0x40},
 	{0x40, 0x01},
-	{0x41, 0x78},
+	{0x41, 0x18},
 	{0x42, 0x00},
-	{0x43, 0x14},
+	{0x43, 0x02},
 	{0x45, 0x04},
 	{0x46, 0x18},
 	{0x47, 0xd8},
@@ -177,8 +179,8 @@
 	{0x83, 0x00},
 	{0x84, 0x0c},
 	{0x85, 0x00},
-	{0x90, 0x0c},
-	{0x91, 0x0c},
+	{0x90, 0x0a},
+	{0x91, 0x0a},
 	{0x92, 0x78},
 	{0x93, 0x70},
 	{0x94, 0xff},
@@ -186,14 +188,14 @@
 	{0x96, 0xdc},
 	{0x97, 0xfe},
 	{0x98, 0x38},
-	{0xa0, 0x45},
-	{0xa2, 0x45},
-	{0xa4, 0x45},
-	{0xa6, 0x45},
-	{0xa8, 0x45},
-	{0xaa, 0x45},
-	{0xac, 0x45},
-	{0xae, 0x45},
+	{0xa0, 0x48},
+	{0xa2, 0x48},
+	{0xa4, 0x48},
+	{0xa6, 0x48},
+	{0xa8, 0x49},
+	{0xaa, 0x49},
+	{0xac, 0x49},
+	{0xae, 0x49},
 	{0x99, 0x43},
 	{0x9a, 0x43},
 	{0x9b, 0x43},
@@ -201,7 +203,6 @@
 	{0x03, 0x02},
 	{0x12, 0x03},
 	{0x13, 0x03},
-	{0x15, 0x00},
 	{0x16, 0x00},
 	{0x17, 0x8C},
 	{0x18, 0x4c},
@@ -212,22 +213,19 @@
 	{0x1e, 0x30},
 	{0x1f, 0x10},
 	{0x20, 0x77},
-	{0x21, 0x6d},
-	{0x22, 0x77},
+	{0x21, 0xde},
+	{0x22, 0xa7},
 	{0x23, 0x30},
-	{0x24, 0x77},
 	{0x27, 0x3c},
 	{0x2b, 0x80},
-	{0x2e, 0x00},
-	{0x2f, 0x00},
+	{0x2e, 0x11},
+	{0x2f, 0xa1},
 	{0x30, 0x05},
 	{0x50, 0x20},
 	{0x52, 0x01},
 	{0x53, 0xc1},
 	{0x55, 0x1c},
 	{0x56, 0x11},
-	{0x58, 0x22},
-	{0x59, 0x20},
 	{0x5d, 0xa2},
 	{0x5e, 0x5a},
 	{0x60, 0x87},
@@ -307,8 +305,8 @@
 	{0xcf, 0x78},
 	{0xd0, 0x0a},
 	{0xd1, 0x09},
-	{0xd4, 0x0c},
-	{0xd5, 0x0c},
+	{0xd4, 0x0a},
+	{0xd5, 0x0a},
 	{0xd6, 0x78},
 	{0xd7, 0x70},
 	{0xe0, 0xc4},
@@ -319,17 +317,17 @@
 	{0xe8, 0x80},
 	{0xe9, 0x40},
 	{0xea, 0x7f},
-	{0xf0, 0xc1},
-	{0xf1, 0xc1},
-	{0xf2, 0xc1},
-	{0xf3, 0xc1},
-	{0xf4, 0xc1},
+	{0xf0, 0x01},
+	{0xf1, 0x01},
+	{0xf2, 0x01},
+	{0xf3, 0x01},
+	{0xf4, 0x01},
 	{0x03, 0x03},
 	{0x10, 0x10},
 	{0x03, 0x10},
 	{0x10, 0x03},
 	{0x12, 0x30},
-	{0x13, 0x02},
+	{0x13, 0x0a},
 	{0x20, 0x00},
 	{0x30, 0x00},
 	{0x31, 0x00},
@@ -343,18 +341,18 @@
 	{0x3f, 0x00},
 	{0x40, 0x80},
 	{0x41, 0x00},
-	{0x48, 0x95},
+	{0x48, 0x90},
 	{0x60, 0x67},
-	{0x61, 0x88},
-	{0x62, 0x90},
+	{0x61, 0x95},
+	{0x62, 0x95},
 	{0x63, 0x50},
 	{0x64, 0x41},
 	{0x66, 0x42},
 	{0x67, 0x20},
-	{0x6a, 0x71},
-	{0x6b, 0x84},
-	{0x6c, 0x72},
-	{0x6d, 0x83},
+	{0x6a, 0x80},
+	{0x6b, 0x80},
+	{0x6c, 0x80},
+	{0x6d, 0x80},
 	{0x03, 0x11},
 	{0x10, 0x7f},
 	{0x11, 0x40},
@@ -381,15 +379,15 @@
 	{0x3c, 0x80},
 	{0x3d, 0x18},
 	{0x3e, 0x80},
-	{0x3f, 0x0c},
-	{0x40, 0x05},
-	{0x41, 0x06},
+	{0x3f, 0x0D},
+	{0x40, 0x0A},
+	{0x41, 0x08},
 	{0x42, 0x80},
 	{0x43, 0x18},
 	{0x44, 0x80},
-	{0x45, 0x0c},
-	{0x46, 0x05},
-	{0x47, 0x06},
+	{0x45, 0x12},
+	{0x46, 0x10},
+	{0x47, 0x10},
 	{0x48, 0x90},
 	{0x49, 0x40},
 	{0x4a, 0x80},
@@ -408,25 +406,25 @@
 	{0x57, 0x01},
 	{0x58, 0x00},
 	{0x59, 0x00},
-	{0x5a, 0x18},
-	{0x5b, 0x00},
+	{0x5a, 0x1f},
+	{0x5b, 0x3f},
 	{0x5c, 0x00},
 	{0x60, 0x3f},
-	{0x62, 0x60},
+	{0x62, 0x10},
 	{0x70, 0x06},
 	{0x03, 0x12},
-	{0x20, 0x00},
-	{0x21, 0x00},
-	{0x25, 0x00},
+	{0x20, 0x0f},
+	{0x21, 0x0f},
+	{0x25, 0x30},
 	{0x28, 0x00},
 	{0x29, 0x00},
 	{0x2a, 0x00},
-	{0x30, 0x50},
-	{0x31, 0x18},
-	{0x32, 0x32},
-	{0x33, 0x40},
-	{0x34, 0x50},
-	{0x35, 0x70},
+	{0x30, 0x30},
+	{0x31, 0x38},
+	{0x32, 0x42},
+	{0x33, 0x60},
+	{0x34, 0x70},
+	{0x35, 0x80},
 	{0x36, 0xa0},
 	{0x40, 0xa0},
 	{0x41, 0x40},
@@ -442,22 +440,22 @@
 	{0x4b, 0x80},
 	{0x4c, 0xb0},
 	{0x4d, 0x40},
-	{0x4e, 0x90},
-	{0x4f, 0x60},
-	{0x50, 0xa0},
+	{0x4e, 0xb0},
+	{0x4f, 0xb0},
+	{0x50, 0xc0},
 	{0x51, 0x80},
 	{0x52, 0xb0},
-	{0x53, 0x40},
-	{0x54, 0x90},
-	{0x55, 0x60},
-	{0x56, 0xa0},
-	{0x57, 0x80},
+	{0x53, 0x60},
+	{0x54, 0xc0},
+	{0x55, 0xc0},
+	{0x56, 0xb0},
+	{0x57, 0x70},
 	{0x58, 0x90},
 	{0x59, 0x40},
 	{0x5a, 0xd0},
 	{0x5b, 0xd0},
-	{0x5c, 0xe0},
-	{0x5d, 0x80},
+	{0x5c, 0xc0},
+	{0x5d, 0x70},
 	{0x5e, 0x88},
 	{0x5f, 0x40},
 	{0x60, 0xe0},
@@ -479,12 +477,12 @@
 	{0x90, 0x5d},
 	{0xD0, 0x0c},
 	{0xD1, 0x80},
-	{0xD2, 0x17},
+	{0xD2, 0x67},
 	{0xD3, 0x00},
 	{0xD4, 0x00},
-	{0xD5, 0x0f},
+	{0xD5, 0x02},
 	{0xD6, 0xff},
-	{0xD7, 0xff},
+	{0xD7, 0x18},
 	{0x3b, 0x06},
 	{0x3c, 0x06},
 	{0xc5, 0x00},
@@ -615,19 +613,19 @@
 	{0x18, 0x80},
 	{0x19, 0x80},
 	{0x20, 0x80},
-	{0x21, 0x80},
-	{0x22, 0x80},
-	{0x23, 0x80},
-	{0x24, 0x80},
+	{0x21, 0x95},
+	{0x22, 0xdc},
+	{0x23, 0xcb},
+	{0x24, 0xcf},
 	{0x30, 0xc8},
 	{0x31, 0x2b},
 	{0x32, 0x00},
 	{0x33, 0x00},
 	{0x34, 0x90},
-	{0x40, 0x32},
-	{0x50, 0x21},
-	{0x60, 0x19},
-	{0x70, 0x21},
+	{0x40, 0x54},
+	{0x50, 0x4b},
+	{0x60, 0x42},
+	{0x70, 0x4b},
 	{0x03, 0x15},
 	{0x10, 0x0f},
 	{0x14, 0x46},
@@ -738,7 +736,6 @@
 	{0xC5, 0x55},
 	{0x03, 0x20},
 	{0x11, 0x1c},
-	{0x18, 0x30},
 	{0x1a, 0x08},
 	{0x20, 0x05},
 	{0x21, 0x30},
@@ -753,7 +750,7 @@
 	{0x2c, 0xc2},
 	{0x2d, 0xff},
 	{0x2e, 0x33},
-	{0x30, 0x78},
+	{0x30, 0xf8},
 	{0x32, 0x03},
 	{0x33, 0x2e},
 	{0x34, 0x30},
@@ -772,24 +769,24 @@
 	{0x58, 0x14},
 	{0x59, 0x88},
 	{0x5a, 0x04},
-	{0x60, 0xaa},
-	{0x61, 0xaa},
-	{0x62, 0xaa},
-	{0x63, 0xaa},
-	{0x64, 0xaa},
-	{0x65, 0xaa},
-	{0x66, 0xab},
-	{0x67, 0xEa},
-	{0x68, 0xab},
-	{0x69, 0xEa},
-	{0x6a, 0xaa},
-	{0x6b, 0xaa},
-	{0x6c, 0xaa},
-	{0x6d, 0xaa},
-	{0x6e, 0xaa},
-	{0x6f, 0xaa},
+	{0x60, 0x55},
+	{0x61, 0x55},
+	{0x62, 0x6A},
+	{0x63, 0xA9},
+	{0x64, 0x6A},
+	{0x65, 0xA9},
+	{0x66, 0x6B},
+	{0x67, 0xE9},
+	{0x68, 0x6B},
+	{0x69, 0xE9},
+	{0x6a, 0x6A},
+	{0x6b, 0xA9},
+	{0x6c, 0x6A},
+	{0x6d, 0xA9},
+	{0x6e, 0x55},
+	{0x6f, 0x55},
 	{0x70, 0x76},
-	{0x71, 0x80},
+	{0x71, 0x82},
 	{0x76, 0x43},
 	{0x77, 0x04},
 	{0x78, 0x23},
@@ -801,18 +798,18 @@
 	{0x84, 0x5f},
 	{0x85, 0x90},
 	{0x86, 0x01},
-	{0x87, 0x2c},
-	{0x88, 0x05},
-	{0x89, 0x7e},
-	{0x8a, 0x40},
+	{0x87, 0xe0},
+	{0x88, 0x04},
+	{0x89, 0x93},
+	{0x8a, 0xe0},
 	{0x8B, 0x75},
 	{0x8C, 0x30},
 	{0x8D, 0x61},
-	{0x8E, 0x44},
-	{0x9c, 0x08},
-	{0x9d, 0x34},
+	{0x8E, 0x80},
+	{0x9c, 0x16},
+	{0x9d, 0x80},
 	{0x9e, 0x01},
-	{0x9f, 0x2c},
+	{0x9f, 0xe0},
 	{0xb0, 0x18},
 	{0xb1, 0x14},
 	{0xb2, 0x80},
@@ -847,7 +844,7 @@
 	{0x39, 0x34},
 	{0x40, 0xfa},
 	{0x41, 0x44},
-	{0x42, 0x43},
+	{0x42, 0x33},
 	{0x43, 0xf6},
 	{0x44, 0x44},
 	{0x45, 0x33},
@@ -858,18 +855,35 @@
 	{0x80, 0x38},
 	{0x81, 0x20},
 	{0x82, 0x38},
-	{0x83, 0x5e},
-	{0x84, 0x18},
-	{0x85, 0x58},
-	{0x86, 0x20},
+	{0x83, 0x60},
+	{0x84, 0x0a},
+	{0x85, 0x60},
+	{0x86, 0x15},
 	{0x87, 0x49},
-	{0x88, 0x33},
-	{0x89, 0x37},
-	{0x8a, 0x2a},
+	{0x88, 0x10},
+	{0x89, 0x50},
+	{0x8a, 0x20},
 	{0x8b, 0x41},
 	{0x8c, 0x39},
 	{0x8d, 0x34},
-	{0x8e, 0x29},
+	{0x8e, 0x28},
+	{0x8f, 0x52},
+	{0x90, 0x50},
+	{0x91, 0x4c},
+	{0x92, 0x49},
+	{0x93, 0x44},
+	{0x94, 0x3b},
+	{0x95, 0x37},
+	{0x96, 0x31},
+	{0x97, 0x28},
+	{0x98, 0x24},
+	{0x99, 0x20},
+	{0x9a, 0x20},
+	{0x9b, 0x88},
+	{0x9c, 0x88},
+	{0x9d, 0x48},
+	{0x9e, 0x38},
+	{0x9f, 0x30},
 	{0x8f, 0x53},
 	{0x90, 0x52},
 	{0x91, 0x51},
@@ -882,11 +896,6 @@
 	{0x98, 0x22},
 	{0x99, 0x1c},
 	{0x9a, 0x18},
-	{0x9b, 0x77},
-	{0x9c, 0x77},
-	{0x9d, 0x48},
-	{0x9e, 0x38},
-	{0x9f, 0x30},
 	{0xa0, 0x60},
 	{0xa1, 0x34},
 	{0xa2, 0x6f},
@@ -958,6 +967,14 @@
 	{0x03, 0x00},
 	{0x0e, 0x03},
 	{0x0e, 0x73},
+	{0x03, 0x20},
+	{0x88, 0x01},
+	{0x89, 0x5f},
+	{0x8a, 0x90},
+	{0x03, 0x20},
+	{0x10, 0x9c},
+	{0x03, 0x22},
+	{0x10, 0xe9},
 	{0x03, 0x00},
 	{0x01, 0xf0},
 };
@@ -1000,10 +1017,6 @@
 	{0x30, 0x06},
 	{0x31, 0x40},
 	{0x03, 0x20},
-	{0x88, 0x01},
-	{0x89, 0x5f},
-	{0x8a, 0x90},
-	{0x03, 0x20},
 	{0x10, 0x9c},
 	{0x03, 0x22},
 	{0x10, 0xe9},
@@ -1050,13 +1063,13 @@
 	},
 	{
 		{0x03, 0x10},
-		{0x61, 0x80},
-		{0x62, 0x80},
+		{0x61, 0x95},
+		{0x62, 0x95},
 	},
 	{
 		{0x03, 0x10},
-		{0x61, 0x94},
-		{0x62, 0x94},
+		{0x61, 0xa0},
+		{0x62, 0xa0},
 	},
 	{
 		{0x03, 0x10},
@@ -1109,7 +1122,7 @@
 	{
 		{0x03, 0x10},
 		{0x13, 0x02},
-		{0x48, 0x80},
+		{0x48, 0x90},
 	},
 	{
 		{0x03, 0x10},
@@ -1267,27 +1280,27 @@
 	/* -2 */
 	{
 		{0x03, 0x10},
-		{0x40, 0xa4},
+		{0x40, 0x94},
 	},
 	/* -1 */
 	{
 		{0x03, 0x10},
-		{0x40, 0x94},
+		{0x40, 0x80},
 	},
 	/* 0 */
 	{
 		{0x03, 0x10},
-		{0x40, 0x80},
+		{0x40, 0x14},
 	},
 	/* 1 */
 	{
 		{0x03, 0x10},
-		{0x40, 0x14},
+		{0x40, 0x24},
 	},
 	/* 2 */
 	{
 		{0x03, 0x10},
-		{0x40, 0x24},
+		{0x40, 0x34},
 	},
 };
 
@@ -1376,9 +1389,9 @@
 	{0x03, 0x20},
 	{0x10, 0x1c},
 	{0x18, 0x38},
-	{0x88, 0x05},
-	{0x89, 0x7e},
-	{0x8a, 0x40},
+	{0x88, 0x01},
+	{0x89, 0x5f},
+	{0x8a, 0x90},
 	{0x10, 0x9c},
 	{0x18, 0x30},
 };
@@ -1690,7 +1703,7 @@
 	case MSM_CAMERA_SCENE_MODE_OFF: {
 		hi256_i2c_write_table(s_ctrl, &HI256_reg_scene_auto[0],
 			ARRAY_SIZE(HI256_reg_scene_auto));
-					break;
+		break;
 	}
 	case MSM_CAMERA_SCENE_MODE_NIGHT: {
 		hi256_i2c_write_table(s_ctrl, &HI256_reg_scene_night[0],
@@ -1700,12 +1713,12 @@
 	case MSM_CAMERA_SCENE_MODE_LANDSCAPE: {
 		hi256_i2c_write_table(s_ctrl, &HI256_reg_scene_landscape[0],
 			ARRAY_SIZE(HI256_reg_scene_landscape));
-					break;
+		break;
 	}
 	case MSM_CAMERA_SCENE_MODE_PORTRAIT: {
 		hi256_i2c_write_table(s_ctrl, &HI256_reg_scene_portrait[0],
 			ARRAY_SIZE(HI256_reg_scene_portrait));
-					break;
+		break;
 	}
 	default:
 		hi256_i2c_write_table(s_ctrl, &HI256_reg_scene_auto[0],
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
index 1724db1..0447159 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
@@ -1342,6 +1342,13 @@
 		s_ctrl->power_setting_array =
 			sensor_slave_info.power_setting_array;
 		power_setting_array = &s_ctrl->power_setting_array;
+
+		if (!power_setting_array->size) {
+			pr_err("%s:%d failed\n", __func__, __LINE__);
+			rc = -EFAULT;
+			break;
+		}
+
 		power_setting_array->power_setting = kzalloc(
 			power_setting_array->size *
 			sizeof(struct msm_sensor_power_setting), GFP_KERNEL);
@@ -1403,6 +1410,12 @@
 			break;
 		}
 
+		if (!conf_array.size) {
+			pr_err("%s:%d failed\n", __func__, __LINE__);
+			rc = -EFAULT;
+			break;
+		}
+
 		reg_setting = kzalloc(conf_array.size *
 			(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
 		if (!reg_setting) {
@@ -1492,6 +1505,12 @@
 		CDBG("%s:slave_addr=0x%x, array_size=%d\n", __func__,
 			write_config.slave_addr,
 			write_config.conf_array.size);
+
+		if (!write_config.conf_array.size) {
+			pr_err("%s:%d failed\n", __func__, __LINE__);
+			rc = -EFAULT;
+			break;
+		}
 		reg_setting = kzalloc(write_config.conf_array.size *
 			(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
 		if (!reg_setting) {
@@ -1565,6 +1584,11 @@
 			break;
 		}
 
+		if (!conf_array.size) {
+			pr_err("%s:%d failed\n", __func__, __LINE__);
+			rc = -EFAULT;
+			break;
+		}
 		reg_setting = kzalloc(conf_array.size *
 			(sizeof(struct msm_camera_i2c_seq_reg_array)),
 			GFP_KERNEL);
@@ -1655,8 +1679,13 @@
 			break;
 		}
 		s_ctrl->stop_setting_valid = 1;
-
 		reg_setting = stop_setting->reg_setting;
+
+		if (!stop_setting->size) {
+			pr_err("%s:%d failed\n", __func__, __LINE__);
+			rc = -EFAULT;
+			break;
+		}
 		stop_setting->reg_setting = kzalloc(stop_setting->size *
 			(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
 		if (!stop_setting->reg_setting) {
diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c
index d718c40..317c6a9 100644
--- a/drivers/mfd/wcd9xxx-core.c
+++ b/drivers/mfd/wcd9xxx-core.c
@@ -1689,6 +1689,10 @@
 static int wcd9xxx_slim_device_up(struct slim_device *sldev)
 {
 	struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev);
+	if (!wcd9xxx) {
+		pr_err("%s: wcd9xxx is NULL\n", __func__);
+		return -EINVAL;
+	}
 	dev_dbg(wcd9xxx->dev, "%s: device up\n", __func__);
 	return wcd9xxx_device_up(wcd9xxx);
 }
@@ -1697,6 +1701,10 @@
 {
 	struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev);
 
+	if (!wcd9xxx) {
+		pr_err("%s: wcd9xxx is NULL\n", __func__);
+		return -EINVAL;
+	}
 	wcd9xxx_irq_exit(&wcd9xxx->core_res);
 	if (wcd9xxx->dev_down)
 		wcd9xxx->dev_down(wcd9xxx);
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 0987b6b..58703cf 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -77,10 +77,11 @@
 };
 
 enum qseecom_client_handle_type {
-	QSEECOM_CLIENT_APP = 0,
+	QSEECOM_CLIENT_APP = 1,
 	QSEECOM_LISTENER_SERVICE,
 	QSEECOM_SECURE_SERVICE,
 	QSEECOM_GENERIC,
+	QSEECOM_UNAVAILABLE_CLIENT_APP,
 };
 
 enum qseecom_ce_hw_instance {
@@ -2171,6 +2172,9 @@
 	struct qseecom_unload_app_ireq req;
 	struct cpumask mask;
 
+	/* unavailable client app */
+	data->type = QSEECOM_UNAVAILABLE_CLIENT_APP;
+
 	/* Populate the structure for sending scm call to unload image */
 	req.qsee_cmd_id = QSEOS_UNLOAD_EXTERNAL_ELF_COMMAND;
 
@@ -2943,6 +2947,8 @@
 				return ret;
 			}
 			break;
+		case QSEECOM_UNAVAILABLE_CLIENT_APP:
+			break;
 		default:
 			pr_err("Unsupported clnt_handle_type %d",
 				data->type);
diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c
index 58ba933..eb5d365 100644
--- a/drivers/mmc/core/bus.c
+++ b/drivers/mmc/core/bus.c
@@ -204,9 +204,11 @@
 
 	if (mmc_use_core_runtime_pm(card->host)) {
 		ret = pm_schedule_suspend(dev, card->idle_timeout);
-		if (ret) {
-			pr_err("%s: %s: pm_schedule_suspend failed: err: %d\n",
-			       mmc_hostname(host), __func__, ret);
+		if ((ret < 0) && (dev->power.runtime_error ||
+				  dev->power.disable_depth > 0)) {
+			pr_err("%s: %s: %s: pm_schedule_suspend failed: err: %d\n",
+			       mmc_hostname(host), __func__, dev_name(dev),
+			       ret);
 			return ret;
 		}
 	}
diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c
index 1262306..aa29748 100644
--- a/drivers/net/wireless/wcnss/wcnss_wlan.c
+++ b/drivers/net/wireless/wcnss/wcnss_wlan.c
@@ -31,6 +31,8 @@
 #include <linux/kthread.h>
 #include <linux/wait.h>
 #include <linux/uaccess.h>
+#include <linux/suspend.h>
+#include <linux/rwsem.h>
 #include <linux/mfd/pm8xxx/misc.h>
 
 #include <mach/msm_smd.h>
@@ -1344,6 +1346,7 @@
 	return;
 }
 
+static DECLARE_RWSEM(wcnss_pm_sem);
 
 static void wcnss_nvbin_dnld(void)
 {
@@ -1359,12 +1362,14 @@
 	const struct firmware *nv = NULL;
 	struct device *dev = &penv->pdev->dev;
 
+	down_read(&wcnss_pm_sem);
+
 	ret = request_firmware(&nv, NVBIN_FILE, dev);
 
 	if (ret || !nv || !nv->data || !nv->size) {
 		pr_err("wcnss: %s: request_firmware failed for %s\n",
 			__func__, NVBIN_FILE);
-		return;
+		goto out;
 	}
 
 	/*
@@ -1457,6 +1462,9 @@
 	/* release firmware */
 	release_firmware(nv);
 
+out:
+	up_read(&wcnss_pm_sem);
+
 	return;
 }
 
@@ -1590,7 +1598,25 @@
 	return;
 }
 
+static int wcnss_pm_notify(struct notifier_block *b,
+			unsigned long event, void *p)
+{
+	switch (event) {
+	case PM_SUSPEND_PREPARE:
+		down_write(&wcnss_pm_sem);
+		break;
 
+	case PM_POST_SUSPEND:
+		up_write(&wcnss_pm_sem);
+		break;
+	}
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block wcnss_pm_notifier = {
+	.notifier_call = wcnss_pm_notify,
+};
 
 static int
 wcnss_trigger_config(struct platform_device *pdev)
@@ -2034,7 +2060,7 @@
 	platform_driver_register(&wcnss_wlan_driver);
 	platform_driver_register(&wcnss_wlan_ctrl_driver);
 	platform_driver_register(&wcnss_ctrl_driver);
-
+	register_pm_notifier(&wcnss_pm_notifier);
 #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
 	ret = wcnss_prealloc_init();
 	if (ret < 0)
@@ -2049,17 +2075,16 @@
 	if (penv) {
 		if (penv->pil)
 			subsystem_put(penv->pil);
-
-
 		penv = NULL;
 	}
 
-	platform_driver_unregister(&wcnss_ctrl_driver);
-	platform_driver_unregister(&wcnss_wlan_ctrl_driver);
-	platform_driver_unregister(&wcnss_wlan_driver);
 #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
 	wcnss_prealloc_deinit();
 #endif
+	unregister_pm_notifier(&wcnss_pm_notifier);
+	platform_driver_unregister(&wcnss_ctrl_driver);
+	platform_driver_unregister(&wcnss_wlan_ctrl_driver);
+	platform_driver_unregister(&wcnss_wlan_driver);
 }
 
 module_init(wcnss_wlan_init);
diff --git a/drivers/power/qpnp-bms.c b/drivers/power/qpnp-bms.c
index 639d88c..ae13a06 100644
--- a/drivers/power/qpnp-bms.c
+++ b/drivers/power/qpnp-bms.c
@@ -2030,6 +2030,9 @@
 		pr_debug("new delta ocv = %d\n", delta_ocv_uv);
 	}
 
+	if (wake_lock_active(&chip->low_voltage_wake_lock))
+		goto skip_limits;
+
 	if (chip->last_ocv_uv > chip->flat_ocv_threshold_uv)
 		correction_limit_uv = chip->high_ocv_correction_limit_uv;
 	else
@@ -2045,6 +2048,8 @@
 		pr_debug("new delta ocv = %d\n", delta_ocv_uv);
 	}
 
+skip_limits:
+
 	chip->last_ocv_uv -= delta_ocv_uv;
 
 	if (chip->last_ocv_uv >= chip->max_voltage_uv)
diff --git a/drivers/video/msm/mdss/mdss_mdp_ctl.c b/drivers/video/msm/mdss/mdss_mdp_ctl.c
index 1186f1e..176d0df 100644
--- a/drivers/video/msm/mdss/mdss_mdp_ctl.c
+++ b/drivers/video/msm/mdss/mdss_mdp_ctl.c
@@ -567,6 +567,7 @@
 	struct mdss_mdp_ctl *ctl;
 
 	ctl = mixer->ctl;
+	mixer->rotator_mode = 0;
 
 	pr_debug("destroy ctl=%d mixer=%d\n", ctl->num, mixer->num);
 
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 5256d44..627dab1 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1670,8 +1670,10 @@
 {
 	struct rq *rq = task_rq(p);
 
-	BUG_ON(rq != this_rq());
-	BUG_ON(p == current);
+	if (WARN_ON(rq != this_rq()) ||
+	    WARN_ON(p == current))
+		return;
+
 	lockdep_assert_held(&rq->lock);
 
 	if (!raw_spin_trylock(&p->pi_lock)) {
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 16df20c..7db02f3 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2408,8 +2408,8 @@
 		return -ENOENT;
 
 	err = rdev->ops->stop_ap(&rdev->wiphy, dev);
-	if (!err)
-		wdev->beacon_interval = 0;
+	wdev->beacon_interval = 0;
+
 	return err;
 }
 
diff --git a/sound/soc/codecs/wcd9306.c b/sound/soc/codecs/wcd9306.c
index 23696c9..c509b08 100644
--- a/sound/soc/codecs/wcd9306.c
+++ b/sound/soc/codecs/wcd9306.c
@@ -90,6 +90,13 @@
 
 #define TAPAN_IRQ_MBHC_JACK_SWITCH 21
 
+enum tapan_codec_type {
+	WCD9306,
+	WCD9302,
+};
+
+static enum tapan_codec_type codec_ver;
+
 enum {
 	AIF1_PB = 0,
 	AIF1_CAP,
@@ -5042,6 +5049,16 @@
 	struct wcd9xxx_core_resource *core_res = &core->core_res;
 
 	if (enable) {
+		wcd9xxx_reg_update(core, WCD9XXX_A_BIAS_CENTRAL_BG_CTL,
+				   0x80, 0x80);
+		wcd9xxx_reg_update(core, WCD9XXX_A_BIAS_CENTRAL_BG_CTL,
+				   0x04, 0x04);
+		wcd9xxx_reg_update(core, WCD9XXX_A_BIAS_CENTRAL_BG_CTL,
+				   0x01, 0x01);
+		usleep_range(1000, 1000);
+		wcd9xxx_reg_update(core, WCD9XXX_A_BIAS_CENTRAL_BG_CTL,
+				   0x80, 0x00);
+
 		/* Enable RC Oscillator */
 		wcd9xxx_reg_update(core, WCD9XXX_A_RC_OSC_FREQ, 0x10, 0x00);
 		wcd9xxx_reg_write(core_res, WCD9XXX_A_BIAS_OSC_BG_CTL, 0x17);
@@ -5070,6 +5087,13 @@
 		wcd9xxx_reg_update(core, WCD9XXX_A_CLK_BUFF_EN2, 0x02, 0x02);
 		wcd9xxx_reg_update(core, WCD9XXX_A_CLK_BUFF_EN1, 0x05, 0x00);
 		usleep_range(50, 50);
+
+		wcd9xxx_reg_update(core, WCD9XXX_A_RC_OSC_FREQ, 0x80, 0x00);
+		usleep_range(10, 10);
+		wcd9xxx_reg_write(core_res, WCD9XXX_A_BIAS_OSC_BG_CTL, 0x16);
+		wcd9xxx_reg_update(core, WCD9XXX_A_BIAS_CENTRAL_BG_CTL,
+				   0x03, 0x00);
+		usleep_range(100, 100);
 	}
 
 }
@@ -5233,7 +5257,7 @@
 		}
 	}
 
-	if (tapan_check_wcd9306(codec->dev, false) == true) {
+	if (codec_ver == WCD9306) {
 		snd_soc_add_codec_controls(codec, tapan_9306_snd_controls,
 					   ARRAY_SIZE(tapan_9306_snd_controls));
 		snd_soc_dapm_new_controls(dapm, tapan_9306_dapm_widgets,
@@ -5258,11 +5282,13 @@
 
 	atomic_set(&kp_tapan_priv, (unsigned long)tapan);
 	mutex_lock(&dapm->codec->mutex);
-	snd_soc_dapm_disable_pin(dapm, "ANC HPHL");
-	snd_soc_dapm_disable_pin(dapm, "ANC HPHR");
-	snd_soc_dapm_disable_pin(dapm, "ANC HEADPHONE");
-	snd_soc_dapm_disable_pin(dapm, "ANC EAR PA");
-	snd_soc_dapm_disable_pin(dapm, "ANC EAR");
+	if (codec_ver == WCD9306) {
+		snd_soc_dapm_disable_pin(dapm, "ANC HPHL");
+		snd_soc_dapm_disable_pin(dapm, "ANC HPHR");
+		snd_soc_dapm_disable_pin(dapm, "ANC HEADPHONE");
+		snd_soc_dapm_disable_pin(dapm, "ANC EAR PA");
+		snd_soc_dapm_disable_pin(dapm, "ANC EAR");
+	}
 	snd_soc_dapm_sync(dapm);
 	mutex_unlock(&dapm->codec->mutex);
 
@@ -5363,6 +5389,7 @@
 			 __func__);
 		is_wcd9306 = true;
 	}
+	codec_ver = is_wcd9306 ? WCD9306 : WCD9302;
 
 	if (!is_wcd9306) {
 		if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_SLIMBUS)
diff --git a/sound/soc/codecs/wcd9xxx-mbhc.c b/sound/soc/codecs/wcd9xxx-mbhc.c
index 0c685fd..acb86416 100644
--- a/sound/soc/codecs/wcd9xxx-mbhc.c
+++ b/sound/soc/codecs/wcd9xxx-mbhc.c
@@ -67,6 +67,7 @@
 #define HS_DETECT_PLUG_INERVAL_MS 100
 #define SWCH_REL_DEBOUNCE_TIME_MS 50
 #define SWCH_IRQ_DEBOUNCE_TIME_US 5000
+#define BTN_RELEASE_DEBOUNCE_TIME_MS 25
 
 #define GND_MIC_SWAP_THRESHOLD 2
 #define OCP_ATTEMPT 1
@@ -854,6 +855,7 @@
 		} else if (jack_type == SND_JACK_HEADSET) {
 			mbhc->polling_active = BUTTON_POLLING_SUPPORTED;
 			mbhc->current_plug = PLUG_TYPE_HEADSET;
+			mbhc->update_z = true;
 		} else if (jack_type == SND_JACK_LINEOUT) {
 			mbhc->current_plug = PLUG_TYPE_HIGH_HPH;
 		}
@@ -2838,12 +2840,11 @@
 	return r;
 }
 
-static int wcd9xxx_is_fake_press(struct wcd9xxx_mbhc *mbhc)
+static int wcd9xxx_is_false_press(struct wcd9xxx_mbhc *mbhc)
 {
-	int i;
 	s16 mb_v;
+	int i = 0;
 	int r = 0;
-	const int dces = NUM_DCE_PLUG_DETECT;
 	const s16 v_ins_hu =
 	    wcd9xxx_get_current_v(mbhc, WCD9XXX_CURRENT_V_INS_HU);
 	const s16 v_ins_h =
@@ -2852,9 +2853,16 @@
 	    wcd9xxx_get_current_v(mbhc, WCD9XXX_CURRENT_V_B1_HU);
 	const s16 v_b1_h =
 	    wcd9xxx_get_current_v(mbhc, WCD9XXX_CURRENT_V_B1_H);
+	const unsigned long timeout =
+	    jiffies + msecs_to_jiffies(BTN_RELEASE_DEBOUNCE_TIME_MS);
 
-	for (i = 0; i < dces; i++) {
-		usleep_range(10000, 10000);
+	while (time_before(jiffies, timeout)) {
+		/*
+		 * This function needs to run measurements just few times during
+		 * release debounce time.  Make 1ms interval to avoid
+		 * unnecessary excessive measurements.
+		 */
+		usleep_range(1000, 1000 + WCD9XXX_USLEEP_RANGE_MARGIN_US);
 		if (i == 0) {
 			mb_v = wcd9xxx_codec_sta_dce(mbhc, 0, true);
 			pr_debug("%s: STA[0]: %d,%d\n", __func__, mb_v,
@@ -2872,6 +2880,7 @@
 				break;
 			}
 		}
+		i++;
 	}
 
 	return r;
@@ -2955,6 +2964,9 @@
 	*sta_z = wcd9xxx_codec_sta_dce(mbhc, 0, false);
 	*dce_z = wcd9xxx_codec_sta_dce(mbhc, 1, false);
 
+	pr_debug("%s: sta_z 0x%x, dce_z 0x%x\n", __func__, *sta_z & 0xFFFF,
+		 *dce_z & 0xFFFF);
+
 	/* Connect override from micbias */
 	snd_soc_update_bits(codec, WCD9XXX_A_MAD_ANA_CTRL, 1 << 4, 1 << 4);
 	/* Disable pull down micbias to ground */
@@ -2962,6 +2974,21 @@
 	snd_soc_write(codec, mbhc->mbhc_bias_regs.ctl_reg, reg0);
 }
 
+void wcd9xxx_update_z(struct wcd9xxx_mbhc *mbhc)
+{
+	const u16 sta_z = mbhc->mbhc_data.sta_z;
+	const u16 dce_z = mbhc->mbhc_data.dce_z;
+
+	wcd9xxx_get_z(mbhc, &mbhc->mbhc_data.dce_z, &mbhc->mbhc_data.sta_z);
+	pr_debug("%s: sta_z 0x%x,dce_z 0x%x -> sta_z 0x%x,dce_z 0x%x\n",
+		 __func__, sta_z & 0xFFFF, dce_z & 0xFFFF,
+		 mbhc->mbhc_data.sta_z & 0xFFFF,
+		 mbhc->mbhc_data.dce_z & 0xFFFF);
+
+	wcd9xxx_mbhc_calc_thres(mbhc);
+	wcd9xxx_calibrate_hs_polling(mbhc);
+}
+
 /*
  * wcd9xxx_update_rel_threshold : update mbhc release upper bound threshold
  *				  to ceilmv + buffer
@@ -3042,6 +3069,9 @@
 	vddio = (mbhc->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
 		 mbhc->mbhc_micbias_switched);
 
+	dce_z = mbhc->mbhc_data.dce_z;
+	sta_z = mbhc->mbhc_data.sta_z;
+
 	/* Measure scaled HW STA */
 	dce[0] = wcd9xxx_read_dce_result(codec);
 	sta = wcd9xxx_read_sta_result(codec);
@@ -3054,7 +3084,10 @@
 		} else {
 			pr_debug("%s: Button is released without resume",
 				 __func__);
-			wcd9xxx_get_z(mbhc, &dce_z, &sta_z);
+			if (mbhc->update_z) {
+				wcd9xxx_update_z(mbhc);
+				mbhc->update_z = false;
+			}
 			stamv = __wcd9xxx_codec_sta_dce_v(mbhc, 0, sta, sta_z,
 						mbhc->mbhc_data.micb_mv);
 			if (vddio)
@@ -3077,7 +3110,10 @@
 	     meas++)
 		dce[meas] = wcd9xxx_codec_sta_dce(mbhc, 1, false);
 
-	wcd9xxx_get_z(mbhc, &dce_z, &sta_z);
+	if (mbhc->update_z) {
+		wcd9xxx_update_z(mbhc);
+		mbhc->update_z = false;
+	}
 
 	stamv = __wcd9xxx_codec_sta_dce_v(mbhc, 0, sta, sta_z,
 					  mbhc->mbhc_data.micb_mv);
@@ -3167,6 +3203,7 @@
 static irqreturn_t wcd9xxx_release_handler(int irq, void *data)
 {
 	int ret;
+	bool waitdebounce = true;
 	struct wcd9xxx_mbhc *mbhc = data;
 
 	pr_debug("%s: enter\n", __func__);
@@ -3181,7 +3218,7 @@
 			wcd9xxx_jack_report(mbhc, &mbhc->button_jack, 0,
 					    mbhc->buttons_pressed);
 		} else {
-			if (wcd9xxx_is_fake_press(mbhc)) {
+			if (wcd9xxx_is_false_press(mbhc)) {
 				pr_debug("%s: Fake button press interrupt\n",
 					 __func__);
 			} else {
@@ -3200,6 +3237,7 @@
 					wcd9xxx_jack_report(mbhc,
 						      &mbhc->button_jack,
 						      0, mbhc->buttons_pressed);
+					waitdebounce = false;
 				}
 			}
 		}
@@ -3209,7 +3247,8 @@
 
 	wcd9xxx_calibrate_hs_polling(mbhc);
 
-	msleep(SWCH_REL_DEBOUNCE_TIME_MS);
+	if (waitdebounce)
+		msleep(SWCH_REL_DEBOUNCE_TIME_MS);
 	wcd9xxx_start_hs_polling(mbhc);
 
 	pr_debug("%s: leave\n", __func__);
diff --git a/sound/soc/codecs/wcd9xxx-mbhc.h b/sound/soc/codecs/wcd9xxx-mbhc.h
index 83bc377..3040bc4 100644
--- a/sound/soc/codecs/wcd9xxx-mbhc.h
+++ b/sound/soc/codecs/wcd9xxx-mbhc.h
@@ -309,6 +309,8 @@
 
 	u32 rco_clk_rate;
 
+	bool update_z;
+
 #ifdef CONFIG_DEBUG_FS
 	struct dentry *debugfs_poke;
 	struct dentry *debugfs_mbhc;