Linux IRQ have 3 important structures, they are :
1.
include/linux/irq.h
struct
irq_desc{
unsigned int irq;
struct irq_chip
*chip;
struct irqaction *action;
......
};
2.
include/linux/irq.h
struct irq_chip{
const char *name;
unsigned int (*startup)(unsigned int irq);
unsigned int
(*shutdown)(unsigned int irq);
......
};
3.
include/linux/interrupt.h
struct irqaction{
irq_handler_t handler; //user define
function
void *dev_id;
struct irqaction
*next;
......;
};
------------------------------
The follow is Linux IRQ initailization process:
1).init/main.c
start_kernel() ----> setup_arch()
start_kernel() ----> Init_IRQ()
2).arch/arm/kernel/irq.c
init_IRQ() ----> init_arch_irq()
3).arch/arm/kernel/setup.c
setup_arch() ----> init_arch_irq = mdesc->init_irq;
4).arch/arm/mach-tcc8900/board-tcc8900.c
MACHINE_START
init_irq = tcc8900_init_irq;
MACHEND
tcc8900_init_irq() ----> tcc8900_irq_init()
5).arch/arm/mach-tcc8900/irq.c
tcc8900_irq_init() ----> set_irq_chip(irqno,&chip),set_irq_handler(irqno,&handle_level_irq),set_irq_flags(irqno, IRQF_VALID)
chip was defined in arch/arm/mach-tcc8900/board-tcc8900.c