Commit 673b5032 authored by Linus Walleij's avatar Linus Walleij Committed by Sebastian Reichel

power: supply: ab8500_fg: Break out load compensated voltage

Break out the part of the function providing the load compensated
capacity that provides the load compensated voltage and use
that to get the load compensated capacity.
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent edc400e1
......@@ -909,18 +909,20 @@ static int ab8500_fg_battery_resistance(struct ab8500_fg *di)
}
/**
* ab8500_fg_load_comp_volt_to_capacity() - Load compensated voltage based capacity
* ab8500_load_comp_fg_bat_voltage() - get load compensated battery voltage
* @di: pointer to the ab8500_fg structure
*
* Returns battery capacity based on battery voltage that is load compensated
* for the voltage drop
* Returns compensated battery voltage (on success) else error code.
* If always is specified, we always return a voltage but it may be
* uncompensated.
*/
static int ab8500_fg_load_comp_volt_to_capacity(struct ab8500_fg *di)
static int ab8500_load_comp_fg_bat_voltage(struct ab8500_fg *di)
{
int vbat_comp_uv, res;
int i = 0;
int vbat_uv = 0;
int rcomp;
/* Average the instant current to get a stable current measurement */
ab8500_fg_inst_curr_start(di);
do {
......@@ -932,25 +934,37 @@ static int ab8500_fg_load_comp_volt_to_capacity(struct ab8500_fg *di)
if (i > WAIT_FOR_INST_CURRENT_MAX) {
dev_err(di->dev,
"TIMEOUT: return capacity based on uncompensated measurement of VBAT\n");
goto calc_cap;
"TIMEOUT: return uncompensated measurement of VBAT\n");
di->vbat_uv = vbat_uv / i;
return di->vbat_uv;
}
ab8500_fg_inst_curr_finalize(di, &di->inst_curr_ua);
calc_cap:
di->vbat_uv = vbat_uv / i;
res = ab8500_fg_battery_resistance(di);
vbat_uv = vbat_uv / i;
/*
* Use Ohms law to get the load compensated voltage.
* Divide by 1000 to get from milliohms to ohms.
*/
vbat_comp_uv = di->vbat_uv - (di->inst_curr_ua * res) / 1000;
/* Next we apply voltage compensation from internal resistance */
rcomp = ab8500_fg_battery_resistance(di);
vbat_uv = vbat_uv - (di->inst_curr_ua * rcomp) / 1000;
/* Always keep this state at latest measurement */
di->vbat_uv = vbat_uv;
return vbat_uv;
}
/**
* ab8500_fg_load_comp_volt_to_capacity() - Load compensated voltage based capacity
* @di: pointer to the ab8500_fg structure
*
* Returns battery capacity based on battery voltage that is load compensated
* for the voltage drop
*/
static int ab8500_fg_load_comp_volt_to_capacity(struct ab8500_fg *di)
{
int vbat_comp_uv;
dev_dbg(di->dev, "%s Measured Vbat: %d uV,Compensated Vbat %d uV, "
"R: %d mOhm, Current: %d uA Vbat Samples: %d\n",
__func__, di->vbat_uv, vbat_comp_uv, res, di->inst_curr_ua, i);
vbat_comp_uv = ab8500_load_comp_fg_bat_voltage(di);
return ab8500_fg_volt_to_capacity(di, vbat_comp_uv);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment