diff options
Diffstat (limited to 'drivers/power/bq27x00_battery.c')
| -rw-r--r-- | drivers/power/bq27x00_battery.c | 28 | 
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; |