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 |
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 --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 {
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