From baae8496943a8a2cb141f28c005ee5e6d6b19bbc Mon Sep 17 00:00:00 2001 From: David Brownell Date: Mon, 6 Oct 2008 20:37:59 -0700 Subject: [PATCH] twl4030 "subdriver" irq tweaks 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 Signed-off-by: Tony Lindgren --- drivers/i2c/chips/twl4030-madc.c | 10 +++++++++- drivers/input/keyboard/omap-twl4030keypad.c | 11 +++++++++-- drivers/power/twl4030_bci_battery.c | 18 +++++++++++++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/chips/twl4030-madc.c b/drivers/i2c/chips/twl4030-madc.c index bff2554ed2f..c17c7fe9d6d 100644 --- a/drivers/i2c/chips/twl4030-madc.c +++ b/drivers/i2c/chips/twl4030-madc.c @@ -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; diff --git a/drivers/input/keyboard/omap-twl4030keypad.c b/drivers/input/keyboard/omap-twl4030keypad.c index e6b34beda9a..d3e1d2076d3 100644 --- a/drivers/input/keyboard/omap-twl4030keypad.c +++ b/drivers/input/keyboard/omap-twl4030keypad.c @@ -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, ®, 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); diff --git a/drivers/power/twl4030_bci_battery.c b/drivers/power/twl4030_bci_battery.c index 72a018ba4a3..a36eaae3670 100644 --- a/drivers/power/twl4030_bci_battery.c +++ b/drivers/power/twl4030_bci_battery.c @@ -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); -- 2.41.0