[PATCH v2 03/15] mfd: menelaus: Convert to threaded irq
we don't need that extra workqueue when we have generic threaded irq handlers support. Signed-off-by: Felipe Balbi --- drivers/mfd/menelaus.c | 29 - 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/drivers/mfd/menelaus.c b/drivers/mfd/menelaus.c index 8bd97ca..11d7d81 100644 --- a/drivers/mfd/menelaus.c +++ b/drivers/mfd/menelaus.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -161,12 +160,9 @@ #define MCT_PIN_ST_S1_CD_ST(1 << 0) #define MCT_PIN_ST_S2_CD_ST(1 << 1) -static void menelaus_work(struct work_struct *_menelaus); - struct menelaus_chip { struct mutexlock; struct i2c_client *client; - struct work_struct work; #ifdef CONFIG_RTC_DRV_TWL92330 struct rtc_device *rtc; u8 rtc_control; @@ -795,11 +791,9 @@ out: /*---*/ -/* Handles Menelaus interrupts. Does not run in interrupt context */ -static void menelaus_work(struct work_struct *_menelaus) +static irqreturn_t menelaus_irq(int irq, void *_menelaus) { - struct menelaus_chip *menelaus = - container_of(_menelaus, struct menelaus_chip, work); + struct menelaus_chip *menelaus = _menelaus; void (*handler)(struct menelaus_chip *menelaus); while (1) { @@ -826,18 +820,6 @@ static void menelaus_work(struct work_struct *_menelaus) mutex_unlock(>lock); } } - enable_irq(menelaus->client->irq); -} - -/* - * We cannot use I2C in interrupt context, so we just schedule work. - */ -static irqreturn_t menelaus_irq(int irq, void *_menelaus) -{ - struct menelaus_chip *menelaus = _menelaus; - - disable_irq_nosync(irq); - (void)schedule_work(>work); return IRQ_HANDLED; } @@ -1225,8 +1207,8 @@ static int menelaus_probe(struct i2c_client *client, menelaus_write_reg(MENELAUS_MCT_CTRL1, 0x73); if (client->irq > 0) { - err = request_irq(client->irq, menelaus_irq, 0, - DRIVER_NAME, menelaus); + err = request_threaded_irq(client->irq, NULL, menelaus_irq, + IRQF_ONESHOT, DRIVER_NAME, menelaus); if (err) { dev_dbg(>dev, "can't get IRQ %d, err %d\n", client->irq, err); @@ -1235,7 +1217,6 @@ static int menelaus_probe(struct i2c_client *client, } mutex_init(>lock); - INIT_WORK(>work, menelaus_work); pr_info("Menelaus rev %d.%d\n", rev >> 4, rev & 0x0f); @@ -1258,7 +1239,6 @@ static int menelaus_probe(struct i2c_client *client, return 0; fail: free_irq(client->irq, menelaus); - flush_work(>work); return err; } @@ -1267,7 +1247,6 @@ static int menelaus_remove(struct i2c_client *client) struct menelaus_chip*menelaus = i2c_get_clientdata(client); free_irq(client->irq, menelaus); - flush_work(>work); the_menelaus = NULL; return 0; } -- 1.8.4.GIT -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH v2 03/15] mfd: menelaus: Convert to threaded irq
we don't need that extra workqueue when we have generic threaded irq handlers support. Signed-off-by: Felipe Balbi ba...@ti.com --- drivers/mfd/menelaus.c | 29 - 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/drivers/mfd/menelaus.c b/drivers/mfd/menelaus.c index 8bd97ca..11d7d81 100644 --- a/drivers/mfd/menelaus.c +++ b/drivers/mfd/menelaus.c @@ -36,7 +36,6 @@ #include linux/interrupt.h #include linux/sched.h #include linux/mutex.h -#include linux/workqueue.h #include linux/delay.h #include linux/rtc.h #include linux/bcd.h @@ -161,12 +160,9 @@ #define MCT_PIN_ST_S1_CD_ST(1 0) #define MCT_PIN_ST_S2_CD_ST(1 1) -static void menelaus_work(struct work_struct *_menelaus); - struct menelaus_chip { struct mutexlock; struct i2c_client *client; - struct work_struct work; #ifdef CONFIG_RTC_DRV_TWL92330 struct rtc_device *rtc; u8 rtc_control; @@ -795,11 +791,9 @@ out: /*---*/ -/* Handles Menelaus interrupts. Does not run in interrupt context */ -static void menelaus_work(struct work_struct *_menelaus) +static irqreturn_t menelaus_irq(int irq, void *_menelaus) { - struct menelaus_chip *menelaus = - container_of(_menelaus, struct menelaus_chip, work); + struct menelaus_chip *menelaus = _menelaus; void (*handler)(struct menelaus_chip *menelaus); while (1) { @@ -826,18 +820,6 @@ static void menelaus_work(struct work_struct *_menelaus) mutex_unlock(menelaus-lock); } } - enable_irq(menelaus-client-irq); -} - -/* - * We cannot use I2C in interrupt context, so we just schedule work. - */ -static irqreturn_t menelaus_irq(int irq, void *_menelaus) -{ - struct menelaus_chip *menelaus = _menelaus; - - disable_irq_nosync(irq); - (void)schedule_work(menelaus-work); return IRQ_HANDLED; } @@ -1225,8 +1207,8 @@ static int menelaus_probe(struct i2c_client *client, menelaus_write_reg(MENELAUS_MCT_CTRL1, 0x73); if (client-irq 0) { - err = request_irq(client-irq, menelaus_irq, 0, - DRIVER_NAME, menelaus); + err = request_threaded_irq(client-irq, NULL, menelaus_irq, + IRQF_ONESHOT, DRIVER_NAME, menelaus); if (err) { dev_dbg(client-dev, can't get IRQ %d, err %d\n, client-irq, err); @@ -1235,7 +1217,6 @@ static int menelaus_probe(struct i2c_client *client, } mutex_init(menelaus-lock); - INIT_WORK(menelaus-work, menelaus_work); pr_info(Menelaus rev %d.%d\n, rev 4, rev 0x0f); @@ -1258,7 +1239,6 @@ static int menelaus_probe(struct i2c_client *client, return 0; fail: free_irq(client-irq, menelaus); - flush_work(menelaus-work); return err; } @@ -1267,7 +1247,6 @@ static int menelaus_remove(struct i2c_client *client) struct menelaus_chip*menelaus = i2c_get_clientdata(client); free_irq(client-irq, menelaus); - flush_work(menelaus-work); the_menelaus = NULL; return 0; } -- 1.8.4.GIT -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/