I am trying to understand this driver code of mcspi for omap2 panda board.
I don't understand who calls the probe
function and what is the call chain in this driver code?
How does the driver is informed when the device is connected?
I am trying to understand this driver code of mcspi for omap2 panda board.
I don't understand who calls the probe
function and what is the call chain in this driver code?
How does the driver is informed when the device is connected?
The probe function from spi-omap2-mcspi.c
is saved in the static struct platform_driver omap2_mcspi_driver
, which is registered with module_platform_driver(omap2_mcspi_driver);
(at the end of file). The module_platform_driver
macro, defined in platform_device.h will pass the struct to platform_driver_register
macro and __platform_driver_register
function from 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);
The probe now passed to driver_register
function from 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 }
So, now the driver is registered in the bus (platform_bus_type
).
Actual call to probe is done via driver_probe_device
drivers/base/dd.c, then really_probe
(same file line 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;