diff options
| author | mattis fjallstrom <mattis@acm.org> | 2015-12-04 17:11:51 -0800 |
|---|---|---|
| committer | mattis fjallstrom <mattis@acm.org> | 2015-12-11 16:10:11 -0800 |
| commit | 06b1976074548242b33bba2cec89c219fbb442af (patch) | |
| tree | de54268e169eb9ad2aafa880c98255c1a7196279 | |
| parent | d0e134526a3d928584b32be8ca6737e77def70d3 (diff) | |
| download | olio-linux-3.10-06b1976074548242b33bba2cec89c219fbb442af.tar.xz olio-linux-3.10-06b1976074548242b33bba2cec89c219fbb442af.zip | |
Several bug-fixes. Set device up as wake-up device, since we may wake up from interrupt. Changed cancel_delayed_work_sync to cancel_delayed_work, since we're calling from an interrupt and stopping to sync would be bad. Using managed and threaded IRQ. Finally, returning POWER_SUPPLY_STATUS_UNKNOWN when we can't communicate with the charger chip.
Change-Id: I6f47769299275b60d277af3f4db0321f6f0de9d8
| -rw-r--r-- | drivers/power/bq27x00_battery.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c index 4e9cd67f38b..c26859a2f84 100644 --- a/drivers/power/bq27x00_battery.c +++ b/drivers/power/bq27x00_battery.c @@ -1227,8 +1227,8 @@ static int bq27x00_charger_status(struct bq27x00_device_info *di) { return POWER_SUPPLY_STATUS_CHARGING; default: olio_debug("Couldn't read status from ts81001 charger.\n"); - olio_debug("exiting, EINVAL\n"); - return -EINVAL; + olio_debug("exiting, UNKNOWN\n"); + return POWER_SUPPLY_STATUS_UNKNOWN; } } @@ -1249,12 +1249,14 @@ static int bq27x00_battery_status(struct bq27x00_device_info *di, else status = POWER_SUPPLY_STATUS_DISCHARGING; } else { - #ifdef CONFIG_OLIO_TS81001 +#ifdef CONFIG_OLIO_TS81001 status = bq27x00_charger_status (di); - if(status != POWER_SUPPLY_STATUS_DISCHARGING && di->cache.flags & BQ27XXX_FLAG_FC) { + + if(status == POWER_SUPPLY_STATUS_CHARGING && + di->cache.flags & BQ27XXX_FLAG_FC) { status = POWER_SUPPLY_STATUS_FULL; } - #else +#else if (di->cache.flags & BQ27XXX_FLAG_FC) status = POWER_SUPPLY_STATUS_FULL; else if (di->cache.flags & BQ27XXX_FLAG_DSC) @@ -1418,7 +1420,7 @@ static void bq27x00_external_power_changed(struct power_supply *psy) { struct bq27x00_device_info *di = to_bq27x00_device_info(psy); - cancel_delayed_work_sync(&di->work); + cancel_delayed_work(&di->work); schedule_delayed_work(&di->work, 0); } @@ -1426,7 +1428,9 @@ static irqreturn_t bq27x00_chg_isr(int irq, void *dev) { struct power_supply *ps = (struct power_supply*) dev; wake_lock_timeout(&chg_wake_lock, msecs_to_jiffies(500)); - //dev_dbg(ps->dev, "%s: Updating battery status\n", __func__); + /* dev_dbg(ps->dev, "%s: Updating battery status\n", __func__); Don't + do i/o in interrupt! */ + bq27x00_external_power_changed(ps); return IRQ_HANDLED; @@ -1480,13 +1484,18 @@ static int __init bq27x00_powersupply_init(struct bq27x00_device_info *di) return ret; } + /* This device is a wakeup source */ + + device_init_wakeup(di->dev, 1); + wake_lock_init(&chg_wake_lock, WAKE_LOCK_SUSPEND, "chg_wake_lock"); if(di->irq) { // If using an irq, disable poll interal poll_interval = 0; - ret = request_irq(di->irq, bq27x00_chg_isr, IRQF_TRIGGER_RISING, - "bq27x00 chg", &di->bat); + ret = devm_request_threaded_irq(di->dev, di->irq, bq27x00_chg_isr, + NULL, IRQF_TRIGGER_RISING, + dev_name(di->dev), &di->bat); if (ret) { dev_err(di->dev, "failed to request irq: %d\n", di->irq); return ret; @@ -1796,7 +1805,7 @@ static int bq27x00_set_platform_data (struct bq27x00_platform_data * pdata) { #endif /* CONFIG_OLIO_TS81001 */ static int __init bq27x00_battery_probe(struct i2c_client *client, - const struct i2c_device_id *id) + const struct i2c_device_id *id) { char *name; struct bq27x00_device_info *di; |