if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL;
相关语句。此处就是根据platfor_device和platform_driver的名字来实现配对。但是platform_driver有好几个名字
可以选择,通过id_table来实现配对。执行到此处,之前已注册到platform_bus的platform_device
型设备s3c_devicei2c0和现在刚注册到platform_bus总线的platfor_drver型驱动s3c24xx_i2c_drive将
实现配对成功。
成功配对之后将尝试进行probe
static int really_probe(struct device *dev, struct device_driver *drv) { 。。。 。。。 if (dev->bus->probe) { ret = dev->bus->probe(dev); if (ret) goto probe_failed; } else if (drv->probe) { ret = drv->probe(dev); if (ret) goto probe_failed; } 。。。 。。。 }
有上述代码可知,成功配对后首先调用的是总线的probe,假如总线未初始化probe方法才会去调用驱动中的probe,即platform_driver.drv->probe,而platform_bus本身未初始化probe方法,
所以此处调用驱动的probe方法,驱动的probe在注册过程中已被初始化
int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_type; if (drv->probe) drv->driver.probe = platform_drv_probe; if (drv->remove) drv->driver.remove = platform_drv_remove; if (drv->shutdown) drv->driver.shutdown = platform_drv_shutdown; return driver_register(&drv->driver); }
即直接调用函数platform_drv_probe,函数如下: