summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2014-04-21 13:12:22 +0530
committerMandar Padmawar <mpadmawar@nvidia.com>2014-05-07 01:16:33 -0700
commit91bd52d1b1eb9cacee9883bba874f594b314ed65 (patch)
tree6e9c327ce79fef50f9306c55d36f5c81b2f19954 /drivers/power
parentfcc70bdef0421ca438c981155d2ddcd6f02a5124 (diff)
power: bq2419x: reconfigure BQ on the safety timer expire
When safety timer expire, it need to reconfigure all BQ parameter as safety timer expiry reset all values to default. bug 1503606 Change-Id: I17f5a51be99ab7bde28acb18944dec110eee684a Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: http://git-master/r/398769 Reviewed-on: http://git-master/r/405640 GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/bq2419x-charger.c71
1 files changed, 37 insertions, 34 deletions
diff --git a/drivers/power/bq2419x-charger.c b/drivers/power/bq2419x-charger.c
index 4e5f0d7d7a65..057c2646fa14 100644
--- a/drivers/power/bq2419x-charger.c
+++ b/drivers/power/bq2419x-charger.c
@@ -622,6 +622,32 @@ static void bq2419x_wdt_restart_wq(struct work_struct *work)
dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret);
}
+static int bq2419x_reconfigure_charger_param(struct bq2419x_chip *bq2419x,
+ const char *from)
+{
+ int ret;
+
+ dev_info(bq2419x->dev, "Reconfiguring charging param from %s\n", from);
+ ret = bq2419x_watchdog_init(bq2419x, bq2419x->wdt_time_sec, from);
+ if (ret < 0) {
+ dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
+ return ret;
+ }
+
+ ret = bq2419x_charger_init(bq2419x);
+ if (ret < 0) {
+ dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
+ return ret;
+ }
+
+ ret = bq2419x_configure_charging_current(bq2419x,
+ bq2419x->in_current_limit);
+ if (ret < 0) {
+ dev_err(bq2419x->dev, "Current config failed: %d\n", ret);
+ return ret;
+ }
+ return ret;
+}
static int bq2419x_handle_safety_timer_expire(struct bq2419x_chip *bq2419x)
{
@@ -656,6 +682,12 @@ static int bq2419x_handle_safety_timer_expire(struct bq2419x_chip *bq2419x)
dev_err(dev, "PWR_ON_REG update failed %d\n", ret);
return ret;
}
+
+ ret = bq2419x_reconfigure_charger_param(bq2419x, "SAFETY-TIMER_EXPIRE");
+ if (ret < 0) {
+ dev_err(dev, "Reconfig of BQ parm failed: %d\n", ret);
+ return ret;
+ }
return ret;
}
@@ -683,23 +715,9 @@ static irqreturn_t bq2419x_irq(int irq, void *data)
if (val & BQ2419x_FAULT_WATCHDOG_FAULT) {
bq_chg_err(bq2419x, "WatchDog Expired\n");
- ret = bq2419x_watchdog_init(bq2419x,
- bq2419x->wdt_time_sec, "ISR");
- if (ret < 0) {
- dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
- return ret;
- }
-
- ret = bq2419x_charger_init(bq2419x);
- if (ret < 0) {
- dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
- return ret;
- }
-
- ret = bq2419x_configure_charging_current(bq2419x,
- bq2419x->in_current_limit);
+ ret = bq2419x_reconfigure_charger_param(bq2419x, "WDT-EXP-ISR");
if (ret < 0) {
- dev_err(bq2419x->dev, "bq2419x init failed: %d\n", ret);
+ dev_err(bq2419x->dev, "BQ reconfig failed %d\n", ret);
return ret;
}
}
@@ -1785,25 +1803,10 @@ static int bq2419x_resume(struct device *dev)
if (val & BQ2419x_FAULT_WATCHDOG_FAULT) {
bq_chg_err(bq2419x, "Watchdog Timer Expired\n");
- ret = bq2419x_watchdog_init(bq2419x, bq2419x->wdt_time_sec,
- "RESUME");
- if (ret < 0) {
- dev_err(bq2419x->dev, "BQWDT init failed %d\n", ret);
- return ret;
- }
-
- ret = bq2419x_charger_init(bq2419x);
+ ret = bq2419x_reconfigure_charger_param(bq2419x,
+ "WDT-EXP-RESUME");
if (ret < 0) {
- dev_err(bq2419x->dev, "Charger init failed: %d\n", ret);
- return ret;
- }
-
- ret = bq2419x_set_charging_current(bq2419x->chg_rdev,
- bq2419x->last_charging_current,
- bq2419x->last_charging_current);
- if (ret < 0) {
- dev_err(bq2419x->dev,
- "Set charging current failed: %d\n", ret);
+ dev_err(bq2419x->dev, "BQ reconfig failed %d\n", ret);
return ret;
}
} else {