dev: pmi8994: Add API for broken battery detection
API to detect broken battery.
Change-Id: I287d38fa656b3441289519d58b01af221b3a50df
diff --git a/dev/pmic/pm8x41/include/pm8x41_hw.h b/dev/pmic/pm8x41/include/pm8x41_hw.h
index db4473c..44e9599 100644
--- a/dev/pmic/pm8x41/include/pm8x41_hw.h
+++ b/dev/pmic/pm8x41/include/pm8x41_hw.h
@@ -143,6 +143,16 @@
#define VBAT_DET_HI_RT_STS 0x02
#define VCP_ENABLE 0x01
+#define PMI8994_CHGR_CFG2 0x210FC
+#define CURRENT_TERM_EN BIT(3)
+#define PMI8994_FCC_CFG 0x210F2
+#define PMI8994_FV_CFG 0x210F4
+#define PMI8994_INT_RT_STS 0x21010
+#define BAT_TAPER_MODE_CHARGING_RT_STS BIT(6)
+#define PMI8994_CHGR_TRIM_OPTIONS_7_0 0x216F6
+#define INPUT_MISSING_POLLER_EN BIT(3)
+
int pm8xxx_is_battery_broken(void);
+bool pmi8994_battery_broken(void);
#endif
diff --git a/dev/pmic/pm8x41/pm8x41.c b/dev/pmic/pm8x41/pm8x41.c
index dc4c32d..5886161 100644
--- a/dev/pmic/pm8x41/pm8x41.c
+++ b/dev/pmic/pm8x41/pm8x41.c
@@ -625,3 +625,38 @@
return batt_is_broken;
}
+
+/* Detect broken battery for pmi 8994*/
+bool pmi8994_is_battery_broken()
+{
+ bool batt_is_broken;
+ uint8_t fast_charge = 0;
+
+ /* Disable the input missing ppoller */
+ REG_WRITE(PMI8994_CHGR_TRIM_OPTIONS_7_0, REG_READ(PMI8994_CHGR_TRIM_OPTIONS_7_0) & ~INPUT_MISSING_POLLER_EN);
+ /* Disable current termination */
+ REG_WRITE(PMI8994_CHGR_CFG2, REG_READ(PMI8994_CHGR_CFG2) & ~CURRENT_TERM_EN);
+ /* Fast-charge current to 300 mA */
+ fast_charge = REG_READ(PMI8994_FCC_CFG);
+ REG_WRITE(PMI8994_FCC_CFG, 0x0);
+ /* Change the float voltage to 4.50V */
+ REG_WRITE(PMI8994_FV_CFG, 0x3F);
+
+ mdelay(5);
+
+ if (REG_READ(PMI8994_INT_RT_STS) & BAT_TAPER_MODE_CHARGING_RT_STS)
+ batt_is_broken = true;
+ else
+ batt_is_broken = false;
+
+ /* Set float voltage back to 4.35V */
+ REG_WRITE(PMI8994_FV_CFG, 0x2B);
+ /* Enable current termination */
+ REG_WRITE(PMI8994_CHGR_CFG2, REG_READ(PMI8994_CHGR_CFG2) | CURRENT_TERM_EN);
+ /* Fast-charge current back to default mA */
+ REG_WRITE(PMI8994_FCC_CFG, fast_charge);
+ /* Re-enable the input missing poller */
+ REG_WRITE(PMI8994_CHGR_TRIM_OPTIONS_7_0, REG_READ(PMI8994_CHGR_TRIM_OPTIONS_7_0) | INPUT_MISSING_POLLER_EN);
+
+ return batt_is_broken;
+}