Skip to content
Snippets Groups Projects
Select Git revision
  • 13731de6add8a543b1fc9ea292197d81a517ef9e
  • master default protected
  • android-msm-bullhead-3.10-nougat_kgdb_less_changes
  • android-msm-bullhead-3.10-nougat_kgdb
  • android-msm-bullhead-3.10-nougat_klist
  • android-4.4
  • android-msm-vega-4.4-oreo-daydream
  • android-msm-wahoo-4.4-p-preview-5
  • android-msm-wahoo-4.4-pie
  • android-msm-marlin-3.18-p-preview-5
  • android-msm-marlin-3.18-pie
  • android-msm-wahoo-2018.07-oreo-m2
  • android-msm-wahoo-2018.07-oreo-m4
  • android-msm-wahoo-4.4-p-preview-4
  • android-msm-bullhead-3.10-oreo-m6
  • android-msm-angler-3.10-oreo-m6
  • android-msm-marlin-3.18-p-preview-4
  • android-msm-stargazer-3.18-oreo-wear-dr
  • android-msm-catshark-3.18-oreo-wear-dr
  • android-msm-wahoo-4.4-oreo-m2
  • android-msm-wahoo-4.4-oreo-m4
  • android-daydreamos-8.0.0_r0.5
  • android-8.1.0_r0.92
  • android-8.1.0_r0.91
  • android-daydreamos-8.0.0_r0.4
  • android-p-preview-5_r0.2
  • android-p-preview-5_r0.1
  • android-9.0.0_r0.5
  • android-9.0.0_r0.4
  • android-9.0.0_r0.2
  • android-9.0.0_r0.1
  • android-8.1.0_r0.81
  • android-8.1.0_r0.80
  • android-8.1.0_r0.78
  • android-8.1.0_r0.76
  • android-8.1.0_r0.75
  • android-8.1.0_r0.72
  • android-8.1.0_r0.70
  • android-p-preview-4_r0.2
  • android-p-preview-4_r0.1
  • android-wear-8.0.0_r0.30
41 results

module.c

Blame
  • module.c 1.94 KiB
    /*
     * 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>
    #include <linux/slab.h>
    #include <linux/string.h>
    #include "base.h"
    
    static char *make_driver_name(struct device_driver *drv)
    {
    	char *driver_name;
    
    	driver_name = kasprintf(GFP_KERNEL, "%s:%s", drv->bus->name, drv->name);
    	if (!driver_name)
    		return NULL;
    
    	return driver_name;
    }
    
    static void module_create_drivers_dir(struct module_kobject *mk)
    {
    	if (!mk || mk->drivers_dir)
    		return;
    
    	mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj);
    }
    
    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 */
    			drv->p->mkobj = mk;
    			/* kset_find_obj took a reference */
    			kobject_put(mkobj);
    		}
    	}
    
    	if (!mk)
    		return;
    
    	/* Don't check return codes; these calls are idempotent */
    	no_warn = sysfs_create_link(&drv->p->kobj, &mk->kobj, "module");
    	driver_name = make_driver_name(drv);
    	if (driver_name) {
    		module_create_drivers_dir(mk);
    		no_warn = sysfs_create_link(mk->drivers_dir, &drv->p->kobj,
    					    driver_name);
    		kfree(driver_name);
    	}
    }
    
    void module_remove_driver(struct device_driver *drv)
    {
    	struct module_kobject *mk = NULL;
    	char *driver_name;
    
    	if (!drv)
    		return;
    
    	sysfs_remove_link(&drv->p->kobj, "module");
    
    	if (drv->owner)
    		mk = &drv->owner->mkobj;
    	else if (drv->p->mkobj)
    		mk = drv->p->mkobj;
    	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);
    		}
    	}
    }