Blame view
drivers/base/module.c
2.03 KB
989d42e85 driver core: add ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
c63469a39 Driver core: move... |
2 3 |
/* * module.c - module sysfs fun for drivers |
c63469a39 Driver core: move... |
4 5 6 7 |
*/ #include <linux/device.h> #include <linux/module.h> #include <linux/errno.h> |
5a0e3ad6a include cleanup: ... |
8 |
#include <linux/slab.h> |
c63469a39 Driver core: move... |
9 10 11 12 13 14 |
#include <linux/string.h> #include "base.h" static char *make_driver_name(struct device_driver *drv) { char *driver_name; |
1653268b1 driver core: modu... |
15 |
driver_name = kasprintf(GFP_KERNEL, "%s:%s", drv->bus->name, drv->name); |
c63469a39 Driver core: move... |
16 17 |
if (!driver_name) return NULL; |
c63469a39 Driver core: move... |
18 19 20 21 22 |
return driver_name; } static void module_create_drivers_dir(struct module_kobject *mk) { |
7e1b1fc4d base: make module... |
23 |
static DEFINE_MUTEX(drivers_dir_mutex); |
c63469a39 Driver core: move... |
24 |
|
7e1b1fc4d base: make module... |
25 26 27 28 |
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... |
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
} 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... |
50 |
drv->p->mkobj = mk; |
c63469a39 Driver core: move... |
51 52 53 54 55 56 57 58 59 |
/* 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... |
60 |
no_warn = sysfs_create_link(&drv->p->kobj, &mk->kobj, "module"); |
c63469a39 Driver core: move... |
61 62 63 |
driver_name = make_driver_name(drv); if (driver_name) { module_create_drivers_dir(mk); |
e5dd12784 Driver core: move... |
64 |
no_warn = sysfs_create_link(mk->drivers_dir, &drv->p->kobj, |
c63469a39 Driver core: move... |
65 66 67 68 69 70 71 72 73 74 75 76 |
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... |
77 |
sysfs_remove_link(&drv->p->kobj, "module"); |
c63469a39 Driver core: move... |
78 79 80 |
if (drv->owner) mk = &drv->owner->mkobj; |
e5dd12784 Driver core: move... |
81 82 |
else if (drv->p->mkobj) mk = drv->p->mkobj; |
c63469a39 Driver core: move... |
83 84 85 86 87 88 89 90 |
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); } } } |