Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 165508
b: refs/heads/master
c: 02d0d27
h: refs/heads/master
v: v3
  • Loading branch information
Daniel Mack authored and Anton Vorontsov committed Jul 30, 2009
1 parent ea3c0ff commit 12e5bb9
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 25f2bfa62ae77820a8185734c4a2ab7f3971a2fc
refs/heads/master: 02d0d2758821c38b2601d34dac544140af09e651
41 changes: 27 additions & 14 deletions trunk/drivers/power/ds2760_battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ static unsigned int rated_capacity;
module_param(rated_capacity, uint, 0644);
MODULE_PARM_DESC(rated_capacity, "rated battery capacity, 10*mAh or index");

static unsigned int current_accum;
module_param(current_accum, uint, 0644);
MODULE_PARM_DESC(current_accum, "current accumulator value");

/* Some batteries have their rated capacity stored a N * 10 mAh, while
* others use an index into this table. */
static int rated_capacities[] = {
Expand Down Expand Up @@ -215,6 +219,22 @@ static int ds2760_battery_read_status(struct ds2760_device_info *di)
return 0;
}

static void ds2760_battery_set_current_accum(struct ds2760_device_info *di,
unsigned int acr_val)
{
unsigned char acr[2];

/* acr is in units of 0.25 mAh */
acr_val *= 4L;
acr_val /= 1000;

acr[0] = acr_val >> 8;
acr[1] = acr_val & 0xff;

if (w1_ds2760_write(di->w1_dev, acr, DS2760_CURRENT_ACCUM_MSB, 2) < 2)
dev_warn(di->dev, "ACR write failed\n");
}

static void ds2760_battery_update_status(struct ds2760_device_info *di)
{
int old_charge_status = di->charge_status;
Expand Down Expand Up @@ -246,21 +266,9 @@ static void ds2760_battery_update_status(struct ds2760_device_info *di)
if (di->full_counter < 2) {
di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
} else {
unsigned char acr[2];
int acr_val;

/* acr is in units of 0.25 mAh */
acr_val = di->full_active_uAh * 4L / 1000;

acr[0] = acr_val >> 8;
acr[1] = acr_val & 0xff;

if (w1_ds2760_write(di->w1_dev, acr,
DS2760_CURRENT_ACCUM_MSB, 2) < 2)
dev_warn(di->dev,
"ACR reset failed\n");

di->charge_status = POWER_SUPPLY_STATUS_FULL;
ds2760_battery_set_current_accum(di,
di->full_active_uAh);
}
}
} else {
Expand Down Expand Up @@ -423,6 +431,11 @@ static int ds2760_battery_probe(struct platform_device *pdev)
if (rated_capacity)
ds2760_battery_write_rated_capacity(di, rated_capacity);

/* set current accumulator if given as parameter.
* this should only be done for bootstrapping the value */
if (current_accum)
ds2760_battery_set_current_accum(di, current_accum);

retval = power_supply_register(&pdev->dev, &di->bat);
if (retval) {
dev_err(di->dev, "failed to register battery\n");
Expand Down

0 comments on commit 12e5bb9

Please sign in to comment.