linux/arch/microblaze/kernel/irq.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
   3 * Copyright (C) 2007-2009 PetaLogix
   4 * Copyright (C) 2006 Atmark Techno, Inc.
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License. See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 */
  10
  11#include <linux/init.h>
  12#include <linux/ftrace.h>
  13#include <linux/kernel.h>
  14#include <linux/hardirq.h>
  15#include <linux/interrupt.h>
  16#include <linux/irqflags.h>
  17#include <linux/seq_file.h>
  18#include <linux/kernel_stat.h>
  19#include <linux/irq.h>
  20#include <linux/irqchip.h>
  21#include <linux/of_irq.h>
  22
  23static u32 concurrent_irq;
  24
  25void __irq_entry do_IRQ(struct pt_regs *regs)
  26{
  27        unsigned int irq;
  28        struct pt_regs *old_regs = set_irq_regs(regs);
  29        trace_hardirqs_off();
  30
  31        irq_enter();
  32        irq = xintc_get_irq();
  33next_irq:
  34        BUG_ON(!irq);
  35        generic_handle_irq(irq);
  36
  37        irq = xintc_get_irq();
  38        if (irq != -1U) {
  39                pr_debug("next irq: %d\n", irq);
  40                ++concurrent_irq;
  41                goto next_irq;
  42        }
  43
  44        irq_exit();
  45        set_irq_regs(old_regs);
  46        trace_hardirqs_on();
  47}
  48
  49void __init init_IRQ(void)
  50{
  51        /* process the entire interrupt tree in one go */
  52        irqchip_init();
  53}
  54