当一个platform设备注册后,就会自动为其匹配驱动,这是怎么做到的呢?
其实前面的分析已经有提到。
这里只说函数调用,以及关键的部分,具体的不再分析。
其实前面的分析已经有提到。
这里只说函数调用,以及关键的部分,具体的不再分析。
下面再来分析一次。
这里函数进行了删减,把这个自动匹配的过程突显出来。
具体的函数调用关系:
platform_add_devices--->platform_device_register---->platform_device_add--->device_add---->bus_probe_device
int platform_add_devices(struct platform_device **devs, int num)
{
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
}
return ret;
}
int platform_device_register(struct platform_device *pdev)
{
device_initialize(&pdev->dev);
arch_setup_pdev_archdata(pdev);
return platform_device_add(pdev);
}
int platform_device_add(struct platform_device *pdev)
{
int i, ret;
.......
ret = device_add(&pdev->dev);
.......
if (ret == 0)
return ret;
}
int device_add(struct device *dev)
{
struct device *parent = NULL;
struct kobject *kobj;
struct class_interface *class_intf;
int error = -EINVAL;
.......
.......
bus_probe_device(dev);
.......
.......
if (parent)
klist_add_tail(&dev->p->knode_parent,
&parent->p->klist_children);
}
void bus_probe_device(struct device *dev)
{
struct bus_type *bus = dev->bus;
struct subsys_interface *sif;
int ret;
//因为platform总线设置了这个drivers_autoprobe自动匹配标志,所以后面就会接着
//调用函数device_attach函数,为设备查找驱动。
if (bus->p->drivers_autoprobe) {
ret = device_attach(dev);
WARN_ON(ret < 0);
}
........
........
}