diff mbox series

[1/5] power: supply: ab8500: Use library interpolation

Message ID 20210713152709.871833-1-linus.walleij@linaro.org
State Accepted
Commit f820547446ed05edee2944ebe19ea6a3104434f4
Headers show
Series [1/5] power: supply: ab8500: Use library interpolation | expand

Commit Message

Linus Walleij July 13, 2021, 3:27 p.m. UTC
The kernel already has a static inline for linear interpolation
so use that instead of rolling our own.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

---
 drivers/power/supply/ab8500_btemp.c |  6 ++++--
 drivers/power/supply/ab8500_fg.c    | 14 +++++++-------
 2 files changed, 11 insertions(+), 9 deletions(-)

-- 
2.31.1

Comments

Sebastian Reichel July 16, 2021, 1:58 p.m. UTC | #1
Hi Linus,

On Tue, Jul 13, 2021 at 05:27:05PM +0200, Linus Walleij wrote:
> The kernel already has a static inline for linear interpolation

> so use that instead of rolling our own.

> 

> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

> ---


Thanks, I queued the whole series.

-- Sebastian

>  drivers/power/supply/ab8500_btemp.c |  6 ++++--

>  drivers/power/supply/ab8500_fg.c    | 14 +++++++-------

>  2 files changed, 11 insertions(+), 9 deletions(-)

> 

> diff --git a/drivers/power/supply/ab8500_btemp.c b/drivers/power/supply/ab8500_btemp.c

> index dbdcff32f353..24958b935d39 100644

> --- a/drivers/power/supply/ab8500_btemp.c

> +++ b/drivers/power/supply/ab8500_btemp.c

> @@ -27,6 +27,7 @@

>  #include <linux/mfd/abx500.h>

>  #include <linux/mfd/abx500/ab8500.h>

>  #include <linux/iio/consumer.h>

> +#include <linux/fixp-arith.h>

>  

>  #include "ab8500-bm.h"

>  

> @@ -437,8 +438,9 @@ static int ab8500_btemp_res_to_temp(struct ab8500_btemp *di,

>  			i++;

>  	}

>  

> -	return tbl[i].temp + ((tbl[i + 1].temp - tbl[i].temp) *

> -		(res - tbl[i].resist)) / (tbl[i + 1].resist - tbl[i].resist);

> +	return fixp_linear_interpolate(tbl[i].resist, tbl[i].temp,

> +				       tbl[i + 1].resist, tbl[i + 1].temp,

> +				       res);

>  }

>  

>  /**

> diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c

> index 3d45ed0157c6..bdbf3f13bee0 100644

> --- a/drivers/power/supply/ab8500_fg.c

> +++ b/drivers/power/supply/ab8500_fg.c

> @@ -34,6 +34,7 @@

>  #include <linux/mfd/abx500/ab8500.h>

>  #include <linux/iio/consumer.h>

>  #include <linux/kernel.h>

> +#include <linux/fixp-arith.h>

>  

>  #include "ab8500-bm.h"

>  

> @@ -56,9 +57,6 @@

>  /* FG constants */

>  #define BATT_OVV			0x01

>  

> -#define interpolate(x, x1, y1, x2, y2) \

> -	((y1) + ((((y2) - (y1)) * ((x) - (x1))) / ((x2) - (x1))));

> -

>  /**

>   * struct ab8500_fg_interrupts - ab8500 fg interrupts

>   * @name:	name of the interrupt

> @@ -868,11 +866,12 @@ static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage)

>  	}

>  

>  	if ((i > 0) && (i < tbl_size)) {

> -		cap = interpolate(voltage,

> +		cap = fixp_linear_interpolate(

>  			tbl[i].voltage,

>  			tbl[i].capacity * 10,

>  			tbl[i-1].voltage,

> -			tbl[i-1].capacity * 10);

> +			tbl[i-1].capacity * 10,

> +			voltage);

>  	} else if (i == 0) {

>  		cap = 1000;

>  	} else {

> @@ -920,11 +919,12 @@ static int ab8500_fg_battery_resistance(struct ab8500_fg *di)

>  	}

>  

>  	if ((i > 0) && (i < tbl_size)) {

> -		resist = interpolate(di->bat_temp / 10,

> +		resist = fixp_linear_interpolate(

>  			tbl[i].temp,

>  			tbl[i].resist,

>  			tbl[i-1].temp,

> -			tbl[i-1].resist);

> +			tbl[i-1].resist,

> +			di->bat_temp / 10);

>  	} else if (i == 0) {

>  		resist = tbl[0].resist;

>  	} else {

> -- 

> 2.31.1

>
diff mbox series

Patch

diff --git a/drivers/power/supply/ab8500_btemp.c b/drivers/power/supply/ab8500_btemp.c
index dbdcff32f353..24958b935d39 100644
--- a/drivers/power/supply/ab8500_btemp.c
+++ b/drivers/power/supply/ab8500_btemp.c
@@ -27,6 +27,7 @@ 
 #include <linux/mfd/abx500.h>
 #include <linux/mfd/abx500/ab8500.h>
 #include <linux/iio/consumer.h>
+#include <linux/fixp-arith.h>
 
 #include "ab8500-bm.h"
 
@@ -437,8 +438,9 @@  static int ab8500_btemp_res_to_temp(struct ab8500_btemp *di,
 			i++;
 	}
 
-	return tbl[i].temp + ((tbl[i + 1].temp - tbl[i].temp) *
-		(res - tbl[i].resist)) / (tbl[i + 1].resist - tbl[i].resist);
+	return fixp_linear_interpolate(tbl[i].resist, tbl[i].temp,
+				       tbl[i + 1].resist, tbl[i + 1].temp,
+				       res);
 }
 
 /**
diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c
index 3d45ed0157c6..bdbf3f13bee0 100644
--- a/drivers/power/supply/ab8500_fg.c
+++ b/drivers/power/supply/ab8500_fg.c
@@ -34,6 +34,7 @@ 
 #include <linux/mfd/abx500/ab8500.h>
 #include <linux/iio/consumer.h>
 #include <linux/kernel.h>
+#include <linux/fixp-arith.h>
 
 #include "ab8500-bm.h"
 
@@ -56,9 +57,6 @@ 
 /* FG constants */
 #define BATT_OVV			0x01
 
-#define interpolate(x, x1, y1, x2, y2) \
-	((y1) + ((((y2) - (y1)) * ((x) - (x1))) / ((x2) - (x1))));
-
 /**
  * struct ab8500_fg_interrupts - ab8500 fg interrupts
  * @name:	name of the interrupt
@@ -868,11 +866,12 @@  static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage)
 	}
 
 	if ((i > 0) && (i < tbl_size)) {
-		cap = interpolate(voltage,
+		cap = fixp_linear_interpolate(
 			tbl[i].voltage,
 			tbl[i].capacity * 10,
 			tbl[i-1].voltage,
-			tbl[i-1].capacity * 10);
+			tbl[i-1].capacity * 10,
+			voltage);
 	} else if (i == 0) {
 		cap = 1000;
 	} else {
@@ -920,11 +919,12 @@  static int ab8500_fg_battery_resistance(struct ab8500_fg *di)
 	}
 
 	if ((i > 0) && (i < tbl_size)) {
-		resist = interpolate(di->bat_temp / 10,
+		resist = fixp_linear_interpolate(
 			tbl[i].temp,
 			tbl[i].resist,
 			tbl[i-1].temp,
-			tbl[i-1].resist);
+			tbl[i-1].resist,
+			di->bat_temp / 10);
 	} else if (i == 0) {
 		resist = tbl[0].resist;
 	} else {