* Re: [lm-sensors] [PATCH] hwmon: sht15: Fix sht15_calc_temp interpolation function [not found] <1269639013-26029-1-git-send-email-jerome.oufella@savoirfairelinux.com> @ 2010-04-01 12:01 ` Jean Delvare 2010-04-01 12:54 ` Jerome Oufella 0 siblings, 1 reply; 3+ messages in thread From: Jean Delvare @ 2010-04-01 12:01 UTC (permalink / raw) To: Jerome Oufella, Jonathan Cameron; +Cc: lm-sensors, linux-kernel Hi Jerome, Jonathan, On Fri, 26 Mar 2010 17:30:13 -0400, Jerome Oufella wrote: > I discovered two issues. > First the previous sht15_calc_temp() loop did not iterate through the > temppoints array since the (data->supply_uV > temppoints[i - 1].vdd) > test is always true in this direction. > > Also the two-points linear interpolation function was returning biased > values which I adressed using a different form of interpolation. > > Signed-off-by: Jerome Oufella <jerome.oufella@savoirfairelinux.com> > --- > > drivers/hwmon/sht15.c | 14 +++++++------- > 1 files changed, 7 insertions(+), 7 deletions(-) > > > diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c > index 864a371..a6ad93b 100644 > --- a/drivers/hwmon/sht15.c > +++ b/drivers/hwmon/sht15.c > @@ -303,15 +303,15 @@ error_ret: > static inline int sht15_calc_temp(struct sht15_data *data) > { > int d1 = 0; > - int i; > + int i, t; > > - for (i = 1; i < ARRAY_SIZE(temppoints); i++) > + for (i = ARRAY_SIZE(temppoints) - 1; i > 0; i--) > /* Find pointer to interpolate */ > - if (data->supply_uV > temppoints[i - 1].vdd) { > - d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd) > - * (temppoints[i].d1 - temppoints[i - 1].d1) > - / (temppoints[i].vdd - temppoints[i - 1].vdd) > - + temppoints[i - 1].d1; > + if (data->supply_uV >= temppoints[i - 1].vdd) { > + t = (data->supply_uV - temppoints[i-1].vdd) / > + ((temppoints[i].vdd - temppoints[i-1].vdd) / 10000); > + > + d1 = (temppoints[i].d1 * t + (10000 - t) * temppoints[i-1].d1) / 10000; > break; > } > May I suggest the more simple fix below? --- drivers/hwmon/sht15.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- linux-2.6.34-rc3.orig/drivers/hwmon/sht15.c 2010-04-01 13:41:15.000000000 +0200 +++ linux-2.6.34-rc3/drivers/hwmon/sht15.c 2010-04-01 13:41:55.000000000 +0200 @@ -305,10 +305,10 @@ static inline int sht15_calc_temp(struct int d1 = 0; int i; - for (i = 1; i < ARRAY_SIZE(temppoints); i++) + for (i = ARRAY_SIZE(temppoints) - 1; i > 0 ;i--) /* Find pointer to interpolate */ if (data->supply_uV > temppoints[i - 1].vdd) { - d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd) + d1 = (data->supply_uV - temppoints[i - 1].vdd) * (temppoints[i].d1 - temppoints[i - 1].d1) / (temppoints[i].vdd - temppoints[i - 1].vdd) + temppoints[i - 1].d1; It leads to the same numbers as with Jerome's patch, with the advantages that 1* it is a much smaller change, more suitable for applying to stable kernels and 2* it avoids the magic constant number 10000. The "/1000" seems to be a relict of former times when temppoints[*].vdd was probably expressed in millivolt instead of microvolt. And the inverted loop iteration is obviously a bug. Note that in both cases, something should be done about values which are outside of the temppoints array. I don't know how likely these are, but they are seriously mishandled. For supply_uV values below temppoints[0].vdd, d1 defaults to 0, so no adjustment is done at all. temppoints[0].d1 would seem to be a much better default, if we don't want to do any interpolation in that case. For supply_uV values above temppoints[4].vdd, we do interpolate, which seems reasonable. Opinions? -- Jean Delvare ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [lm-sensors] [PATCH] hwmon: sht15: Fix sht15_calc_temp interpolation function 2010-04-01 12:01 ` [lm-sensors] [PATCH] hwmon: sht15: Fix sht15_calc_temp interpolation function Jean Delvare @ 2010-04-01 12:54 ` Jerome Oufella 2010-04-01 13:49 ` Jonathan Cameron 0 siblings, 1 reply; 3+ messages in thread From: Jerome Oufella @ 2010-04-01 12:54 UTC (permalink / raw) To: Jean Delvare; +Cc: lm-sensors, linux-kernel, Jonathan Cameron ----- "Jean Delvare" <khali@linux-fr.org> wrote : > May I suggest the more simple fix below? > > --- > drivers/hwmon/sht15.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > --- linux-2.6.34-rc3.orig/drivers/hwmon/sht15.c 2010-04-01 > 13:41:15.000000000 +0200 > +++ linux-2.6.34-rc3/drivers/hwmon/sht15.c 2010-04-01 > 13:41:55.000000000 +0200 > @@ -305,10 +305,10 @@ static inline int sht15_calc_temp(struct > int d1 = 0; > int i; > > - for (i = 1; i < ARRAY_SIZE(temppoints); i++) > + for (i = ARRAY_SIZE(temppoints) - 1; i > 0 ;i--) > /* Find pointer to interpolate */ > if (data->supply_uV > temppoints[i - 1].vdd) { > - d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd) > + d1 = (data->supply_uV - temppoints[i - 1].vdd) > * (temppoints[i].d1 - temppoints[i - 1].d1) > / (temppoints[i].vdd - temppoints[i - 1].vdd) > + temppoints[i - 1].d1; > > It leads to the same numbers as with Jerome's patch, with the > advantages that 1* it is a much smaller change, more suitable for > applying to stable kernels and 2* it avoids the magic constant number > 10000. > > The "/1000" seems to be a relict of former times when > temppoints[*].vdd > was probably expressed in millivolt instead of microvolt. And the > inverted loop iteration is obviously a bug. > > Note that in both cases, something should be done about values which > are outside of the temppoints array. I don't know how likely these > are, > but they are seriously mishandled. For supply_uV values below > temppoints[0].vdd, d1 defaults to 0, so no adjustment is done at all. > temppoints[0].d1 would seem to be a much better default, if we don't > want to do any interpolation in that case. For supply_uV values above > temppoints[4].vdd, we do interpolate, which seems reasonable. > > Opinions? > > -- > Jean Delvare That's fine, it does a good job for me, in the expected voltage range. Jerome Oufella ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [lm-sensors] [PATCH] hwmon: sht15: Fix sht15_calc_temp interpolation function 2010-04-01 12:54 ` Jerome Oufella @ 2010-04-01 13:49 ` Jonathan Cameron 0 siblings, 0 replies; 3+ messages in thread From: Jonathan Cameron @ 2010-04-01 13:49 UTC (permalink / raw) To: Jerome Oufella; +Cc: Jean Delvare, lm-sensors, linux-kernel On 04/01/10 13:54, Jerome Oufella wrote: > ----- "Jean Delvare" <khali@linux-fr.org> wrote : >> May I suggest the more simple fix below? >> >> --- >> drivers/hwmon/sht15.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> --- linux-2.6.34-rc3.orig/drivers/hwmon/sht15.c 2010-04-01 >> 13:41:15.000000000 +0200 >> +++ linux-2.6.34-rc3/drivers/hwmon/sht15.c 2010-04-01 >> 13:41:55.000000000 +0200 >> @@ -305,10 +305,10 @@ static inline int sht15_calc_temp(struct >> int d1 = 0; >> int i; >> >> - for (i = 1; i < ARRAY_SIZE(temppoints); i++) >> + for (i = ARRAY_SIZE(temppoints) - 1; i > 0 ;i--) >> /* Find pointer to interpolate */ >> if (data->supply_uV > temppoints[i - 1].vdd) { >> - d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd) >> + d1 = (data->supply_uV - temppoints[i - 1].vdd) >> * (temppoints[i].d1 - temppoints[i - 1].d1) >> / (temppoints[i].vdd - temppoints[i - 1].vdd) >> + temppoints[i - 1].d1; >> >> It leads to the same numbers as with Jerome's patch, with the >> advantages that 1* it is a much smaller change, more suitable for >> applying to stable kernels and 2* it avoids the magic constant number >> 10000. >> >> The "/1000" seems to be a relict of former times when >> temppoints[*].vdd >> was probably expressed in millivolt instead of microvolt. And the >> inverted loop iteration is obviously a bug. >> >> Note that in both cases, something should be done about values which >> are outside of the temppoints array. I don't know how likely these >> are, >> but they are seriously mishandled. For supply_uV values below >> temppoints[0].vdd, d1 defaults to 0, so no adjustment is done at all. >> temppoints[0].d1 would seem to be a much better default, if we don't >> want to do any interpolation in that case. For supply_uV values above >> temppoints[4].vdd, we do interpolate, which seems reasonable. >> >> Opinions? >> >> -- >> Jean Delvare > > That's fine, it does a good job for me, in the expected voltage range. Seems sensible. I'm not quite sure but I think the code in question predates my involvement with the driver, so I'm guessing I never actually looked closely enough at it. Jonathan ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-04-01 13:47 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1269639013-26029-1-git-send-email-jerome.oufella@savoirfairelinux.com>
2010-04-01 12:01 ` [lm-sensors] [PATCH] hwmon: sht15: Fix sht15_calc_temp interpolation function Jean Delvare
2010-04-01 12:54 ` Jerome Oufella
2010-04-01 13:49 ` Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox