]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
power: supply: ug3105_battery: Switch to power_supply_batinfo_ocv2cap()
authorHans de Goede <hansg@kernel.org>
Sun, 8 Jun 2025 20:40:09 +0000 (22:40 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Sun, 22 Jun 2025 00:08:44 +0000 (02:08 +0200)
Replace the hardcoded ocv -> capacity table and the ug3105_get_capacity()
helper with using the generic power_supply_batinfo_ocv2cap() function.

Note this relies on the battery fwnode providing at least 1
"ocv-capacity-table", if that is missing probe() will now fail with EINVAL.

Signed-off-by: Hans de Goede <hansg@kernel.org>
Link: https://lore.kernel.org/r/20250608204010.37482-10-hansg@kernel.org
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/ug3105_battery.c

index 806f6892e1895b449c66fb00cbe5568e9e9efc3c..e8a1de7cade0cee9a1b85ef82c5f38b68e433d9d 100644 (file)
@@ -66,6 +66,8 @@
 #define UG3105_LOW_BAT_UV                                      3700000
 #define UG3105_FULL_BAT_HYST_UV                                        38000
 
+#define AMBIENT_TEMP_CELCIUS                                   25
+
 struct ug3105_chip {
        struct i2c_client *client;
        struct power_supply *psy;
@@ -117,62 +119,6 @@ static int ug3105_get_status(struct ug3105_chip *chip)
        return POWER_SUPPLY_STATUS_NOT_CHARGING;
 }
 
-static int ug3105_get_capacity(struct ug3105_chip *chip)
-{
-       /*
-        * OCV voltages in uV for 0-110% in 5% increments, the 100-110% is
-        * for LiPo HV (High-Voltage) bateries which can go up to 4.35V
-        * instead of the usual 4.2V.
-        */
-       static const int ocv_capacity_tbl[23] = {
-               3350000,
-               3610000,
-               3690000,
-               3710000,
-               3730000,
-               3750000,
-               3770000,
-               3786667,
-               3803333,
-               3820000,
-               3836667,
-               3853333,
-               3870000,
-               3907500,
-               3945000,
-               3982500,
-               4020000,
-               4075000,
-               4110000,
-               4150000,
-               4200000,
-               4250000,
-               4300000,
-       };
-       int i, ocv_diff, ocv_step;
-
-       if (chip->ocv_avg < ocv_capacity_tbl[0])
-               return 0;
-
-       if (chip->status == POWER_SUPPLY_STATUS_FULL)
-               return 100;
-
-       for (i = 1; i < ARRAY_SIZE(ocv_capacity_tbl); i++) {
-               if (chip->ocv_avg > ocv_capacity_tbl[i])
-                       continue;
-
-               ocv_diff = ocv_capacity_tbl[i] - chip->ocv_avg;
-               ocv_step = ocv_capacity_tbl[i] - ocv_capacity_tbl[i - 1];
-               /* scale 0-110% down to 0-100% for LiPo HV */
-               if (chip->psy->battery_info->constant_charge_voltage_max_uv >= 4300000)
-                       return (i * 500 - ocv_diff * 500 / ocv_step) / 110;
-               else
-                       return i * 5 - ocv_diff * 5 / ocv_step;
-       }
-
-       return 100;
-}
-
 static void ug3105_work(struct work_struct *work)
 {
        struct ug3105_chip *chip = container_of(work, struct ug3105_chip,
@@ -231,7 +177,12 @@ static void ug3105_work(struct work_struct *work)
 
        chip->supplied = power_supply_am_i_supplied(psy);
        chip->status = ug3105_get_status(chip);
-       chip->capacity = ug3105_get_capacity(chip);
+       if (chip->status == POWER_SUPPLY_STATUS_FULL)
+               chip->capacity = 100;
+       else
+               chip->capacity = power_supply_batinfo_ocv2cap(chip->psy->battery_info,
+                                                             chip->ocv_avg,
+                                                             AMBIENT_TEMP_CELCIUS);
 
        /*
         * Skip internal resistance calc on charger [un]plug and
@@ -403,7 +354,8 @@ static int ug3105_probe(struct i2c_client *client)
 
        if (!psy->battery_info ||
            psy->battery_info->factory_internal_resistance_uohm == -EINVAL ||
-           psy->battery_info->constant_charge_voltage_max_uv == -EINVAL) {
+           psy->battery_info->constant_charge_voltage_max_uv == -EINVAL ||
+           !psy->battery_info->ocv_table[0]) {
                dev_err(dev, "error required properties are missing\n");
                return -ENODEV;
        }