summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2014-04-14 16:07:39 +0530
committerMandar Padmawar <mpadmawar@nvidia.com>2014-05-07 01:16:10 -0700
commitbbd4234a669bffe1e424dbab839d5047507b7cf5 (patch)
tree053bbd5250df56da3e97b955740e46f5e8aadd03 /drivers/power
parent7181ddb1abd732a3f2c2e1e2000d1e2fc79c51e4 (diff)
power: bq2419x: rewrite suspend callback as per flow diagram
Rewrite suspend callback to easily map with flow diagram and understand the code path. This rewrite removes the complexity from codes. Change-Id: Ia8747f2f40aec9e5515849a904f08ef018f04b97 Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: http://git-master/r/395810 Reviewed-on: http://git-master/r/405638 GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/bq2419x-charger.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/drivers/power/bq2419x-charger.c b/drivers/power/bq2419x-charger.c
index ee410c6d73af..796977d633e3 100644
--- a/drivers/power/bq2419x-charger.c
+++ b/drivers/power/bq2419x-charger.c
@@ -1719,6 +1719,7 @@ end:
static int bq2419x_suspend(struct device *dev)
{
struct bq2419x_chip *bq2419x = dev_get_drvdata(dev);
+ int next_wakeup = 0;
int ret;
if (!bq2419x->battery_presense)
@@ -1726,34 +1727,42 @@ static int bq2419x_suspend(struct device *dev)
battery_charging_restart_cancel(bq2419x->bc_dev);
+ if (!bq2419x->cable_connected || bq2419x->in_current_limit <= 500)
+ goto charge_500;
+
ret = bq2419x_reset_wdt(bq2419x, "Suspend");
if (ret < 0)
dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
- if (bq2419x->cable_connected &&
- !bq2419x->disable_suspend_during_charging &&
- (bq2419x->in_current_limit > 500)) {
- battery_charging_wakeup(bq2419x->bc_dev,
- bq2419x->wdt_refresh_timeout);
- } else if (bq2419x->cable_connected &&
- bq2419x->auto_recharge_time_supend &&
- (bq2419x->in_current_limit > 500) &&
- (bq2419x->chg_status == BATTERY_CHARGING_DONE)){
- battery_charging_wakeup(bq2419x->bc_dev,
- bq2419x->auto_recharge_time_supend);
- ret = bq2419x_set_charging_current_suspend(
- bq2419x, 500);
- if (ret < 0)
- dev_err(bq2419x->dev,
- "Configuration of charging failed: %d\n", ret);
- } else {
- ret = bq2419x_set_charging_current_suspend(bq2419x, 500);
- if (ret < 0)
+ switch (bq2419x->chg_status) {
+ case BATTERY_CHARGING_DONE:
+ next_wakeup = bq2419x->auto_recharge_time_supend;
+ break;
+ case BATTERY_CHARGING:
+ if (bq2419x->disable_suspend_during_charging) {
dev_err(bq2419x->dev,
- "Configuration of charging failed: %d\n", ret);
+ "ERROR: Device suspended during charging\n");
+ next_wakeup = bq2419x->auto_recharge_time_supend;
+ } else {
+ next_wakeup = bq2419x->wdt_refresh_timeout;
+ }
+ break;
+ default:
+ break;
}
+ if (next_wakeup)
+ battery_charging_wakeup(bq2419x->bc_dev, next_wakeup);
+
+ if (next_wakeup == bq2419x->auto_recharge_time_supend)
+ goto charge_500;
+
return 0;
+charge_500:
+ ret = bq2419x_set_charging_current_suspend(bq2419x, 500);
+ if (ret < 0)
+ dev_err(bq2419x->dev, "Config of charging failed: %d\n", ret);
+ return ret;
}
static int bq2419x_resume(struct device *dev)