diff options
Diffstat (limited to 'common/battery_fuel_gauge.c')
-rw-r--r-- | common/battery_fuel_gauge.c | 283 |
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(®); - 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(®)) - 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 */ |