request_irq returns -16 (-EBUSY)

request_irq returns -16 (-EBUSY)

这是我的问题。我目前正在更新 arm 嵌入式 Linux 机器的内核,从 4.14.14.73.

我遇到了驱动程序问题。对于内核 4.1,就在使用 request_irq 注册 irq 之前,IRQF_VALID 标志将由 set_irq_flags.

为驱动程序设置

如文档所述here

set_irq_flags is ARM specific with custom flags which have genirq equivalents. Convert drivers to use the genirq interfaces directly, so we can kill off set_irq_flags. The translation of flags is as follows:

IRQF_VALID -> !IRQ_NOREQUEST

IRQF_PROBE -> !IRQ_NOPROBE

IRQF_NOAUTOEN -> IRQ_NOAUTOEN

因此,我将 set_irq_flags 替换为 irq_clear_status_flags(irq, IRQ_NOREQUEST)

事情是,现在 request_irq 调用 returns -16 (-EBUSY),我不知道为什么。我检查了每个请求的 irq(在运行时),它们都与该驱动程序请求的不同。

我也注意到日志中的这一行:

genirq: Flags mismatch irq 40. 00000004 (digitalGPIO) vs. 00000000 ((null))

我对(null)设备名称很疑惑

我做错了什么?

我希望我包含了足够的上下文信息。

最后,很明显,在加载我的模块之前,IRQ 确实已经注册为 not shared

这是由于我使用的内核发生了变化,它是基于 linux 内核的 Altera 修订 。他们在之前的内核更新中更改了与此 IRQ 关联的驱动程序的行为。

我不明白的是为什么之前的请求被记录为 (null) 而不是正确的名称。显示有关谁先前请求 IRQ 的正确信息的唯一方法是直接在 Altera 内核中将其设置为 shared