1079 action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);
1080 if (!action)
1081 return -ENOMEM;
1082
1083 action->handler = handler;
1084 action->thread_fn = thread_fn;
1085 action->flags = irqflags;
1086 action->name = devname;
1087 action->dev_id = dev_id;
从1079~1087:根据requst_irq()函数中传递的参数生成一个irqaction.
1097 if (!retval && (irqflags & IRQF_SHARED)) {
1098 /*
1099 * It's a shared IRQ -- the driver ought to be prepared for it
1100 * to happen immediately, so let's make sure....
1101 * We disable the irq to make sure that a 'real' IRQ doesn't
1102 * run in parallel with our fake.
1103 */
1104 unsigned long flags;
1105
1106 disable_irq(irq);
1107 local_irq_save(flags);
1108
1109 handler(irq, dev_id);
1110
1111 local_irq_restore(flags);
1112 enable_irq(irq);
1113 }
1097~1113:如果为共享中断的话,在执行中断服务例程之前,要先把这条中断线上的中断屏蔽,让后在执行,执行完之后打开中断。
6.有注册中断服务函数,那必然有相应的释放中断函数。
可以调用void free_irq(unsigned int irq, void *dev_id)来释放我们申请的中断线。
函数形参:
1>unsigned int riq:表示申请的中断号与request_irq()函数中的第一个形参对应。
2>void *dev_id:与request_irq()函数中的最后一个形参含义和用法相同,在此不再说明。
函数功能:
如果指定的中断线不是共享的,那么,该函数删除处理程序的同时将禁用这条中断线。如果中断线是共享的,则仅删除dev_id所对应的处理程序,而这条中断线本省只有在删除了最后一个处理程序时才会被禁止。
切记:This function must not be called from interrupt context
freee_irq()函数不能在中断上下文中被调用。
3>深入分析下free_irq()函数内部是如何实现的
993void free_irq(unsigned int irq, void *dev_id)
994{
995 struct irq_desc *desc = irq_to_desc(irq);
996
997 if (!desc)
998 return;
999
1000 chip_bus_lock(irq, desc);
1001 kfree(__free_irq(irq, dev_id));
1002 chip_bus_sync_unlock(irq, desc);
1003}
993void free_irq(unsigned int irq, void *dev_id)
994{
995 struct irq_desc *desc = irq_to_desc(irq);
996
997 if (!desc)
998 return;
999
1000 chip_bus_lock(irq, desc);
1001 kfree(__free_irq(irq, dev_id));
1002 chip_bus_sync_unlock(irq, desc);
1003}
可以看到free_irq()函数了封装了_free_irq(irq,dev_id)函数。