From 6efe929eccb2ea1dd56934bdbac8a6d080deea1e Mon Sep 17 00:00:00 2001 From: Aseda Aboagye Date: Thu, 11 Jan 2018 18:40:51 -0800 Subject: [PATCH] meowth: zoombini: Check for battery disconnect. This commit enables support for reviving a battery from disconnect while also providing the code to detect if the batteries are disconnected or not. The disconnection code behaves similarly to some other battery packs used in Chromebooks. BUG=b:71515229 BRANCH=None TEST=Flash zoombini; cut off battery; apply AC and verify that we do not leave safe mode until the battery is no longer "disconnected". TEST=Repeat above test for meowth. TEST=Cutoff the battery and apply AC and verify that board wakes up from cutoff. Change-Id: I52fe91bd6522901671ad5a302bfa0ca27e5f5aa0 Signed-off-by: Aseda Aboagye Reviewed-on: https://chromium-review.googlesource.com/864830 Commit-Ready: Aseda Aboagye Tested-by: Aseda Aboagye Reviewed-by: Shawn N --- board/zoombini/battery.c | 45 ++++++++++++++++++++++++++++++++++++++++ board/zoombini/board.h | 1 + 2 files changed, 46 insertions(+) diff --git a/board/zoombini/battery.c b/board/zoombini/battery.c index a5077881c1..f29f9b6009 100644 --- a/board/zoombini/battery.c +++ b/board/zoombini/battery.c @@ -9,6 +9,7 @@ #include "battery_smart.h" #include "common.h" #include "ec_commands.h" +#include "extpower.h" /* Shutdown mode parameter to write to manufacturer access register */ #define SB_SHUTDOWN_DATA 0x0010 @@ -71,3 +72,47 @@ const struct battery_info *battery_get_info(void) { return &info; } + +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_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); + if (rv) + return BATTERY_DISCONNECT_ERROR; + if (~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_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); + 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; +} diff --git a/board/zoombini/board.h b/board/zoombini/board.h index b1c6f29dae..dfc459078b 100644 --- a/board/zoombini/board.h +++ b/board/zoombini/board.h @@ -42,6 +42,7 @@ #define CONFIG_BATTERY_CUT_OFF #define CONFIG_BATTERY_SMART +#define CONFIG_BATTERY_REVIVE_DISCONNECT #define CONFIG_BATTERY_PRESENT_GPIO GPIO_BAT_PRESENT_L #define CONFIG_BOARD_VERSION