summaryrefslogtreecommitdiff
path: root/common/battery_fuel_gauge.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /common/battery_fuel_gauge.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14588.98.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'common/battery_fuel_gauge.c')
-rw-r--r--common/battery_fuel_gauge.c283
1 files changed, 0 insertions, 283 deletions
diff --git a/common/battery_fuel_gauge.c b/common/battery_fuel_gauge.c
deleted file mode 100644
index 528713d68f..0000000000
--- a/common/battery_fuel_gauge.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Battery fuel gauge parameters
- */
-
-#include "battery_fuel_gauge.h"
-#include "battery_smart.h"
-#include "console.h"
-#include "hooks.h"
-#include "i2c.h"
-#include "util.h"
-
-#define CPRINTS(format, args...) cprints(CC_CHARGER, format, ## args)
-
-
-/* Get type of the battery connected on the board */
-static int get_battery_type(void)
-{
- char manuf_name[32], device_name[32];
- int i;
- static enum battery_type battery_type = BATTERY_TYPE_COUNT;
-
- /*
- * If battery_type is not the default value, then can return here
- * as there is no need to query the fuel gauge.
- */
- if (battery_type != BATTERY_TYPE_COUNT)
- return battery_type;
-
- /* Get the manufacturer name. If can't read then just exit */
- if (battery_manufacturer_name(manuf_name, sizeof(manuf_name)))
- return battery_type;
-
- /*
- * Compare the manufacturer name read from the fuel gauge to the
- * manufacturer names defined in the board_battery_info table. If
- * a device name has been specified in the board_battery_info table,
- * then both the manufacturer and device name must match.
- */
- for (i = 0; i < BATTERY_TYPE_COUNT; i++) {
- const struct fuel_gauge_info * const fuel_gauge =
- &board_battery_info[i].fuel_gauge;
- int len = 0;
-
- if (strcasecmp(manuf_name, fuel_gauge->manuf_name))
- continue;
-
- if (fuel_gauge->device_name != NULL) {
-
- if (battery_device_name(device_name,
- sizeof(device_name)))
- continue;
-
- len = strlen(fuel_gauge->device_name);
- if (strncasecmp(device_name, fuel_gauge->device_name,
- len))
- continue;
- }
-
- CPRINTS("found batt:%s", fuel_gauge->manuf_name);
- battery_type = i;
- break;
- }
-
- return battery_type;
-}
-
-__overridable int board_get_default_battery_type(void)
-{
- return DEFAULT_BATTERY_TYPE;
-}
-
-/*
- * Initialize the battery type for the board.
- *
- * The first call to battery_get_info() is when the charger task starts, so
- * initialize the battery type as soon as I2C is initialized.
- */
-static void init_battery_type(void)
-{
- if (get_battery_type() == BATTERY_TYPE_COUNT)
- CPRINTS("battery not found");
-}
-DECLARE_HOOK(HOOK_INIT, init_battery_type, HOOK_PRIO_INIT_I2C + 1);
-
-static inline const struct board_batt_params *get_batt_params(void)
-{
- int type = get_battery_type();
-
- return &board_battery_info[type == BATTERY_TYPE_COUNT ?
- board_get_default_battery_type() : type];
-}
-
-const struct battery_info *battery_get_info(void)
-{
- return &get_batt_params()->batt_info;
-}
-
-int cut_off_battery_block_write(const struct ship_mode_info *ship_mode)
-{
- int rv;
-
- uint8_t cutdata[3] = {
- 0x02,
- ship_mode->reg_data[0] & 0xFF,
- ship_mode->reg_data[0] >> 8,
- };
-
- /* SMBus protocols are block write, which include byte count
- * byte. Byte count segments are required to communicate
- * required action and the number of data bytes.
- * Due to ship mode command requires writing data values twice
- * to cutoff the battery, so byte count is 0x02.
- */
- rv = sb_write_block(ship_mode->reg_addr, cutdata, sizeof(cutdata));
- if (rv)
- return rv;
-
- /* Use the next set of values */
- cutdata[1] = ship_mode->reg_data[1] & 0xFF;
- cutdata[2] = ship_mode->reg_data[1] >> 8;
-
- return sb_write_block(ship_mode->reg_addr, cutdata, sizeof(cutdata));
-}
-
-int cut_off_battery_sb_write(const struct ship_mode_info *ship_mode)
-{
- int rv;
-
- /* Ship mode command requires writing 2 data values */
- rv = sb_write(ship_mode->reg_addr, ship_mode->reg_data[0]);
- if (rv)
- return rv;
-
- return sb_write(ship_mode->reg_addr, ship_mode->reg_data[1]);
-}
-
-int board_cut_off_battery(void)
-{
- int rv;
- int type = get_battery_type();
-
- /* If battery type is unknown can't send ship mode command */
- if (type == BATTERY_TYPE_COUNT)
- return EC_RES_ERROR;
-
- if (board_battery_info[type].fuel_gauge.ship_mode.wb_support)
- rv = cut_off_battery_block_write(
- &board_battery_info[type].fuel_gauge.ship_mode);
- else
- rv = cut_off_battery_sb_write(
- &board_battery_info[type].fuel_gauge.ship_mode);
-
- 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;
- uint8_t data[6];
- int type = get_battery_type();
-
- /* If battery type is not known, can't check CHG/DCHG FETs */
- if (type == BATTERY_TYPE_COUNT) {
- /* Still don't know, so return here */
- return EC_ERROR_BUSY;
- }
-
- /* Read the status of charge/discharge FETs */
- if (board_battery_info[type].fuel_gauge.fet.mfgacc_support == 1) {
- rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
- SB_ALT_MANUFACTURER_ACCESS, data,
- sizeof(data));
- /* Get the lowest 16bits of the OperationStatus() data */
- *regval = data[2] | data[3] << 8;
- } else
- rv = sb_read(board_battery_info[type].fuel_gauge.fet.reg_addr,
- regval);
-
- return rv;
-}
-
-int battery_is_charge_fet_disabled(void)
-{
- int rv;
- int reg;
- int type = get_battery_type();
-
- /* If battery type is not known, can't check CHG/DCHG FETs */
- if (type == BATTERY_TYPE_COUNT) {
- /* Still don't know, so return here */
- return -1;
- }
-
- /*
- * If the CFET mask hasn't been defined, assume that it's not disabled.
- */
- if (!board_battery_info[type].fuel_gauge.fet.cfet_mask)
- return 0;
-
- rv = battery_get_fet_status_regval(&reg);
- if (rv)
- return -1;
-
- return (reg & board_battery_info[type].fuel_gauge.fet.cfet_mask) ==
- board_battery_info[type].fuel_gauge.fet.cfet_off_val;
-}
-
-/*
- * This function checks the charge/discharge FET status bits. Each battery type
- * supported provides the register address, mask, and disconnect value for these
- * 2 FET status bits. If the FET status matches the disconnected value, then
- * BATTERY_DISCONNECTED is returned. This function is required to handle the
- * cases when the fuel gauge is awake and will return a non-zero state of
- * charge, but is not able yet to provide power (i.e. discharge FET is not
- * active). By returning BATTERY_DISCONNECTED the AP will not be powered up
- * until either the external charger is able to provided enough power, or
- * the battery is able to provide power and thus prevent a brownout when the
- * AP is powered on by the EC.
- */
-enum battery_disconnect_state battery_get_disconnect_state(void)
-{
- int reg;
- int type = get_battery_type();
-
- /* If battery type is not known, can't check CHG/DCHG FETs */
- if (type == BATTERY_TYPE_COUNT) {
- /* Still don't know, so return here */
- return BATTERY_DISCONNECT_ERROR;
- }
-
- if (battery_get_fet_status_regval(&reg))
- return BATTERY_DISCONNECT_ERROR;
-
- if ((reg & board_battery_info[type].fuel_gauge.fet.reg_mask) ==
- board_battery_info[type].fuel_gauge.fet.disconnect_val) {
- CPRINTS("Batt disconnected: reg 0x%04x mask 0x%04x disc 0x%04x",
- reg,
- board_battery_info[type].fuel_gauge.fet.reg_mask,
- board_battery_info[type].fuel_gauge.fet.disconnect_val);
- return BATTERY_DISCONNECTED;
- }
-
- return BATTERY_NOT_DISCONNECTED;
-}
-
-#ifdef CONFIG_BATTERY_MEASURE_IMBALANCE
-int battery_imbalance_mv(void)
-{
- int type = get_battery_type();
-
- /*
- * If battery type is unknown, we cannot safely access non-standard
- * registers.
- */
- return (type == BATTERY_TYPE_COUNT) ? 0 :
- board_battery_info[type].fuel_gauge.imbalance_mv();
-}
-
-int battery_default_imbalance_mv(void)
-{
- return 0;
-}
-#endif /* CONFIG_BATTERY_MEASURE_IMBALANCE */