模块初始化函数除了在 linux 设备驱动程序中打印之外什么都不做,驱动程序是否在设备树解析期间初始化?

module init function does nothing but a print in linux device driver, is the driver initialized during device tree parsing?

在linux内核3.3中,drivers/mmc/host/dw-mmc.c文件有这部分。

static int __init dw_mci_init(void)
{
    return platform_driver_probe(&dw_mci_driver, dw_mci_probe);
}

static void __exit dw_mci_exit(void)
{
    platform_driver_unregister(&dw_mci_driver);
}

module_init(dw_mci_init);
module_exit(dw_mci_exit);

在内核引导期间的某个时刻(实际上是在 start_kernel() 中,在 init_call 循环中),dw_mci_init 被调用(因为它带有 __init 标记) 和探测函数探测设备并安装驱动程序。几年前我修改了这个驱动来实现我们自己的SD卡控制器驱动。

现在,当我查看 linux 内核 5.4.21 时,同一文件的以上部分已更改如下:

static int __init dw_mci_init(void)
{
    pr_info("Synopsys Designware Multimedia Card Interface Driver\n");
    return 0;
}

static void __exit dw_mci_exit(void)
{
}

module_init(dw_mci_init);
module_exit(dw_mci_exit);

驱动程序初始化函数只执行打印。发生了什么?我猜想在内核初始化的某个地方,内核解析“设备树”(flattend device tree,.dtb 文件)并找到并调用匹配的平台驱动程序来初始化设备和驱动程序。这个对吗?如果可以的话,在内核源码哪里可以找到设备树(flattend device tree)的解析和设备驱动的安装操作?

What happened?

驱动程序已拆分为单独的模块以处理来自不同总线类型的设备。平台驱动程序在“dw_mmc-pltfrm”模块中。 (这也处理由设备树节点配置的设备。)“dw_mmc-pci”模块中还有一个 PCI 驱动程序。旧的“dw_mmc”模块导出特定于总线类型的驱动程序模块的通用函数。

在“dw_mmc-pltfrm.c”中,模块初始化和退出函数由辅助宏调用定义:

module_platform_driver(dw_mci_pltfm_driver);