浅分析linux 2.6.23ドライバ登録関数driver_レジスター


linux 2.6.23 driver_register()

:http://gliethttp.cublog.cn

int driver_register(struct device_driver * drv)
{
    if ((drv->bus->probe && drv->probe) ||
//drv drv bus 1 , bus , drv
     (drv->bus->remove && drv->remove) ||
     (drv->bus->shutdown && drv->shutdown)) {
        printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods/n", drv->name);
    }
    klist_init(&drv->klist_devices, NULL, NULL);// drv
    return bus_add_driver(drv);// drv drv->bus
}
void klist_init(struct klist * k, void (*get)(struct klist_node *),
        void (*put)(struct klist_node *))
{
    INIT_LIST_HEAD(&k->k_list);//
    spin_lock_init(&k->k_lock);//
    k->get = get;//
    k->put = put;
}
int bus_add_driver(struct device_driver *drv)
{
    struct bus_type * bus = get_bus(drv->bus);
    int error = 0;

    if (!bus)
        return -EINVAL;

    pr_debug("bus %s: add driver %s/n", bus->name, drv->name);
    //kboj->name[KOBJ_NAME_LEN], KOBJ_NAME_LEN , kmalloc
    // kobj->k_name kboj->name kmalloc
    error = kobject_set_name(&drv->kobj, "%s", drv->name);
    if (error)
        goto out_put_bus;
    //bus->drivers kset , drv->kobj kset
    drv->kobj.kset = &bus->drivers;
    //gliethttp_20071025 kobject_register()
    // drv kobj kset ,
    //gliethttp_20071026
    // kobj, kobj kset, entry kset list ,
    // kset , kobj->parent=&kset->kobj,parent kset kobj
    // kobj kset, parent, parent 1
    // kobj kset , kset kobj, kobj kset
    // kobj parent , , kobj parent,parent
    // parent kobj
    //parent , kset ,
    // parent
    // create_dir() kobj sysfs
    // kobject_uevent() KOBJ_ADD
    error = kobject_register(&drv->kobj);
    if (error)
        goto out_put_bus;

    if (drv->bus->drivers_autoprobe) {
    //gliethttp_20071025
    //driver ,
    // driver
        error = driver_attach(drv);
        if (error)
            goto out_unregister;
    }
    // driver bus klist_drivers klist
    klist_add_tail(&drv->knode_bus, &bus->klist_drivers);
    module_add_driver(drv->owner, drv);

//gliethttp_20071026
// 1 klist kobj -- drv->kobj , kobj sysfs
// kobj , kobj kobj ,
// kobj 0 , , kobj , ,
// , ,
// : hub1 ,hub1 , 2.4 .
// kset、kobj driver , , 、
// kset、kobj driver , , linux c++ , eCos ,
// , ,
// , , , ,
//kset、kobj driver 3 , , 3 、 、 、 、
// 、 、 、 , " , , !"
// , ( , ,
// , , , )
// c ,
// , , c (gliethttp_20071026 ).
    //
    error = driver_add_attrs(bus, drv);
    if (error) {
        /* How the hell do we get out of this pickle? Give up */
        printk(KERN_ERR "%s: driver_add_attrs(%s) failed/n",
            __FUNCTION__, drv->name);
    }
    error = add_bind_files(drv);
    if (error) {
        /* Ditto */
        printk(KERN_ERR "%s: add_bind_files(%s) failed/n",
            __FUNCTION__, drv->name);
    }

    return error;
out_unregister:
    kobject_unregister(&drv->kobj);
out_put_bus:
    put_bus(bus);
    return error;
}