*参照元 [#a30c5bb8] #backlinks *説明 [#q8354948] -パス: [[linux-2.6.33/drivers/base/bus.c]] -FIXME: これは何? --説明 **引数 [#z3baebe7] -struct device_driver *drv -- --[[linux-2.6.33/device_driver]] **返り値 [#eb5c3fee] -int -- **参考 [#i2f69560] *実装 [#c70e0517] /** * bus_add_driver - Add a driver to the bus. * @drv: driver. */ int bus_add_driver(struct device_driver *drv) { struct bus_type *bus; struct driver_private *priv; int error = 0; - --[[linux-2.6.33/bus_type]] - --[[linux-2.6.33/driver_private]] bus = bus_get(drv->bus); if (!bus) return -EINVAL; - --[[linux-2.6.33/bus_get()]] pr_debug("bus: '%s': add driver %s\n", bus->name, drv->name); - --[[linux-2.6.33/pr_debug()]] priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { error = -ENOMEM; goto out_put_bus; } - --[[linux-2.6.33/kzalloc()]] - --[[linux-2.6.33/GFP_KERNEL]] klist_init(&priv->klist_devices, NULL, NULL); priv->driver = drv; drv->p = priv; priv->kobj.kset = bus->p->drivers_kset; error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL, "%s", drv->name); if (error) goto out_unregister; - --[[linux-2.6.33/klist_init()]] - --[[linux-2.6.33/kobject_init_and_add()]] - --[[linux-2.6.33/driver_ktype(global)]] if (drv->bus->p->drivers_autoprobe) { error = driver_attach(drv); if (error) goto out_unregister; } klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers); module_add_driver(drv->owner, drv); - --[[linux-2.6.33/driver_attach()]] - --[[linux-2.6.33/klist_add_tail()]] - --[[linux-2.6.33/module_add_driver()]] error = driver_create_file(drv, &driver_attr_uevent); if (error) { printk(KERN_ERR "%s: uevent attr (%s) failed\n", __func__, drv->name); } - --[[linux-2.6.33/driver_create_file()]] - --[[linux-2.6.33/driver_attr_uevent(global)]] - --[[linux-2.6.33/printk()]] 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", __func__, drv->name); } - --[[linux-2.6.33/driver_add_attrs()]] if (!drv->suppress_bind_attrs) { error = add_bind_files(drv); if (error) { /* Ditto */ printk(KERN_ERR "%s: add_bind_files(%s) failed\n", __func__, drv->name); } } - --[[linux-2.6.33/add_bind_files()]] kobject_uevent(&priv->kobj, KOBJ_ADD); return 0; - --[[linux-2.6.33/kobject_uevent()]] - --[[linux-2.6.33/KOBJ_ADD]] out_unregister: kobject_put(&priv->kobj); kfree(drv->p); drv->p = NULL; - --[[linux-2.6.33/kobject_put()]] - --[[linux-2.6.33/kfree()]] out_put_bus: bus_put(bus); return error; - --[[linux-2.6.33/bus_put()]] } *コメント [#t9e7f47c]