lkml.org 
[lkml]   [2011]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 17/23] arm: at91: Cleanup irq chip
    Avoid the whole lazy disable dance in the demux handler by providing a
    irq_disable() callback.

    Use the proper accessor functions and tidy up gpio_irq_handler()

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/arm/mach-at91/gpio.c | 31 +++++++++----------------------
    1 file changed, 9 insertions(+), 22 deletions(-)

    Index: linux-2.6-tip/arch/arm/mach-at91/gpio.c
    ===================================================================
    --- linux-2.6-tip.orig/arch/arm/mach-at91/gpio.c
    +++ linux-2.6-tip/arch/arm/mach-at91/gpio.c
    @@ -375,6 +375,7 @@ static int gpio_irq_type(struct irq_data

    static struct irq_chip gpio_irqchip = {
    .name = "GPIO",
    + .irq_disable = gpio_irq_mask,
    .irq_mask = gpio_irq_mask,
    .irq_unmask = gpio_irq_unmask,
    .irq_set_type = gpio_irq_type,
    @@ -384,16 +385,14 @@ static struct irq_chip gpio_irqchip = {
    static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)
    {
    unsigned pin;
    - struct irq_desc *gpio;
    - struct at91_gpio_chip *at91_gpio;
    - void __iomem *pio;
    + struct irq_data *idata = irq_desc_get_irq_data(desc);
    + struct irq_chip *chip = irq_data_get_chip(data);
    + struct at91_gpio_chip *at91_gpio = irq_data_get_chip_data(data);
    + void __iomem *pio = at91_gpio->regbase;
    u32 isr;

    - at91_gpio = get_irq_chip_data(irq);
    - pio = at91_gpio->regbase;
    -
    /* temporarily mask (level sensitive) parent IRQ */
    - desc->irq_data.chip->irq_ack(&desc->irq_data);
    + chip->irq_ack(idata);
    for (;;) {
    /* Reading ISR acks pending (edge triggered) GPIO interrupts.
    * When there none are pending, we're finished unless we need
    @@ -409,27 +408,15 @@ static void gpio_irq_handler(unsigned ir
    }

    pin = at91_gpio->chip.base;
    - gpio = &irq_desc[pin];

    while (isr) {
    - if (isr & 1) {
    - if (unlikely(gpio->depth)) {
    - /*
    - * The core ARM interrupt handler lazily disables IRQs so
    - * another IRQ must be generated before it actually gets
    - * here to be disabled on the GPIO controller.
    - */
    - gpio_irq_mask(irq_get_irq_data(pin));
    - }
    - else
    - generic_handle_irq(pin);
    - }
    + if (isr & 1)
    + generic_handle_irq(pin);
    pin++;
    - gpio++;
    isr >>= 1;
    }
    }
    - desc->irq_data.chip->irq_unmask(&desc->irq_data);
    + chip->irq_unmask(idata);
    /* now it may re-trigger */
    }




    \
     
     \ /
      Last update: 2011-03-25 14:25    [W:0.022 / U:0.116 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site