From 297099668e76ad5602eeee6dbc7cd0f668a70849 Mon Sep 17 00:00:00 2001 From: Aseda Aboagye Date: Fri, 21 Aug 2020 15:31:52 -0700 Subject: 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 Change-Id: I899070e50a38499708a367bba6b5f502b0232672 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2368071 Reviewed-by: Diana Z Commit-Queue: Aseda Aboagye Tested-by: Aseda Aboagye Auto-Submit: Aseda Aboagye Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2378279 Reviewed-by: Edward Hill Commit-Queue: Edward Hill Tested-by: Edward Hill --- common/battery_fuel_gauge.c | 68 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 14 deletions(-) (limited to 'common') 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) == -- cgit v1.2.1