summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/battery_fuel_gauge.c17
-rw-r--r--include/battery_fuel_gauge.h15
2 files changed, 32 insertions, 0 deletions
diff --git a/common/battery_fuel_gauge.c b/common/battery_fuel_gauge.c
index 8135344f41..528713d68f 100644
--- a/common/battery_fuel_gauge.c
+++ b/common/battery_fuel_gauge.c
@@ -156,6 +156,23 @@ int board_cut_off_battery(void)
return rv ? EC_RES_ERROR : EC_RES_SUCCESS;
}
+enum ec_error_list battery_sleep_fuel_gauge(void)
+{
+ const struct sleep_mode_info *sleep_command;
+ int type = get_battery_type();
+
+ /* Sleep entry command must be supplied as it will vary by gauge */
+ if (type == BATTERY_TYPE_COUNT)
+ return EC_ERROR_UNKNOWN;
+
+ sleep_command = &board_battery_info[type].fuel_gauge.sleep_mode;
+
+ if (!sleep_command->sleep_supported)
+ return EC_ERROR_UNIMPLEMENTED;
+
+ return sb_write(sleep_command->reg_addr, sleep_command->reg_data);
+}
+
static enum ec_error_list battery_get_fet_status_regval(int *regval)
{
int rv;
diff --git a/include/battery_fuel_gauge.h b/include/battery_fuel_gauge.h
index 36da40b274..eb54b64c53 100644
--- a/include/battery_fuel_gauge.h
+++ b/include/battery_fuel_gauge.h
@@ -9,6 +9,7 @@
#define __CROS_EC_BATTERY_FUEL_GAUGE_H
#include "battery.h"
+#include <stdbool.h>
/* Number of writes needed to invoke battery cutoff command */
#define SHIP_MODE_WRITES 2
@@ -25,6 +26,12 @@ struct ship_mode_info {
const uint16_t reg_data[SHIP_MODE_WRITES];
};
+struct sleep_mode_info {
+ const bool sleep_supported;
+ const uint8_t reg_addr;
+ const uint16_t reg_data;
+};
+
struct fet_info {
const int mfgacc_support;
const uint8_t reg_addr;
@@ -39,6 +46,7 @@ struct fuel_gauge_info {
const char *device_name;
const uint8_t override_nil;
const struct ship_mode_info ship_mode;
+ const struct sleep_mode_info sleep_mode;
const struct fet_info fet;
#ifdef CONFIG_BATTERY_MEASURE_IMBALANCE
@@ -99,4 +107,11 @@ int cut_off_battery_block_write(const struct ship_mode_info *ship_mode);
*/
int cut_off_battery_sb_write(const struct ship_mode_info *ship_mode);
+/**
+ * Send the fuel gauge sleep command through SMBus.
+ *
+ * @return 0 if successful, non-zero if error occurred
+ */
+enum ec_error_list battery_sleep_fuel_gauge(void);
+
#endif /* __CROS_EC_BATTERY_FUEL_GAUGE_H */