summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/lp8727_charger.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/drivers/power/lp8727_charger.c b/drivers/power/lp8727_charger.c
index c33532b..134ed5c 100644
--- a/drivers/power/lp8727_charger.c
+++ b/drivers/power/lp8727_charger.c
@@ -90,6 +90,7 @@ struct lp8727_chg {
struct lp8727_chg_param *chg_parm;
enum lp8727_dev_id devid;
unsigned long debounce_jiffies;
+ int irq;
};
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)
return IRQ_HANDLED;
}
-static int lp8727_intr_config(struct lp8727_chg *pchg)
+static int lp8727_setup_irq(struct lp8727_chg *pchg)
{
+ int ret;
+ int irq = pchg->client->irq;
unsigned delay_msec = pchg->pdata ? pchg->pdata->debounce_msec :
DEFAULT_DEBOUNCE_MSEC;
INIT_DELAYED_WORK(&pchg->work, lp8727_delayed_func);
- pchg->debounce_jiffies = msecs_to_jiffies(delay_msec);
+ if (irq <= 0) {
+ dev_warn(pchg->dev, "invalid irq number: %d\n", irq);
+ return 0;
+ }
- return request_threaded_irq(pchg->client->irq,
- NULL,
- lp8727_isr_func,
+ ret = request_threaded_irq(irq, NULL, lp8727_isr_func,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
- "lp8727_irq",
- pchg);
+ "lp8727_irq", pchg);
+
+ if (ret)
+ return ret;
+
+ pchg->irq = irq;
+ pchg->debounce_jiffies = msecs_to_jiffies(delay_msec);
+
+ return 0;
+}
+
+static void lp8727_release_irq(struct lp8727_chg *pchg)
+{
+ cancel_delayed_work_sync(&pchg->work);
+
+ if (pchg->irq)
+ free_irq(pchg->irq, pchg);
}
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)
return ret;
}
- ret = lp8727_intr_config(pchg);
+ ret = lp8727_setup_irq(pchg);
if (ret) {
dev_err(pchg->dev, "irq handler err: %d", ret);
lp8727_unregister_psy(pchg);
@@ -476,7 +495,7 @@ static int __devexit lp8727_remove(struct i2c_client *cl)
{
struct lp8727_chg *pchg = i2c_get_clientdata(cl);
- free_irq(pchg->client->irq, pchg);
+ lp8727_release_irq(pchg);
lp8727_unregister_psy(pchg);
return 0;
}