summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYilun Lin <yllin@google.com>2018-11-21 09:57:10 +0800
committerchrome-bot <chrome-bot@chromium.org>2018-12-06 14:35:25 -0800
commit07daaad308ae62530bd6ab6acee7578e9308d483 (patch)
tree57d951c69ce0daf1571a174099a2e801e3d42cb0
parent93eee0a9e77bb8bb9726998eb84940ada6010d14 (diff)
downloadchrome-ec-07daaad308ae62530bd6ab6acee7578e9308d483.tar.gz
battery/max17055: Update batt_param as a whole.
Clearing batt_param everytime when calling battery_get_params may cause AP getting weird battery information through host_command due to preemption. We should update the batt_param as a whole. BUG=b:119322063, b:73347743, b:117061273 TEST=on kukui, remove batt, connect pd, see battery output in console > batt Status: 0x0040 DCHG Param flags:00000000 Temp: 0x0000 = 0.0 K (-273.1 C) V: 0x0000 = 0 mV V-desired: 0x0000 = 0 mV I: 0x0000 = 0 mA I-desired: 0x0000 = 0 mA Charging: Not Allowed Charge: 0 % Manuf: <unkn> Device: <BATT> Chem: <unkn> Serial: 0xffffffff V-design: 0x0f14 = 3860 mV Mode: (unsupported) Abs charge:(unsupported) Remaining: 6355 mAh Cap-full: 6910 mAh (6771 mAh with 98 % compensation) Display: 0.0 % Design: 6910 mAh Time-full: 102h:23 Empty: 102h:23 TEST=on connect batt, connect pd, see battery output in console > batt Status: 0x0000 Param flags:00000003 Temp: 0x0bae = 299.0 K (25.9 C) V: 0x0ef4 = 3828 mV V-desired: 0x1130 = 4400 mV I: 0x0067 = 103 mA(CHG) I-desired: 0x07d0 = 2000 mA Charging: Allowed Charge: 49 % Manuf: <unkn> Device: <BATT> Chem: <unkn> Serial: 0xffffffff V-design: 0x0f14 = 3860 mV Mode: (unsupported) Abs charge:(unsupported) Remaining: 3440 mAh Cap-full: 6910 mAh (6771 mAh with 98 % compensation) Display: 0.0 % Design: 6910 mAh Time-full: 0h:0 Empty: 102h:23 BRANCH=None Change-Id: I752a3842e6ca54dc8cad98a1099387e0088cc48d Signed-off-by: Yilun Lin <yllin@google.com> Reviewed-on: https://chromium-review.googlesource.com/1345551 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Yilun Lin <yllin@chromium.org> Reviewed-by: Philip Chen <philipchen@chromium.org> Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r--driver/battery/max17055.c61
1 files changed, 32 insertions, 29 deletions
diff --git a/driver/battery/max17055.c b/driver/battery/max17055.c
index 9cdd107d20..1b5679fe37 100644
--- a/driver/battery/max17055.c
+++ b/driver/battery/max17055.c
@@ -263,64 +263,67 @@ enum battery_present battery_is_present(void)
void battery_get_params(struct batt_params *batt)
{
int reg = 0;
+ struct batt_params batt_new = {0};
- /* Reset params */
- memset(batt, 0, sizeof(struct batt_params));
/*
* Assuming the battery is responsive as long as
* max17055 finds battery is present.
*/
- batt->is_present = battery_is_present();
+ batt_new.is_present = battery_is_present();
- if (batt->is_present == BP_YES)
- batt->flags |= BATT_FLAG_RESPONSIVE;
- else if (batt->is_present == BP_NO)
+ if (batt_new.is_present == BP_YES)
+ batt_new.flags |= BATT_FLAG_RESPONSIVE;
+ else if (batt_new.is_present == BP_NO)
/* Battery is not present, gauge won't report useful info. */
- return;
+ goto batt_out;
if (max17055_read(REG_TEMPERATURE, &reg))
- batt->flags |= BATT_FLAG_BAD_TEMPERATURE;
+ batt_new.flags |= BATT_FLAG_BAD_TEMPERATURE;
- batt->temperature = TEMPERATURE_CONV((int16_t)reg);
+ batt_new.temperature = TEMPERATURE_CONV((int16_t)reg);
if (max17055_read(REG_STATE_OF_CHARGE, &reg) &&
fake_state_of_charge < 0)
- batt->flags |= BATT_FLAG_BAD_STATE_OF_CHARGE;
+ batt_new.flags |= BATT_FLAG_BAD_STATE_OF_CHARGE;
- batt->state_of_charge = fake_state_of_charge >= 0 ?
+ batt_new.state_of_charge = fake_state_of_charge >= 0 ?
fake_state_of_charge : PERCENTAGE_CONV(reg);
if (max17055_read(REG_VOLTAGE, &reg))
- batt->flags |= BATT_FLAG_BAD_VOLTAGE;
+ batt_new.flags |= BATT_FLAG_BAD_VOLTAGE;
- batt->voltage = VOLTAGE_CONV(reg);
+ batt_new.voltage = VOLTAGE_CONV(reg);
if (max17055_read(REG_CURRENT, &reg))
- batt->flags |= BATT_FLAG_BAD_CURRENT;
+ batt_new.flags |= BATT_FLAG_BAD_CURRENT;
- batt->current = CURRENT_CONV((int16_t)reg);
+ batt_new.current = CURRENT_CONV((int16_t)reg);
- batt->desired_voltage = battery_get_info()->voltage_max;
- batt->desired_current = BATTERY_DESIRED_CHARGING_CURRENT;
+ batt_new.desired_voltage = battery_get_info()->voltage_max;
+ batt_new.desired_current = BATTERY_DESIRED_CHARGING_CURRENT;
- if (battery_remaining_capacity(&batt->remaining_capacity))
- batt->flags |= BATT_FLAG_BAD_REMAINING_CAPACITY;
+ if (battery_remaining_capacity(&batt_new.remaining_capacity))
+ batt_new.flags |= BATT_FLAG_BAD_REMAINING_CAPACITY;
- if (battery_full_charge_capacity(&batt->full_capacity))
- batt->flags |= BATT_FLAG_BAD_FULL_CAPACITY;
+ if (battery_full_charge_capacity(&batt_new.full_capacity))
+ batt_new.flags |= BATT_FLAG_BAD_FULL_CAPACITY;
/*
* Charging allowed if both desired voltage and current are nonzero
* and battery isn't full (and we read them all correctly).
*/
- if (!(batt->flags & BATT_FLAG_BAD_STATE_OF_CHARGE) &&
- batt->desired_voltage &&
- batt->desired_current &&
- batt->state_of_charge < BATTERY_LEVEL_FULL)
- batt->flags |= BATT_FLAG_WANT_CHARGE;
-
- if (battery_status(&batt->status))
- batt->flags |= BATT_FLAG_BAD_STATUS;
+ if (!(batt_new.flags & BATT_FLAG_BAD_STATE_OF_CHARGE) &&
+ batt_new.desired_voltage &&
+ batt_new.desired_current &&
+ batt_new.state_of_charge < BATTERY_LEVEL_FULL)
+ batt_new.flags |= BATT_FLAG_WANT_CHARGE;
+
+ if (battery_status(&batt_new.status))
+ batt_new.flags |= BATT_FLAG_BAD_STATUS;
+
+batt_out:
+ /* Update visible battery parameters */
+ memcpy(batt, &batt_new, sizeof(*batt));
}
#ifdef CONFIG_CMD_PWR_AVG