在linux驱动开发过程中,经常会使用到platform总线来开发,通过platform_driver_register()注册驱动,platform_device_register()来注册设备。如果在同一个platform bus下注册同name的driver,那么会出现什么情况呢?
从代码上进行分析,查找驱动是否已经装载,已经装载的则直接退出,不继续进行注册了:
#define platform_driver_register(drv) \
__platform_driver_register(drv, THIS_MODULE)
int __platform_driver_register(struct platform_driver *drv,
struct module *owner)
{
drv->driver.owner = owner;
drv->driver.bus = &platform_bus_type;
drv->driver.probe = platform_drv_probe;
drv->driver.remove = platform_drv_remove;
drv->driver.shutdown = platform_drv_shutdown;
return driver_register(&drv->driver);
}
int driver_register(struct device_driver *drv)
{
......
//查找驱动是否已经装载,已经装载的则直接退出
other = driver_find(drv->name, drv->bus);
if (other) {
printk(KERN_ERR "Error: Driver '%s' is already registered, "
"aborting...\n", drv->name);
return -EBUSY;
}
ret = bus_add_driver(drv);
......
return ret;
}
struct device_driver *driver_find(const char *name, struct bus_type *bus)
{
//在bus所管理的driver链表中,查找有没有这个name的driver
struct kobject *k = kset_find_obj(bus->p->drivers_kset, name);
struct driver_private *priv;
if (k) {
//把该driver的kobject引用计数减1,kset_find_obj函数对其+1了
kobject_put(k);
priv = to_driver(k);
return priv->driver;
}
return NULL;
}
struct kobject *kset_find_obj(struct kset *kset, const char *name)
{
struct kobject *k;
struct kobject *ret = NULL;
spin_lock(&kset->list_lock);
//查找方法很简单,依次遍历bus的driver链表每个driver的kobject的name,如果有相同的返回对应的kobject
list_for_each_entry(k, &kset->list, entry) {
if (kobject_name(k) && !strcmp(kobject_name(k), name)) {
//找到的话,这里对其引用计数+1了
ret = kobject_get_unless_zero(k);
break;
}
}
spin_unlock(&kset->list_lock);
return ret;
}