void acpi_bus_trim(struct acpi_device *adev)
这个函数用于从acpi device object中删除handle和driver
其源码分析如下:
void acpi_bus_trim(struct acpi_device *adev)
{
struct acpi_scan_handler *handler = adev->handler;
struct acpi_device *child;
#对这个acpi_device的每一个子设备都调用acpi_bus_trim
list_for_each_entry_reverse(child, &adev->children, node)
acpi_bus_trim(child);
adev->flags.match_driver = false;
#如果有对应的handle->detach的话,则调用这个函数删除handle,否则调用device_release_driver 来删除acpi_device设备
if (handler) {
if (handler->detach)
handler->detach(adev);
adev->handler = NULL;
} else {
device_release_driver(&adev->dev);
}
/*
* Most likely, the device is going away, so put it into D3cold before
* that.
*/
#设置这个acpi_device的power状态为D3_clod,并清楚枚举信息
acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
adev->flags.initialized = false;
acpi_device_clear_enumerated(adev);
}
枚举信息的清除实现如下所示
static inline void acpi_device_clear_enumerated(struct acpi_device *adev)
{
adev->flags.visited = false;
}
可见也就是把flags.visited 这个变量设置为false