diff options
-rw-r--r-- | board/kevin/battery.c | 53 | ||||
-rw-r--r-- | board/kevin/board.h | 1 |
2 files changed, 54 insertions, 0 deletions
diff --git a/board/kevin/battery.c b/board/kevin/battery.c index c3262b6b11..68150f6ce0 100644 --- a/board/kevin/battery.c +++ b/board/kevin/battery.c @@ -10,6 +10,7 @@ #include "charge_state.h" #include "console.h" #include "ec_commands.h" +#include "extpower.h" #include "util.h" /* Shutdown mode parameter to write to manufacturer access register */ @@ -61,6 +62,58 @@ int board_cut_off_battery(void) return rv ? EC_RES_ERROR : EC_RES_SUCCESS; } +enum battery_disconnect_state battery_get_disconnect_state(void) +{ + uint8_t data[6]; + int rv; + + /* + * Take note if we find that the battery isn't in disconnect state, + * and always return NOT_DISCONNECTED without probing the battery. + * This assumes the battery will not go to disconnect state during + * runtime. + */ + static int not_disconnected; + + if (not_disconnected) + return BATTERY_NOT_DISCONNECTED; + + if (extpower_is_present()) { + /* Check if battery charging + discharging is disabled. */ + rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_OPERATION_STATUS); + if (rv) + return BATTERY_DISCONNECT_ERROR; + + rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + SB_ALT_MANUFACTURER_ACCESS, data, 6); + + if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED))) { + not_disconnected = 1; + return BATTERY_NOT_DISCONNECTED; + } + + /* + * Battery is neither charging nor discharging. Verify that + * we didn't enter this state due to a safety fault. + */ + rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); + if (rv) + return BATTERY_DISCONNECT_ERROR; + + rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + SB_ALT_MANUFACTURER_ACCESS, data, 6); + + if (rv || data[2] || data[3] || data[4] || data[5]) + return BATTERY_DISCONNECT_ERROR; + + /* No safety fault, battery is disconnected */ + return BATTERY_DISCONNECTED; + } + not_disconnected = 1; + return BATTERY_NOT_DISCONNECTED; +} + int charger_profile_override(struct charge_state_data *curr) { const struct battery_info *batt_info; diff --git a/board/kevin/board.h b/board/kevin/board.h index a840a30d12..d98b39aab8 100644 --- a/board/kevin/board.h +++ b/board/kevin/board.h @@ -91,6 +91,7 @@ #define CONFIG_BATTERY_CUT_OFF #define CONFIG_BATTERY_PRESENT_GPIO GPIO_EC_BATT_PRES_L +#define CONFIG_BATTERY_REVIVE_DISCONNECT #define CONFIG_BATTERY_SMART #ifdef BOARD_KEVIN |