Qui appelle la fonction «sonde» dans le code du conducteur?

J’essaie de comprendre ce code de pilote de mcspi pour omap2 panda board.

Je ne comprends pas qui appelle la fonction de probe et quelle est la chaîne d’appels dans ce code de pilote?

Comment le pilote est-il informé lorsque le périphérique est connecté?

La fonction de spi-omap2-mcspi.c de spi-omap2-mcspi.c est enregistrée dans la static struct platform_driver omap2_mcspi_driver , qui est enregistrée avec module_platform_driver(omap2_mcspi_driver); (en fin de fichier). La macro module_platform_driver , définie dans platform_device.h , transmettra la structure à la macro platform_driver_register et à la fonction __platform_driver_register partir de drivers / base / platform.c.

 527 /** 528 * __platform_driver_register - register a driver for platform-level devices 529 * @drv: platform driver structure 530 * @owner: owning module/driver 531 */ 532 int __platform_driver_register(struct platform_driver *drv, 533 struct module *owner) 534 { ... 536 drv->driver.bus = &platform_bus_type; 537 if (drv->probe) 538 drv->driver.probe = platform_drv_probe; ... 544 return driver_register(&drv->driver); 545 } 546 EXPORT_SYMBOL_GPL(__platform_driver_register); 

La sonde est maintenant passée à la fonction driver_register partir de drivers / base / driver.c

 139 /** 140 * driver_register - register driver with bus 141 * @drv: driver to register 142 * 143 * We pass off most of the work to the bus_add_driver() call, 144 * since most of the things we have to do deal with the bus 145 * structures. 146 */ 147 int driver_register(struct device_driver *drv) 148 { ... 154 if ((drv->bus->probe && drv->probe) || ... 167 ret = bus_add_driver(drv); ... 178 } 

Donc, maintenant le pilote est enregistré dans le bus ( platform_bus_type ).

L’appel réel à driver_probe_device est effectué via driver_probe_device drivers / base / dd.c , puis really_probe (même ligne de fichier 265):

 265 static int really_probe(struct device *dev, struct device_driver *drv) 266 { ... 270 pr_debug("bus: '%s': %s: probing driver %s with device %s\n", 271 drv->bus->name, __func__, drv->name, dev_name(dev)); ... 287 if (dev->bus->probe) { 288 ret = dev->bus->probe(dev); /// <<<< HERE 289 if (ret) 290 goto probe_failed; 291 } else if (drv->probe) { 292 ret = drv->probe(dev); /// <<<< OR HERE 293 if (ret) 294 goto probe_failed; 295 } 296 297 driver_bound(dev); 298 ret = 1; 299 pr_debug("bus: '%s': %s: bound device %s to driver %s\n", 300 drv->bus->name, __func__, dev_name(dev), drv->name); 301 goto done;