summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLoic Pallardy <loic.pallardy@stericsson.com>2012-05-10 15:33:56 +0200
committerMathieu J. Poirier <mathieu.poirier@linaro.org>2012-09-25 09:37:07 -0600
commit596d6b85f4d090e5c6bccf340ae6243e4cbf9f9e (patch)
treedb19bd6f64e031b5d37427246d3d5b04ca2785a5 /drivers/power
parent47e2c3614e58a71d8c62c6c8950e9d1eeaec8ce8 (diff)
power: charge: update watchdog for pm2xxx support
AB and PMxxx doesn't have same watchdog refresh period Add watchdog to refresh period parameters in x500 charger structure, this should kick watchdog every 30sec. The AC charging should also kick both pm2xxx and the AB charger watchdog. Signed-off-by: Rajkumar Kasirajan <rajkumar.kasirajan@stericsson.com> Signed-off-by: Loic Pallardy <loic.pallardy@stericsson.com> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Reviewed-by: Michel JAOUEN <michel.jaouen@stericsson.com> Reviewed-by: Marcus COOPER <marcus.xm.cooper@stericsson.com> Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/ab8500_charger.c6
-rw-r--r--drivers/power/abx500_chargalg.c23
2 files changed, 27 insertions, 2 deletions
diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c
index 3100f1144f04..4129599b1949 100644
--- a/drivers/power/ab8500_charger.c
+++ b/drivers/power/ab8500_charger.c
@@ -90,6 +90,8 @@
#define CHARGER_STATUS_POLL 10 /* in ms */
+#define CHG_WD_INTERVAL (60 * HZ)
+
/* UsbLineStatus register - usb types */
enum ab8500_charger_link_status {
USB_STAT_NOT_CONFIGURED,
@@ -2945,7 +2947,9 @@ static int __devinit ab8500_charger_probe(struct platform_device *pdev)
ARRAY_SIZE(ab8500_charger_voltage_map) - 1];
di->ac_chg.max_out_curr = ab8500_charger_current_map[
ARRAY_SIZE(ab8500_charger_current_map) - 1];
+ di->ac_chg.wdt_refresh = CHG_WD_INTERVAL;
di->ac_chg.enabled = di->pdata->ac_enabled;
+ di->ac_chg.external = false;
/* USB supply */
/* power_supply base class */
@@ -2964,7 +2968,9 @@ static int __devinit ab8500_charger_probe(struct platform_device *pdev)
ARRAY_SIZE(ab8500_charger_voltage_map) - 1];
di->usb_chg.max_out_curr = ab8500_charger_current_map[
ARRAY_SIZE(ab8500_charger_current_map) - 1];
+ di->usb_chg.wdt_refresh = CHG_WD_INTERVAL;
di->usb_chg.enabled = di->pdata->usb_enabled;
+ di->usb_chg.external = false;
/* Create a work queue for the charger */
di->charger_wq =
diff --git a/drivers/power/abx500_chargalg.c b/drivers/power/abx500_chargalg.c
index ca87cb2dfefc..d3efc2abac2a 100644
--- a/drivers/power/abx500_chargalg.c
+++ b/drivers/power/abx500_chargalg.c
@@ -453,8 +453,18 @@ static int abx500_chargalg_kick_watchdog(struct abx500_chargalg *di)
{
/* Check if charger exists and kick watchdog if charging */
if (di->ac_chg && di->ac_chg->ops.kick_wd &&
- di->chg_info.online_chg & AC_CHG)
+ di->chg_info.online_chg & AC_CHG) {
+ /*
+ * If AB charger watchdog expired, pm2xxx charging
+ * gets disabled. To be safe, kick both AB charger watchdog
+ * and pm2xxx watchdog.
+ */
+ if (di->ac_chg->external &&
+ di->usb_chg && di->usb_chg->ops.kick_wd)
+ di->usb_chg->ops.kick_wd(di->usb_chg);
+
return di->ac_chg->ops.kick_wd(di->ac_chg);
+ }
else if (di->usb_chg && di->usb_chg->ops.kick_wd &&
di->chg_info.online_chg & USB_CHG)
return di->usb_chg->ops.kick_wd(di->usb_chg);
@@ -1591,6 +1601,8 @@ static void abx500_chargalg_periodic_work(struct work_struct *work)
static void abx500_chargalg_wd_work(struct work_struct *work)
{
int ret;
+ int refresh_time;
+
struct abx500_chargalg *di = container_of(work,
struct abx500_chargalg, chargalg_wd_work.work);
@@ -1600,8 +1612,15 @@ static void abx500_chargalg_wd_work(struct work_struct *work)
if (ret < 0)
dev_err(di->dev, "failed to kick watchdog\n");
+ if (di->chg_info.online_chg & AC_CHG)
+ refresh_time = di->ac_chg->wdt_refresh;
+ else if (di->chg_info.online_chg & USB_CHG)
+ refresh_time = di->usb_chg->wdt_refresh;
+ else
+ refresh_time = CHG_WD_INTERVAL;
+
queue_delayed_work(di->chargalg_wq,
- &di->chargalg_wd_work, CHG_WD_INTERVAL);
+ &di->chargalg_wd_work, refresh_time);
}
/**