在设备树探测之前加载内核模块

时间:2014-03-24 17:36:10

标签: linux-kernel embedded device-tree

我为 custom_hardware 开发了一个依赖于设备树的工作驱动程序。因为我的驱动程序可能会发展,所以我不希望我的驱动程序成为内核的一部分(当我说'是内核的一部分时,我的意思是,在内核创建期间用内核编译)< / p>

以下是我的dts的一瞥:

custom_hardware: custom_hardware@0x41006000 {
    compatible = "mfg,custom";
    reg = <0x41006000 0x1000>;
    #interrupt-cells = <0x1>;
    interrupt-controller;
};

existing_hardware: existing_hardward@41004000 {
    compatible = "mfg,existing";
    reg = <0x41004000 0x1000>;
    interrupt-parent = <&custom_hardware>;
    interrupts = <0>;
};

existing_hardware 的驱动程序已经使用内核编译( existing_hardware 的驱动程序已在内核创建期间与内核一起编译) 。

我想要做的是将 custom_hardware 的驱动程序附加到ramfs并让内核加载 custom_hardware 的驱动程序在 existing_hardware 的驱动程序之前。

这很重要,因为 existing_hardware 的驱动程序从 custom_hardware的 irq_domain 中请求 virq 的司机。要获取 irq_domain ,必须先加载 custom_hardware 的驱动程序。

请注意,在探测设备树期间会加载 existing_hardware 的驱动程序,这似乎发生在内核启动序列的早期阶段。

2 个答案:

答案 0 :(得分:0)

这不是办法。模块/驱动程序加载的顺序无关紧要。当您在existing_hardware中获取IRQ失败时,您需要做的是返回-EPROBE_DEFER。然后它会在稍后再次被探测,希望在custom_hardware被探测之后。

此外,您可以应用该补丁,以确保request_irq()失败,因为该域尚未存在,并在此情况下返回-EPROBE_DEFER https://lkml.org/lkml/2014/2/13/114

答案 1 :(得分:0)

我有类似的问题(探测顺序错误),我发现的唯一简单的解决方案是将模块按所需的探测顺序放入Makefile中。 我在这里找到了解决方案:What is the Linux built-in driver load order?