如何将我的平台驱动程序绑定到 ACPI 容器设备

How to bind my platform driver to an ACPI Container device

我的笔记本电脑在 SSDT Table 中有以下 SuperIO 设备:

DefinitionBlock ("", "SSDT", 1, "VENDORx", "TABLEx", 0x00001000)
{
    Device (\_SB.PC00.LPCB.SIO0)
    {
        Name (_HID, EisaId ("PNP0A05") /* Generic Container Device */)
        Name (_UID, "SD28301")
    }

此 ID 由 ACPI 容器驱动程序声明,但我在 /sys/bus/container/* 中看到没有与此设备关联的驱动程序。

我想写一个平台驱动程序来连接这个设备。我的驱动程序代码中有以下内容:

static const struct acpi_device_id sio_device_ids[] = {
    { "PNP0A05", 0},
    { "", 0}
};
MODULE_DEVICE_TABLE(acpi, sio_device_ids);

调用 platform_driver_register() 后,我的驱动程序没有绑定到 SIO 设备。为了查看内核是否尝试匹配 acpi_device_id 条目,我将内核代码中的 PNP0A05 更改为 MHF1234(自定义 _HID)。然后我在内核驱动程序中插入了一个 SSDT,其设备的 _HID 与 acpi_device_id 相同:Name (_HID, EisaId ("MHF1234")。现在,在插入我的驱动程序后,探测函数被调用,因此我的驱动程序与 ACPI 设备相匹配。

问:如何匹配我的驱动程序和PNP0A05设备?我看到 ACPI 容器驱动程序已经检测到并将其添加到 /sys 但没有驱动程序绑定到它。任何调试提示都将不胜感激。

正在通过 drivers/acpi/container.c. However, it's purely ACPI device for now. The platform devices for ACPI ones are created by acpi_create_platform_device() which is supposed to be called by acpi_bus_attach() (via acpi_default_enumeration() because it's not enumerated by parent). However, container_device_attach() on success returns positive number, i.e. 1, and acpi_bus_attach() skips platform device creation due to the conditional 下的代码创建设备。这就是为什么它没有被表示为平台设备,因此可能无法通过平台总线枚举。

除此之外,ACPI 规范告诉我们以下内容:PNP0A05 通用容器设备。其设置完全由其 ACPI 资源信息控制的设备,否则 不需要设备或特定于总线的驱动程序支持。这最初被称为通用 ISA 总线设备。此 ID 应仅用于不产生供子设备使用的资源的容器。 PNP0A05 设备的 _CRS 对象要求的任何系统资源必须由容器本身消耗。