lkml.org 
[lkml]   [2010]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [RFC][PATCH] irq: support IRQ_NESTED_THREAD with non-threaded interrupt handlers
    From
    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/

    \
     
     \ /
      Last update: 2010-06-05 15:59    [W:0.026 / U:61.596 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site