summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/power/bq27x00_battery.c28
1 files 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;