summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/kevin/battery.c53
-rw-r--r--board/kevin/board.h1
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