我有一个关于Linux内核中的IRQ的问题。我使用request_threaded_irq()
启用IRQ。但有时我们需要使用disable_irq()
禁用IRQ。根据具体情况,可能需要再次启用它。在启用IRQ之前,是否可以检查某个IRQ是否已经启用?防止再次启用。是否有任何API来检查特定的IRQ是否启用或禁用?
当前Linux内核不提供此函数,但您可以在下游内核中提供自己的函数,如:
modified include/linux/interrupt.h
@@ -244,6 +244,7 @@ bool irq_has_action(unsigned int irq);
extern void disable_irq_nosync(unsigned int irq);
extern bool disable_hardirq(unsigned int irq);
extern void disable_irq(unsigned int irq);
+extern int irq_state_disabled(unsigned int irq);
extern void disable_percpu_irq(unsigned int irq);
extern void enable_irq(unsigned int irq);
extern void enable_percpu_irq(unsigned int irq, unsigned int type);
modified kernel/irq/manage.c
@@ -704,6 +704,22 @@ static int __disable_irq_nosync(unsigned int irq)
return 0;
}
+int irq_state_disabled(unsigned int irq)
+{
+ unsigned long flags;
+ bool ret;
+ struct irq_desc *desc =
+ irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
+
+ if (!desc)
+ return -EINVAL;
+
+ ret = irqd_irq_disabled(&desc->irq_data);
+ irq_put_desc_busunlock(desc, flags);
+ return ret;
+}
+EXPORT_SYMBOL(irq_state_disabled);