如何检查 Linux 内核中特定的 irq 是否被禁用?

问题描述 投票:0回答:1

我有一个关于 linux 内核中 irq 的问题。 我使用 request_threaded_irq(..) 启用 irq。但有时我们需要使用disable_irq()来禁用irq。 根据情况,可能需要再次启用它。 我可以在启用 irq 之前检查特定的 irq 是否已启用吗?防止再次启用。 是否有任何API可以检查特定IRQ是否启用或禁用?

谢谢你

linux kernel irq
1个回答
0
投票

当前的 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);
© www.soinside.com 2019 - 2024. All rights reserved.