twl4030 "subdriver" irq tweaks
authorDavid Brownell <dbrownell@users.sourceforge.net>
Tue, 7 Oct 2008 03:37:59 +0000 (20:37 -0700)
committerTony Lindgren <tony@atomide.com>
Tue, 7 Oct 2008 08:35:09 +0000 (11:35 +0300)
Bugfixes to TWL subdriver irq handler setup ... lockdep
workarounds, remove IRQF_DISABLED.  NOPs with current code.

These changes are specific to the drivers which register
directly with the PIH irq_chip (in twl4030-core), and are
prerequsites to a cleanup patch for that PIH infrastructure.
(Unless you don't use these drivers.)

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/i2c/chips/twl4030-madc.c
drivers/input/keyboard/omap-twl4030keypad.c
drivers/power/twl4030_bci_battery.c

index bff2554..c17c7fe 100644 (file)
@@ -148,6 +148,14 @@ static irqreturn_t twl4030_madc_irq_handler(int irq, void *_madc)
        u8 isr_val, imr_val;
        int i;
 
+#ifdef CONFIG_LOCKDEP
+       /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
+        * we don't want and can't tolerate.  Although it might be
+        * friendlier not to borrow this thread context...
+        */
+       local_irq_enable();
+#endif
+
        /* Use COR to ack interrupts since we have no shared IRQs in ISRx */
        isr_val = twl4030_madc_read(madc, madc->isr);
        imr_val = twl4030_madc_read(madc, madc->imr);
@@ -451,7 +459,7 @@ static int __init twl4030_madc_probe(struct platform_device *pdev)
                                   regval, TWL4030_BCI_BCICTL1);
 
        ret = request_irq(TWL4030_MODIRQ_MADC, twl4030_madc_irq_handler,
-                         IRQF_DISABLED, "twl4030_madc", madc);
+                         0, "twl4030_madc", madc);
        if (ret) {
                dev_dbg(&pdev->dev, "could not request irq\n");
                goto err_irq;
index e6b34be..d3e1d20 100644 (file)
@@ -208,6 +208,14 @@ static irqreturn_t do_kp_irq(int irq, void *_kp)
        u8 reg;
        int ret;
 
+#ifdef CONFIG_LOCKDEP
+       /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
+        * we don't want and can't tolerate.  Although it might be
+        * friendlier not to borrow this thread context...
+        */
+       local_irq_enable();
+#endif
+
        /* Read & Clear TWL4030 pending interrupt */
        ret = twl4030_kpread(kp, TWL4030_MODULE_KEYPAD, &reg, KEYP_ISR1, 1);
 
@@ -340,8 +348,7 @@ static int __init omap_kp_probe(struct platform_device *pdev)
         * This ISR will always execute in kernel thread context because of
         * the need to access the TWL4030 over the I2C bus.
         */
-       ret = request_irq(kp->irq, do_kp_irq, IRQF_DISABLED,
-                       "TWL4030 Keypad", kp);
+       ret = request_irq(kp->irq, do_kp_irq, 0, pdev->name, kp);
        if (ret < 0) {
                dev_info(kp->dbg_dev, "request_irq failed for irq no=%d\n",
                        kp->irq);
index 72a018b..a36eaae 100644 (file)
@@ -210,6 +210,14 @@ static irqreturn_t twl4030charger_interrupt(int irq, void *_di)
 {
        struct twl4030_bci_device_info *di = _di;
 
+#ifdef CONFIG_LOCKDEP
+       /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
+        * we don't want and can't tolerate.  Although it might be
+        * friendlier not to borrow this thread context...
+        */
+       local_irq_enable();
+#endif
+
        twl4030charger_presence_evt();
        power_supply_changed(&di->bat);
 
@@ -310,6 +318,14 @@ static irqreturn_t twl4030battery_interrupt(int irq, void *_di)
        u8 isr1a_val, isr2a_val, clear_2a, clear_1a;
        int ret;
 
+#ifdef CONFIG_LOCKDEP
+       /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
+        * we don't want and can't tolerate.  Although it might be
+        * friendlier not to borrow this thread context...
+        */
+       local_irq_enable();
+#endif
+
        ret = twl4030_i2c_read_u8(TWL4030_MODULE_INTERRUPTS, &isr1a_val,
                                REG_BCIISR1A);
        if (ret)
@@ -943,7 +959,7 @@ static int __init twl4030_bci_battery_probe(struct platform_device *pdev)
 
        /* request BCI interruption */
        ret = request_irq(TWL4030_MODIRQ_BCI, twl4030battery_interrupt,
-               IRQF_DISABLED, pdev->name, NULL);
+               0, pdev->name, NULL);
        if (ret) {
                dev_dbg(&pdev->dev, "could not request irq %d, status %d\n",
                        TWL4030_MODIRQ_BCI, ret);