From 844a56c2f21dc07f86bbacf5943b0129c7302a5b Mon Sep 17 00:00:00 2001 From: mattis fjallstrom Date: Fri, 4 Dec 2015 17:11:51 -0800 Subject: 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 Signed-off-by: Evan Wilson --- drivers/power/bq27x00_battery.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c index 1cc928fe2c9..646ed08b95c 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,8 @@ 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 +1483,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 +1804,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; -- cgit v1.2.3-70-g09d2