Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : * driver.c - centralized device driver management 4 : : * 5 : : * Copyright (c) 2002-3 Patrick Mochel 6 : : * Copyright (c) 2002-3 Open Source Development Labs 7 : : * Copyright (c) 2007 Greg Kroah-Hartman <gregkh@suse.de> 8 : : * Copyright (c) 2007 Novell Inc. 9 : : */ 10 : : 11 : : #include <linux/device/driver.h> 12 : : #include <linux/device.h> 13 : : #include <linux/module.h> 14 : : #include <linux/errno.h> 15 : : #include <linux/slab.h> 16 : : #include <linux/string.h> 17 : : #include <linux/sysfs.h> 18 : : #include "base.h" 19 : : 20 : 0 : static struct device *next_device(struct klist_iter *i) 21 : : { 22 : 0 : struct klist_node *n = klist_next(i); 23 : 0 : struct device *dev = NULL; 24 : 0 : struct device_private *dev_prv; 25 : : 26 [ # # # # ]: 0 : if (n) { 27 : 0 : dev_prv = to_device_private_driver(n); 28 : 0 : dev = dev_prv->device; 29 : : } 30 : 0 : return dev; 31 : : } 32 : : 33 : : /** 34 : : * driver_for_each_device - Iterator for devices bound to a driver. 35 : : * @drv: Driver we're iterating. 36 : : * @start: Device to begin with 37 : : * @data: Data to pass to the callback. 38 : : * @fn: Function to call for each device. 39 : : * 40 : : * Iterate over the @drv's list of devices calling @fn for each one. 41 : : */ 42 : 0 : int driver_for_each_device(struct device_driver *drv, struct device *start, 43 : : void *data, int (*fn)(struct device *, void *)) 44 : : { 45 : 0 : struct klist_iter i; 46 : 0 : struct device *dev; 47 : 0 : int error = 0; 48 : : 49 [ # # ]: 0 : if (!drv) 50 : : return -EINVAL; 51 : : 52 [ # # ]: 0 : klist_iter_init_node(&drv->p->klist_devices, &i, 53 : 0 : start ? &start->p->knode_driver : NULL); 54 [ # # # # ]: 0 : while (!error && (dev = next_device(&i))) 55 : 0 : error = fn(dev, data); 56 : 0 : klist_iter_exit(&i); 57 : 0 : return error; 58 : : } 59 : : EXPORT_SYMBOL_GPL(driver_for_each_device); 60 : : 61 : : /** 62 : : * driver_find_device - device iterator for locating a particular device. 63 : : * @drv: The device's driver 64 : : * @start: Device to begin with 65 : : * @data: Data to pass to match function 66 : : * @match: Callback function to check device 67 : : * 68 : : * This is similar to the driver_for_each_device() function above, but 69 : : * it returns a reference to a device that is 'found' for later use, as 70 : : * determined by the @match callback. 71 : : * 72 : : * The callback should return 0 if the device doesn't match and non-zero 73 : : * if it does. If the callback returns non-zero, this function will 74 : : * return to the caller and not iterate over any more devices. 75 : : */ 76 : 0 : struct device *driver_find_device(struct device_driver *drv, 77 : : struct device *start, const void *data, 78 : : int (*match)(struct device *dev, const void *data)) 79 : : { 80 : 0 : struct klist_iter i; 81 : 0 : struct device *dev; 82 : : 83 [ # # # # ]: 0 : if (!drv || !drv->p) 84 : : return NULL; 85 : : 86 [ # # ]: 0 : klist_iter_init_node(&drv->p->klist_devices, &i, 87 : 0 : (start ? &start->p->knode_driver : NULL)); 88 [ # # ]: 0 : while ((dev = next_device(&i))) 89 [ # # # # ]: 0 : if (match(dev, data) && get_device(dev)) 90 : : break; 91 : 0 : klist_iter_exit(&i); 92 : 0 : return dev; 93 : : } 94 : : EXPORT_SYMBOL_GPL(driver_find_device); 95 : : 96 : : /** 97 : : * driver_create_file - create sysfs file for driver. 98 : : * @drv: driver. 99 : : * @attr: driver attribute descriptor. 100 : : */ 101 : 7518 : int driver_create_file(struct device_driver *drv, 102 : : const struct driver_attribute *attr) 103 : : { 104 : 7518 : int error; 105 : : 106 [ + - ]: 7518 : if (drv) 107 : 7518 : error = sysfs_create_file(&drv->p->kobj, &attr->attr); 108 : : else 109 : : error = -EINVAL; 110 : 7518 : return error; 111 : : } 112 : : EXPORT_SYMBOL_GPL(driver_create_file); 113 : : 114 : : /** 115 : : * driver_remove_file - remove sysfs file for driver. 116 : : * @drv: driver. 117 : : * @attr: driver attribute descriptor. 118 : : */ 119 : 189 : void driver_remove_file(struct device_driver *drv, 120 : : const struct driver_attribute *attr) 121 : : { 122 [ + - ]: 189 : if (drv) 123 : 189 : sysfs_remove_file(&drv->p->kobj, &attr->attr); 124 : 189 : } 125 : : EXPORT_SYMBOL_GPL(driver_remove_file); 126 : : 127 : 4956 : int driver_add_groups(struct device_driver *drv, 128 : : const struct attribute_group **groups) 129 : : { 130 : 2478 : return sysfs_create_groups(&drv->p->kobj, groups); 131 : : } 132 : : 133 : 126 : void driver_remove_groups(struct device_driver *drv, 134 : : const struct attribute_group **groups) 135 : : { 136 : 63 : sysfs_remove_groups(&drv->p->kobj, groups); 137 : 63 : } 138 : : 139 : : /** 140 : : * driver_register - register driver with bus 141 : : * @drv: driver to register 142 : : * 143 : : * We pass off most of the work to the bus_add_driver() call, 144 : : * since most of the things we have to do deal with the bus 145 : : * structures. 146 : : */ 147 : 2478 : int driver_register(struct device_driver *drv) 148 : : { 149 : 2478 : int ret; 150 : 2478 : struct device_driver *other; 151 : : 152 [ - + ]: 2478 : if (!drv->bus->p) { 153 : 0 : pr_err("Driver '%s' was unable to register with bus_type '%s' because the bus was not initialized.\n", 154 : : drv->name, drv->bus->name); 155 : 0 : return -EINVAL; 156 : : } 157 : : 158 [ + + + - ]: 2478 : if ((drv->bus->probe && drv->probe) || 159 [ + + + - ]: 2478 : (drv->bus->remove && drv->remove) || 160 [ + + - + ]: 2478 : (drv->bus->shutdown && drv->shutdown)) 161 : 0 : printk(KERN_WARNING "Driver '%s' needs updating - please use " 162 : : "bus_type methods\n", drv->name); 163 : : 164 : 2478 : other = driver_find(drv->name, drv->bus); 165 [ - + ]: 2478 : if (other) { 166 : 0 : printk(KERN_ERR "Error: Driver '%s' is already registered, " 167 : : "aborting...\n", drv->name); 168 : 0 : return -EBUSY; 169 : : } 170 : : 171 : 2478 : ret = bus_add_driver(drv); 172 [ + - ]: 2478 : if (ret) 173 : : return ret; 174 : 2478 : ret = driver_add_groups(drv, drv->groups); 175 [ - + ]: 2478 : if (ret) { 176 : 0 : bus_remove_driver(drv); 177 : 0 : return ret; 178 : : } 179 : 2478 : kobject_uevent(&drv->p->kobj, KOBJ_ADD); 180 : : 181 : 2478 : return ret; 182 : : } 183 : : EXPORT_SYMBOL_GPL(driver_register); 184 : : 185 : : /** 186 : : * driver_unregister - remove driver from system. 187 : : * @drv: driver. 188 : : * 189 : : * Again, we pass off most of the work to the bus-level call. 190 : : */ 191 : 63 : void driver_unregister(struct device_driver *drv) 192 : : { 193 [ + - - + ]: 63 : if (!drv || !drv->p) { 194 : 0 : WARN(1, "Unexpected driver unregister!\n"); 195 : 0 : return; 196 : : } 197 : 63 : driver_remove_groups(drv, drv->groups); 198 : 63 : bus_remove_driver(drv); 199 : : } 200 : : EXPORT_SYMBOL_GPL(driver_unregister); 201 : : 202 : : /** 203 : : * driver_find - locate driver on a bus by its name. 204 : : * @name: name of the driver. 205 : : * @bus: bus to scan for the driver. 206 : : * 207 : : * Call kset_find_obj() to iterate over list of drivers on 208 : : * a bus to find driver by name. Return driver if found. 209 : : * 210 : : * This routine provides no locking to prevent the driver it returns 211 : : * from being unregistered or unloaded while the caller is using it. 212 : : * The caller is responsible for preventing this. 213 : : */ 214 : 2478 : struct device_driver *driver_find(const char *name, struct bus_type *bus) 215 : : { 216 : 2478 : struct kobject *k = kset_find_obj(bus->p->drivers_kset, name); 217 : 2478 : struct driver_private *priv; 218 : : 219 [ - + ]: 2478 : if (k) { 220 : : /* Drop reference added by kset_find_obj() */ 221 : 0 : kobject_put(k); 222 : 0 : priv = to_driver(k); 223 : 0 : return priv->driver; 224 : : } 225 : : return NULL; 226 : : } 227 : : EXPORT_SYMBOL_GPL(driver_find);