diff options
author | Sivaram Nair <sivaramn@nvidia.com> | 2013-04-09 11:35:15 +0300 |
---|---|---|
committer | Mrutyunjay Sawant <msawant@nvidia.com> | 2013-04-25 06:14:35 -0700 |
commit | cbdee27a0995508c02dd5387a0ce55cfdc9509b7 (patch) | |
tree | 886a9bb47afcd383a1800582eb05e0d6547f6099 | |
parent | 13df76a419e402fed56e9121414b1813a4d504ad (diff) |
power: max17042: interpolate RBAT values
Patch to interpolate RBAT values from discrete steps.
Bug 1264825
Change-Id: Id2ddcde984d1ddd0ac27786d6fd3abe2d7aa4239
Signed-off-by: Sivaram Nair <sivaramn@nvidia.com>
Reviewed-on: http://git-master/r/222573
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Juha Tukkinen <jtukkinen@nvidia.com>
-rw-r--r-- | drivers/power/max17042_battery.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/power/max17042_battery.c b/drivers/power/max17042_battery.c index 347e567ab7e1..4c733989f4da 100644 --- a/drivers/power/max17042_battery.c +++ b/drivers/power/max17042_battery.c @@ -748,16 +748,28 @@ static inline unsigned int max17042_max_depletion(struct max17042_chip *chip) return chip->pdata->edp_client->states[0]; } +static int interpolate(int x, int x1, int y1, int x2, int y2) +{ + return x1 == x2 ? y1 : (y2 * (x - x1) - y1 * (x - x2)) / (x2 - x1); +} + static int max17042_rbat(struct max17042_chip *chip, unsigned int capacity) { struct max17042_rbat_map *p; + struct max17042_rbat_map *q; p = chip->pdata->rbat_map; while (p->capacity > capacity) p++; - return p->rbat; + if (p == chip->pdata->rbat_map) + return p->rbat; + + q = p - 1; + + return interpolate(capacity, p->capacity, p->rbat, + q->capacity, q->rbat); } static s64 max17042_ibat_possible(struct max17042_chip *chip, s64 avgcurrent, |