diff options
-rw-r--r-- | drivers/power/pda_power.c | 80 |
1 files changed, 44 insertions, 36 deletions
diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c index c058f285be1a..d98622f9f31d 100644 --- a/drivers/power/pda_power.c +++ b/drivers/power/pda_power.c | |||
@@ -168,66 +168,74 @@ static int pda_power_probe(struct platform_device *pdev) | |||
168 | pda_power_supplies[1].num_supplicants = pdata->num_supplicants; | 168 | pda_power_supplies[1].num_supplicants = pdata->num_supplicants; |
169 | } | 169 | } |
170 | 170 | ||
171 | ret = power_supply_register(&pdev->dev, &pda_power_supplies[0]); | 171 | if (pdata->is_ac_online) { |
172 | if (ret) { | 172 | ret = power_supply_register(&pdev->dev, &pda_power_supplies[0]); |
173 | dev_err(dev, "failed to register %s power supply\n", | 173 | if (ret) { |
174 | pda_power_supplies[0].name); | 174 | dev_err(dev, "failed to register %s power supply\n", |
175 | goto supply0_failed; | 175 | pda_power_supplies[0].name); |
176 | } | 176 | goto ac_supply_failed; |
177 | } | ||
177 | 178 | ||
178 | ret = power_supply_register(&pdev->dev, &pda_power_supplies[1]); | 179 | if (ac_irq) { |
179 | if (ret) { | 180 | ret = request_irq(ac_irq->start, power_changed_isr, |
180 | dev_err(dev, "failed to register %s power supply\n", | 181 | get_irq_flags(ac_irq), ac_irq->name, |
181 | pda_power_supplies[1].name); | 182 | &pda_power_supplies[0]); |
182 | goto supply1_failed; | 183 | if (ret) { |
184 | dev_err(dev, "request ac irq failed\n"); | ||
185 | goto ac_irq_failed; | ||
186 | } | ||
187 | } | ||
183 | } | 188 | } |
184 | 189 | ||
185 | if (ac_irq) { | 190 | if (pdata->is_usb_online) { |
186 | ret = request_irq(ac_irq->start, power_changed_isr, | 191 | ret = power_supply_register(&pdev->dev, &pda_power_supplies[1]); |
187 | get_irq_flags(ac_irq), ac_irq->name, | ||
188 | &pda_power_supplies[0]); | ||
189 | if (ret) { | 192 | if (ret) { |
190 | dev_err(dev, "request ac irq failed\n"); | 193 | dev_err(dev, "failed to register %s power supply\n", |
191 | goto ac_irq_failed; | 194 | pda_power_supplies[1].name); |
195 | goto usb_supply_failed; | ||
192 | } | 196 | } |
193 | } | ||
194 | 197 | ||
195 | if (usb_irq) { | 198 | if (usb_irq) { |
196 | ret = request_irq(usb_irq->start, power_changed_isr, | 199 | ret = request_irq(usb_irq->start, power_changed_isr, |
197 | get_irq_flags(usb_irq), usb_irq->name, | 200 | get_irq_flags(usb_irq), |
198 | &pda_power_supplies[1]); | 201 | usb_irq->name, |
199 | if (ret) { | 202 | &pda_power_supplies[1]); |
200 | dev_err(dev, "request usb irq failed\n"); | 203 | if (ret) { |
201 | goto usb_irq_failed; | 204 | dev_err(dev, "request usb irq failed\n"); |
205 | goto usb_irq_failed; | ||
206 | } | ||
202 | } | 207 | } |
203 | } | 208 | } |
204 | 209 | ||
205 | goto success; | 210 | return 0; |
206 | 211 | ||
207 | usb_irq_failed: | 212 | usb_irq_failed: |
208 | if (ac_irq) | 213 | if (pdata->is_usb_online) |
214 | power_supply_unregister(&pda_power_supplies[1]); | ||
215 | usb_supply_failed: | ||
216 | if (pdata->is_ac_online && ac_irq) | ||
209 | free_irq(ac_irq->start, &pda_power_supplies[0]); | 217 | free_irq(ac_irq->start, &pda_power_supplies[0]); |
210 | ac_irq_failed: | 218 | ac_irq_failed: |
211 | power_supply_unregister(&pda_power_supplies[1]); | 219 | if (pdata->is_ac_online) |
212 | supply1_failed: | 220 | power_supply_unregister(&pda_power_supplies[0]); |
213 | power_supply_unregister(&pda_power_supplies[0]); | 221 | ac_supply_failed: |
214 | supply0_failed: | ||
215 | noirqs: | 222 | noirqs: |
216 | wrongid: | 223 | wrongid: |
217 | success: | ||
218 | return ret; | 224 | return ret; |
219 | } | 225 | } |
220 | 226 | ||
221 | static int pda_power_remove(struct platform_device *pdev) | 227 | static int pda_power_remove(struct platform_device *pdev) |
222 | { | 228 | { |
223 | if (usb_irq) | 229 | if (pdata->is_usb_online && usb_irq) |
224 | free_irq(usb_irq->start, &pda_power_supplies[1]); | 230 | free_irq(usb_irq->start, &pda_power_supplies[1]); |
225 | if (ac_irq) | 231 | if (pdata->is_ac_online && ac_irq) |
226 | free_irq(ac_irq->start, &pda_power_supplies[0]); | 232 | free_irq(ac_irq->start, &pda_power_supplies[0]); |
227 | del_timer_sync(&charger_timer); | 233 | del_timer_sync(&charger_timer); |
228 | del_timer_sync(&supply_timer); | 234 | del_timer_sync(&supply_timer); |
229 | power_supply_unregister(&pda_power_supplies[1]); | 235 | if (pdata->is_usb_online) |
230 | power_supply_unregister(&pda_power_supplies[0]); | 236 | power_supply_unregister(&pda_power_supplies[1]); |
237 | if (pdata->is_ac_online) | ||
238 | power_supply_unregister(&pda_power_supplies[0]); | ||
231 | return 0; | 239 | return 0; |
232 | } | 240 | } |
233 | 241 | ||