Lines Matching +full:drv +full:- +full:0

1 // SPDX-License-Identifier: GPL-2.0
3 * driver.c - centralized device driver management
5 * Copyright (c) 2002-3 Patrick Mochel
6 * Copyright (c) 2002-3 Open Source Development Labs
7 * Copyright (c) 2007 Greg Kroah-Hartman <[email protected]>
28 dev = dev_prv->device; in next_device()
34 * driver_set_override() - Helper to set or clear driver override.
36 * @override: Address of string to change (e.g. &device->driver_override);
38 * @s: NUL-terminated string, new driver name to force a match, pass empty
46 * Returns: 0 on success or a negative error code on failure.
55 return -EINVAL; in driver_set_override()
63 if (len >= (PAGE_SIZE - 1)) in driver_set_override()
64 return -EINVAL; in driver_set_override()
68 * bunch of \0 characters like python likes to do. in driver_set_override()
73 /* Empty string passed - clear override */ in driver_set_override()
80 return 0; in driver_set_override()
85 len = cp - s; in driver_set_override()
89 return -ENOMEM; in driver_set_override()
96 /* "\n" passed - clear override */ in driver_set_override()
104 return 0; in driver_set_override()
109 * driver_for_each_device - Iterator for devices bound to a driver.
110 * @drv: Driver we're iterating.
115 * Iterate over the @drv's list of devices calling @fn for each one.
117 int driver_for_each_device(struct device_driver *drv, struct device *start, in driver_for_each_device() argument
122 int error = 0; in driver_for_each_device()
124 if (!drv) in driver_for_each_device()
125 return -EINVAL; in driver_for_each_device()
127 klist_iter_init_node(&drv->p->klist_devices, &i, in driver_for_each_device()
128 start ? &start->p->knode_driver : NULL); in driver_for_each_device()
137 * driver_find_device - device iterator for locating a particular device.
138 * @drv: The device's driver
147 * The callback should return 0 if the device doesn't match and non-zero
148 * if it does. If the callback returns non-zero, this function will
151 struct device *driver_find_device(const struct device_driver *drv, in driver_find_device() argument
158 if (!drv || !drv->p) in driver_find_device()
161 klist_iter_init_node(&drv->p->klist_devices, &i, in driver_find_device()
162 (start ? &start->p->knode_driver : NULL)); in driver_find_device()
175 * driver_create_file - create sysfs file for driver.
176 * @drv: driver.
179 int driver_create_file(const struct device_driver *drv, in driver_create_file() argument
184 if (drv) in driver_create_file()
185 error = sysfs_create_file(&drv->p->kobj, &attr->attr); in driver_create_file()
187 error = -EINVAL; in driver_create_file()
193 * driver_remove_file - remove sysfs file for driver.
194 * @drv: driver.
197 void driver_remove_file(const struct device_driver *drv, in driver_remove_file() argument
200 if (drv) in driver_remove_file()
201 sysfs_remove_file(&drv->p->kobj, &attr->attr); in driver_remove_file()
205 int driver_add_groups(const struct device_driver *drv, in driver_add_groups() argument
208 return sysfs_create_groups(&drv->p->kobj, groups); in driver_add_groups()
211 void driver_remove_groups(const struct device_driver *drv, in driver_remove_groups() argument
214 sysfs_remove_groups(&drv->p->kobj, groups); in driver_remove_groups()
218 * driver_register - register driver with bus
219 * @drv: driver to register
225 int driver_register(struct device_driver *drv) in driver_register() argument
230 if (!bus_is_registered(drv->bus)) { in driver_register()
232 drv->name, drv->bus->name); in driver_register()
233 return -EINVAL; in driver_register()
236 if ((drv->bus->probe && drv->probe) || in driver_register()
237 (drv->bus->remove && drv->remove) || in driver_register()
238 (drv->bus->shutdown && drv->shutdown)) in driver_register()
239 pr_warn("Driver '%s' needs updating - please use " in driver_register()
240 "bus_type methods\n", drv->name); in driver_register()
242 other = driver_find(drv->name, drv->bus); in driver_register()
245 "aborting...\n", drv->name); in driver_register()
246 return -EBUSY; in driver_register()
249 ret = bus_add_driver(drv); in driver_register()
252 ret = driver_add_groups(drv, drv->groups); in driver_register()
254 bus_remove_driver(drv); in driver_register()
257 kobject_uevent(&drv->p->kobj, KOBJ_ADD); in driver_register()
265 * driver_unregister - remove driver from system.
266 * @drv: driver.
268 * Again, we pass off most of the work to the bus-level call.
270 void driver_unregister(struct device_driver *drv) in driver_unregister() argument
272 if (!drv || !drv->p) { in driver_unregister()
276 driver_remove_groups(drv, drv->groups); in driver_unregister()
277 bus_remove_driver(drv); in driver_unregister()