power: supply: core: Use library interpolation
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 16 Nov 2021 23:02:33 +0000 (00:02 +0100)
committerSebastian Reichel <sre@kernel.org>
Wed, 17 Nov 2021 16:44:41 +0000 (17:44 +0100)
The power supply core appears to contain two open coded
linear interpolations. Use the kernel fixpoint arithmetic
interpolation library function instead.

Cc: Chunyan Zhang <chunyan.zhang@unisoc.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/power_supply_core.c

index fc12a4f..2907b84 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/power_supply.h>
 #include <linux/property.h>
 #include <linux/thermal.h>
+#include <linux/fixp-arith.h>
 #include "power_supply.h"
 
 /* exported for the APM Power driver, APM emulation */
@@ -783,26 +784,25 @@ EXPORT_SYMBOL_GPL(power_supply_put_battery_info);
 int power_supply_temp2resist_simple(struct power_supply_resistance_temp_table *table,
                                    int table_len, int temp)
 {
-       int i, resist;
+       int i, high, low;
 
-       for (i = 0; i < table_len; i++)
+       /* Break loop at table_len - 1 because that is the highest index */
+       for (i = 0; i < table_len - 1; i++)
                if (temp > table[i].temp)
                        break;
 
-       if (i > 0 && i < table_len) {
-               int tmp;
-
-               tmp = (table[i - 1].resistance - table[i].resistance) *
-                       (temp - table[i].temp);
-               tmp /= table[i - 1].temp - table[i].temp;
-               resist = tmp + table[i].resistance;
-       } else if (i == 0) {
-               resist = table[0].resistance;
-       } else {
-               resist = table[table_len - 1].resistance;
-       }
-
-       return resist;
+       /* The library function will deal with high == low */
+       if ((i == 0) || (i == (table_len - 1)))
+               high = i;
+       else
+               high = i - 1;
+       low = i;
+
+       return fixp_linear_interpolate(table[low].temp,
+                                      table[low].resistance,
+                                      table[high].temp,
+                                      table[high].resistance,
+                                      temp);
 }
 EXPORT_SYMBOL_GPL(power_supply_temp2resist_simple);
 
@@ -821,24 +821,25 @@ EXPORT_SYMBOL_GPL(power_supply_temp2resist_simple);
 int power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table *table,
                                int table_len, int ocv)
 {
-       int i, cap, tmp;
+       int i, high, low;
 
-       for (i = 0; i < table_len; i++)
+       /* Break loop at table_len - 1 because that is the highest index */
+       for (i = 0; i < table_len - 1; i++)
                if (ocv > table[i].ocv)
                        break;
 
-       if (i > 0 && i < table_len) {
-               tmp = (table[i - 1].capacity - table[i].capacity) *
-                       (ocv - table[i].ocv);
-               tmp /= table[i - 1].ocv - table[i].ocv;
-               cap = tmp + table[i].capacity;
-       } else if (i == 0) {
-               cap = table[0].capacity;
-       } else {
-               cap = table[table_len - 1].capacity;
-       }
-
-       return cap;
+       /* The library function will deal with high == low */
+       if ((i == 0) || (i == (table_len - 1)))
+               high = i - 1;
+       else
+               high = i; /* i.e. i == 0 */
+       low = i;
+
+       return fixp_linear_interpolate(table[low].ocv,
+                                      table[low].capacity,
+                                      table[high].ocv,
+                                      table[high].capacity,
+                                      ocv);
 }
 EXPORT_SYMBOL_GPL(power_supply_ocv2cap_simple);