我正在尝试在基于ARM的平台上将驱动程序从旧内核移植到新内核。在移植其中一个驱动程序时,我注意到 request_irq 在新内核上失败。实际上,这个驱动程序具有多个硬编码的irq编号,它会尝试 request_irq 用于此HW行。我开始搜索request_irq失败的原因是什么 - 原因是相应的IRQ描述符( irq_desc )设置了 IRQ_NOREQUEST 标志。
我开始搜索此标志被清除的位置,并发现它发生在这里:
of_platform_populate
|
...
|
of_device_alloc
|
...
|
irq_of_parse_and_map
(some levels below this flag is dropped)
因此,从mach init init代码调用代码并解析DTB,DTB中提到的所有中断号都将映射到irq虚拟空间,并且可以通过适当的设备结构访问,例如:
irq = platform_get_irq(pdev, 0);
正如我已经说过的,这些老式的驱动程序在包含文件中只有硬编码的irq编号,而且他们没有合适的dtb条目。
问题是从内核的角度来看,正确的方法是什么?我是否需要将这个旧驱动程序作为平台设备(现在它只是一个char设备)并为它创建适当的dtb描述?或者我可以使用一些内核API将此中断标记为可用?这是一种普通/普通的风格吗?