summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorAseda Aboagye <aaboagye@google.com>2020-08-21 15:31:52 -0700
committerCommit Bot <commit-bot@chromium.org>2020-08-26 23:15:37 +0000
commit297099668e76ad5602eeee6dbc7cd0f668a70849 (patch)
tree626cb360ee4f4d1da9439e3da0c35d8e42ce70d3 /common
parent71f3e3c69987ba20f17184c3d691f3863fef1569 (diff)
downloadchrome-ec-297099668e76ad5602eeee6dbc7cd0f668a70849.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> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2378279 Reviewed-by: Edward Hill <ecgh@chromium.org> Commit-Queue: Edward Hill <ecgh@chromium.org> Tested-by: Edward Hill <ecgh@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/battery_fuel_gauge.c68
1 files changed, 54 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(&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
@@ -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,
- &reg);
-
- if (rv)
+ if (battery_get_fet_status_regval(&reg))
return BATTERY_DISCONNECT_ERROR;
if ((reg & board_battery_info[type].fuel_gauge.fet.reg_mask) ==