/*
* spi 设备注册分析
*/
1. kernel/drivers/spi/spi.c 初始化设备 device_initialize
/* 调用device_initialize 的会有这些函数 */
spi_match_controller_to_boardinfo
spi_new_device
spi_alloc_device
device_initialize
spi_of_notifier
of_spi_notify
of_register_spi_devices /* 调用 spi_alloc_device 和 spi_add_device */
spi_alloc_device
device_initialize
spi_add_device
device_add
acpi_spi_notify
acpi_spi_add_device
acpi_register_spi_device /* 调用 spi_alloc_device 和 spi_add_device */
spi_alloc_device
device_initialize
spi_add_device
device_add
spi_alloc_master
spi_alloc_slave /* spi_alloc_master 和 spi_alloc_slave 都调用 __spi_alloc_controller */
__spi_alloc_controller
device_initialize
2. kernel/drivers/spi/spi.c 添加设备 device_add
spi_add_device
device_add
rockchip_spi_probe /* kernel/drivers/spi/spi-rockchip.c */
spi_alloc_master /* rockchip_spi_probe 调用 spi_alloc_master 和 devm_spi_register_controller */
devm_spi_register_controller
spi_register_controller
device_add
3. 一个 match 三个 probe 调用
a. spi_drv_probe /* kernel/drivers/spi/spi.c */
b. spidev_probe /* kernel/drivers/spi/spidev.c */
c. rockchip_spi_probe /* kernel/drivers/spi/spi-rockchip.c */
d. spi_match_device /* kernel/drivers/spi/spi.c */
驱动通过 driver_register 注册后,如果驱动 driverA 和设备 deviceA 匹配成功,即调用 probe 函数。
首先被调用到的是 spi_drv_probe , 在 spi_drv_probe 的里面再调用 spidev_probe ,成功后生成 /dev/spi0.0 。
每个SPI设备肯定挂载到了一个SPI控制器,这个控制器设备由 rockchip_spi_probe 生成。
控制器是通过平台设备注册的,由platform匹配并调用 rockchip_spi_probe 。
4. 调用顺序,两个spi设备
[ 0.058649] --- spi_init ---
[ 0.209375] --- spidev_init ---
[ 0.210388] --- rockchip_spi_probe ---
[ 0.210596] --- spi_register_controller ---
[ 0.211056] --- spi_alloc_device ---
[ 0.211096] --- spi_add_device ---
[ 0.211354] --- spi_match_device ---
[ 0.211415] --- spi_drv_probe ---
[ 0.211544] --- spidev_probe ---
[ 0.212558] --- rockchip_spi_probe ---
[ 0.212762] --- spi_register_controller ---
[ 0.213183] --- spi_alloc_device ---
[ 0.213225] --- spi_add_device ---
[ 0.213528] --- spi_match_device ---
[ 0.213589] --- spi_drv_probe ---
[ 0.213708] --- spidev_probe ---