summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorSivaram Nair <sivaramn@nvidia.com>2013-04-09 11:35:15 +0300
committerMrutyunjay Sawant <msawant@nvidia.com>2013-04-25 06:14:35 -0700
commitcbdee27a0995508c02dd5387a0ce55cfdc9509b7 (patch)
tree886a9bb47afcd383a1800582eb05e0d6547f6099 /drivers/power
parent13df76a419e402fed56e9121414b1813a4d504ad (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>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/max17042_battery.c14
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,