summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2014-05-07 14:51:04 +0530
committerRiham Haidar <rhaidar@nvidia.com>2014-05-12 16:37:08 -0700
commit71ddb7496a7c22f34d0c3775de7a816716d6fae7 (patch)
tree6f4784940891ef878be38a20de239ec9e9989316 /drivers/power
parent51713c28dcd8aea46de276740f17a4ca8bb19734 (diff)
power: bq2419x: configure resume and power-ON time on suspend/shutdown
Based on the chargign status and type of cable connected, configure resume and auto power on of system on suspend and shutdown respectively. bug 1440235 bug 1509880 Change-Id: Idd1c731b2852c26132272c35a78e1c5ec5101031 Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Tested-by: Venkat Reddy Talla <vreddytalla@nvidia.com> Reviewed-on: http://git-master/r/406364 Reviewed-on: http://git-master/r/408096
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/bq2419x-charger.c81
1 files changed, 44 insertions, 37 deletions
diff --git a/drivers/power/bq2419x-charger.c b/drivers/power/bq2419x-charger.c
index 8ba60b53e443..9f05b3f76091 100644
--- a/drivers/power/bq2419x-charger.c
+++ b/drivers/power/bq2419x-charger.c
@@ -1409,6 +1409,9 @@ static struct bq2419x_platform_data *bq2419x_dt_parse(struct i2c_client *client)
if (!ret)
pdata->bcharger_pdata->auto_recharge_time_power_off =
auto_recharge_time_power_off;
+ else
+ pdata->bcharger_pdata->auto_recharge_time_power_off =
+ 3600;
ret = of_property_read_u32(batt_reg_node,
"ti,auto-recharge-time", &chg_restart_time);
@@ -1422,6 +1425,9 @@ static struct bq2419x_platform_data *bq2419x_dt_parse(struct i2c_client *client)
if (!ret)
pdata->bcharger_pdata->auto_recharge_time_supend =
chg_restart_time;
+ else
+ pdata->bcharger_pdata->auto_recharge_time_supend =
+ 3600;
ret = of_property_read_u32(batt_reg_node,
"ti,temp-polling-time-sec", &temp_polling_time);
@@ -1718,6 +1724,7 @@ static int bq2419x_remove(struct i2c_client *client)
static void bq2419x_shutdown(struct i2c_client *client)
{
struct bq2419x_chip *bq2419x = i2c_get_clientdata(client);
+ struct device *dev = &client->dev;
int ret;
int next_poweron_time = 0;
@@ -1727,34 +1734,35 @@ static void bq2419x_shutdown(struct i2c_client *client)
if (!bq2419x->cable_connected)
goto end;
- if (bq2419x->in_current_limit <= 500)
- goto end;
-
ret = bq2419x_reset_wdt(bq2419x, "SHUTDOWN");
if (ret < 0)
dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
- switch (bq2419x->chg_status) {
- case BATTERY_CHARGING:
- next_poweron_time = bq2419x->wdt_refresh_timeout;
- break;
- case BATTERY_CHARGING_DONE:
- next_poweron_time = bq2419x->auto_recharge_time_power_off;
- break;
- default:
- break;
+ if (bq2419x->chg_status == BATTERY_CHARGING_DONE) {
+ dev_info(bq2419x->dev, "Battery charging done\n");
+ goto end;
}
- if (!next_poweron_time)
- goto end;
+ if (bq2419x->in_current_limit <= 500) {
+ dev_info(bq2419x->dev, "Battery charging with 500mA\n");
+ next_poweron_time = bq2419x->auto_recharge_time_power_off;
+ } else {
+ dev_info(bq2419x->dev, "Battery charging with high current\n");
+ next_poweron_time = bq2419x->wdt_refresh_timeout;
+ }
ret = battery_charging_system_reset_after(bq2419x->bc_dev,
next_poweron_time);
if (ret < 0)
- dev_err(bq2419x->dev,
- "System poweron after %d config failed %d\n",
+ dev_err(dev, "System poweron after %d config failed %d\n",
next_poweron_time, ret);
end:
+ if (next_poweron_time)
+ dev_info(dev, "System-charger will power-ON after %d sec\n",
+ next_poweron_time);
+ else
+ dev_info(bq2419x->dev, "System-charger will not power-ON\n");
+
battery_charging_system_power_on_usb_event(bq2419x->bc_dev);
}
@@ -1770,38 +1778,37 @@ 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;
+ if (!bq2419x->cable_connected)
+ goto end;
ret = bq2419x_reset_wdt(bq2419x, "Suspend");
if (ret < 0)
dev_err(bq2419x->dev, "Reset WDT failed: %d\n", ret);
- switch (bq2419x->chg_status) {
- case BATTERY_CHARGING_DONE:
+ if (bq2419x->chg_status == BATTERY_CHARGING_DONE) {
+ dev_info(bq2419x->dev, "Battery charging done\n");
+ goto end;
+ }
+
+ if (bq2419x->in_current_limit <= 500) {
+ dev_info(bq2419x->dev, "Battery charging with 500mA\n");
next_wakeup = bq2419x->auto_recharge_time_supend;
- break;
- case BATTERY_CHARGING:
- if (bq2419x->disable_suspend_during_charging) {
- dev_err(bq2419x->dev,
- "ERROR: Device suspended during charging\n");
- next_wakeup = bq2419x->auto_recharge_time_supend;
- } else {
- next_wakeup = bq2419x->wdt_refresh_timeout;
- }
- break;
- default:
- break;
+ } else {
+ dev_info(bq2419x->dev, "Battery charging with high current\n");
+ next_wakeup = bq2419x->wdt_refresh_timeout;
}
+ battery_charging_wakeup(bq2419x->bc_dev, next_wakeup);
+end:
if (next_wakeup)
- battery_charging_wakeup(bq2419x->bc_dev, next_wakeup);
+ dev_info(dev, "System-charger will resume after %d sec\n",
+ next_wakeup);
+ else
+ dev_info(dev, "System-charger will not have resume time\n");
- if (next_wakeup == bq2419x->auto_recharge_time_supend)
- goto charge_500;
+ if (next_wakeup == bq2419x->wdt_refresh_timeout)
+ return 0;
- 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);