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;