aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power
diff options
context:
space:
mode:
authorRupesh Kumar <rupesh.kumar@stericsson.com>2012-06-28 09:01:19 -0400
committerLee Jones <lee.jones@linaro.org>2013-03-06 23:35:43 -0500
commitd4f510f6c3f579bac0dbeaa8dc7c2dc768c31786 (patch)
tree3b20ee9b707e4e687ef9f4c2fbd1280eb8150ab1 /drivers/power
parentda9e83d496039458fe9863540cf52b3f9b450675 (diff)
pm2301-charger: Wake system when ext charger is plugged-in
When in suspend state, upon plug-in of external AC charger the device needs to wake-up and charging operation started. Signed-off-by: Rupesh Kumar <rupesh.kumar@stericsson.com> Signed-off-by: Lee Jones <lee.jones@linaro.org> Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/pm2301_charger.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/power/pm2301_charger.c b/drivers/power/pm2301_charger.c
index ae647c41c535..b8eafc3850d0 100644
--- a/drivers/power/pm2301_charger.c
+++ b/drivers/power/pm2301_charger.c
@@ -1072,6 +1072,12 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
1072 pm2xxx_charger_irq[0].name, pm2->pdata->irq_number, ret); 1072 pm2xxx_charger_irq[0].name, pm2->pdata->irq_number, ret);
1073 goto unregister_pm2xxx_charger; 1073 goto unregister_pm2xxx_charger;
1074 } 1074 }
1075 /* pm interrupt can wake up system */
1076 ret = enable_irq_wake(pm2->pdata->irq_number);
1077 if (ret) {
1078 dev_err(pm2->dev, "failed to set irq wake\n");
1079 goto unregister_pm2xxx_interrupt;
1080 }
1075 1081
1076 /*Initialize lock*/ 1082 /*Initialize lock*/
1077 mutex_init(&pm2->lock); 1083 mutex_init(&pm2->lock);
@@ -1084,7 +1090,7 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
1084 ret = gpio_request(pm2->lpn_pin, "pm2301_lpm_gpio"); 1090 ret = gpio_request(pm2->lpn_pin, "pm2301_lpm_gpio");
1085 if (ret < 0) { 1091 if (ret < 0) {
1086 dev_err(pm2->dev, "pm2301_lpm_gpio request failed\n"); 1092 dev_err(pm2->dev, "pm2301_lpm_gpio request failed\n");
1087 goto unregister_pm2xxx_charger; 1093 goto disable_pm2_irq_wake;
1088 } 1094 }
1089 ret = gpio_direction_output(pm2->lpn_pin, 0); 1095 ret = gpio_direction_output(pm2->lpn_pin, 0);
1090 if (ret < 0) { 1096 if (ret < 0) {
@@ -1115,6 +1121,11 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
1115 1121
1116free_gpio: 1122free_gpio:
1117 gpio_free(pm2->lpn_pin); 1123 gpio_free(pm2->lpn_pin);
1124disable_pm2_irq_wake:
1125 disable_irq_wake(pm2->pdata->irq_number);
1126unregister_pm2xxx_interrupt:
1127 /* disable interrupt */
1128 free_irq(pm2->pdata->irq_number, pm2);
1118unregister_pm2xxx_charger: 1129unregister_pm2xxx_charger:
1119 /* unregister power supply */ 1130 /* unregister power supply */
1120 power_supply_unregister(&pm2->ac_chg.psy); 1131 power_supply_unregister(&pm2->ac_chg.psy);
@@ -1125,6 +1136,7 @@ free_charger_wq:
1125 destroy_workqueue(pm2->charger_wq); 1136 destroy_workqueue(pm2->charger_wq);
1126free_device_info: 1137free_device_info:
1127 kfree(pm2); 1138 kfree(pm2);
1139
1128 return ret; 1140 return ret;
1129} 1141}
1130 1142
@@ -1135,6 +1147,9 @@ static int pm2xxx_wall_charger_remove(struct i2c_client *i2c_client)
1135 /* Disable AC charging */ 1147 /* Disable AC charging */
1136 pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0); 1148 pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0);
1137 1149
1150 /* Disable wake by pm interrupt */
1151 disable_irq_wake(pm2->pdata->irq_number);
1152
1138 /* Disable interrupts */ 1153 /* Disable interrupts */
1139 free_irq(pm2->pdata->irq_number, pm2); 1154 free_irq(pm2->pdata->irq_number, pm2);
1140 1155