From: Jean Delvare <khali@linux-fr.org>
To: lm-sensors@vger.kernel.org
Subject: Re: [lm-sensors] [PATCH 01/10] hwmon: (lm85) Fix function
Date: Tue, 29 Apr 2008 06:03:01 +0000 [thread overview]
Message-ID: <20080429080301.2d45dc6d@hyperion.delvare> (raw)
In-Reply-To: <48169F4D.8090508@gmail.com>
Hi Juerg,
On Mon, 28 Apr 2008 21:08:45 -0700, Juerg Haefliger wrote:
> > Function RANGE_TO_REG() is broken. For a requested range of 2000 (2
> > degrees C), it will return an index value of 15, i.e. 80.0 degrees C,
> > instead of the expected index value of 0. All other values are handled
> > properly, just 2000 isn't.
> >
> > The bug was introduced back in November 2004 by this patch:
> > http://git.kernel.org/?p=linux/kernel/git/tglx/history.git;a=commit;h\x1c28d80f1992240373099d863e4996cdd5d646d0
> >
> > While this can be fixed easily with the current code, I'd rather
> > rewrite the whole function in a way which is more obviously correct.
> >
> > Signed-off-by: Jean Delvare <khali@linux-fr.org>
> > Cc: Justin Thiessen <jthiessen@penguincomputing.com>
> > ---
> > Note: this is the same patch as I already sent on April 3rd.
> >
> > drivers/hwmon/lm85.c | 25 +++++++++++--------------
> > 1 file changed, 11 insertions(+), 14 deletions(-)
> >
> > --- linux-2.6.25-rc8.orig/drivers/hwmon/lm85.c 2008-04-02 22:20:01.000000000 +0200
> > +++ linux-2.6.25-rc8/drivers/hwmon/lm85.c 2008-04-02 23:10:16.000000000 +0200
> > @@ -192,23 +192,20 @@ static int RANGE_TO_REG( int range )
> > {
> > int i;
> >
> > - if ( range < lm85_range_map[0] ) {
> > - return 0 ;
> > - } else if ( range > lm85_range_map[15] ) {
> > + if (range >= lm85_range_map[15])
> > return 15 ;
> > - } else { /* find closest match */
> > - for ( i = 14 ; i >= 0 ; --i ) {
> > - if ( range > lm85_range_map[i] ) { /* range bracketed */
> > - if ((lm85_range_map[i+1] - range) <
> > - (range - lm85_range_map[i])) {
> > - i++;
> > - break;
> > - }
> > - break;
> > - }
> > +
> > + /* Find the closest match */
> > + for (i = 14; i >= 0; --i) {
> > + if (range >= lm85_range_map[i]) {
> > + if ((lm85_range_map[i + 1] - range) <
> > + (range - lm85_range_map[i]))
> > + return i + 1;
> > + return i;
> > }
> > }
> > - return( i & 0x0f );
> > +
> > + return 0;
> > }
> > #define RANGE_FROM_REG(val) (lm85_range_map[(val)&0x0f])
> >
>
> This works but is less efficient compared to the original code for range
> values < 2000.
But it is slightly more efficient for all values between 2000 and
80000. The average efficiency is exactly the same as those of the
original code.
> Is there a reason not to check for < 2000 before looping?
Code size. The < 2000 case is handled just fine by the for loop, so I
don't see the point of making the code bigger.
Note that performance is hardly an issue here anyway, users aren't
going to change this parameter very often.
--
Jean Delvare
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
next prev parent reply other threads:[~2008-04-29 6:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-29 4:08 [lm-sensors] [PATCH 01/10] hwmon: (lm85) Fix function Juerg Haefliger
2008-04-29 6:03 ` Jean Delvare [this message]
2008-05-01 4:08 ` Juerg Haefliger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080429080301.2d45dc6d@hyperion.delvare \
--to=khali@linux-fr.org \
--cc=lm-sensors@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.