Blame view
drivers/base/dd.c
33.5 KB
989d42e85 driver core: add ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
07e4a3e27 [PATCH] Move devi... |
2 |
/* |
4a3ad20cc Driver core: codi... |
3 |
* drivers/base/dd.c - The core device/driver interactions. |
07e4a3e27 [PATCH] Move devi... |
4 |
* |
4a3ad20cc Driver core: codi... |
5 6 7 |
* This file contains the (sometimes tricky) code that controls the * interactions between devices and drivers, which primarily includes * driver binding and unbinding. |
07e4a3e27 [PATCH] Move devi... |
8 |
* |
4a3ad20cc Driver core: codi... |
9 10 11 |
* All of this code used to exist in drivers/base/bus.c, but was * relocated to here in the name of compartmentalization (since it wasn't * strictly code just for the 'struct bus_type'. |
07e4a3e27 [PATCH] Move devi... |
12 |
* |
4a3ad20cc Driver core: codi... |
13 14 |
* Copyright (c) 2002-5 Patrick Mochel * Copyright (c) 2002-3 Open Source Development Labs |
b40284378 Driver core: move... |
15 16 |
* Copyright (c) 2007-2009 Greg Kroah-Hartman <gregkh@suse.de> * Copyright (c) 2007-2009 Novell Inc. |
07e4a3e27 [PATCH] Move devi... |
17 |
*/ |
28af109a5 driver core: add ... |
18 |
#include <linux/debugfs.h> |
07e4a3e27 [PATCH] Move devi... |
19 |
#include <linux/device.h> |
216773a78 Consolidate drive... |
20 |
#include <linux/delay.h> |
0a0f0d8be dma-mapping: spli... |
21 |
#include <linux/dma-map-ops.h> |
1f5000bd8 initcall_debug: a... |
22 |
#include <linux/init.h> |
07e4a3e27 [PATCH] Move devi... |
23 |
#include <linux/module.h> |
d779249ed Driver Core: add ... |
24 |
#include <linux/kthread.h> |
735a7ffb7 [PATCH] drivers: ... |
25 |
#include <linux/wait.h> |
216773a78 Consolidate drive... |
26 |
#include <linux/async.h> |
5e928f77a PM: Introduce cor... |
27 |
#include <linux/pm_runtime.h> |
ab78029ec drivers/pinctrl: ... |
28 |
#include <linux/pinctrl/devinfo.h> |
d090b70ed driver core: add ... |
29 |
#include <linux/slab.h> |
07e4a3e27 [PATCH] Move devi... |
30 31 32 |
#include "base.h" #include "power/power.h" |
d1c3414c2 drivercore: Add d... |
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/* * Deferred Probe infrastructure. * * Sometimes driver probe order matters, but the kernel doesn't always have * dependency information which means some drivers will get probed before a * resource it depends on is available. For example, an SDHCI driver may * first need a GPIO line from an i2c GPIO controller before it can be * initialized. If a required resource is not available yet, a driver can * request probing to be deferred by returning -EPROBE_DEFER from its probe hook * * Deferred probe maintains two lists of devices, a pending list and an active * list. A driver returning -EPROBE_DEFER causes the device to be added to the * pending list. A successful driver probe will trigger moving all devices * from the pending to the active list so that the workqueue will eventually * retry them. * * The deferred_probe_mutex must be held any time the deferred_probe_*_list |
ef8a3fd6e driver core: move... |
50 |
* of the (struct device*)->p->deferred_probe pointers are manipulated |
d1c3414c2 drivercore: Add d... |
51 52 53 54 |
*/ static DEFINE_MUTEX(deferred_probe_mutex); static LIST_HEAD(deferred_probe_pending_list); static LIST_HEAD(deferred_probe_active_list); |
58b116bce drivercore: defer... |
55 |
static atomic_t deferred_trigger_count = ATOMIC_INIT(0); |
28af109a5 driver core: add ... |
56 |
static struct dentry *deferred_devices; |
25b4e70dc driver core: allo... |
57 |
static bool initcalls_done; |
d1c3414c2 drivercore: Add d... |
58 |
|
1ea61b68d async: Add cmdlin... |
59 60 61 |
/* Save the async probe drivers' name from kernel cmdline */ #define ASYNC_DRV_NAMES_MAX_LEN 256 static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN]; |
41575335e driver core: Remo... |
62 |
/* |
013c074f8 PM / sleep: prohi... |
63 64 65 66 67 68 69 |
* In some cases, like suspend to RAM or hibernation, It might be reasonable * to prohibit probing of devices as it could be unsafe. * Once defer_all_probes is true all drivers probes will be forcibly deferred. */ static bool defer_all_probes; /* |
d1c3414c2 drivercore: Add d... |
70 71 72 73 74 |
* deferred_probe_work_func() - Retry probing devices in the active list. */ static void deferred_probe_work_func(struct work_struct *work) { struct device *dev; |
ef8a3fd6e driver core: move... |
75 |
struct device_private *private; |
d1c3414c2 drivercore: Add d... |
76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
/* * This block processes every device in the deferred 'active' list. * Each device is removed from the active list and passed to * bus_probe_device() to re-attempt the probe. The loop continues * until every device in the active list is removed and retried. * * Note: Once the device is removed from the list and the mutex is * released, it is possible for the device get freed by another thread * and cause a illegal pointer dereference. This code uses * get/put_device() to ensure the device structure cannot disappear * from under our feet. */ mutex_lock(&deferred_probe_mutex); while (!list_empty(&deferred_probe_active_list)) { |
ef8a3fd6e driver core: move... |
90 91 92 93 |
private = list_first_entry(&deferred_probe_active_list, typeof(*dev->p), deferred_probe); dev = private->device; list_del_init(&private->deferred_probe); |
d1c3414c2 drivercore: Add d... |
94 95 |
get_device(dev); |
8b0372a25 driver core: mino... |
96 97 98 99 |
/* * Drop the mutex while probing each device; the probe path may * manipulate the deferred list */ |
d1c3414c2 drivercore: Add d... |
100 |
mutex_unlock(&deferred_probe_mutex); |
8153584e3 driver core: Move... |
101 |
|
d1c3414c2 drivercore: Add d... |
102 103 |
dev_dbg(dev, "Retrying from deferred list "); |
0a50f61c4 drivers: base: in... |
104 |
bus_probe_device(dev); |
d1c3414c2 drivercore: Add d... |
105 106 107 108 109 110 111 |
mutex_lock(&deferred_probe_mutex); put_device(dev); } mutex_unlock(&deferred_probe_mutex); } static DECLARE_WORK(deferred_probe_work, deferred_probe_work_func); |
e7dd40105 driver core: Add ... |
112 |
void driver_deferred_probe_add(struct device *dev) |
d1c3414c2 drivercore: Add d... |
113 114 |
{ mutex_lock(&deferred_probe_mutex); |
ef8a3fd6e driver core: move... |
115 |
if (list_empty(&dev->p->deferred_probe)) { |
d1c3414c2 drivercore: Add d... |
116 117 |
dev_dbg(dev, "Added to deferred list "); |
1d29cfa57 driver core: fixu... |
118 |
list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list); |
d1c3414c2 drivercore: Add d... |
119 120 121 122 123 124 125 |
} mutex_unlock(&deferred_probe_mutex); } void driver_deferred_probe_del(struct device *dev) { mutex_lock(&deferred_probe_mutex); |
ef8a3fd6e driver core: move... |
126 |
if (!list_empty(&dev->p->deferred_probe)) { |
d1c3414c2 drivercore: Add d... |
127 128 |
dev_dbg(dev, "Removed from deferred list "); |
ef8a3fd6e driver core: move... |
129 |
list_del_init(&dev->p->deferred_probe); |
d090b70ed driver core: add ... |
130 131 |
kfree(dev->p->deferred_probe_reason); dev->p->deferred_probe_reason = NULL; |
d1c3414c2 drivercore: Add d... |
132 133 134 135 136 137 138 139 140 141 142 |
} mutex_unlock(&deferred_probe_mutex); } static bool driver_deferred_probe_enable = false; /** * driver_deferred_probe_trigger() - Kick off re-probing deferred devices * * This functions moves all devices from the pending list to the active * list and schedules the deferred probe workqueue to process them. It * should be called anytime a driver is successfully bound to a device. |
58b116bce drivercore: defer... |
143 144 145 146 147 |
* * Note, there is a race condition in multi-threaded probe. In the case where * more than one device is probing at the same time, it is possible for one * probe to complete successfully while another is about to defer. If the second * depends on the first, then it will get put on the pending list after the |
9ba8af664 base:dd - Fix for... |
148 |
* trigger event has already occurred and will be stuck there. |
58b116bce drivercore: defer... |
149 150 151 152 153 |
* * The atomic 'deferred_trigger_count' is used to determine if a successful * trigger has occurred in the midst of probing a driver. If the trigger count * changes in the midst of a probe, then deferred processing should be triggered * again. |
d1c3414c2 drivercore: Add d... |
154 155 156 157 158 |
*/ static void driver_deferred_probe_trigger(void) { if (!driver_deferred_probe_enable) return; |
8b0372a25 driver core: mino... |
159 160 |
/* * A successful probe means that all the devices in the pending list |
d1c3414c2 drivercore: Add d... |
161 |
* should be triggered to be reprobed. Move all the deferred devices |
8b0372a25 driver core: mino... |
162 163 |
* into the active list so they can be retried by the workqueue */ |
d1c3414c2 drivercore: Add d... |
164 |
mutex_lock(&deferred_probe_mutex); |
58b116bce drivercore: defer... |
165 |
atomic_inc(&deferred_trigger_count); |
d1c3414c2 drivercore: Add d... |
166 167 168 |
list_splice_tail_init(&deferred_probe_pending_list, &deferred_probe_active_list); mutex_unlock(&deferred_probe_mutex); |
8b0372a25 driver core: mino... |
169 170 171 172 |
/* * Kick the re-probe thread. It may already be scheduled, but it is * safe to kick it again. */ |
2c507e464 device core: Remo... |
173 |
schedule_work(&deferred_probe_work); |
d1c3414c2 drivercore: Add d... |
174 175 176 |
} /** |
dbf03d656 driver core: fix ... |
177 |
* device_block_probing() - Block/defer device's probes |
013c074f8 PM / sleep: prohi... |
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
* * It will disable probing of devices and defer their probes instead. */ void device_block_probing(void) { defer_all_probes = true; /* sync with probes to avoid races. */ wait_for_device_probe(); } /** * device_unblock_probing() - Unblock/enable device's probes * * It will restore normal behavior and trigger re-probing of deferred * devices. */ void device_unblock_probing(void) { defer_all_probes = false; driver_deferred_probe_trigger(); } |
d090b70ed driver core: add ... |
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
/** * device_set_deferred_probe_reason() - Set defer probe reason message for device * @dev: the pointer to the struct device * @vaf: the pointer to va_format structure with message */ void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf) { const char *drv = dev_driver_string(dev); mutex_lock(&deferred_probe_mutex); kfree(dev->p->deferred_probe_reason); dev->p->deferred_probe_reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf); mutex_unlock(&deferred_probe_mutex); } |
28af109a5 driver core: add ... |
215 216 217 218 219 220 221 222 223 224 |
/* * deferred_devs_show() - Show the devices in the deferred probe pending list. */ static int deferred_devs_show(struct seq_file *s, void *data) { struct device_private *curr; mutex_lock(&deferred_probe_mutex); list_for_each_entry(curr, &deferred_probe_pending_list, deferred_probe) |
d090b70ed driver core: add ... |
225 226 227 |
seq_printf(s, "%s\t%s", dev_name(curr->device), curr->device->p->deferred_probe_reason ?: " "); |
28af109a5 driver core: add ... |
228 229 230 231 232 233 |
mutex_unlock(&deferred_probe_mutex); return 0; } DEFINE_SHOW_ATTRIBUTE(deferred_devs); |
ce68929f0 driver core: Reve... |
234 |
int driver_deferred_probe_timeout; |
64c775fb4 driver core: Rena... |
235 |
EXPORT_SYMBOL_GPL(driver_deferred_probe_timeout); |
35a672363 driver core: Ensu... |
236 |
static DECLARE_WAIT_QUEUE_HEAD(probe_timeout_waitqueue); |
64c775fb4 driver core: Rena... |
237 |
|
25b4e70dc driver core: allo... |
238 239 |
static int __init deferred_probe_timeout_setup(char *str) { |
63c980470 driver core: Repl... |
240 241 242 |
int timeout; if (!kstrtoint(str, 10, &timeout)) |
64c775fb4 driver core: Rena... |
243 |
driver_deferred_probe_timeout = timeout; |
25b4e70dc driver core: allo... |
244 245 246 247 248 249 250 251 |
return 1; } __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); /** * driver_deferred_probe_check_state() - Check deferred probe state * @dev: device to check * |
c8c43cee2 driver core: Fix ... |
252 253 254 255 256 |
* Return: * -ENODEV if initcalls have completed and modules are disabled. * -ETIMEDOUT if the deferred probe timeout was set and has expired * and modules are enabled. * -EPROBE_DEFER in other cases. |
25b4e70dc driver core: allo... |
257 258 259 260 261 262 |
* * Drivers or subsystems can opt-in to calling this function instead of directly * returning -EPROBE_DEFER. */ int driver_deferred_probe_check_state(struct device *dev) { |
0e9f8d09d driver core: Remo... |
263 |
if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) { |
eb7fbc9fb driver core: Add ... |
264 265 |
dev_warn(dev, "ignoring dependency for device, assuming no driver "); |
0e9f8d09d driver core: Remo... |
266 267 |
return -ENODEV; } |
62a6bc3a1 driver: core: All... |
268 |
|
ce68929f0 driver core: Reve... |
269 |
if (!driver_deferred_probe_timeout && initcalls_done) { |
c8be6af9e Merge v5.7-rc5 in... |
270 271 |
dev_warn(dev, "deferred probe timeout, ignoring dependency "); |
0e9f8d09d driver core: Remo... |
272 273 |
return -ETIMEDOUT; } |
62a6bc3a1 driver: core: All... |
274 |
|
25b4e70dc driver core: allo... |
275 276 277 278 279 280 |
return -EPROBE_DEFER; } static void deferred_probe_timeout_work_func(struct work_struct *work) { struct device_private *private, *p; |
64c775fb4 driver core: Rena... |
281 |
driver_deferred_probe_timeout = 0; |
25b4e70dc driver core: allo... |
282 283 284 285 |
driver_deferred_probe_trigger(); flush_work(&deferred_probe_work); list_for_each_entry_safe(private, p, &deferred_probe_pending_list, deferred_probe) |
eb7fbc9fb driver core: Add ... |
286 287 |
dev_info(private->device, "deferred probe pending "); |
b292b50b0 driver core: Fix ... |
288 |
wake_up_all(&probe_timeout_waitqueue); |
25b4e70dc driver core: allo... |
289 290 |
} static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func); |
013c074f8 PM / sleep: prohi... |
291 |
/** |
d1c3414c2 drivercore: Add d... |
292 293 294 295 296 297 298 299 |
* deferred_probe_initcall() - Enable probing of deferred devices * * We don't want to get in the way when the bulk of drivers are getting probed. * Instead, this initcall makes sure that deferred probing is delayed until * late_initcall time. */ static int deferred_probe_initcall(void) { |
28af109a5 driver core: add ... |
300 301 |
deferred_devices = debugfs_create_file("devices_deferred", 0444, NULL, NULL, &deferred_devs_fops); |
d1c3414c2 drivercore: Add d... |
302 303 |
driver_deferred_probe_enable = true; driver_deferred_probe_trigger(); |
d72cca1ee drivercore: Fix o... |
304 |
/* Sort as many dependencies as possible before exiting initcalls */ |
2c507e464 device core: Remo... |
305 |
flush_work(&deferred_probe_work); |
25b4e70dc driver core: allo... |
306 307 308 309 310 311 312 313 |
initcalls_done = true; /* * Trigger deferred probe again, this time we won't defer anything * that is optional */ driver_deferred_probe_trigger(); flush_work(&deferred_probe_work); |
64c775fb4 driver core: Rena... |
314 |
if (driver_deferred_probe_timeout > 0) { |
25b4e70dc driver core: allo... |
315 |
schedule_delayed_work(&deferred_probe_timeout_work, |
64c775fb4 driver core: Rena... |
316 |
driver_deferred_probe_timeout * HZ); |
25b4e70dc driver core: allo... |
317 |
} |
d1c3414c2 drivercore: Add d... |
318 319 320 |
return 0; } late_initcall(deferred_probe_initcall); |
07e4a3e27 [PATCH] Move devi... |
321 |
|
28af109a5 driver core: add ... |
322 323 324 325 326 |
static void __exit deferred_probe_exit(void) { debugfs_remove_recursive(deferred_devices); } __exitcall(deferred_probe_exit); |
6b9cb4275 device core: add ... |
327 328 329 330 331 332 333 334 335 336 337 |
/** * device_is_bound() - Check if device is bound to a driver * @dev: device to check * * Returns true if passed device has already finished probing successfully * against a driver. * * This function must be called with the device lock held. */ bool device_is_bound(struct device *dev) { |
3ded91041 driver core: Avoi... |
338 |
return dev->p && klist_node_attached(&dev->p->knode_driver); |
6b9cb4275 device core: add ... |
339 |
} |
1901fb260 Driver core: fix ... |
340 |
static void driver_bound(struct device *dev) |
07e4a3e27 [PATCH] Move devi... |
341 |
{ |
6b9cb4275 device core: add ... |
342 |
if (device_is_bound(dev)) { |
eb7fbc9fb driver core: Add ... |
343 344 |
pr_warn("%s: device %s already bound ", |
2b3a302a0 driver core: repl... |
345 |
__func__, kobject_name(&dev->kobj)); |
1901fb260 Driver core: fix ... |
346 |
return; |
f86db396f drivers/base: che... |
347 |
} |
4c898c7f2 [PATCH] Driver Co... |
348 |
|
94f8cc0ee drivers/base/dd.c... |
349 350 351 |
pr_debug("driver: '%s': %s: bound to device '%s' ", dev->driver->name, __func__, dev_name(dev)); |
116af3782 Driver core: add ... |
352 |
|
fbb88fadf driver-core: fix ... |
353 |
klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); |
9ed989537 driver core: Func... |
354 |
device_links_driver_bound(dev); |
fbb88fadf driver-core: fix ... |
355 |
|
aa8e54b55 PM / sleep: Go di... |
356 |
device_pm_check_callbacks(dev); |
8b0372a25 driver core: mino... |
357 |
/* |
5d8cbe07c drivers: base: mo... |
358 359 360 361 362 363 364 365 |
* Force the device to the end of the dpm_list since * the PM code assumes that the order we add things to * the list is a good order for suspend but deferred * probe makes that very unsafe. */ device_pm_move_to_tail(dev); /* |
8b0372a25 driver core: mino... |
366 367 368 |
* Make sure the device is no longer in one of the deferred lists and * kick off retrying all pending devices */ |
d1c3414c2 drivercore: Add d... |
369 370 |
driver_deferred_probe_del(dev); driver_deferred_probe_trigger(); |
116af3782 Driver core: add ... |
371 |
if (dev->bus) |
c6f7e72a3 driver core: remo... |
372 |
blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
116af3782 Driver core: add ... |
373 |
BUS_NOTIFY_BOUND_DRIVER, dev); |
1455cf8db driver core: emit... |
374 375 |
kobject_uevent(&dev->kobj, KOBJ_BIND); |
1901fb260 Driver core: fix ... |
376 |
} |
3c47d19ff drivers: base: ad... |
377 378 379 380 |
static ssize_t coredump_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { device_lock(dev); |
1fe56e0ca drivers: base: re... |
381 |
dev->driver->coredump(dev); |
3c47d19ff drivers: base: ad... |
382 383 384 385 386 |
device_unlock(dev); return count; } static DEVICE_ATTR_WO(coredump); |
1901fb260 Driver core: fix ... |
387 388 389 |
static int driver_sysfs_add(struct device *dev) { int ret; |
45daef0fd Driver core: Add ... |
390 391 392 |
if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_BIND_DRIVER, dev); |
e5dd12784 Driver core: move... |
393 |
ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj, |
3c47d19ff drivers: base: ad... |
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 |
kobject_name(&dev->kobj)); if (ret) goto fail; ret = sysfs_create_link(&dev->kobj, &dev->driver->p->kobj, "driver"); if (ret) goto rm_dev; if (!IS_ENABLED(CONFIG_DEV_COREDUMP) || !dev->driver->coredump || !device_create_file(dev, &dev_attr_coredump)) return 0; sysfs_remove_link(&dev->kobj, "driver"); rm_dev: sysfs_remove_link(&dev->driver->p->kobj, |
07e4a3e27 [PATCH] Move devi... |
411 |
kobject_name(&dev->kobj)); |
3c47d19ff drivers: base: ad... |
412 413 |
fail: |
f86db396f drivers/base: che... |
414 |
return ret; |
07e4a3e27 [PATCH] Move devi... |
415 |
} |
1901fb260 Driver core: fix ... |
416 417 418 419 420 |
static void driver_sysfs_remove(struct device *dev) { struct device_driver *drv = dev->driver; if (drv) { |
3c47d19ff drivers: base: ad... |
421 422 |
if (drv->coredump) device_remove_file(dev, &dev_attr_coredump); |
e5dd12784 Driver core: move... |
423 |
sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj)); |
1901fb260 Driver core: fix ... |
424 425 426 427 428 |
sysfs_remove_link(&dev->kobj, "driver"); } } /** |
4a3ad20cc Driver core: codi... |
429 430 |
* device_bind_driver - bind a driver to one device. * @dev: device. |
1901fb260 Driver core: fix ... |
431 |
* |
4a3ad20cc Driver core: codi... |
432 433 |
* Allow manual attachment of a driver to a device. * Caller must have already set @dev->driver. |
1901fb260 Driver core: fix ... |
434 |
* |
fe940d736 driver core: Drop... |
435 436 437 |
* Note that this does not modify the bus reference count. * Please verify that is accounted for before calling this. * (It is ok to call with no other effort from a driver's probe() method.) |
1901fb260 Driver core: fix ... |
438 |
* |
8e9394ce2 Driver core: crea... |
439 |
* This function must be called with the device lock held. |
1901fb260 Driver core: fix ... |
440 441 442 |
*/ int device_bind_driver(struct device *dev) { |
cb986b749 driver core: Chan... |
443 444 445 446 447 |
int ret; ret = driver_sysfs_add(dev); if (!ret) driver_bound(dev); |
14b6257a5 device core: add ... |
448 449 450 |
else if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_DRIVER_NOT_BOUND, dev); |
cb986b749 driver core: Chan... |
451 |
return ret; |
1901fb260 Driver core: fix ... |
452 |
} |
4a3ad20cc Driver core: codi... |
453 |
EXPORT_SYMBOL_GPL(device_bind_driver); |
1901fb260 Driver core: fix ... |
454 |
|
d779249ed Driver Core: add ... |
455 |
static atomic_t probe_count = ATOMIC_INIT(0); |
735a7ffb7 [PATCH] drivers: ... |
456 |
static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); |
0ff26c662 driver core: Fix ... |
457 458 459 460 461 462 463 464 |
static void driver_deferred_probe_add_trigger(struct device *dev, int local_trigger_count) { driver_deferred_probe_add(dev); /* Did a trigger occur while probing? Need to re-trigger if yes */ if (local_trigger_count != atomic_read(&deferred_trigger_count)) driver_deferred_probe_trigger(); } |
8fd456ec0 driver core: Add ... |
465 466 467 468 469 470 471 472 |
static ssize_t state_synced_show(struct device *dev, struct device_attribute *attr, char *buf) { bool val; device_lock(dev); val = dev->state_synced; device_unlock(dev); |
948b3edba drivers core: Mis... |
473 |
|
aa838896d drivers core: Use... |
474 475 |
return sysfs_emit(buf, "%u ", val); |
8fd456ec0 driver core: Add ... |
476 477 |
} static DEVICE_ATTR_RO(state_synced); |
21c7f30b1 driver core: per-... |
478 |
static int really_probe(struct device *dev, struct device_driver *drv) |
07e4a3e27 [PATCH] Move devi... |
479 |
{ |
013c074f8 PM / sleep: prohi... |
480 |
int ret = -EPROBE_DEFER; |
58b116bce drivercore: defer... |
481 |
int local_trigger_count = atomic_read(&deferred_trigger_count); |
c5f062748 driver core: skip... |
482 483 |
bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) && !drv->suppress_bind_attrs; |
07e4a3e27 [PATCH] Move devi... |
484 |
|
013c074f8 PM / sleep: prohi... |
485 486 487 |
if (defer_all_probes) { /* * Value of defer_all_probes can be set only by |
dbf03d656 driver core: fix ... |
488 |
* device_block_probing() which, in turn, will call |
013c074f8 PM / sleep: prohi... |
489 490 491 492 493 494 495 |
* wait_for_device_probe() right after that to avoid any races. */ dev_dbg(dev, "Driver %s force probe deferral ", drv->name); driver_deferred_probe_add(dev); return ret; } |
9ed989537 driver core: Func... |
496 |
ret = device_links_check_suppliers(dev); |
0ff26c662 driver core: Fix ... |
497 498 |
if (ret == -EPROBE_DEFER) driver_deferred_probe_add_trigger(dev, local_trigger_count); |
9ed989537 driver core: Func... |
499 500 |
if (ret) return ret; |
d779249ed Driver Core: add ... |
501 |
atomic_inc(&probe_count); |
7dc72b284 Driver core: clea... |
502 503 |
pr_debug("bus: '%s': %s: probing driver %s with device %s ", |
1e0b2cf93 driver core: stru... |
504 |
drv->bus->name, __func__, drv->name, dev_name(dev)); |
7c35e699c driver core: Prin... |
505 506 507 |
if (!list_empty(&dev->devres_head)) { dev_crit(dev, "Resources present before probing "); |
b292b50b0 driver core: Fix ... |
508 509 |
ret = -EBUSY; goto done; |
7c35e699c driver core: Prin... |
510 |
} |
07e4a3e27 [PATCH] Move devi... |
511 |
|
bea5b158f driver core: add ... |
512 |
re_probe: |
07e4a3e27 [PATCH] Move devi... |
513 |
dev->driver = drv; |
ab78029ec drivers/pinctrl: ... |
514 515 516 517 |
/* If using pinctrl, bind pins now before probing */ ret = pinctrl_bind_pins(dev); if (ret) |
14b6257a5 device core: add ... |
518 |
goto pinctrl_bind_failed; |
ab78029ec drivers/pinctrl: ... |
519 |
|
ccf640f4c dma-mapping: remo... |
520 521 522 |
if (dev->bus->dma_configure) { ret = dev->bus->dma_configure(dev); if (ret) |
0b777eee8 driver core: Post... |
523 |
goto probe_failed; |
ccf640f4c dma-mapping: remo... |
524 |
} |
09515ef5d of/acpi: Configur... |
525 |
|
1901fb260 Driver core: fix ... |
526 |
if (driver_sysfs_add(dev)) { |
eb7fbc9fb driver core: Add ... |
527 528 529 |
pr_err("%s: driver_sysfs_add(%s) failed ", __func__, dev_name(dev)); |
1901fb260 Driver core: fix ... |
530 531 |
goto probe_failed; } |
e90d55327 driver core / PM:... |
532 533 534 535 536 |
if (dev->pm_domain && dev->pm_domain->activate) { ret = dev->pm_domain->activate(dev); if (ret) goto probe_failed; } |
594c8281f [PATCH] Add bus_t... |
537 538 |
if (dev->bus->probe) { ret = dev->bus->probe(dev); |
1901fb260 Driver core: fix ... |
539 |
if (ret) |
d779249ed Driver Core: add ... |
540 |
goto probe_failed; |
594c8281f [PATCH] Add bus_t... |
541 |
} else if (drv->probe) { |
0d3e5a2e3 [PATCH] Driver Co... |
542 |
ret = drv->probe(dev); |
1901fb260 Driver core: fix ... |
543 |
if (ret) |
d779249ed Driver Core: add ... |
544 |
goto probe_failed; |
f86db396f drivers/base: che... |
545 |
} |
1901fb260 Driver core: fix ... |
546 |
|
23b690444 driver core: add ... |
547 548 549 550 551 |
if (device_add_groups(dev, drv->dev_groups)) { dev_err(dev, "device_add_groups() failed "); goto dev_groups_failed; } |
8fd456ec0 driver core: Add ... |
552 553 554 555 556 557 |
if (dev_has_sync_state(dev) && device_create_file(dev, &dev_attr_state_synced)) { dev_err(dev, "state_synced sysfs add failed "); goto dev_sysfs_state_synced_failed; } |
bea5b158f driver core: add ... |
558 559 |
if (test_remove) { test_remove = false; |
8fd456ec0 driver core: Add ... |
560 |
device_remove_file(dev, &dev_attr_state_synced); |
23b690444 driver core: add ... |
561 |
device_remove_groups(dev, drv->dev_groups); |
bdacd1b42 driver core: fix ... |
562 |
if (dev->bus->remove) |
bea5b158f driver core: add ... |
563 564 565 566 567 568 569 570 571 572 573 574 575 576 |
dev->bus->remove(dev); else if (drv->remove) drv->remove(dev); devres_release_all(dev); driver_sysfs_remove(dev); dev->driver = NULL; dev_set_drvdata(dev, NULL); if (dev->pm_domain && dev->pm_domain->dismiss) dev->pm_domain->dismiss(dev); pm_runtime_reinit(dev); goto re_probe; } |
ef0eebc05 drivers/pinctrl: ... |
577 |
pinctrl_init_done(dev); |
e90d55327 driver core / PM:... |
578 579 |
if (dev->pm_domain && dev->pm_domain->sync) dev->pm_domain->sync(dev); |
1901fb260 Driver core: fix ... |
580 |
driver_bound(dev); |
0d3e5a2e3 [PATCH] Driver Co... |
581 |
ret = 1; |
7dc72b284 Driver core: clea... |
582 583 |
pr_debug("bus: '%s': %s: bound device %s to driver %s ", |
1e0b2cf93 driver core: stru... |
584 |
drv->bus->name, __func__, dev_name(dev), drv->name); |
d779249ed Driver Core: add ... |
585 |
goto done; |
0d3e5a2e3 [PATCH] Driver Co... |
586 |
|
8fd456ec0 driver core: Add ... |
587 588 |
dev_sysfs_state_synced_failed: device_remove_groups(dev, drv->dev_groups); |
23b690444 driver core: add ... |
589 590 591 592 593 |
dev_groups_failed: if (dev->bus->remove) dev->bus->remove(dev); else if (drv->remove) drv->remove(dev); |
d779249ed Driver Core: add ... |
594 |
probe_failed: |
14b6257a5 device core: add ... |
595 596 597 598 |
if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_DRIVER_NOT_BOUND, dev); pinctrl_bind_failed: |
9ed989537 driver core: Func... |
599 |
device_links_no_driver(dev); |
9ac7849e3 devres: device re... |
600 |
devres_release_all(dev); |
0b777eee8 driver core: Post... |
601 |
arch_teardown_dma_ops(dev); |
1901fb260 Driver core: fix ... |
602 603 |
driver_sysfs_remove(dev); dev->driver = NULL; |
0998d0631 device-core: Ensu... |
604 |
dev_set_drvdata(dev, NULL); |
e90d55327 driver core / PM:... |
605 606 |
if (dev->pm_domain && dev->pm_domain->dismiss) dev->pm_domain->dismiss(dev); |
5de85b9d5 PM / runtime: Re-... |
607 |
pm_runtime_reinit(dev); |
08810a411 PM / core: Add NE... |
608 |
dev_pm_set_driver_flags(dev, 0); |
1901fb260 Driver core: fix ... |
609 |
|
bb2b40754 driver core: use ... |
610 611 |
switch (ret) { case -EPROBE_DEFER: |
d1c3414c2 drivercore: Add d... |
612 |
/* Driver requested deferred probing */ |
13fcffbbd driver core: Make... |
613 614 |
dev_dbg(dev, "Driver %s requests probe deferral ", drv->name); |
0ff26c662 driver core: Fix ... |
615 |
driver_deferred_probe_add_trigger(dev, local_trigger_count); |
bb2b40754 driver core: use ... |
616 617 618 619 620 621 622 623 |
break; case -ENODEV: case -ENXIO: pr_debug("%s: probe of %s rejects match %d ", drv->name, dev_name(dev), ret); break; default: |
0d3e5a2e3 [PATCH] Driver Co... |
624 |
/* driver matched but the probe failed */ |
eb7fbc9fb driver core: Add ... |
625 626 627 |
pr_warn("%s: probe of %s failed with error %d ", drv->name, dev_name(dev), ret); |
0d3e5a2e3 [PATCH] Driver Co... |
628 |
} |
c578abbc2 driver core: Don'... |
629 630 631 632 633 |
/* * Ignore errors returned by ->probe so that the next driver can try * its luck. */ ret = 0; |
d779249ed Driver Core: add ... |
634 |
done: |
d779249ed Driver Core: add ... |
635 |
atomic_dec(&probe_count); |
b292b50b0 driver core: Fix ... |
636 |
wake_up_all(&probe_waitqueue); |
d779249ed Driver Core: add ... |
637 638 |
return ret; } |
0a50f61c4 drivers: base: in... |
639 640 641 642 643 |
/* * For initcall_debug, show the driver probe time. */ static int really_probe_debug(struct device *dev, struct device_driver *drv) { |
e3aa745ff driver core: Use ... |
644 |
ktime_t calltime, rettime; |
0a50f61c4 drivers: base: in... |
645 646 647 648 649 |
int ret; calltime = ktime_get(); ret = really_probe(dev, drv); rettime = ktime_get(); |
eb7fbc9fb driver core: Add ... |
650 651 |
pr_debug("probe of %s returned %d after %lld usecs ", |
e3aa745ff driver core: Use ... |
652 |
dev_name(dev), ret, ktime_us_delta(rettime, calltime)); |
0a50f61c4 drivers: base: in... |
653 654 |
return ret; } |
d779249ed Driver Core: add ... |
655 656 657 658 659 660 661 662 |
/** * driver_probe_done * Determine if the probe sequence is finished or not. * * Should somehow figure out how to use a semaphore, not an atomic variable... */ int driver_probe_done(void) { |
927f82875 driver core: Read... |
663 664 665 666 667 |
int local_probe_count = atomic_read(&probe_count); pr_debug("%s: probe_count = %d ", __func__, local_probe_count); if (local_probe_count) |
d779249ed Driver Core: add ... |
668 669 670 671 672 |
return -EBUSY; return 0; } /** |
216773a78 Consolidate drive... |
673 674 |
* wait_for_device_probe * Wait for device probing to be completed. |
216773a78 Consolidate drive... |
675 |
*/ |
b23530ebc driver core: remo... |
676 |
void wait_for_device_probe(void) |
216773a78 Consolidate drive... |
677 |
{ |
35a672363 driver core: Ensu... |
678 679 |
/* wait for probe timeout */ wait_event(probe_timeout_waitqueue, !driver_deferred_probe_timeout); |
013c074f8 PM / sleep: prohi... |
680 |
/* wait for the deferred probe workqueue to finish */ |
2c507e464 device core: Remo... |
681 |
flush_work(&deferred_probe_work); |
013c074f8 PM / sleep: prohi... |
682 |
|
216773a78 Consolidate drive... |
683 |
/* wait for the known devices to complete their probing */ |
b23530ebc driver core: remo... |
684 |
wait_event(probe_waitqueue, atomic_read(&probe_count) == 0); |
216773a78 Consolidate drive... |
685 |
async_synchronize_full(); |
216773a78 Consolidate drive... |
686 |
} |
d4d5291c8 driver synchroniz... |
687 |
EXPORT_SYMBOL_GPL(wait_for_device_probe); |
216773a78 Consolidate drive... |
688 689 |
/** |
d779249ed Driver Core: add ... |
690 691 692 693 |
* driver_probe_device - attempt to bind device & driver together * @drv: driver to bind a device to * @dev: device to try to bind to the driver * |
49b420a13 driver core: chec... |
694 |
* This function returns -ENODEV if the device is not registered, |
af901ca18 tree-wide: fix as... |
695 |
* 1 if the device is bound successfully and 0 otherwise. |
d779249ed Driver Core: add ... |
696 |
* |
8e9394ce2 Driver core: crea... |
697 698 |
* This function must be called with @dev lock held. When called for a * USB interface, @dev->parent lock must be held as well. |
ddef08dd0 Driver core: wake... |
699 700 |
* * If the device has a parent, runtime-resume the parent before driver probing. |
d779249ed Driver Core: add ... |
701 |
*/ |
4a3ad20cc Driver core: codi... |
702 |
int driver_probe_device(struct device_driver *drv, struct device *dev) |
d779249ed Driver Core: add ... |
703 |
{ |
d779249ed Driver Core: add ... |
704 |
int ret = 0; |
f2eaae197 Driver core: Fix ... |
705 706 |
if (!device_is_registered(dev)) return -ENODEV; |
d779249ed Driver Core: add ... |
707 |
|
7dc72b284 Driver core: clea... |
708 709 |
pr_debug("bus: '%s': %s: matched device %s with driver %s ", |
1e0b2cf93 driver core: stru... |
710 |
drv->bus->name, __func__, dev_name(dev), drv->name); |
d779249ed Driver Core: add ... |
711 |
|
b06c0b2f0 Revert "PM / runt... |
712 |
pm_runtime_get_suppliers(dev); |
ddef08dd0 Driver core: wake... |
713 714 |
if (dev->parent) pm_runtime_get_sync(dev->parent); |
5e928f77a PM: Introduce cor... |
715 |
pm_runtime_barrier(dev); |
0a50f61c4 drivers: base: in... |
716 717 718 719 |
if (initcall_debug) ret = really_probe_debug(dev, drv); else ret = really_probe(dev, drv); |
fa180eb44 PM / Runtime: Idl... |
720 |
pm_request_idle(dev); |
d779249ed Driver Core: add ... |
721 |
|
ddef08dd0 Driver core: wake... |
722 723 |
if (dev->parent) pm_runtime_put(dev->parent); |
b06c0b2f0 Revert "PM / runt... |
724 |
pm_runtime_put_suppliers(dev); |
0d3e5a2e3 [PATCH] Driver Co... |
725 |
return ret; |
07e4a3e27 [PATCH] Move devi... |
726 |
} |
1ea61b68d async: Add cmdlin... |
727 728 729 730 731 732 733 734 735 |
static inline bool cmdline_requested_async_probing(const char *drv_name) { return parse_option_str(async_probe_drv_names, drv_name); } /* The option format is "driver_async_probe=drv_name1,drv_name2,..." */ static int __init save_async_options(char *buf) { if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN) |
eb7fbc9fb driver core: Add ... |
736 737 |
pr_warn("Too long list of driver names for 'driver_async_probe'! "); |
1ea61b68d async: Add cmdlin... |
738 739 740 741 742 |
strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN); return 0; } __setup("driver_async_probe=", save_async_options); |
765230b5f driver-core: add ... |
743 |
bool driver_allows_async_probing(struct device_driver *drv) |
2287c322b [PATCH] Use bus_f... |
744 |
{ |
d173a137c driver-core: enab... |
745 746 |
switch (drv->probe_type) { case PROBE_PREFER_ASYNCHRONOUS: |
f2411da74 driver-core: add ... |
747 |
return true; |
d173a137c driver-core: enab... |
748 749 750 751 |
case PROBE_FORCE_SYNCHRONOUS: return false; default: |
1ea61b68d async: Add cmdlin... |
752 753 |
if (cmdline_requested_async_probing(drv->name)) return true; |
80c6e1465 driver-core: fix ... |
754 |
if (module_requested_async_probing(drv->owner)) |
d173a137c driver-core: enab... |
755 |
return true; |
f2411da74 driver-core: add ... |
756 |
|
d173a137c driver-core: enab... |
757 758 |
return false; } |
765230b5f driver-core: add ... |
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 |
} struct device_attach_data { struct device *dev; /* * Indicates whether we are are considering asynchronous probing or * not. Only initial binding after device or driver registration * (including deferral processing) may be done asynchronously, the * rest is always synchronous, as we expect it is being done by * request from userspace. */ bool check_async; /* * Indicates if we are binding synchronous or asynchronous drivers. * When asynchronous probing is enabled we'll execute 2 passes * over drivers: first pass doing synchronous probing and second * doing asynchronous probing (if synchronous did not succeed - * most likely because there was no driver requiring synchronous * probing - and we found asynchronous driver during first pass). * The 2 passes are done because we can't shoot asynchronous * probe for given device and driver from bus_for_each_drv() since * driver pointer is not guaranteed to stay valid once * bus_for_each_drv() iterates to the next driver on the bus. */ bool want_async; /* * We'll set have_async to 'true' if, while scanning for matching * driver, we'll encounter one that requests asynchronous probing. */ bool have_async; }; static int __device_attach_driver(struct device_driver *drv, void *_data) { struct device_attach_data *data = _data; struct device *dev = data->dev; bool async_allowed; |
656b8035b ARM: 8524/1: driv... |
799 |
int ret; |
765230b5f driver-core: add ... |
800 |
|
656b8035b ARM: 8524/1: driv... |
801 802 803 |
ret = driver_match_device(drv, dev); if (ret == 0) { /* no match */ |
49b420a13 driver core: chec... |
804 |
return 0; |
656b8035b ARM: 8524/1: driv... |
805 806 807 808 809 |
} else if (ret == -EPROBE_DEFER) { dev_dbg(dev, "Device match requests probe deferral "); driver_deferred_probe_add(dev); } else if (ret < 0) { |
eb7fbc9fb driver core: Add ... |
810 811 |
dev_dbg(dev, "Bus failed to match device: %d ", ret); |
656b8035b ARM: 8524/1: driv... |
812 813 |
return ret; } /* ret > 0 means positive match */ |
49b420a13 driver core: chec... |
814 |
|
765230b5f driver-core: add ... |
815 816 817 818 819 820 821 |
async_allowed = driver_allows_async_probing(drv); if (async_allowed) data->have_async = true; if (data->check_async && async_allowed != data->want_async) return 0; |
0d3e5a2e3 [PATCH] Driver Co... |
822 |
return driver_probe_device(drv, dev); |
2287c322b [PATCH] Use bus_f... |
823 |
} |
765230b5f driver-core: add ... |
824 825 826 827 828 829 830 831 832 833 |
static void __device_attach_async_helper(void *_dev, async_cookie_t cookie) { struct device *dev = _dev; struct device_attach_data data = { .dev = dev, .check_async = true, .want_async = true, }; device_lock(dev); |
3451a495e driver core: Esta... |
834 835 836 837 838 839 840 841 |
/* * Check if device has already been removed or claimed. This may * happen with driver loading, device discovery/registration, * and deferred probe processing happens all at once with * multiple threads. */ if (dev->p->dead || dev->driver) goto out_unlock; |
ddef08dd0 Driver core: wake... |
842 843 |
if (dev->parent) pm_runtime_get_sync(dev->parent); |
765230b5f driver-core: add ... |
844 845 846 847 848 |
bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); dev_dbg(dev, "async probe completed "); pm_request_idle(dev); |
ddef08dd0 Driver core: wake... |
849 850 |
if (dev->parent) pm_runtime_put(dev->parent); |
3451a495e driver core: Esta... |
851 |
out_unlock: |
765230b5f driver-core: add ... |
852 853 854 855 |
device_unlock(dev); put_device(dev); } |
802a87fd5 driver-core: make... |
856 |
static int __device_attach(struct device *dev, bool allow_async) |
07e4a3e27 [PATCH] Move devi... |
857 |
{ |
0d3e5a2e3 [PATCH] Driver Co... |
858 |
int ret = 0; |
8e9394ce2 Driver core: crea... |
859 |
device_lock(dev); |
654888327 driver core: Avoi... |
860 861 862 |
if (dev->p->dead) { goto out_unlock; } else if (dev->driver) { |
6b9cb4275 device core: add ... |
863 |
if (device_is_bound(dev)) { |
8497d6a21 driver-core: fix ... |
864 865 866 |
ret = 1; goto out_unlock; } |
f86db396f drivers/base: che... |
867 868 869 |
ret = device_bind_driver(dev); if (ret == 0) ret = 1; |
c6a46696f driver core: don'... |
870 871 872 873 |
else { dev->driver = NULL; ret = 0; } |
21c7f30b1 driver core: per-... |
874 |
} else { |
765230b5f driver-core: add ... |
875 876 877 878 879 |
struct device_attach_data data = { .dev = dev, .check_async = allow_async, .want_async = false, }; |
ddef08dd0 Driver core: wake... |
880 881 |
if (dev->parent) pm_runtime_get_sync(dev->parent); |
765230b5f driver-core: add ... |
882 883 884 885 886 887 888 889 890 891 892 893 894 |
ret = bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); if (!ret && allow_async && data.have_async) { /* * If we could not find appropriate driver * synchronously and we are allowed to do * async probes and there are drivers that * want to probe asynchronously, we'll * try them. */ dev_dbg(dev, "scheduling asynchronous probe "); get_device(dev); |
c37e20eaf driver core: Atta... |
895 |
async_schedule_dev(__device_attach_async_helper, dev); |
765230b5f driver-core: add ... |
896 897 898 |
} else { pm_request_idle(dev); } |
ddef08dd0 Driver core: wake... |
899 900 901 |
if (dev->parent) pm_runtime_put(dev->parent); |
21c7f30b1 driver core: per-... |
902 |
} |
8497d6a21 driver-core: fix ... |
903 |
out_unlock: |
8e9394ce2 Driver core: crea... |
904 |
device_unlock(dev); |
0d3e5a2e3 [PATCH] Driver Co... |
905 |
return ret; |
2287c322b [PATCH] Use bus_f... |
906 |
} |
765230b5f driver-core: add ... |
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 |
/** * device_attach - try to attach device to a driver. * @dev: device. * * Walk the list of drivers that the bus has and call * driver_probe_device() for each pair. If a compatible * pair is found, break out and return. * * Returns 1 if the device was bound to a driver; * 0 if no matching driver was found; * -ENODEV if the device is not registered. * * When called for a USB interface, @dev->parent lock must be held. */ int device_attach(struct device *dev) { return __device_attach(dev, false); } |
4a3ad20cc Driver core: codi... |
926 |
EXPORT_SYMBOL_GPL(device_attach); |
2287c322b [PATCH] Use bus_f... |
927 |
|
765230b5f driver-core: add ... |
928 929 930 931 |
void device_initial_probe(struct device *dev) { __device_attach(dev, true); } |
ed88747c6 device core: Cons... |
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 |
/* * __device_driver_lock - acquire locks needed to manipulate dev->drv * @dev: Device we will update driver info for * @parent: Parent device. Needed if the bus requires parent lock * * This function will take the required locks for manipulating dev->drv. * Normally this will just be the @dev lock, but when called for a USB * interface, @parent lock will be held as well. */ static void __device_driver_lock(struct device *dev, struct device *parent) { if (parent && dev->bus->need_parent_lock) device_lock(parent); device_lock(dev); } /* * __device_driver_unlock - release locks needed to manipulate dev->drv * @dev: Device we will update driver info for * @parent: Parent device. Needed if the bus requires parent lock * * This function will release the required locks for manipulating dev->drv. * Normally this will just be the the @dev lock, but when called for a * USB interface, @parent lock will be released as well. */ static void __device_driver_unlock(struct device *dev, struct device *parent) { device_unlock(dev); if (parent && dev->bus->need_parent_lock) device_unlock(parent); } /** * device_driver_attach - attach a specific driver to a specific device * @drv: Driver to attach * @dev: Device to attach it to * * Manually attach driver to a device. Will acquire both @dev lock and * @dev->parent lock if needed. */ int device_driver_attach(struct device_driver *drv, struct device *dev) { int ret = 0; __device_driver_lock(dev, dev->parent); /* * If device has been removed or someone has already successfully * bound a driver before us just skip the driver probe call. */ if (!dev->p->dead && !dev->driver) ret = driver_probe_device(drv, dev); __device_driver_unlock(dev, dev->parent); return ret; } |
ef0ff6835 driver core: Prob... |
989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 |
static void __driver_attach_async_helper(void *_dev, async_cookie_t cookie) { struct device *dev = _dev; struct device_driver *drv; int ret = 0; __device_driver_lock(dev, dev->parent); drv = dev->p->async_driver; /* * If device has been removed or someone has already successfully * bound a driver before us just skip the driver probe call. */ if (!dev->p->dead && !dev->driver) ret = driver_probe_device(drv, dev); __device_driver_unlock(dev, dev->parent); dev_dbg(dev, "driver %s async attach completed: %d ", drv->name, ret); put_device(dev); } |
4a3ad20cc Driver core: codi... |
1013 |
static int __driver_attach(struct device *dev, void *data) |
2287c322b [PATCH] Use bus_f... |
1014 |
{ |
4a3ad20cc Driver core: codi... |
1015 |
struct device_driver *drv = data; |
656b8035b ARM: 8524/1: driv... |
1016 |
int ret; |
0d3e5a2e3 [PATCH] Driver Co... |
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 |
/* * Lock device and try to bind to it. We drop the error * here and always return 0, because we need to keep trying * to bind to devices and some drivers will return an error * simply if it didn't support the device. * * driver_probe_device() will spit a warning if there * is an error. */ |
656b8035b ARM: 8524/1: driv... |
1027 1028 1029 |
ret = driver_match_device(drv, dev); if (ret == 0) { /* no match */ |
6cd495860 device model: Do ... |
1030 |
return 0; |
656b8035b ARM: 8524/1: driv... |
1031 1032 1033 1034 1035 |
} else if (ret == -EPROBE_DEFER) { dev_dbg(dev, "Device match requests probe deferral "); driver_deferred_probe_add(dev); } else if (ret < 0) { |
eb7fbc9fb driver core: Add ... |
1036 1037 |
dev_dbg(dev, "Bus failed to match device: %d ", ret); |
656b8035b ARM: 8524/1: driv... |
1038 1039 |
return ret; } /* ret > 0 means positive match */ |
6cd495860 device model: Do ... |
1040 |
|
ef0ff6835 driver core: Prob... |
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 |
if (driver_allows_async_probing(drv)) { /* * Instead of probing the device synchronously we will * probe it asynchronously to allow for more parallelism. * * We only take the device lock here in order to guarantee * that the dev->driver and async_driver fields are protected */ dev_dbg(dev, "probing driver %s asynchronously ", drv->name); device_lock(dev); if (!dev->driver) { get_device(dev); dev->p->async_driver = drv; |
c37e20eaf driver core: Atta... |
1055 |
async_schedule_dev(__driver_attach_async_helper, dev); |
ef0ff6835 driver core: Prob... |
1056 1057 1058 1059 |
} device_unlock(dev); return 0; } |
ed88747c6 device core: Cons... |
1060 |
device_driver_attach(drv, dev); |
0d3e5a2e3 [PATCH] Driver Co... |
1061 |
|
07e4a3e27 [PATCH] Move devi... |
1062 1063 1064 1065 |
return 0; } /** |
4a3ad20cc Driver core: codi... |
1066 1067 |
* driver_attach - try to bind driver to devices. * @drv: driver. |
07e4a3e27 [PATCH] Move devi... |
1068 |
* |
4a3ad20cc Driver core: codi... |
1069 1070 1071 1072 |
* Walk the list of devices that the bus has on it and try to * match the driver with each one. If driver_probe_device() * returns 0 and the @dev->driver is set, we've found a * compatible pair. |
07e4a3e27 [PATCH] Move devi... |
1073 |
*/ |
4a3ad20cc Driver core: codi... |
1074 |
int driver_attach(struct device_driver *drv) |
07e4a3e27 [PATCH] Move devi... |
1075 |
{ |
f86db396f drivers/base: che... |
1076 |
return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); |
07e4a3e27 [PATCH] Move devi... |
1077 |
} |
4a3ad20cc Driver core: codi... |
1078 |
EXPORT_SYMBOL_GPL(driver_attach); |
07e4a3e27 [PATCH] Move devi... |
1079 |
|
ab71c6f07 driver core: fix ... |
1080 |
/* |
8e9394ce2 Driver core: crea... |
1081 1082 |
* __device_release_driver() must be called with @dev lock held. * When called for a USB interface, @dev->parent lock must be held as well. |
07e4a3e27 [PATCH] Move devi... |
1083 |
*/ |
9ed989537 driver core: Func... |
1084 |
static void __device_release_driver(struct device *dev, struct device *parent) |
07e4a3e27 [PATCH] Move devi... |
1085 |
{ |
4a3ad20cc Driver core: codi... |
1086 |
struct device_driver *drv; |
07e4a3e27 [PATCH] Move devi... |
1087 |
|
ef2c51746 Driver core: fix ... |
1088 |
drv = dev->driver; |
c95a6b057 [PATCH] driver co... |
1089 |
if (drv) { |
9226c504e PM: runtime: Resu... |
1090 |
pm_runtime_get_sync(dev); |
9ed989537 driver core: Func... |
1091 |
while (device_links_busy(dev)) { |
ed88747c6 device core: Cons... |
1092 |
__device_driver_unlock(dev, parent); |
9ed989537 driver core: Func... |
1093 1094 |
device_links_unbind_consumers(dev); |
9ed989537 driver core: Func... |
1095 |
|
ed88747c6 device core: Cons... |
1096 |
__device_driver_lock(dev, parent); |
9ed989537 driver core: Func... |
1097 1098 1099 1100 1101 |
/* * A concurrent invocation of the same function might * have released the driver successfully while this one * was waiting, so check for that. */ |
9226c504e PM: runtime: Resu... |
1102 1103 |
if (dev->driver != drv) { pm_runtime_put(dev); |
9ed989537 driver core: Func... |
1104 |
return; |
9226c504e PM: runtime: Resu... |
1105 |
} |
9ed989537 driver core: Func... |
1106 |
} |
1901fb260 Driver core: fix ... |
1107 |
driver_sysfs_remove(dev); |
0d3e5a2e3 [PATCH] Driver Co... |
1108 |
|
116af3782 Driver core: add ... |
1109 |
if (dev->bus) |
c6f7e72a3 driver core: remo... |
1110 |
blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
116af3782 Driver core: add ... |
1111 1112 |
BUS_NOTIFY_UNBIND_DRIVER, dev); |
baab52ded PM / runtime: Use... |
1113 |
pm_runtime_put_sync(dev); |
e1866b33b PM / Runtime: Rew... |
1114 |
|
8fd456ec0 driver core: Add ... |
1115 |
device_remove_file(dev, &dev_attr_state_synced); |
23b690444 driver core: add ... |
1116 |
device_remove_groups(dev, drv->dev_groups); |
0f836ca4c [PATCH] driver co... |
1117 |
if (dev->bus && dev->bus->remove) |
594c8281f [PATCH] Add bus_t... |
1118 1119 |
dev->bus->remove(dev); else if (drv->remove) |
0d3e5a2e3 [PATCH] Driver Co... |
1120 |
drv->remove(dev); |
9ed989537 driver core: Func... |
1121 1122 |
device_links_driver_cleanup(dev); |
09515ef5d of/acpi: Configur... |
1123 |
|
9ac7849e3 devres: device re... |
1124 |
devres_release_all(dev); |
376991db4 driver core: Post... |
1125 |
arch_teardown_dma_ops(dev); |
0d3e5a2e3 [PATCH] Driver Co... |
1126 |
dev->driver = NULL; |
0998d0631 device-core: Ensu... |
1127 |
dev_set_drvdata(dev, NULL); |
e90d55327 driver core / PM:... |
1128 1129 |
if (dev->pm_domain && dev->pm_domain->dismiss) dev->pm_domain->dismiss(dev); |
5de85b9d5 PM / runtime: Re-... |
1130 |
pm_runtime_reinit(dev); |
08810a411 PM / core: Add NE... |
1131 |
dev_pm_set_driver_flags(dev, 0); |
e90d55327 driver core / PM:... |
1132 |
|
8940b4f31 driver core: move... |
1133 |
klist_remove(&dev->p->knode_driver); |
aa8e54b55 PM / sleep: Go di... |
1134 |
device_pm_check_callbacks(dev); |
309b7d60a driver core: add ... |
1135 1136 1137 1138 |
if (dev->bus) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_UNBOUND_DRIVER, dev); |
1455cf8db driver core: emit... |
1139 1140 |
kobject_uevent(&dev->kobj, KOBJ_UNBIND); |
0d3e5a2e3 [PATCH] Driver Co... |
1141 |
} |
07e4a3e27 [PATCH] Move devi... |
1142 |
} |
9ed989537 driver core: Func... |
1143 1144 1145 |
void device_release_driver_internal(struct device *dev, struct device_driver *drv, struct device *parent) |
4bdb35506 driver core: Add ... |
1146 |
{ |
ed88747c6 device core: Cons... |
1147 |
__device_driver_lock(dev, parent); |
4bdb35506 driver core: Add ... |
1148 |
|
4bdb35506 driver core: Add ... |
1149 |
if (!drv || drv == dev->driver) |
9ed989537 driver core: Func... |
1150 |
__device_release_driver(dev, parent); |
4bdb35506 driver core: Add ... |
1151 |
|
ed88747c6 device core: Cons... |
1152 |
__device_driver_unlock(dev, parent); |
4bdb35506 driver core: Add ... |
1153 |
} |
ab71c6f07 driver core: fix ... |
1154 |
/** |
4a3ad20cc Driver core: codi... |
1155 1156 |
* device_release_driver - manually detach device from driver. * @dev: device. |
ab71c6f07 driver core: fix ... |
1157 |
* |
4a3ad20cc Driver core: codi... |
1158 |
* Manually detach device from driver. |
8e9394ce2 Driver core: crea... |
1159 |
* When called for a USB interface, @dev->parent lock must be held. |
9ed989537 driver core: Func... |
1160 1161 1162 1163 |
* * If this function is to be called with @dev->parent lock held, ensure that * the device's consumers are unbound in advance or that their locks can be * acquired under the @dev->parent lock. |
ab71c6f07 driver core: fix ... |
1164 |
*/ |
4a3ad20cc Driver core: codi... |
1165 |
void device_release_driver(struct device *dev) |
94e7b1c5f [PATCH] Add a kli... |
1166 |
{ |
c95a6b057 [PATCH] driver co... |
1167 1168 1169 1170 1171 |
/* * If anyone calls device_release_driver() recursively from * within their ->remove callback for the same device, they * will deadlock right here. */ |
4bdb35506 driver core: Add ... |
1172 |
device_release_driver_internal(dev, NULL, NULL); |
94e7b1c5f [PATCH] Add a kli... |
1173 |
} |
4a3ad20cc Driver core: codi... |
1174 |
EXPORT_SYMBOL_GPL(device_release_driver); |
c95a6b057 [PATCH] driver co... |
1175 |
|
07e4a3e27 [PATCH] Move devi... |
1176 |
/** |
ed88747c6 device core: Cons... |
1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 |
* device_driver_detach - detach driver from a specific device * @dev: device to detach driver from * * Detach driver from device. Will acquire both @dev lock and @dev->parent * lock if needed. */ void device_driver_detach(struct device *dev) { device_release_driver_internal(dev, NULL, dev->parent); } /** |
07e4a3e27 [PATCH] Move devi... |
1189 1190 1191 |
* driver_detach - detach driver from all devices it controls. * @drv: driver. */ |
4a3ad20cc Driver core: codi... |
1192 |
void driver_detach(struct device_driver *drv) |
07e4a3e27 [PATCH] Move devi... |
1193 |
{ |
8940b4f31 driver core: move... |
1194 |
struct device_private *dev_prv; |
4a3ad20cc Driver core: codi... |
1195 |
struct device *dev; |
c95a6b057 [PATCH] driver co... |
1196 |
|
c37d721c6 driver core: Move... |
1197 1198 |
if (driver_allows_async_probing(drv)) async_synchronize_full(); |
c95a6b057 [PATCH] driver co... |
1199 |
for (;;) { |
e5dd12784 Driver core: move... |
1200 1201 1202 |
spin_lock(&drv->p->klist_devices.k_lock); if (list_empty(&drv->p->klist_devices.k_list)) { spin_unlock(&drv->p->klist_devices.k_lock); |
c95a6b057 [PATCH] driver co... |
1203 1204 |
break; } |
a3a87d66d driver core: Repl... |
1205 |
dev_prv = list_last_entry(&drv->p->klist_devices.k_list, |
8940b4f31 driver core: move... |
1206 1207 1208 |
struct device_private, knode_driver.n_node); dev = dev_prv->device; |
c95a6b057 [PATCH] driver co... |
1209 |
get_device(dev); |
e5dd12784 Driver core: move... |
1210 |
spin_unlock(&drv->p->klist_devices.k_lock); |
4bdb35506 driver core: Add ... |
1211 |
device_release_driver_internal(dev, drv, dev->parent); |
c95a6b057 [PATCH] driver co... |
1212 1213 |
put_device(dev); } |
07e4a3e27 [PATCH] Move devi... |
1214 |
} |