handle_edge_irq,handle_level_irq等函数会调用handle_irq_event,我们来看一下它的流程
handle_irq_event->handle_irq_event_percpu->action->handler
irqreturn_t handle_irq_event(struct irq_desc *desc)
{
struct irqaction *action = desc->action;
irqreturn_t ret;
desc->istate &= ~IRQS_PENDING;
irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS); /* 设置IRQD_IRQ_INPROGRESS标志,防止同一中断isr嵌套执行*/
raw_spin_unlock(&desc->lock);
ret = handle_irq_event_percpu(desc, action);
raw_spin_lock(&desc->lock);
irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);/* 清除IRQD_IRQ_INPROGRESS标志 */
return ret;
}
irqreturn_t
handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
{
irqreturn_t retval = IRQ_NONE;
unsigned int flags = 0, ir