• Marc Zyngier's avatar
    genirq: Introduce request_any_context_irq() · ae731f8d
    Marc Zyngier authored
    Now that we enjoy threaded interrupts, we're starting to see irq_chip
    implementations (wm831x, pca953x) that make use of threaded interrupts
    for the controller, and nested interrupts for the client interrupt. It
    all works very well, with one drawback:
    
    Drivers requesting an IRQ must now know whether the handler will
    run in a thread context or not, and call request_threaded_irq() or
    request_irq() accordingly.
    
    The problem is that the requesting driver sometimes doesn't know
    about the nature of the interrupt, specially when the interrupt
    controller is a discrete chip (typically a GPIO expander connected
    over I2C) that can be connected to a wide variety of otherwise perfectly
    supported hardware.
    
    This patch introduces the request_any_context_irq() function that mostly
    mimics the usual request_irq(), except that it checks whether the irq
    level is configured as nested or not, and calls the right backend.
    On success, it also returns either IRQC_IS_HARDIRQ or IRQC_IS_NESTED.
    
    [ tglx: Made return value an enum, simplified code and made the export
      	of request_any_context_irq GPL ]
    Signed-off-by: default avatarMarc Zyngier <maz@misterjones.org>
    Cc: <joachim.eastwood@jotron.com>
    LKML-Reference: <927ea285bd0c68934ddae1a47e44a9ba@localhost>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    ae731f8d
manage.c 29 KB