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