Commit a4585ba2 authored by Linus Walleij's avatar Linus Walleij Committed by Sebastian Reichel
Browse files

power: supply: core: Use library interpolation



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: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarBaolin Wang <baolin.wang@linux.alibaba.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 715ecbc1
Loading
Loading
Loading
Loading
+31 −30
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/power_supply.h>
#include <linux/power_supply.h>
#include <linux/property.h>
#include <linux/property.h>
#include <linux/thermal.h>
#include <linux/thermal.h>
#include <linux/fixp-arith.h>
#include "power_supply.h"
#include "power_supply.h"


/* exported for the APM Power driver, APM emulation */
/* 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 power_supply_temp2resist_simple(struct power_supply_resistance_temp_table *table,
				    int table_len, int temp)
				    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)
		if (temp > table[i].temp)
			break;
			break;


	if (i > 0 && i < table_len) {
	/* The library function will deal with high == low */
		int tmp;
	if ((i == 0) || (i == (table_len - 1)))

		high = i;
		tmp = (table[i - 1].resistance - table[i].resistance) *
	else
			(temp - table[i].temp);
		high = i - 1;
		tmp /= table[i - 1].temp - table[i].temp;
	low = i;
		resist = tmp + table[i].resistance;
	} else if (i == 0) {
		resist = table[0].resistance;
	} else {
		resist = table[table_len - 1].resistance;
	}


	return resist;
	return fixp_linear_interpolate(table[low].temp,
				       table[low].resistance,
				       table[high].temp,
				       table[high].resistance,
				       temp);
}
}
EXPORT_SYMBOL_GPL(power_supply_temp2resist_simple);
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 power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table *table,
				int table_len, int ocv)
				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)
		if (ocv > table[i].ocv)
			break;
			break;


	if (i > 0 && i < table_len) {
	/* The library function will deal with high == low */
		tmp = (table[i - 1].capacity - table[i].capacity) *
	if ((i == 0) || (i == (table_len - 1)))
			(ocv - table[i].ocv);
		high = i - 1;
		tmp /= table[i - 1].ocv - table[i].ocv;
	else
		cap = tmp + table[i].capacity;
		high = i; /* i.e. i == 0 */
	} else if (i == 0) {
	low = i;
		cap = table[0].capacity;

	} else {
	return fixp_linear_interpolate(table[low].ocv,
		cap = table[table_len - 1].capacity;
				       table[low].capacity,
	}
				       table[high].ocv,

				       table[high].capacity,
	return cap;
				       ocv);
}
}
EXPORT_SYMBOL_GPL(power_supply_ocv2cap_simple);
EXPORT_SYMBOL_GPL(power_supply_ocv2cap_simple);