diff options
-rw-r--r-- | drivers/power/lp8727_charger.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/drivers/power/lp8727_charger.c b/drivers/power/lp8727_charger.c index c33532bbb9c7..134ed5c7dde5 100644 --- a/drivers/power/lp8727_charger.c +++ b/drivers/power/lp8727_charger.c | |||
@@ -90,6 +90,7 @@ struct lp8727_chg { | |||
90 | struct lp8727_chg_param *chg_parm; | 90 | struct lp8727_chg_param *chg_parm; |
91 | enum lp8727_dev_id devid; | 91 | enum lp8727_dev_id devid; |
92 | unsigned long debounce_jiffies; | 92 | unsigned long debounce_jiffies; |
93 | int irq; | ||
93 | }; | 94 | }; |
94 | 95 | ||
95 | static int lp8727_read_bytes(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len) | 96 | static int lp8727_read_bytes(struct lp8727_chg *pchg, u8 reg, u8 *data, u8 len) |
@@ -241,21 +242,39 @@ static irqreturn_t lp8727_isr_func(int irq, void *ptr) | |||
241 | return IRQ_HANDLED; | 242 | return IRQ_HANDLED; |
242 | } | 243 | } |
243 | 244 | ||
244 | static int lp8727_intr_config(struct lp8727_chg *pchg) | 245 | static int lp8727_setup_irq(struct lp8727_chg *pchg) |
245 | { | 246 | { |
247 | int ret; | ||
248 | int irq = pchg->client->irq; | ||
246 | unsigned delay_msec = pchg->pdata ? pchg->pdata->debounce_msec : | 249 | unsigned delay_msec = pchg->pdata ? pchg->pdata->debounce_msec : |
247 | DEFAULT_DEBOUNCE_MSEC; | 250 | DEFAULT_DEBOUNCE_MSEC; |
248 | 251 | ||
249 | INIT_DELAYED_WORK(&pchg->work, lp8727_delayed_func); | 252 | INIT_DELAYED_WORK(&pchg->work, lp8727_delayed_func); |
250 | 253 | ||
251 | pchg->debounce_jiffies = msecs_to_jiffies(delay_msec); | 254 | if (irq <= 0) { |
255 | dev_warn(pchg->dev, "invalid irq number: %d\n", irq); | ||
256 | return 0; | ||
257 | } | ||
252 | 258 | ||
253 | return request_threaded_irq(pchg->client->irq, | 259 | ret = request_threaded_irq(irq, NULL, lp8727_isr_func, |
254 | NULL, | ||
255 | lp8727_isr_func, | ||
256 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, | 260 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, |
257 | "lp8727_irq", | 261 | "lp8727_irq", pchg); |
258 | pchg); | 262 | |
263 | if (ret) | ||
264 | return ret; | ||
265 | |||
266 | pchg->irq = irq; | ||
267 | pchg->debounce_jiffies = msecs_to_jiffies(delay_msec); | ||
268 | |||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | static void lp8727_release_irq(struct lp8727_chg *pchg) | ||
273 | { | ||
274 | cancel_delayed_work_sync(&pchg->work); | ||
275 | |||
276 | if (pchg->irq) | ||
277 | free_irq(pchg->irq, pchg); | ||
259 | } | 278 | } |
260 | 279 | ||
261 | static enum power_supply_property lp8727_charger_prop[] = { | 280 | static enum power_supply_property lp8727_charger_prop[] = { |
@@ -462,7 +481,7 @@ static int lp8727_probe(struct i2c_client *cl, const struct i2c_device_id *id) | |||
462 | return ret; | 481 | return ret; |
463 | } | 482 | } |
464 | 483 | ||
465 | ret = lp8727_intr_config(pchg); | 484 | ret = lp8727_setup_irq(pchg); |
466 | if (ret) { | 485 | if (ret) { |
467 | dev_err(pchg->dev, "irq handler err: %d", ret); | 486 | dev_err(pchg->dev, "irq handler err: %d", ret); |
468 | lp8727_unregister_psy(pchg); | 487 | lp8727_unregister_psy(pchg); |
@@ -476,7 +495,7 @@ static int __devexit lp8727_remove(struct i2c_client *cl) | |||
476 | { | 495 | { |
477 | struct lp8727_chg *pchg = i2c_get_clientdata(cl); | 496 | struct lp8727_chg *pchg = i2c_get_clientdata(cl); |
478 | 497 | ||
479 | free_irq(pchg->client->irq, pchg); | 498 | lp8727_release_irq(pchg); |
480 | lp8727_unregister_psy(pchg); | 499 | lp8727_unregister_psy(pchg); |
481 | return 0; | 500 | return 0; |
482 | } | 501 | } |