summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
Diffstat (limited to 'driver')
-rw-r--r--driver/charger/bd9995x.c28
-rw-r--r--driver/charger/bd9995x.h2
2 files changed, 29 insertions, 1 deletions
diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c
index 538a9ea714..7ee385680d 100644
--- a/driver/charger/bd9995x.c
+++ b/driver/charger/bd9995x.c
@@ -30,6 +30,7 @@
* completes 312ms after VBUS/VCC attach.
*/
#define BC12_DETECT_US (312*MSEC)
+#define BD9995X_VSYS_PRECHARGE_OFFSET_MV 200
/* Console output macros */
#define CPRINTS(format, args...) cprints(CC_CHARGER, format, ## args)
@@ -203,7 +204,8 @@ static int bd9995x_charger_enable(int enable)
* Set VSYSREG_SET > VBAT so that the charger is in Pre-Charge
* state when not charging or discharging.
*/
- rv = bd9995x_set_vsysreg(bi->voltage_max + 200);
+ rv = bd9995x_set_vsysreg(bi->voltage_max +
+ BD9995X_VSYS_PRECHARGE_OFFSET_MV);
/*
* Allow charger in pre-charge state for 50ms before disabling
@@ -819,6 +821,15 @@ static void bd9995x_init(void)
ch_raw_write16(BD9995X_CMD_CHGOP_SET1, reg,
BD9995X_EXTENDED_COMMAND);
+ /*
+ * OTP setting for this register is 6.08V. Set VSYS to above battery max
+ * (as is done when charger is disabled) to ensure VSYSREG_SET > VBAT so
+ * that the charger is in Pre-Charge state and that the input current
+ * disable setting below will be active.
+ */
+ bd9995x_set_vsysreg(battery_get_info()->voltage_max +
+ BD9995X_VSYS_PRECHARGE_OFFSET_MV);
+
/* Enable BC1.2 USB charging and DC/DC converter @ 1200KHz */
if (ch_raw_read16(BD9995X_CMD_CHGOP_SET2, &reg,
BD9995X_EXTENDED_COMMAND))
@@ -841,6 +852,21 @@ static void bd9995x_init(void)
return;
reg &= ~BD9995X_CMD_VM_CTRL_SET_EXTIADPEN;
ch_raw_write16(BD9995X_CMD_VM_CTRL_SET, reg, BD9995X_EXTENDED_COMMAND);
+ /*
+ * Disable the input current limit when VBAT is < VSYSREG_SET. This
+ * needs to be done before calling
+ * bd9995x_battery_charging_profile_settings() as in that function the
+ * input current limit is set to CONFIG_CHARGER_INPUT_CURRENT which is
+ * 512 mA. In deeply discharged battery cases, setting the input current
+ * limit this low can cause VSYS to collapse, which in turn can cause
+ * the EC's brownout detector to reset the EC.
+ */
+ if (ch_raw_read16(BD9995X_CMD_VIN_CTRL_SET, &reg,
+ BD9995X_EXTENDED_COMMAND))
+ return;
+ reg |= BD9995X_CMD_VIN_CTRL_SET_VSYS_PRIORITY;
+ ch_raw_write16(BD9995X_CMD_VIN_CTRL_SET, reg,
+ BD9995X_EXTENDED_COMMAND);
/* Define battery charging profile */
bd9995x_battery_charging_profile_settings();
diff --git a/driver/charger/bd9995x.h b/driver/charger/bd9995x.h
index 2799973584..892e76cf10 100644
--- a/driver/charger/bd9995x.h
+++ b/driver/charger/bd9995x.h
@@ -94,6 +94,8 @@ enum bd9995x_charge_port {
#define BD9995X_CMD_EXT_ICC_LIM_SET 0x08
#define BD9995X_CMD_IOTG_LIM_SET 0x09
#define BD9995X_CMD_VIN_CTRL_SET 0x0A
+#define BD9995X_CMD_VIN_CTRL_SET_VSYS_PRIORITY (1 << 4)
+
#define BD9995X_CMD_VIN_CTRL_SET_PP_BOTH_THRU (1 << 11)
#define BD9995X_CMD_VIN_CTRL_SET_VBUS_PRIORITY (1 << 7)
#define BD9995X_CMD_VIN_CTRL_SET_VBUS_EN (1 << 6)