max1720x_battery: robust historical collection data
Bug: 269757278
Change-Id: Ic951eb1554fff7497ff2fdb17901cca7a606da5e
Signed-off-by: Jenny Ho <[email protected]>
diff --git a/max1720x_battery.c b/max1720x_battery.c
index 5d17030..1c426fb 100644
--- a/max1720x_battery.c
+++ b/max1720x_battery.c
@@ -2106,6 +2106,7 @@
return reg_to_time_hr(timerh, chip);
}
+#define MAX_HIST_FULLCAP 0x3FF
static int max1720x_get_fade_rate(struct max1720x_chip *chip)
{
struct max17x0x_eeprom_history hist = { 0 };
@@ -2130,7 +2131,7 @@
dev_info(chip->dev, "%s: idx=%d hist.fc=%d (%x) ret=%d\n", __func__,
hist_idx, hist.fullcapnom, hist.fullcapnom, ret);
- if (ret < 0 || hist.fullcapnom == 0x3FF)
+ if (ret < 0)
return -EINVAL;
/* hist.fullcapnom = fullcapnom * 800 / designcap */
@@ -5209,55 +5210,90 @@
{
struct max17x0x_eeprom_history hist = { 0 };
u16 data, designcap;
+ int ret;
- if (REGMAP_READ(&chip->regmap, MAX1720X_TEMPCO, &data) == 0)
- hist.tempco = data;
+ if (chip->por)
+ return -EINVAL;
- if (REGMAP_READ(&chip->regmap, MAX1720X_RCOMP0, &data) == 0)
- hist.rcomp0 = data;
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_TEMPCO, &data);
+ if (ret)
+ return ret;
- if (REGMAP_READ(&chip->regmap, MAX1720X_TIMERH, &data) == 0) {
- /* Convert LSB from 3.2hours(192min) to 5days(7200min) */
- hist.timerh = data * 192 / 7200;
- }
+ hist.tempco = data;
- if (REGMAP_READ(&chip->regmap, MAX1720X_DESIGNCAP, &designcap) == 0) {
- /* multiply by 100 to convert from mAh to %, LSB 0.125% */
- if (REGMAP_READ(&chip->regmap, MAX1720X_FULLCAPNOM, &data) == 0)
- hist.fullcapnom = data * 800 / designcap;
- if (REGMAP_READ(&chip->regmap, MAX1720X_FULLCAPREP, &data) == 0)
- hist.fullcaprep = data * 800 / designcap;
- }
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_RCOMP0, &data);
+ if (ret)
+ return ret;
- if (REGMAP_READ(&chip->regmap, MAX1720X_MIXSOC, &data) == 0) {
- /* Convert LSB from 1% to 2% */
- hist.mixsoc = REG_HALF_HIGH(data) / 2;
- }
+ hist.rcomp0 = data;
- if (REGMAP_READ(&chip->regmap, MAX1720X_VFSOC, &data) == 0) {
- /* Convert LSB from 1% to 2% */
- hist.vfsoc = REG_HALF_HIGH(data) / 2;
- }
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_TIMERH, &data);
+ if (ret)
+ return ret;
- if (REGMAP_READ(&chip->regmap, MAX1720X_MAXMINVOLT, &data) == 0) {
- /* LSB is 20mV, store values from 4.2V min */
- hist.maxvolt = (REG_HALF_HIGH(data) * 20 - 4200) / 20;
- /* Convert LSB from 20mV to 10mV, store values from 2.5V min */
- hist.minvolt = (REG_HALF_LOW(data) * 20 - 2500) / 10;
- }
+ /* Convert LSB from 3.2hours(192min) to 5days(7200min) */
+ hist.timerh = data * 192 / 7200;
- if (REGMAP_READ(&chip->regmap, MAX1720X_MAXMINTEMP, &data) == 0) {
- /* Convert LSB from 1degC to 3degC, store values from 25degC min */
- hist.maxtemp = (REG_HALF_HIGH(data) - 25) / 3;
- /* Convert LSB from 1degC to 3degC, store values from -20degC min */
- hist.mintemp = (REG_HALF_LOW(data) + 20) / 3;
- }
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_DESIGNCAP, &designcap);
+ if (ret)
+ return ret;
- if (REGMAP_READ(&chip->regmap, MAX1720X_MAXMINCURR, &data) == 0) {
- /* Convert LSB from 0.08A to 0.5A */
- hist.maxchgcurr = REG_HALF_HIGH(data) * 8 / 50;
- hist.maxdischgcurr = REG_HALF_LOW(data) * 8 / 50;
- }
+ /* multiply by 100 to convert from mAh to %, LSB 0.125% */
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_FULLCAPNOM, &data);
+ if (ret)
+ return ret;
+
+ data = data * 800 / designcap;
+ hist.fullcapnom = data > MAX_HIST_FULLCAP ? MAX_HIST_FULLCAP : data;
+
+ /* multiply by 100 to convert from mAh to %, LSB 0.125% */
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_FULLCAPREP, &data);
+ if (ret)
+ return ret;
+
+ data = data * 800 / designcap;
+ hist.fullcaprep = data > MAX_HIST_FULLCAP ? MAX_HIST_FULLCAP : data;
+
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_MIXSOC, &data);
+ if (ret)
+ return ret;
+
+ /* Convert LSB from 1% to 2% */
+ hist.mixsoc = REG_HALF_HIGH(data) / 2;
+
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_VFSOC, &data);
+ if (ret)
+ return ret;
+
+ /* Convert LSB from 1% to 2% */
+ hist.vfsoc = REG_HALF_HIGH(data) / 2;
+
+
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_MAXMINVOLT, &data);
+ if (ret)
+ return ret;
+
+ /* LSB is 20mV, store values from 4.2V min */
+ hist.maxvolt = (REG_HALF_HIGH(data) * 20 - 4200) / 20;
+ /* Convert LSB from 20mV to 10mV, store values from 2.5V min */
+ hist.minvolt = (REG_HALF_LOW(data) * 20 - 2500) / 10;
+
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_MAXMINTEMP, &data);
+ if (ret)
+ return ret;
+
+ /* Convert LSB from 1degC to 3degC, store values from 25degC min */
+ hist.maxtemp = (REG_HALF_HIGH(data) - 25) / 3;
+ /* Convert LSB from 1degC to 3degC, store values from -20degC min */
+ hist.mintemp = (REG_HALF_LOW(data) + 20) / 3;
+
+ ret = REGMAP_READ(&chip->regmap, MAX1720X_MAXMINCURR, &data);
+ if (ret)
+ return ret;
+
+ /* Convert LSB from 0.08A to 0.5A */
+ hist.maxchgcurr = REG_HALF_HIGH(data) * 8 / 50;
+ hist.maxdischgcurr = REG_HALF_LOW(data) * 8 / 50;
memcpy(buff, &hist, sizeof(hist));
return (size_t)sizeof(hist);