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 mutex            lock;
        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/

Reply via email to