max1720x_battery: optimize model load flow
1. compare model version to prevent re-loading model from init POR check
2. add logs to record cycles update fail situation
3. clear status irq if unable to max1720x_model_reload
4. disable save cycles when por
Bug: 201484772
Signed-off-by: Jenny Ho <[email protected]>
Change-Id: Icd493a0855192aa5c3853d6cc615fbdadebad15d
diff --git a/max1720x_battery.c b/max1720x_battery.c
index 04164fe..9b70688 100644
--- a/max1720x_battery.c
+++ b/max1720x_battery.c
@@ -889,28 +889,40 @@
* force is true when changing the model via debug props.
* NOTE: call holding model_lock
*/
-static void max1720x_model_reload(struct max1720x_chip *chip, bool force)
+static int max1720x_model_reload(struct max1720x_chip *chip, bool force)
{
const bool disabled = chip->model_reload == MAX_M5_LOAD_MODEL_DISABLED;
const bool pending = chip->model_reload != MAX_M5_LOAD_MODEL_IDLE;
+ int version_now, version_load;
+
+ if (chip->gauge_type != MAX_M5_GAUGE_TYPE)
+ return -EINVAL;
pr_debug("model_reload=%d force=%d pending=%d disabled=%d\n",
chip->model_reload, force, pending, disabled);
if (!force && (pending || disabled))
- return;
+ return -EEXIST;
+
+ version_now = max_m5_model_read_version(chip->model_data);
+ version_load = max_m5_fg_model_version(chip->model_data);
+
+ if (!force && version_now == version_load)
+ return -EEXIST;
/* REQUEST -> IDLE or set to the number of retries */
dev_info(chip->dev, "Schedule Load FG Model, ID=%d, ver:%d->%d cap_lsb:%d->%d\n",
chip->batt_id,
- max_m5_model_read_version(chip->model_data),
- max_m5_fg_model_version(chip->model_data),
+ version_now,
+ version_load,
max_m5_model_get_cap_lsb(chip->model_data),
max_m5_cap_lsb(chip->model_data));
chip->model_reload = MAX_M5_LOAD_MODEL_REQUEST;
chip->model_ok = false;
mod_delayed_work(system_wq, &chip->model_work, 0);
+
+ return 0;
}
static ssize_t max1720x_model_set_state(struct device *dev,
@@ -1364,8 +1376,11 @@
eeprom_cycle = (chip->eeprom_cycle & 0x7FFF) << 1;
dev_info(chip->dev, "reg_cycle:%d, eeprom_cycle:%d, update:%c",
reg_cycle, eeprom_cycle, eeprom_cycle > reg_cycle ? 'Y' : 'N');
- if (eeprom_cycle > reg_cycle)
- REGMAP_WRITE(&chip->regmap, MAX1720X_CYCLES, eeprom_cycle);
+ if (eeprom_cycle > reg_cycle) {
+ ret = REGMAP_WRITE_VERIFY(&chip->regmap, MAX1720X_CYCLES, eeprom_cycle);
+ if (ret < 0)
+ dev_warn(chip->dev, "fail to update cycles (%d)", ret);
+ }
}
static u16 max1720x_save_battery_cycle(const struct max1720x_chip *chip,
@@ -1377,6 +1392,9 @@
if (chip->gauge_type != MAX_M5_GAUGE_TYPE)
return eeprom_cycle;
+ if (chip->por)
+ return eeprom_cycle;
+
/* save half value to record over 655 cycles case */
reg_cycle /= 2;
@@ -2437,10 +2455,10 @@
/* trigger model load */
mutex_lock(&chip->model_lock);
- if (chip->gauge_type == MAX_M5_GAUGE_TYPE)
- max1720x_model_reload(chip, false);
- else
+ err = max1720x_model_reload(chip, false);
+ if (err < 0)
fg_status_clr &= ~MAX1720X_STATUS_POR;
+
mutex_unlock(&chip->model_lock);
}