power: pm8921-bms: adjust battery tolerances based on charging state
Some board designs have grounding issues where current flows from
external common ground instead of the rsense resistor. This is typically
seen on a fake battery power supply setup which also has another device
(such as a callbox) connected to the system ground. IOW the gnd of the
power supply and the ground of the callbox are same and the current flows
from this common ground instead of rsense.
This causes the BMS to see incorrect battery current direction, it thinks
the battery is being charged and moves to a high load state. It recovers
after a while to move back in to low load state. This transition continues
causing irregular increase in sleep current.
Fix this by increasing the battery tolerance while not charging.
CRs-Fixed: 337827
Change-Id: I824387568e93191365faead05a70850f0eed423d
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/drivers/power/pm8921-bms.c b/drivers/power/pm8921-bms.c
index 93de829..3104daf 100644
--- a/drivers/power/pm8921-bms.c
+++ b/drivers/power/pm8921-bms.c
@@ -29,6 +29,7 @@
#define BMS_CONTROL 0x224
#define BMS_OUTPUT0 0x230
#define BMS_OUTPUT1 0x231
+#define BMS_TOLERANCES 0x232
#define BMS_TEST1 0x237
#define ADC_ARB_SECP_CNTRL 0x190
@@ -1268,6 +1269,10 @@
}
EXPORT_SYMBOL_GPL(pm8921_bms_get_fcc);
+#define IBAT_TOL_MASK 0x0F
+#define OCV_TOL_MASK 0xF0
+#define IBAT_TOL_DEFAULT 0x03
+#define IBAT_TOL_NOCHG 0x0F
void pm8921_bms_charging_began(void)
{
int batt_temp, rc;
@@ -1291,7 +1296,8 @@
bms_start_percent = the_chip->start_percent;
bms_start_ocv_uv = raw.last_good_ocv_uv;
calculate_cc_uah(the_chip, raw.cc, &bms_start_cc_uah);
-
+ pm_bms_masked_write(the_chip, BMS_TOLERANCES,
+ IBAT_TOL_MASK, IBAT_TOL_DEFAULT);
pr_debug("start_percent = %u%%\n", the_chip->start_percent);
}
EXPORT_SYMBOL_GPL(pm8921_bms_charging_began);
@@ -1373,6 +1379,8 @@
last_chargecycles);
the_chip->start_percent = -EINVAL;
the_chip->end_percent = -EINVAL;
+ pm_bms_masked_write(the_chip, BMS_TOLERANCES,
+ IBAT_TOL_MASK, IBAT_TOL_NOCHG);
}
EXPORT_SYMBOL_GPL(pm8921_bms_charging_end);
@@ -1514,6 +1522,9 @@
BMS_CONTROL, rc);
}
+ /* The charger will call start charge later if usb is present */
+ pm_bms_masked_write(chip, BMS_TOLERANCES,
+ IBAT_TOL_MASK, IBAT_TOL_NOCHG);
return 0;
}