summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2022-03-10 01:27:38 +0000
committerCommit Bot <commit-bot@chromium.org>2022-03-16 03:11:54 +0000
commit7b2059e3bcc3c38b37df9569e0ffc27a6071e874 (patch)
tree082de465f7a246c476e9fc689b62bd78aa7c9c5c
parentd8ba3645e877b1accb8c1aaac174fb35d6a39fa3 (diff)
downloadchrome-ec-7b2059e3bcc3c38b37df9569e0ffc27a6071e874.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/+/3518076 Reviewed-by: caveh jalali <caveh@chromium.org>
-rw-r--r--driver/battery/smart.c10
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;