diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2022-03-10 01:27:38 +0000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2022-03-11 03:18:39 +0000 |
commit | d7509398b30ece7df78884ed6f309f0e1b6c3127 (patch) | |
tree | b5820372d3f4468c88e8e59da3ee0896dedd388e | |
parent | 0238c3b0553333aed94d16a494be933738450a85 (diff) | |
download | chrome-ec-d7509398b30ece7df78884ed6f309f0e1b6c3127.tar.gz |
battery/smart: Don't update fields if reading fails
Currently, battery_get_params starts with batt_new = {0} and ends with
memcpy(batt, batt_new). That is, if battery_get_params fails to read a
field, we set a BATT_FLAG_BAD_* and clear the field. This behavior
forces us to check the flags everywhere fields are read (to
distinguish 0 v.s. invalid 0). It also makes EC forget the last known
good values.
Instead, we will always keep good values in the global batt_params.
That is, we update fields only if reads are successful. (That's how
other implementations of battery_get_params behave.) Thus, if
display_soc is zero, it was computed legitimately as zero (except the
very initial value).
BUG=b:217401040,b:222722611
BRANCH=None
TEST=Guybrush
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Change-Id: I5b69b708d149d1c750551d8cf957eab3fdc8aa64
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3514489
Reviewed-by: Rob Barnes <robbarnes@google.com>
-rw-r--r-- | driver/battery/smart.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c index 3704618e36..72cf545afe 100644 --- a/driver/battery/smart.c +++ b/driver/battery/smart.c @@ -366,9 +366,17 @@ static void apply_fake_state_of_charge(struct batt_params *batt) void battery_get_params(struct batt_params *batt) { - struct batt_params batt_new = {0}; + struct batt_params batt_new; int v; + /* + * Start with a copy so that only valid fields will be updated. Note + * sb_read doesn't change the value if I2C fails. So, the current value + * will be preserved. + */ + memcpy(&batt_new, batt, sizeof(*batt)); + batt_new.flags = 0; + if (sb_read(SB_TEMPERATURE, &batt_new.temperature) && fake_temperature < 0) batt_new.flags |= BATT_FLAG_BAD_TEMPERATURE; |