request_irq返回-16(-EBUSY)

时间:2019-06-18 15:16:27

标签: linux kernel driver irq

这是我的问题。我当前正在更新Arm嵌入式Linux机器的内核,从 4.1 更改为 4.14.73

我正遇到司机的问题。对于内核4.1,在向request_irq注册irq之前,IRQF_VALID将为驱动程序设置标志set_irq_flags

here所述,

  

set_irq_flags是特定于ARM的,带有具有genirq的自定义标志   等价物。转换驱动程序以直接使用genirq接口,因此   我们可以杀死set_irq_flags。标志的翻译如下:

     

IRQF_VALID-> !IRQ_NOREQUEST

     

IRQF_PROBE-> !IRQ_NOPROBE

     

IRQF_NOAUTOEN-> IRQ_NOAUTOEN

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

问题是,现在request_irq调用返回-16-EBUSY),我不知道为什么。我检查了每个被请求的irq(在运行时),它们都与此驱动程序所请求的不一样。

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

  

genirq:标记irq 40不匹配。00000004(digitalGPIO)与00000000((null))

我对(null)设备名称感到困惑。

我在做什么错了?

我希望我提供了足够的上下文信息。

1 个答案:

答案 0 :(得分:0)

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

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

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