Blame view
drivers/base/module.c
2.04 KB
c63469a39 Driver core: move... |
1 2 3 4 5 6 7 8 9 |
/* * module.c - module sysfs fun for drivers * * This file is released under the GPLv2 * */ #include <linux/device.h> #include <linux/module.h> #include <linux/errno.h> |
5a0e3ad6a include cleanup: ... |
10 |
#include <linux/slab.h> |
c63469a39 Driver core: move... |
11 12 13 14 15 16 |
#include <linux/string.h> #include "base.h" static char *make_driver_name(struct device_driver *drv) { char *driver_name; |
1653268b1 driver core: modu... |
17 |
driver_name = kasprintf(GFP_KERNEL, "%s:%s", drv->bus->name, drv->name); |
c63469a39 Driver core: move... |
18 19 |
if (!driver_name) return NULL; |
c63469a39 Driver core: move... |
20 21 22 23 24 |
return driver_name; } static void module_create_drivers_dir(struct module_kobject *mk) { |
7e1b1fc4d base: make module... |
25 |
static DEFINE_MUTEX(drivers_dir_mutex); |
c63469a39 Driver core: move... |
26 |
|
7e1b1fc4d base: make module... |
27 28 29 30 |
mutex_lock(&drivers_dir_mutex); if (mk && !mk->drivers_dir) mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj); mutex_unlock(&drivers_dir_mutex); |
c63469a39 Driver core: move... |
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
} void module_add_driver(struct module *mod, struct device_driver *drv) { char *driver_name; int no_warn; struct module_kobject *mk = NULL; if (!drv) return; if (mod) mk = &mod->mkobj; else if (drv->mod_name) { struct kobject *mkobj; /* Lookup built-in module entry in /sys/modules */ mkobj = kset_find_obj(module_kset, drv->mod_name); if (mkobj) { mk = container_of(mkobj, struct module_kobject, kobj); /* remember our module structure */ |
e5dd12784 Driver core: move... |
52 |
drv->p->mkobj = mk; |
c63469a39 Driver core: move... |
53 54 55 56 57 58 59 60 61 |
/* kset_find_obj took a reference */ kobject_put(mkobj); } } if (!mk) return; /* Don't check return codes; these calls are idempotent */ |
e5dd12784 Driver core: move... |
62 |
no_warn = sysfs_create_link(&drv->p->kobj, &mk->kobj, "module"); |
c63469a39 Driver core: move... |
63 64 65 |
driver_name = make_driver_name(drv); if (driver_name) { module_create_drivers_dir(mk); |
e5dd12784 Driver core: move... |
66 |
no_warn = sysfs_create_link(mk->drivers_dir, &drv->p->kobj, |
c63469a39 Driver core: move... |
67 68 69 70 71 72 73 74 75 76 77 78 |
driver_name); kfree(driver_name); } } void module_remove_driver(struct device_driver *drv) { struct module_kobject *mk = NULL; char *driver_name; if (!drv) return; |
e5dd12784 Driver core: move... |
79 |
sysfs_remove_link(&drv->p->kobj, "module"); |
c63469a39 Driver core: move... |
80 81 82 |
if (drv->owner) mk = &drv->owner->mkobj; |
e5dd12784 Driver core: move... |
83 84 |
else if (drv->p->mkobj) mk = drv->p->mkobj; |
c63469a39 Driver core: move... |
85 86 87 88 89 90 91 92 |
if (mk && mk->drivers_dir) { driver_name = make_driver_name(drv); if (driver_name) { sysfs_remove_link(mk->drivers_dir, driver_name); kfree(driver_name); } } } |