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);
 	}