3、linux同一bus下注册同名driver问题

244 阅读1分钟

在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;
}