mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Matt Reimer" <mattjreimer@gmail.com>
To: "Pavel Machek" <pavel@ucw.cz>
Cc: "Anton Vorontsov" <cbou@mail.ru>,
	linux-kernel@vger.kernel.org, kernel-discuss@handhelds.org,
	dwmw2@infradead.org
Subject: Re: [PATCH 6/7] [RFC] ds2760 battery driver
Date: Mon, 16 Apr 2007 12:14:27 -0700	[thread overview]
Message-ID: <f383264b0704161214x168b36f4tdd9a074d604b36cb@mail.gmail.com> (raw)
In-Reply-To: <20070415194001.GF10097@ucw.cz>

On 4/15/07, Pavel Machek <pavel@ucw.cz> wrote:
> > +     di->update_time = jiffies;
> > +
> > +     /* DS2760 reports voltage in units of 4.88mV, but the battery class
> > +      * reports in units of mV, so convert by multiplying by 4.875.
> > +      * We approximate because integer math is cheap, and close enough. */
> > +     di->voltage_raw = (di->raw[DS2760_VOLTAGE_MSB] << 3) |
> > +                       (di->raw[DS2760_VOLTAGE_LSB] >> 5);
> > +     di->voltage_mV = (di->voltage_raw * 5) - (di->voltage_raw / 8);
>
> Hmm, not sure if such tricks re really worth it... should not compiler
> be doing this?

The shifts (<< 3 and >> 5) are just to get the bits reassembled in the
right positions. The multiplication by 5 and subtracting 1/8 is
because (AFAIK) we can't do floating point multiplication in the
kernel. I'm open to suggestions.

> > +     /* Calculate the empty level at the present temperature. */
> > +     scale[4] = di->raw[DS2760_ACTIVE_EMPTY + 4];
> > +     for (i = 3; i >= 0; i--)
> > +             scale[i] = scale[i + 1] + di->raw[DS2760_ACTIVE_EMPTY + i];
> > +
> > +     di->empty_mAh = battery_interpolate(scale, di->temp_C / 10);
>
> Wow.

Yeah, mea culpa. I don't like its obtuseness either, and haven't
revisited it since I got it working. Basically the battery has an
array stored in its EEPROM that represents the empty level at various
temperature thresholds. What makes this complicated is that the array
does not contain all absolute values; just the first is absolute, and
the others are relative to it, in reverse order. The above code
converts it to an array of absolute values from low to high. I'm open
to suggestions about this one too.

Matt

  reply	other threads:[~2007-04-16 19:14 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-11 23:25 Anton Vorontsov
2007-04-13 13:49 ` Anton Vorontsov
2007-04-15 19:40 ` Pavel Machek
2007-04-16 19:14   ` Matt Reimer [this message]
2007-04-16 19:35     ` Anton Vorontsov
2007-04-16 21:33       ` Matt Reimer
2007-04-17  8:17     ` Pavel Machek

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=f383264b0704161214x168b36f4tdd9a074d604b36cb@mail.gmail.com \
    --to=mattjreimer@gmail.com \
    --cc=cbou@mail.ru \
    --cc=dwmw2@infradead.org \
    --cc=kernel-discuss@handhelds.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pavel@ucw.cz \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®