Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756995Ab0FDV1w (ORCPT ); Fri, 4 Jun 2010 17:27:52 -0400 Received: from zmta01.cabocomm.dk ([193.200.44.52]:33724 "EHLO zmta01.irigo.dk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756679Ab0FDV1v (ORCPT ); Fri, 4 Jun 2010 17:27:51 -0400 Subject: [RFC][PATCH] irq: support IRQ_NESTED_THREAD with non-threaded interrupt handlers From: Esben Haabendal To: linux-kernel@vger.kernel.org, maz@misterjones.org, tglx@linutronix.de, mingo@elte.hu, joachim.eastwood@jotron.com Content-Type: text/plain; charset="UTF-8" Organization: =?ISO-8859-1?Q?Dor=E9Development?= ApS Date: Fri, 04 Jun 2010 23:19:12 +0200 Message-ID: <1275686352.2970.2.camel@eha.doredevelopment.dk> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1876 Lines: 56 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. Signed-off-by: Esben Haabendal --- 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/