Skip to content

Commit

Permalink
pm2301: Update watchdog for pm2xxx support
Browse files Browse the repository at this point in the history
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: Lee Jones <lee.jones@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>
Tested-by: Michel JAOUEN <michel.jaouen@stericsson.com>
Tested-by: Jonas ABERG <jonas.aberg@stericsson.com>
  • Loading branch information
Loic Pallardy authored and Lee Jones committed Jan 23, 2013
1 parent e345500 commit e07a564
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 2 deletions.
6 changes: 6 additions & 0 deletions drivers/power/ab8500_charger.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,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,
Expand Down Expand Up @@ -2953,7 +2955,9 @@ static int 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 */
Expand All @@ -2972,7 +2976,9 @@ static int 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 =
Expand Down
12 changes: 11 additions & 1 deletion drivers/power/abx500_chargalg.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,8 +445,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);
Expand Down
2 changes: 2 additions & 0 deletions drivers/power/pm2301_charger.c
Original file line number Diff line number Diff line change
Expand Up @@ -875,7 +875,9 @@ static int __devinit pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
ARRAY_SIZE(pm2xxx_charger_voltage_map) - 1];
pm2->ac_chg.max_out_curr = pm2xxx_charger_current_map[
ARRAY_SIZE(pm2xxx_charger_current_map) - 1];
pm2->ac_chg.wdt_refresh = WD_KICK_INTERVAL;
pm2->ac_chg.enabled = true;
pm2->ac_chg.external = true;

/* Create a work queue for the charger */
pm2->charger_wq =
Expand Down
2 changes: 1 addition & 1 deletion drivers/power/pm2301_charger.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

/* Watchdog timeout constant */
#define WD_TIMER 0x30 /* 4min */
#define WD_KICK_INTERVAL (60 * HZ)
#define WD_KICK_INTERVAL (30 * HZ)

#define PM2XXX_NUM_INT_REG 0x6

Expand Down
3 changes: 3 additions & 0 deletions include/linux/mfd/abx500/ux500_chargalg.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,16 @@ struct ux500_charger_ops {
* @max_out_volt maximum output charger voltage in mV
* @max_out_curr maximum output charger current in mA
* @enabled indicates if this charger is used or not
* @external external charger unit (pm2xxx)
*/
struct ux500_charger {
struct power_supply psy;
struct ux500_charger_ops ops;
int max_out_volt;
int max_out_curr;
int wdt_refresh;
bool enabled;
bool external;
};

#endif

0 comments on commit e07a564

Please sign in to comment.