diff options
Diffstat (limited to 'baseboard')
-rw-r--r-- | baseboard/kukui/charger_mt6370.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/baseboard/kukui/charger_mt6370.c b/baseboard/kukui/charger_mt6370.c index 2ad7627fd9..b2c1e90935 100644 --- a/baseboard/kukui/charger_mt6370.c +++ b/baseboard/kukui/charger_mt6370.c @@ -243,6 +243,15 @@ update_charge: prev_stable_current = stable_current; } +#ifdef CONFIG_BATTERY_SMART +static void charge_enable_eoc_and_te(void) +{ + rt946x_enable_charge_eoc(1); + rt946x_enable_charge_termination(1); +} +DECLARE_DEFERRED(charge_enable_eoc_and_te); +#endif + void mt6370_charger_profile_override(struct charge_state_data *curr) { static int previous_chg_limit_mv; @@ -252,6 +261,46 @@ void mt6370_charger_profile_override(struct charge_state_data *curr) battery_thermal_control(curr); +#ifdef CONFIG_BATTERY_SMART + /* + * SMP battery uses HW pre-charge circuit and pre-charge current is + * limited to ~50mA. Once the charge current is lower than IEOC level + * within CHG_TEDG_EOC, and TE is enabled, the charging power path will + * be turned off. Disable EOC and TE when battery stays over discharge + * state, otherwise enable EOC and TE. + */ + if (!(curr->batt.flags & BATT_FLAG_BAD_VOLTAGE)) { + const struct battery_info *batt_info = battery_get_info(); + static int normal_charge_lock, over_discharge_lock; + + if (curr->batt.voltage < batt_info->voltage_min) { + normal_charge_lock = 0; + + if (!over_discharge_lock && curr->state == ST_CHARGE) { + over_discharge_lock = 1; + rt946x_enable_charge_eoc(0); + rt946x_enable_charge_termination(0); + } + } else { + over_discharge_lock = 0; + + if (!normal_charge_lock) { + normal_charge_lock = 1; + /* + * b/148045048: When the battery is activated + * in shutdown mode, the adapter cannot boot + * DUT automatically. It's a workaround to + * delay 4.5 second to enable charger EOC + * and TE function. + */ + hook_call_deferred( + &charge_enable_eoc_and_te_data, + (4.5 * SECOND)); + } + } + } +#endif + /* Limit input (=VBUS) to 5V when soc > 85% and charge current < 1A. */ if (!(curr->batt.flags & BATT_FLAG_BAD_CURRENT) && charge_get_percent() > BAT_LEVEL_PD_LIMIT && @@ -283,6 +332,7 @@ void mt6370_charger_profile_override(struct charge_state_data *curr) } +#ifndef CONFIG_BATTERY_SMART static void board_charge_termination(void) { static uint8_t te; @@ -295,6 +345,7 @@ static void board_charge_termination(void) DECLARE_HOOK(HOOK_BATTERY_SOC_CHANGE, board_charge_termination, HOOK_PRIO_DEFAULT); +#endif void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, int charge_mv) |