summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/scarlet/board.c10
-rw-r--r--board/scarlet/board.h2
-rw-r--r--common/charge_state_v2.c39
-rw-r--r--include/charge_state_v2.h19
-rw-r--r--include/config.h6
-rw-r--r--test/sbs_charging_v2.c5
6 files changed, 53 insertions, 28 deletions
diff --git a/board/scarlet/board.c b/board/scarlet/board.c
index 7f217bcd80..80a3a73c4e 100644
--- a/board/scarlet/board.c
+++ b/board/scarlet/board.c
@@ -137,10 +137,14 @@ void board_reset_pd_mcu(void)
{
}
-int board_critical_shutdown_check(struct charge_state_data *curr)
+enum critical_shutdown board_critical_shutdown_check(
+ struct charge_state_data *curr)
{
- return ((curr->batt.flags & BATT_FLAG_BAD_VOLTAGE) ||
- (curr->batt.voltage <= BAT_LOW_VOLTAGE_THRESH));
+ if ((curr->batt.flags & BATT_FLAG_BAD_VOLTAGE) ||
+ (curr->batt.voltage <= BAT_LOW_VOLTAGE_THRESH))
+ return CRITICAL_SHUTDOWN_CUTOFF;
+ else
+ return CRITICAL_SHUTDOWN_IGNORE;
}
uint16_t tcpc_get_alert_status(void)
diff --git a/board/scarlet/board.h b/board/scarlet/board.h
index 1d7e8203de..c5698fd096 100644
--- a/board/scarlet/board.h
+++ b/board/scarlet/board.h
@@ -119,8 +119,6 @@
#define CONFIG_USBC_VCONN_SWAP
#define CONFIG_USB_PD_COMM_LOCKED
-#define CONFIG_BATTERY_CRITICAL_SHUTDOWN_CUT_OFF
-#define CONFIG_BATTERY_CRITICAL_CUT_OFF_CUSTOM_CONDITION
#define CONFIG_BATTERY_CUT_OFF
#define CONFIG_BATTERY_PRESENT_CUSTOM
#define CONFIG_BATTERY_RETRY_NACK
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index bd4bb81558..b07e82022e 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -1284,6 +1284,19 @@ static inline int battery_too_low(void)
curr.batt.voltage <= batt_info->voltage_min));
}
+__attribute__((weak))
+enum critical_shutdown board_critical_shutdown_check(
+ struct charge_state_data *curr)
+{
+#ifdef CONFIG_BATTERY_CRITICAL_SHUTDOWN_CUT_OFF
+ return CRITICAL_SHUTDOWN_CUTOFF;
+#elif defined(CONFIG_HIBERNATE)
+ return CRITICAL_SHUTDOWN_HIBERNATE;
+#else
+ return CRITICAL_SHUTDOWN_IGNORE;
+#endif
+}
+
/*
* If the battery is at extremely low charge (and discharging) or extremely
* high temperature, the EC will notify the AP and start a timer. If the
@@ -1329,19 +1342,19 @@ static int shutdown_on_critical_battery(void)
CRITICAL_BATTERY_SHUTDOWN_TIMEOUT_US) {
if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) {
/* Timeout waiting for charger to provide more power */
-#if defined(CONFIG_BATTERY_CRITICAL_SHUTDOWN_CUT_OFF)
-#ifdef CONFIG_BATTERY_CRITICAL_CUT_OFF_CUSTOM_CONDITION
- if (!board_critical_shutdown_check(&curr))
- return battery_critical;
-#endif /* CONFIG_BATTERY_CRITICAL_CUT_OFF_CUSTOM_CONDITION */
- CPRINTS(
- "charge force battery cut-off due to critical level");
- board_cut_off_battery();
-#elif defined(CONFIG_HIBERNATE)
- CPRINTS(
- "charge force EC hibernate due to critical battery");
- system_hibernate(0, 0);
-#endif
+ switch (board_critical_shutdown_check(&curr)) {
+ case CRITICAL_SHUTDOWN_HIBERNATE:
+ CPRINTS("Hibernate due to critical battery");
+ system_hibernate(0, 0);
+ break;
+ case CRITICAL_SHUTDOWN_CUTOFF:
+ CPRINTS("Cutoff due to critical battery");
+ board_cut_off_battery();
+ break;
+ case CRITICAL_SHUTDOWN_IGNORE:
+ default:
+ break;
+ }
} else {
/* Timeout waiting for AP to shut down, so kill it */
CPRINTS(
diff --git a/include/charge_state_v2.h b/include/charge_state_v2.h
index e3a43d8bcf..ec164ea507 100644
--- a/include/charge_state_v2.h
+++ b/include/charge_state_v2.h
@@ -110,10 +110,21 @@ void board_enable_base_power(int enable);
void board_base_reset(void);
/**
- * Don't cut off battery in critical battery condition when this
- * board-specific routine returns 0.
+ * Callback with which boards determine action on critical low battery
+ *
+ * The default implementation is provided in charge_state_v2.c. Overwrite it
+ * to customize it.
+ *
+ * @param curr Pointer to struct charge_state_data
+ * @return Action to take.
*/
-int board_critical_shutdown_check(struct charge_state_data *curr);
+enum critical_shutdown {
+ CRITICAL_SHUTDOWN_IGNORE,
+ CRITICAL_SHUTDOWN_HIBERNATE,
+ CRITICAL_SHUTDOWN_CUTOFF,
+};
+enum critical_shutdown board_critical_shutdown_check(
+ struct charge_state_data *curr);
-#endif /* __CROS_EC_CHARGE_STATE_V2_H */
+#endif /* __CROS_EC_CHARGE_STATE_V2_H */
diff --git a/include/config.h b/include/config.h
index 3b0302b2ae..107a94b469 100644
--- a/include/config.h
+++ b/include/config.h
@@ -378,12 +378,6 @@
#undef CONFIG_BATTERY_CRITICAL_SHUTDOWN_CUT_OFF
/*
- * There is an extra condition we want to meet before cutting off battery
- * when we found the battery is in a critical condition.
- */
-#undef CONFIG_BATTERY_CRITICAL_CUT_OFF_CUSTOM_CONDITION
-
-/*
* Support battery cut-off as host command and console command.
*
* Once defined, you have to implement a board_cut_off_battery() function
diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c
index e266e59215..a41c8205d5 100644
--- a/test/sbs_charging_v2.c
+++ b/test/sbs_charging_v2.c
@@ -36,6 +36,11 @@ static void reset_mocks(void)
shutdown_warning_time.val = 0ULL;
}
+int board_cut_off_battery(void)
+{
+ return EC_SUCCESS;
+}
+
void chipset_force_shutdown(enum chipset_shutdown_reason reason)
{
is_shutdown = 1;