Код горячего подключения PCI будет вызывать pci_do_scan_bus (), чтобы пройти через все слоты, посмотреть, найдем ли мы устройство / мост и добавим ли они в наше дерево устройств:
unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus) {
max = pci_scan_child_bus(bus) //scan bus for all slots and devices in them
pci_bus_add_devices(bus); //add what we find
...
}
Поля в struct device фактически заполняются как часть вызова pci_scan_child_bus (). Вот график звонков (вроде:)):
pci_scan_child_bus> pci_scan_slot (поиск слотов на шине)> pci_scan_single_device> pci_device_add> device_initialize.
Обратите внимание, что device_initialize () является первой частью device_register (). Вы увидите, что поля struct device заполнены в pci_device_add после вызова device_initialize (). Вы можете найти его в drivers / pci / probe.c в исходниках ядра. Также будет заполнена структура pci_dev, которая позднее будет использоваться драйвером, специфичным для устройства.
Фактическое добавление kobject в иерархию устройств происходит в pci_bus_add_devices. Вот график звонков:
pci_bus_add_devices> pci_bus_add_device> device_add.
Как видите, этот поток вызовов завершает вторую часть функции device_register ().
Итак, вкратце, device_register () состоит из: 1. Инициализировать устройство и 2. Добавить устройство.
pci_device_add выполняет шаг 1, а pci_bus_add_device - шаг 2.
Интересующие файлы: drivers / pci / {pci.c, bus.c, probe.c}