diff options
Diffstat (limited to 'driver')
-rw-r--r-- | driver/charger/bd9995x.c | 28 | ||||
-rw-r--r-- | driver/charger/bd9995x.h | 2 |
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, ®, 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, ®, + 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) |