串口是一种platform设备,在体系框架setup_arch()中完成设备注册,而且设备的注册先于驱动注册,最终串口设备与驱动的连接在driver_register() -->bus_add_driver()中完成。
- int bus_add_driver(struct device_driver *drv)
- {
- intret;
- structdevice_driver *other;
-
- …
-
- if(drv->bus->p->drivers_autoprobe) { //platfrom_but_type == 1自动探测platfrom设备
- error= driver_attach(drv);
- if(error)
- goto out_unregister;
- }
- ….
- }
最后driver_attach()-->bus_for_each_dev(),完成串口设备与驱动的连接
- int bus_for_each_dev(struct bus_type *bus,struct device *start,
- void *data, int (*fn)(struct device *,void *))
- {
- structklist_iter i;
- structdevice *dev;
- interror = 0;
-
- if(!bus)
- return-EINVAL;
-
- klist_iter_init_node(&bus->p->klist_devices,&i,
- (start ? &start->p->knode_bus :NULL));
- while((dev = next_device(&i)) && !error) //遍历所有对应上的设备
- error= fn(dev, data);
- klist_iter_exit(&i);
- return error;
- }