Messages in this thread | | | Date | Sat, 5 Jun 2010 15:56:01 +0200 | Subject | Re: [RFC][PATCH] irq: support IRQ_NESTED_THREAD with non-threaded interrupt handlers | From | Esben Haabendal <> |
| |
I have a board with an I2C PCA9535 chip with two PHY interrupt lines hooked up to. The pca953x driver calls set_irq_nested_thread on all irq's on initialization. The PHY driver then calls request_irq, and has no idea that it should actually be using a threaded handler.
With this patch, the PHY driver is able to work in this scenario without changes (and so should any other driver using request_irq).
/Esben
On Fri, Jun 4, 2010 at 11:46 PM, Thomas Gleixner <tglx@linutronix.de> wrote: > On Fri, 4 Jun 2010, Esben Haabendal wrote: > >> set_irq_nested_thread() might be called by interrupt controller to >> supported nested irq thread handling, and with this change, drivers >> with non-threaded irq handlers can still use the irqs. > > What's the problem you are trying to solve ? The above changelog is > not very useful ? > > Thanks, > > tglx > >> Signed-off-by: Esben Haabendal <eha@doredevelopment.dk> >> --- >> kernel/irq/chip.c | 9 ++++++++- >> kernel/irq/manage.c | 4 +--- >> 2 files changed, 9 insertions(+), 4 deletions(-) >> >> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c >> index b7091d5..8202993 100644 >> --- a/kernel/irq/chip.c >> +++ b/kernel/irq/chip.c >> @@ -405,7 +405,14 @@ void handle_nested_irq(unsigned int irq) >> desc->status |= IRQ_INPROGRESS; >> raw_spin_unlock_irq(&desc->lock); >> >> - action_ret = action->thread_fn(action->irq, action->dev_id); >> + if (desc->status & IRQ_NESTED_THREAD && action->thread_fn) >> + action_ret = action->thread_fn(action->irq, action->dev_id); >> + else { >> + local_irq_disable(); >> + action_ret = action->handler(action->irq, action->dev_id); >> + local_irq_enable(); >> + } >> + >> if (!noirqdebug) >> note_interrupt(irq, desc, action_ret); >> >> diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c >> index 3164ba7..e7bca04 100644 >> --- a/kernel/irq/manage.c >> +++ b/kernel/irq/manage.c >> @@ -681,10 +681,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) >> * Check whether the interrupt nests into another interrupt >> * thread. >> */ >> - nested = desc->status & IRQ_NESTED_THREAD; >> + nested = (desc->status & IRQ_NESTED_THREAD) && new->thread_fn; >> if (nested) { >> - if (!new->thread_fn) >> - return -EINVAL; >> /* >> * Replace the primary handler which was provided from >> * the driver for non nested interrupt handling by the >> -- >> 1.7.1 >> >> >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ >
-- Esben Haabendal, Senior Software Consultant DoréDevelopment ApS, Ved Stranden 1, 9560 Hadsund, DK-Denmark Phone: +45 51 92 53 93, E-mail: eha@doredevelopment.dk WWW: http://www.doredevelopment.dk -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |