调用platform_device_register()是否为必须?Linux平台设备注册疑问
你找不到对应的platform_device_register或platform_add_devices调用,核心原因是当前Linux内核的平台设备注册早已不局限于硬编码调用这两个函数的方式,绝大多数场景下平台设备是由内核动态生成的,不需要驱动开发者手动编写注册逻辑。
设备树(Device Tree)动态生成
目前ARM、RISC-V等架构的绝大多数硬件都采用设备树描述板载硬件信息,仅需要在设备树中定义Synopsys I2C控制器的节点,将compatible属性设置为包含snps,designware-i2c的值,内核启动解析设备树的过程中,就会自动为这个节点生成对应的platform_device实例并完成注册,同时自动匹配名称一致的platform_driver完成绑定,全程不需要手动调用注册函数。ACPI表动态生成
x86架构的平台硬件信息一般存放在ACPI表中,平台总线会自动解析ACPI表中的硬件描述,为符合匹配规则的设备自动创建并注册platform_device,同样不需要硬编码调用注册函数。旧版板级代码场景
在设备树普及之前的老版本内核中,这类平台设备的注册代码通常存放在arch/[架构]/mach-[SOC系列]/目录下的板级支持文件中,和具体的SOC硬件强绑定,并不在驱动的通用代码目录下。目前新内核已经逐步淘汰了这类硬编码的板级注册逻辑,相关代码大多已经被移除,这也是你全局搜索也很难找到对应调用的原因。
这种设计是Linux驱动和硬件分离的核心体现:驱动只需要定义匹配规则和功能逻辑,不需要关心具体硬件的注册流程,设备注册由内核统一根据固件描述完成。
内容的提问来源于stack exchange,提问作者Sergo

