diff options
author | Aseda Aboagye <aaboagye@google.com> | 2020-08-21 15:31:52 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-08-26 04:47:39 +0000 |
commit | e909c5a3f0b0c8f8fcba470878170f3d3195d9b1 (patch) | |
tree | 626cb360ee4f4d1da9439e3da0c35d8e42ce70d3 | |
parent | ff52ee7e2da9dd76499007a6b541c3fdc093aa02 (diff) | |
download | chrome-ec-e909c5a3f0b0c8f8fcba470878170f3d3195d9b1.tar.gz |
battery_fuel_gauge: Add check for CFET status
This commit adds a function that allows the system to check the
if the charge FET (CFET) is disabled or not.
BUG=b:160918663
BRANCH=None
TEST=Build and flash waddledee; cutoff battery, revive system, verify
that "found batt in disconnect" statements are still found.
TEST=Add other code, verify that CFET status is able to be retrieved.
Signed-off-by: Aseda Aboagye <aaboagye@google.com>
Change-Id: I899070e50a38499708a367bba6b5f502b0232672
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2368071
Reviewed-by: Diana Z <dzigterman@chromium.org>
Commit-Queue: Aseda Aboagye <aaboagye@chromium.org>
Tested-by: Aseda Aboagye <aaboagye@chromium.org>
Auto-Submit: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r-- | common/battery_fuel_gauge.c | 68 | ||||
-rw-r--r-- | include/battery_fuel_gauge.h | 8 |
2 files changed, 62 insertions, 14 deletions
diff --git a/common/battery_fuel_gauge.c b/common/battery_fuel_gauge.c index a0dd250899..444144dfeb 100644 --- a/common/battery_fuel_gauge.c +++ b/common/battery_fuel_gauge.c @@ -148,6 +148,58 @@ int board_cut_off_battery(void) return rv ? EC_RES_ERROR : EC_RES_SUCCESS; } +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 @@ -162,28 +214,16 @@ int board_cut_off_battery(void) */ enum battery_disconnect_state battery_get_disconnect_state(void) { - int rv; int reg; - 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 BATTERY_DISCONNECT_ERROR; + 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 */ - reg = data[2] | data[3] << 8; - } else - rv = sb_read(board_battery_info[type].fuel_gauge.fet.reg_addr, - ®); - - if (rv) + if (battery_get_fet_status_regval(®)) return BATTERY_DISCONNECT_ERROR; if ((reg & board_battery_info[type].fuel_gauge.fet.reg_mask) == diff --git a/include/battery_fuel_gauge.h b/include/battery_fuel_gauge.h index d610b7e417..8b1b7106bd 100644 --- a/include/battery_fuel_gauge.h +++ b/include/battery_fuel_gauge.h @@ -30,6 +30,8 @@ struct fet_info { const uint8_t reg_addr; const uint16_t reg_mask; const uint16_t disconnect_val; + const uint16_t cfet_mask; /* CHG FET status mask */ + const uint16_t cfet_off_val; }; struct fuel_gauge_info { @@ -69,6 +71,12 @@ int battery_bq4050_imbalance_mv(void); #endif /** + * Return 1 if CFET is disabled, 0 if enabled. -1 if an error was encountered. + * If the CFET mask is not defined, it will return 0. + */ +int battery_is_charge_fet_disabled(void); + +/** * Battery cut off command via SMBus write block. * * @param ship_mode Battery ship mode information |