summaryrefslogtreecommitdiff
path: root/driver/battery/smart.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/battery/smart.c')
-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 f30b74d71b..4497129bdd 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -342,9 +342,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))
batt_new.flags |= BATT_FLAG_BAD_TEMPERATURE;