Merge "f2fs: avoid infinite GC loop due to stale atomic files"
diff --git a/arch/arm/boot/dts/qcom/sa415m-ttp.dtsi b/arch/arm/boot/dts/qcom/sa415m-ttp.dtsi
index b0d746a..6028387 100644
--- a/arch/arm/boot/dts/qcom/sa415m-ttp.dtsi
+++ b/arch/arm/boot/dts/qcom/sa415m-ttp.dtsi
@@ -53,8 +53,8 @@
};
cnss_pcie: qcom,cnss {
compatible = "qcom,cnss";
- reg = <0x10000000 0x10000000>,
- <0x20000000 0x10000>;
+ reg = <0xa0000000 0x10000000>,
+ <0xb0000000 0x10000>;
reg-names = "smmu_iova_base", "smmu_iova_ipa";
wlan-en-gpio = <&tlmm 52 0>;
diff --git a/arch/arm/configs/msm8937go-perf_defconfig b/arch/arm/configs/msm8937go-perf_defconfig
index 8420285..1c37757 100755
--- a/arch/arm/configs/msm8937go-perf_defconfig
+++ b/arch/arm/configs/msm8937go-perf_defconfig
@@ -362,7 +362,6 @@
CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_QCOM=y
CONFIG_QCOM_DLOAD_MODE=y
-CONFIG_POWER_SUPPLY=y
CONFIG_QPNP_FG=y
CONFIG_SMB135X_CHARGER=y
CONFIG_SMB1360_CHARGER_FG=y
@@ -460,6 +459,7 @@
CONFIG_HID_MAGICMOUSE=y
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MULTITOUCH=y
+CONFIG_HID_SONY=y
CONFIG_USB_HIDDEV=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
diff --git a/arch/arm/configs/msm8937go_defconfig b/arch/arm/configs/msm8937go_defconfig
index b9cdd7e..2e63db2d 100755
--- a/arch/arm/configs/msm8937go_defconfig
+++ b/arch/arm/configs/msm8937go_defconfig
@@ -368,7 +368,6 @@
CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_QCOM=y
CONFIG_QCOM_DLOAD_MODE=y
-CONFIG_POWER_SUPPLY=y
CONFIG_QPNP_FG=y
CONFIG_SMB135X_CHARGER=y
CONFIG_SMB1360_CHARGER_FG=y
@@ -467,6 +466,7 @@
CONFIG_HID_MAGICMOUSE=y
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MULTITOUCH=y
+CONFIG_HID_SONY=y
CONFIG_USB_HIDDEV=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
diff --git a/drivers/power/supply/qcom/qg-reg.h b/drivers/power/supply/qcom/qg-reg.h
index 69f2e1e..dddc7b0 100644
--- a/drivers/power/supply/qcom/qg-reg.h
+++ b/drivers/power/supply/qcom/qg-reg.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -118,6 +118,7 @@
#define QG_SDAM_ESR_DISCHARGE_DELTA_OFFSET 0x6E /* 4-byte 0x6E-0x71 */
#define QG_SDAM_ESR_CHARGE_SF_OFFSET 0x72 /* 2-byte 0x72-0x73 */
#define QG_SDAM_ESR_DISCHARGE_SF_OFFSET 0x74 /* 2-byte 0x74-0x75 */
+#define QG_SDAM_MAGIC_OFFSET 0x80 /* 4-byte 0x80-0x83 */
#define QG_SDAM_MAX_OFFSET 0xA4
/* Below offset is used by PBS */
diff --git a/drivers/power/supply/qcom/qg-sdam.c b/drivers/power/supply/qcom/qg-sdam.c
index a7cb97e..95ac8ec 100644
--- a/drivers/power/supply/qcom/qg-sdam.c
+++ b/drivers/power/supply/qcom/qg-sdam.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -88,6 +88,11 @@
.offset = QG_SDAM_ESR_DISCHARGE_SF_OFFSET,
.length = 2,
},
+ [SDAM_MAGIC] = {
+ .name = "SDAM_MAGIC_OFFSET",
+ .offset = QG_SDAM_MAGIC_OFFSET,
+ .length = 4,
+ },
};
int qg_sdam_write(u8 param, u32 data)
@@ -242,6 +247,23 @@
return 0;
}
+int qg_sdam_clear(void)
+{
+ int i, rc = 0;
+ struct qg_sdam *chip = the_chip;
+ u8 data = 0;
+
+ if (!chip) {
+ pr_err("Invalid sdam-chip pointer\n");
+ return -EINVAL;
+ }
+
+ for (i = SDAM_MIN_OFFSET; i <= SDAM_MAX_OFFSET; i++)
+ rc |= qg_sdam_multibyte_write(i, &data, 1);
+
+ return rc;
+}
+
int qg_sdam_init(struct device *dev)
{
int rc;
diff --git a/drivers/power/supply/qcom/qg-sdam.h b/drivers/power/supply/qcom/qg-sdam.h
index 45218a8..d365f25 100644
--- a/drivers/power/supply/qcom/qg-sdam.h
+++ b/drivers/power/supply/qcom/qg-sdam.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -14,6 +14,8 @@
#define __QG_SDAM_H__
#define SDAM_TYPE 0x2E
+#define SDAM_MIN_OFFSET 0x45
+#define SDAM_MAX_OFFSET 0xB3
enum qg_sdam_param {
SDAM_VALID,
@@ -28,6 +30,7 @@
SDAM_ESR_DISCHARGE_DELTA,
SDAM_ESR_CHARGE_SF,
SDAM_ESR_DISCHARGE_SF,
+ SDAM_MAGIC,
SDAM_MAX,
};
@@ -43,5 +46,6 @@
int qg_sdam_read_all(u32 *sdam_data);
int qg_sdam_multibyte_write(u32 offset, u8 *sdam_data, u32 length);
int qg_sdam_multibyte_read(u32 offset, u8 *sdam_data, u32 length);
+int qg_sdam_clear(void);
#endif
diff --git a/drivers/power/supply/qcom/qpnp-qg.c b/drivers/power/supply/qcom/qpnp-qg.c
index f84e072..e3ebe66 100644
--- a/drivers/power/supply/qcom/qpnp-qg.c
+++ b/drivers/power/supply/qcom/qpnp-qg.c
@@ -2767,6 +2767,39 @@
return 0;
}
+#define SDAM_MAGIC_NUMBER 0x12345678
+static int qg_sanitize_sdam(struct qpnp_qg *chip)
+{
+ int rc = 0;
+ u32 data = 0;
+
+ rc = qg_sdam_read(SDAM_MAGIC, &data);
+ if (rc < 0) {
+ pr_err("Failed to read SDAM rc=%d\n", rc);
+ return rc;
+ }
+
+ if (data == SDAM_MAGIC_NUMBER) {
+ qg_dbg(chip, QG_DEBUG_PON, "SDAM valid\n");
+ } else if (data == 0) {
+ rc = qg_sdam_write(SDAM_MAGIC, SDAM_MAGIC_NUMBER);
+ if (!rc)
+ qg_dbg(chip, QG_DEBUG_PON, "First boot. SDAM initilized\n");
+ } else {
+ /* SDAM has invalid value */
+ rc = qg_sdam_clear();
+ if (!rc) {
+ pr_err("SDAM uninitialized, SDAM reset\n");
+ rc = qg_sdam_write(SDAM_MAGIC, SDAM_MAGIC_NUMBER);
+ }
+ }
+
+ if (rc < 0)
+ pr_err("Failed in SDAM operation, rc=%d\n", rc);
+
+ return rc;
+}
+
#define ADC_CONV_DLY_512MS 0xA
static int qg_hw_init(struct qpnp_qg *chip)
{
@@ -3794,6 +3827,12 @@
return rc;
}
+ rc = qg_sanitize_sdam(chip);
+ if (rc < 0) {
+ pr_err("Failed to sanitize SDAM, rc=%d\n", rc);
+ return rc;
+ }
+
rc = qg_soc_init(chip);
if (rc < 0) {
pr_err("Failed to initialize SOC scaling init rc=%d\n", rc);