diff options
author | Rupesh Kumar <rupesh.kumar@stericsson.com> | 2012-06-28 09:01:19 -0400 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2013-03-06 23:35:43 -0500 |
commit | d4f510f6c3f579bac0dbeaa8dc7c2dc768c31786 (patch) | |
tree | 3b20ee9b707e4e687ef9f4c2fbd1280eb8150ab1 /drivers/power | |
parent | da9e83d496039458fe9863540cf52b3f9b450675 (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.c | 17 |
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 | ||
1116 | free_gpio: | 1122 | free_gpio: |
1117 | gpio_free(pm2->lpn_pin); | 1123 | gpio_free(pm2->lpn_pin); |
1124 | disable_pm2_irq_wake: | ||
1125 | disable_irq_wake(pm2->pdata->irq_number); | ||
1126 | unregister_pm2xxx_interrupt: | ||
1127 | /* disable interrupt */ | ||
1128 | free_irq(pm2->pdata->irq_number, pm2); | ||
1118 | unregister_pm2xxx_charger: | 1129 | unregister_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); |
1126 | free_device_info: | 1137 | free_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 | ||