Merge "Merge android13-gs-pixel-5.10-tm-qpr3 into android13-gs-pixel-5.10-udc" into android13-gs-pixel-5.10-udc
diff --git a/google_battery.c b/google_battery.c
index 804bd86..e1bfa5b 100644
--- a/google_battery.c
+++ b/google_battery.c
@@ -2221,8 +2221,9 @@
 	const bool same_type_and_status =
 		csi_stats->csi_current_type == batt_drv->csi_current_type &&
 		csi_stats->csi_current_status == batt_drv->csi_current_status;
-	int current_speed = batt_drv->csi_current_speed < 0 ? 0 :
-			    batt_drv->csi_current_speed;
+	int current_speed = batt_drv->csi_current_speed;
+	int min_speed = csi_stats->csi_speed_min;
+	int max_speed = csi_stats->csi_speed_max;
 	const ktime_t right_now = get_boot_sec();
 	int ssoc = -1;
 
@@ -2239,14 +2240,18 @@
 		csi_stats->last_update = right_now;
 
 		/* accumulate only positive*/
-		if (batt_drv->csi_current_speed < 0)
+		if (current_speed < 0)
 			return;
 
-		if (current_speed < csi_stats->csi_speed_min)
-			csi_stats->csi_speed_min = current_speed;
-		else if (current_speed > csi_stats->csi_speed_max)
-			csi_stats->csi_speed_max = current_speed;
+		if (min_speed == max_speed && max_speed == 0)
+			min_speed = max_speed = current_speed;
+		else if (current_speed < min_speed)
+			min_speed = current_speed;
+		else if (current_speed > max_speed)
+			max_speed = current_speed;
 
+		csi_stats->csi_speed_min = min_speed;
+		csi_stats->csi_speed_max = max_speed;
 		csi_stats->speed_sum += current_speed * elap;
 		csi_stats->csi_time_sum += elap;
 		return;
@@ -2258,7 +2263,7 @@
 
 	if (csi_stats->ssoc != -1) {
 		const int csi_speed_avg = csi_stats->csi_time_sum == 0 ?
-					  csi_stats->speed_sum :
+					  ((csi_stats->csi_speed_min + csi_stats->csi_speed_max) / 2) :
 					  (csi_stats->speed_sum / csi_stats->csi_time_sum);
 		const int cc = GPSY_GET_PROP(batt_drv->fg_psy, POWER_SUPPLY_PROP_CHARGE_COUNTER);
 		ktime_t res = 0;
@@ -2278,7 +2283,7 @@
 	}
 
 	/* ssoc == -1 on disconnect */
-	if (ssoc == -1)
+	if (ssoc == -1 || current_speed < 0)
 		current_speed = 0;
 
 	csi_stats->ssoc = ssoc;
@@ -2524,12 +2529,15 @@
 	 * different from the reference. Here status will either be *_COLD
 	 * or *_HOT.
 	 */
-	cc_max = GBMS_CCCM_LIMITS(profile, batt_drv->temp_idx, batt_drv->vbatt_idx);
+	cc_max = GBMS_CCCM_LIMITS(profile, batt_drv->temp_idx, batt_drv->vbatt_idx) / 1000;
 	if (cc_max && cc_max < nominal_demand)
 		nominal_demand = cc_max;
 
 	chg_speed = ibatt * 100 / nominal_demand;
 
+	pr_debug("chg_speed=%d ibatt=%d nominal_demand=%d cc_max=%d",
+		 chg_speed, ibatt, nominal_demand, cc_max);
+
 	/* bound in [0,100] */
 	if (chg_speed > CSI_CHG_SPEED_MAX)
 		chg_speed = CSI_CHG_SPEED_MAX;