power: supply: ab8500: Respect charge_restart_voltage_uv
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 15 Apr 2022 20:36:37 +0000 (22:36 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Thu, 9 Jun 2022 20:09:58 +0000 (22:09 +0200)
The battery info contains a voltage indicating when the voltage
is so low that it is time to restart the CC/CV charging.
Make the AB8500 respect and prioritize this setting over the
hardcoded 95% threshold.

Break out the check into its own function and add some safeguards
so we do not run into unpredictable side effects.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/ab8500_chargalg.c

index 431bbc3..037ae9b 100644 (file)
@@ -1217,6 +1217,34 @@ static void ab8500_chargalg_external_power_changed(struct power_supply *psy)
 }
 
 /**
+ * ab8500_chargalg_time_to_restart() - time to restart CC/CV charging?
+ * @di: charging algorithm state
+ *
+ * This checks if the voltage or capacity of the battery has fallen so
+ * low that we need to restart the CC/CV charge cycle.
+ */
+static bool ab8500_chargalg_time_to_restart(struct ab8500_chargalg *di)
+{
+       struct power_supply_battery_info *bi = di->bm->bi;
+
+       /* Sanity check - these need to have some reasonable values */
+       if (!di->batt_data.volt_uv || !di->batt_data.percent)
+               return false;
+
+       /* Some batteries tell us at which voltage we should restart charging */
+       if (bi->charge_restart_voltage_uv > 0) {
+               if (di->batt_data.volt_uv <= bi->charge_restart_voltage_uv)
+                       return true;
+               /* Else we restart as we reach a certain capacity */
+       } else {
+               if (di->batt_data.percent <= AB8500_RECHARGE_CAP)
+                       return true;
+       }
+
+       return false;
+}
+
+/**
  * ab8500_chargalg_algorithm() - Main function for the algorithm
  * @di:                pointer to the ab8500_chargalg structure
  *
@@ -1459,7 +1487,7 @@ static void ab8500_chargalg_algorithm(struct ab8500_chargalg *di)
                fallthrough;
 
        case STATE_WAIT_FOR_RECHARGE:
-               if (di->batt_data.percent <= AB8500_RECHARGE_CAP)
+               if (ab8500_chargalg_time_to_restart(di))
                        ab8500_chargalg_state_to(di, STATE_NORMAL_INIT);
                break;