#include <linux/irq.h>
#include <linux/random.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <asm/irq_regs.h>
#include <trace/events/irq.h>
#include "internals.h"
#ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
void (*handle_arch_irq)(struct pt_regs *) __ro_after_init;
#endif
void handle_bad_irq(struct irq_desc *desc)
{ … }
EXPORT_SYMBOL_GPL(…);
irqreturn_t no_action(int cpl, void *dev_id)
{ … }
EXPORT_SYMBOL_GPL(…);
static void warn_no_thread(unsigned int irq, struct irqaction *action)
{ … }
void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action)
{ … }
irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc)
{ … }
irqreturn_t handle_irq_event_percpu(struct irq_desc *desc)
{ … }
irqreturn_t handle_irq_event(struct irq_desc *desc)
{ … }
#ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
int __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
{
if (handle_arch_irq)
return -EBUSY;
handle_arch_irq = handle_irq;
return 0;
}
asmlinkage void noinstr generic_handle_arch_irq(struct pt_regs *regs)
{
struct pt_regs *old_regs;
irq_enter();
old_regs = set_irq_regs(regs);
handle_arch_irq(regs);
set_irq_regs(old_regs);
irq_exit();
}
#endif