Blame view

drivers/base/dd.c 33.5 KB
989d42e85   Greg Kroah-Hartman   driver core: add ...
1
  // SPDX-License-Identifier: GPL-2.0
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
2
  /*
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
3
   * drivers/base/dd.c - The core device/driver interactions.
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
4
   *
4a3ad20cc   Greg Kroah-Hartman   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   Patrick Mochel   [PATCH] Move devi...
8
   *
4a3ad20cc   Greg Kroah-Hartman   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   Patrick Mochel   [PATCH] Move devi...
12
   *
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
13
14
   * Copyright (c) 2002-5 Patrick Mochel
   * Copyright (c) 2002-3 Open Source Development Labs
b40284378   Greg Kroah-Hartman   Driver core: move...
15
16
   * Copyright (c) 2007-2009 Greg Kroah-Hartman <gregkh@suse.de>
   * Copyright (c) 2007-2009 Novell Inc.
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
17
   */
28af109a5   Javier Martinez Canillas   driver core: add ...
18
  #include <linux/debugfs.h>
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
19
  #include <linux/device.h>
216773a78   Arjan van de Ven   Consolidate drive...
20
  #include <linux/delay.h>
0a0f0d8be   Christoph Hellwig   dma-mapping: spli...
21
  #include <linux/dma-map-ops.h>
1f5000bd8   Todd Poynor   initcall_debug: a...
22
  #include <linux/init.h>
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
23
  #include <linux/module.h>
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
24
  #include <linux/kthread.h>
735a7ffb7   Andrew Morton   [PATCH] drivers: ...
25
  #include <linux/wait.h>
216773a78   Arjan van de Ven   Consolidate drive...
26
  #include <linux/async.h>
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
27
  #include <linux/pm_runtime.h>
ab78029ec   Linus Walleij   drivers/pinctrl: ...
28
  #include <linux/pinctrl/devinfo.h>
d090b70ed   Andrzej Hajda   driver core: add ...
29
  #include <linux/slab.h>
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
30
31
32
  
  #include "base.h"
  #include "power/power.h"
d1c3414c2   Grant Likely   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   Greg Kroah-Hartman   driver core: move...
50
   * of the (struct device*)->p->deferred_probe pointers are manipulated
d1c3414c2   Grant Likely   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   Grant Likely   drivercore: defer...
55
  static atomic_t deferred_trigger_count = ATOMIC_INIT(0);
28af109a5   Javier Martinez Canillas   driver core: add ...
56
  static struct dentry *deferred_devices;
25b4e70dc   Rob Herring   driver core: allo...
57
  static bool initcalls_done;
d1c3414c2   Grant Likely   drivercore: Add d...
58

1ea61b68d   Feng Tang   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   Thierry Reding   driver core: Remo...
62
  /*
013c074f8   Strashko, Grygorii   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   Grant Likely   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   Greg Kroah-Hartman   driver core: move...
75
  	struct device_private *private;
d1c3414c2   Grant Likely   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   Greg Kroah-Hartman   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   Grant Likely   drivercore: Add d...
94
95
  
  		get_device(dev);
8b0372a25   Greg Kroah-Hartman   driver core: mino...
96
97
98
99
  		/*
  		 * Drop the mutex while probing each device; the probe path may
  		 * manipulate the deferred list
  		 */
d1c3414c2   Grant Likely   drivercore: Add d...
100
  		mutex_unlock(&deferred_probe_mutex);
8153584e3   Mark Brown   driver core: Move...
101

d1c3414c2   Grant Likely   drivercore: Add d...
102
103
  		dev_dbg(dev, "Retrying from deferred list
  ");
0a50f61c4   Todd Poynor   drivers: base: in...
104
  		bus_probe_device(dev);
d1c3414c2   Grant Likely   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   Rafael J. Wysocki   driver core: Add ...
112
  void driver_deferred_probe_add(struct device *dev)
d1c3414c2   Grant Likely   drivercore: Add d...
113
114
  {
  	mutex_lock(&deferred_probe_mutex);
ef8a3fd6e   Greg Kroah-Hartman   driver core: move...
115
  	if (list_empty(&dev->p->deferred_probe)) {
d1c3414c2   Grant Likely   drivercore: Add d...
116
117
  		dev_dbg(dev, "Added to deferred list
  ");
1d29cfa57   Kuninori Morimoto   driver core: fixu...
118
  		list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list);
d1c3414c2   Grant Likely   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   Greg Kroah-Hartman   driver core: move...
126
  	if (!list_empty(&dev->p->deferred_probe)) {
d1c3414c2   Grant Likely   drivercore: Add d...
127
128
  		dev_dbg(dev, "Removed from deferred list
  ");
ef8a3fd6e   Greg Kroah-Hartman   driver core: move...
129
  		list_del_init(&dev->p->deferred_probe);
d090b70ed   Andrzej Hajda   driver core: add ...
130
131
  		kfree(dev->p->deferred_probe_reason);
  		dev->p->deferred_probe_reason = NULL;
d1c3414c2   Grant Likely   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   Grant Likely   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   Shailendra Verma   base:dd - Fix for...
148
   * trigger event has already occurred and will be stuck there.
58b116bce   Grant Likely   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   Grant Likely   drivercore: Add d...
154
155
156
157
158
   */
  static void driver_deferred_probe_trigger(void)
  {
  	if (!driver_deferred_probe_enable)
  		return;
8b0372a25   Greg Kroah-Hartman   driver core: mino...
159
160
  	/*
  	 * A successful probe means that all the devices in the pending list
d1c3414c2   Grant Likely   drivercore: Add d...
161
  	 * should be triggered to be reprobed.  Move all the deferred devices
8b0372a25   Greg Kroah-Hartman   driver core: mino...
162
163
  	 * into the active list so they can be retried by the workqueue
  	 */
d1c3414c2   Grant Likely   drivercore: Add d...
164
  	mutex_lock(&deferred_probe_mutex);
58b116bce   Grant Likely   drivercore: defer...
165
  	atomic_inc(&deferred_trigger_count);
d1c3414c2   Grant Likely   drivercore: Add d...
166
167
168
  	list_splice_tail_init(&deferred_probe_pending_list,
  			      &deferred_probe_active_list);
  	mutex_unlock(&deferred_probe_mutex);
8b0372a25   Greg Kroah-Hartman   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   Bhaktipriya Shridhar   device core: Remo...
173
  	schedule_work(&deferred_probe_work);
d1c3414c2   Grant Likely   drivercore: Add d...
174
175
176
  }
  
  /**
dbf03d656   Randy Dunlap   driver core: fix ...
177
   * device_block_probing() - Block/defer device's probes
013c074f8   Strashko, Grygorii   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   Andrzej Hajda   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   Javier Martinez Canillas   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   Andrzej Hajda   driver core: add ...
225
226
227
  		seq_printf(s, "%s\t%s", dev_name(curr->device),
  			   curr->device->p->deferred_probe_reason ?: "
  ");
28af109a5   Javier Martinez Canillas   driver core: add ...
228
229
230
231
232
233
  
  	mutex_unlock(&deferred_probe_mutex);
  
  	return 0;
  }
  DEFINE_SHOW_ATTRIBUTE(deferred_devs);
ce68929f0   John Stultz   driver core: Reve...
234
  int driver_deferred_probe_timeout;
64c775fb4   John Stultz   driver core: Rena...
235
  EXPORT_SYMBOL_GPL(driver_deferred_probe_timeout);
35a672363   John Stultz   driver core: Ensu...
236
  static DECLARE_WAIT_QUEUE_HEAD(probe_timeout_waitqueue);
64c775fb4   John Stultz   driver core: Rena...
237

25b4e70dc   Rob Herring   driver core: allo...
238
239
  static int __init deferred_probe_timeout_setup(char *str)
  {
63c980470   Muchun Song   driver core: Repl...
240
241
242
  	int timeout;
  
  	if (!kstrtoint(str, 10, &timeout))
64c775fb4   John Stultz   driver core: Rena...
243
  		driver_deferred_probe_timeout = timeout;
25b4e70dc   Rob Herring   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   John Stultz   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   Rob Herring   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   John Stultz   driver core: Remo...
263
  	if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) {
eb7fbc9fb   Christophe JAILLET   driver core: Add ...
264
265
  		dev_warn(dev, "ignoring dependency for device, assuming no driver
  ");
0e9f8d09d   John Stultz   driver core: Remo...
266
267
  		return -ENODEV;
  	}
62a6bc3a1   Thierry Reding   driver: core: All...
268

ce68929f0   John Stultz   driver core: Reve...
269
  	if (!driver_deferred_probe_timeout && initcalls_done) {
c8be6af9e   Greg Kroah-Hartman   Merge v5.7-rc5 in...
270
271
  		dev_warn(dev, "deferred probe timeout, ignoring dependency
  ");
0e9f8d09d   John Stultz   driver core: Remo...
272
273
  		return -ETIMEDOUT;
  	}
62a6bc3a1   Thierry Reding   driver: core: All...
274

25b4e70dc   Rob Herring   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   John Stultz   driver core: Rena...
281
  	driver_deferred_probe_timeout = 0;
25b4e70dc   Rob Herring   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   Christophe JAILLET   driver core: Add ...
286
287
  		dev_info(private->device, "deferred probe pending
  ");
b292b50b0   Tetsuo Handa   driver core: Fix ...
288
  	wake_up_all(&probe_timeout_waitqueue);
25b4e70dc   Rob Herring   driver core: allo...
289
290
  }
  static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);
013c074f8   Strashko, Grygorii   PM / sleep: prohi...
291
  /**
d1c3414c2   Grant Likely   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   Javier Martinez Canillas   driver core: add ...
300
301
  	deferred_devices = debugfs_create_file("devices_deferred", 0444, NULL,
  					       NULL, &deferred_devs_fops);
d1c3414c2   Grant Likely   drivercore: Add d...
302
303
  	driver_deferred_probe_enable = true;
  	driver_deferred_probe_trigger();
d72cca1ee   Grant Likely   drivercore: Fix o...
304
  	/* Sort as many dependencies as possible before exiting initcalls */
2c507e464   Bhaktipriya Shridhar   device core: Remo...
305
  	flush_work(&deferred_probe_work);
25b4e70dc   Rob Herring   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   John Stultz   driver core: Rena...
314
  	if (driver_deferred_probe_timeout > 0) {
25b4e70dc   Rob Herring   driver core: allo...
315
  		schedule_delayed_work(&deferred_probe_timeout_work,
64c775fb4   John Stultz   driver core: Rena...
316
  			driver_deferred_probe_timeout * HZ);
25b4e70dc   Rob Herring   driver core: allo...
317
  	}
d1c3414c2   Grant Likely   drivercore: Add d...
318
319
320
  	return 0;
  }
  late_initcall(deferred_probe_initcall);
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
321

28af109a5   Javier Martinez Canillas   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   Tomeu Vizoso   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   Rafael J. Wysocki   driver core: Avoi...
338
  	return dev->p && klist_node_attached(&dev->p->knode_driver);
6b9cb4275   Tomeu Vizoso   device core: add ...
339
  }
1901fb260   Kay Sievers   Driver core: fix ...
340
  static void driver_bound(struct device *dev)
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
341
  {
6b9cb4275   Tomeu Vizoso   device core: add ...
342
  	if (device_is_bound(dev)) {
eb7fbc9fb   Christophe JAILLET   driver core: Add ...
343
344
  		pr_warn("%s: device %s already bound
  ",
2b3a302a0   Harvey Harrison   driver core: repl...
345
  			__func__, kobject_name(&dev->kobj));
1901fb260   Kay Sievers   Driver core: fix ...
346
  		return;
f86db396f   Andrew Morton   drivers/base: che...
347
  	}
4c898c7f2   Daniel Ritz   [PATCH] Driver Co...
348

94f8cc0ee   Frank Rowand   drivers/base/dd.c...
349
350
351
  	pr_debug("driver: '%s': %s: bound to device '%s'
  ", dev->driver->name,
  		 __func__, dev_name(dev));
116af3782   Benjamin Herrenschmidt   Driver core: add ...
352

fbb88fadf   Stefani Seibold   driver-core: fix ...
353
  	klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
9ed989537   Rafael J. Wysocki   driver core: Func...
354
  	device_links_driver_bound(dev);
fbb88fadf   Stefani Seibold   driver-core: fix ...
355

aa8e54b55   Tomeu Vizoso   PM / sleep: Go di...
356
  	device_pm_check_callbacks(dev);
8b0372a25   Greg Kroah-Hartman   driver core: mino...
357
  	/*
5d8cbe07c   Dong Aisheng   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   Greg Kroah-Hartman   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   Grant Likely   drivercore: Add d...
369
370
  	driver_deferred_probe_del(dev);
  	driver_deferred_probe_trigger();
116af3782   Benjamin Herrenschmidt   Driver core: add ...
371
  	if (dev->bus)
c6f7e72a3   Greg Kroah-Hartman   driver core: remo...
372
  		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
116af3782   Benjamin Herrenschmidt   Driver core: add ...
373
  					     BUS_NOTIFY_BOUND_DRIVER, dev);
1455cf8db   Dmitry Torokhov   driver core: emit...
374
375
  
  	kobject_uevent(&dev->kobj, KOBJ_BIND);
1901fb260   Kay Sievers   Driver core: fix ...
376
  }
3c47d19ff   Arend van Spriel   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   Arend van Spriel   drivers: base: re...
381
  	dev->driver->coredump(dev);
3c47d19ff   Arend van Spriel   drivers: base: ad...
382
383
384
385
386
  	device_unlock(dev);
  
  	return count;
  }
  static DEVICE_ATTR_WO(coredump);
1901fb260   Kay Sievers   Driver core: fix ...
387
388
389
  static int driver_sysfs_add(struct device *dev)
  {
  	int ret;
45daef0fd   Magnus Damm   Driver core: Add ...
390
391
392
  	if (dev->bus)
  		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
  					     BUS_NOTIFY_BIND_DRIVER, dev);
e5dd12784   Greg Kroah-Hartman   Driver core: move...
393
  	ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj,
3c47d19ff   Arend van Spriel   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   Patrick Mochel   [PATCH] Move devi...
411
  			  kobject_name(&dev->kobj));
3c47d19ff   Arend van Spriel   drivers: base: ad...
412
413
  
  fail:
f86db396f   Andrew Morton   drivers/base: che...
414
  	return ret;
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
415
  }
1901fb260   Kay Sievers   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   Arend van Spriel   drivers: base: ad...
421
422
  		if (drv->coredump)
  			device_remove_file(dev, &dev_attr_coredump);
e5dd12784   Greg Kroah-Hartman   Driver core: move...
423
  		sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj));
1901fb260   Kay Sievers   Driver core: fix ...
424
425
426
427
428
  		sysfs_remove_link(&dev->kobj, "driver");
  	}
  }
  
  /**
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
429
430
   * device_bind_driver - bind a driver to one device.
   * @dev: device.
1901fb260   Kay Sievers   Driver core: fix ...
431
   *
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
432
433
   * Allow manual attachment of a driver to a device.
   * Caller must have already set @dev->driver.
1901fb260   Kay Sievers   Driver core: fix ...
434
   *
fe940d736   Lukas Wunner   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   Kay Sievers   Driver core: fix ...
438
   *
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
439
   * This function must be called with the device lock held.
1901fb260   Kay Sievers   Driver core: fix ...
440
441
442
   */
  int device_bind_driver(struct device *dev)
  {
cb986b749   Cornelia Huck   driver core: Chan...
443
444
445
446
447
  	int ret;
  
  	ret = driver_sysfs_add(dev);
  	if (!ret)
  		driver_bound(dev);
14b6257a5   Andy Shevchenko   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   Cornelia Huck   driver core: Chan...
451
  	return ret;
1901fb260   Kay Sievers   Driver core: fix ...
452
  }
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
453
  EXPORT_SYMBOL_GPL(device_bind_driver);
1901fb260   Kay Sievers   Driver core: fix ...
454

d779249ed   Greg Kroah-Hartman   Driver Core: add ...
455
  static atomic_t probe_count = ATOMIC_INIT(0);
735a7ffb7   Andrew Morton   [PATCH] drivers: ...
456
  static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue);
0ff26c662   Adrian Hunter   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   Saravana Kannan   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   Joe Perches   drivers core: Mis...
473

aa838896d   Joe Perches   drivers core: Use...
474
475
  	return sysfs_emit(buf, "%u
  ", val);
8fd456ec0   Saravana Kannan   driver core: Add ...
476
477
  }
  static DEVICE_ATTR_RO(state_synced);
21c7f30b1   Cornelia Huck   driver core: per-...
478
  static int really_probe(struct device *dev, struct device_driver *drv)
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
479
  {
013c074f8   Strashko, Grygorii   PM / sleep: prohi...
480
  	int ret = -EPROBE_DEFER;
58b116bce   Grant Likely   drivercore: defer...
481
  	int local_trigger_count = atomic_read(&deferred_trigger_count);
c5f062748   Rob Herring   driver core: skip...
482
483
  	bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) &&
  			   !drv->suppress_bind_attrs;
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
484

013c074f8   Strashko, Grygorii   PM / sleep: prohi...
485
486
487
  	if (defer_all_probes) {
  		/*
  		 * Value of defer_all_probes can be set only by
dbf03d656   Randy Dunlap   driver core: fix ...
488
  		 * device_block_probing() which, in turn, will call
013c074f8   Strashko, Grygorii   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   Rafael J. Wysocki   driver core: Func...
496
  	ret = device_links_check_suppliers(dev);
0ff26c662   Adrian Hunter   driver core: Fix ...
497
498
  	if (ret == -EPROBE_DEFER)
  		driver_deferred_probe_add_trigger(dev, local_trigger_count);
9ed989537   Rafael J. Wysocki   driver core: Func...
499
500
  	if (ret)
  		return ret;
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
501
  	atomic_inc(&probe_count);
7dc72b284   Greg Kroah-Hartman   Driver core: clea...
502
503
  	pr_debug("bus: '%s': %s: probing driver %s with device %s
  ",
1e0b2cf93   Kay Sievers   driver core: stru...
504
  		 drv->bus->name, __func__, drv->name, dev_name(dev));
7c35e699c   Geert Uytterhoeven   driver core: Prin...
505
506
507
  	if (!list_empty(&dev->devres_head)) {
  		dev_crit(dev, "Resources present before probing
  ");
b292b50b0   Tetsuo Handa   driver core: Fix ...
508
509
  		ret = -EBUSY;
  		goto done;
7c35e699c   Geert Uytterhoeven   driver core: Prin...
510
  	}
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
511

bea5b158f   Rob Herring   driver core: add ...
512
  re_probe:
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
513
  	dev->driver = drv;
ab78029ec   Linus Walleij   drivers/pinctrl: ...
514
515
516
517
  
  	/* If using pinctrl, bind pins now before probing */
  	ret = pinctrl_bind_pins(dev);
  	if (ret)
14b6257a5   Andy Shevchenko   device core: add ...
518
  		goto pinctrl_bind_failed;
ab78029ec   Linus Walleij   drivers/pinctrl: ...
519

ccf640f4c   Christoph Hellwig   dma-mapping: remo...
520
521
522
  	if (dev->bus->dma_configure) {
  		ret = dev->bus->dma_configure(dev);
  		if (ret)
0b777eee8   John Garry   driver core: Post...
523
  			goto probe_failed;
ccf640f4c   Christoph Hellwig   dma-mapping: remo...
524
  	}
09515ef5d   Sricharan R   of/acpi: Configur...
525

1901fb260   Kay Sievers   Driver core: fix ...
526
  	if (driver_sysfs_add(dev)) {
eb7fbc9fb   Christophe JAILLET   driver core: Add ...
527
528
529
  		pr_err("%s: driver_sysfs_add(%s) failed
  ",
  		       __func__, dev_name(dev));
1901fb260   Kay Sievers   Driver core: fix ...
530
531
  		goto probe_failed;
  	}
e90d55327   Rafael J. Wysocki   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   Russell King   [PATCH] Add bus_t...
537
538
  	if (dev->bus->probe) {
  		ret = dev->bus->probe(dev);
1901fb260   Kay Sievers   Driver core: fix ...
539
  		if (ret)
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
540
  			goto probe_failed;
594c8281f   Russell King   [PATCH] Add bus_t...
541
  	} else if (drv->probe) {
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
542
  		ret = drv->probe(dev);
1901fb260   Kay Sievers   Driver core: fix ...
543
  		if (ret)
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
544
  			goto probe_failed;
f86db396f   Andrew Morton   drivers/base: che...
545
  	}
1901fb260   Kay Sievers   Driver core: fix ...
546

23b690444   Dmitry Torokhov   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   Saravana Kannan   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   Rob Herring   driver core: add ...
558
559
  	if (test_remove) {
  		test_remove = false;
8fd456ec0   Saravana Kannan   driver core: Add ...
560
  		device_remove_file(dev, &dev_attr_state_synced);
23b690444   Dmitry Torokhov   driver core: add ...
561
  		device_remove_groups(dev, drv->dev_groups);
bdacd1b42   Rob Herring   driver core: fix ...
562
  		if (dev->bus->remove)
bea5b158f   Rob Herring   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   Douglas Anderson   drivers/pinctrl: ...
577
  	pinctrl_init_done(dev);
e90d55327   Rafael J. Wysocki   driver core / PM:...
578
579
  	if (dev->pm_domain && dev->pm_domain->sync)
  		dev->pm_domain->sync(dev);
1901fb260   Kay Sievers   Driver core: fix ...
580
  	driver_bound(dev);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
581
  	ret = 1;
7dc72b284   Greg Kroah-Hartman   Driver core: clea...
582
583
  	pr_debug("bus: '%s': %s: bound device %s to driver %s
  ",
1e0b2cf93   Kay Sievers   driver core: stru...
584
  		 drv->bus->name, __func__, dev_name(dev), drv->name);
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
585
  	goto done;
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
586

8fd456ec0   Saravana Kannan   driver core: Add ...
587
588
  dev_sysfs_state_synced_failed:
  	device_remove_groups(dev, drv->dev_groups);
23b690444   Dmitry Torokhov   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   Greg Kroah-Hartman   Driver Core: add ...
594
  probe_failed:
14b6257a5   Andy Shevchenko   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   Rafael J. Wysocki   driver core: Func...
599
  	device_links_no_driver(dev);
9ac7849e3   Tejun Heo   devres: device re...
600
  	devres_release_all(dev);
0b777eee8   John Garry   driver core: Post...
601
  	arch_teardown_dma_ops(dev);
1901fb260   Kay Sievers   Driver core: fix ...
602
603
  	driver_sysfs_remove(dev);
  	dev->driver = NULL;
0998d0631   Hans de Goede   device-core: Ensu...
604
  	dev_set_drvdata(dev, NULL);
e90d55327   Rafael J. Wysocki   driver core / PM:...
605
606
  	if (dev->pm_domain && dev->pm_domain->dismiss)
  		dev->pm_domain->dismiss(dev);
5de85b9d5   Ulf Hansson   PM / runtime: Re-...
607
  	pm_runtime_reinit(dev);
08810a411   Rafael J. Wysocki   PM / core: Add NE...
608
  	dev_pm_set_driver_flags(dev, 0);
1901fb260   Kay Sievers   Driver core: fix ...
609

bb2b40754   Sergei Shtylyov   driver core: use ...
610
611
  	switch (ret) {
  	case -EPROBE_DEFER:
d1c3414c2   Grant Likely   drivercore: Add d...
612
  		/* Driver requested deferred probing */
13fcffbbd   Mark Brown   driver core: Make...
613
614
  		dev_dbg(dev, "Driver %s requests probe deferral
  ", drv->name);
0ff26c662   Adrian Hunter   driver core: Fix ...
615
  		driver_deferred_probe_add_trigger(dev, local_trigger_count);
bb2b40754   Sergei Shtylyov   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   Patrick Mochel   [PATCH] Driver Co...
624
  		/* driver matched but the probe failed */
eb7fbc9fb   Christophe JAILLET   driver core: Add ...
625
626
627
  		pr_warn("%s: probe of %s failed with error %d
  ",
  			drv->name, dev_name(dev), ret);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
628
  	}
c578abbc2   Cornelia Huck   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   Greg Kroah-Hartman   Driver Core: add ...
634
  done:
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
635
  	atomic_dec(&probe_count);
b292b50b0   Tetsuo Handa   driver core: Fix ...
636
  	wake_up_all(&probe_waitqueue);
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
637
638
  	return ret;
  }
0a50f61c4   Todd Poynor   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   Zenghui Yu   driver core: Use ...
644
  	ktime_t calltime, rettime;
0a50f61c4   Todd Poynor   drivers: base: in...
645
646
647
648
649
  	int ret;
  
  	calltime = ktime_get();
  	ret = really_probe(dev, drv);
  	rettime = ktime_get();
eb7fbc9fb   Christophe JAILLET   driver core: Add ...
650
651
  	pr_debug("probe of %s returned %d after %lld usecs
  ",
e3aa745ff   Zenghui Yu   driver core: Use ...
652
  		 dev_name(dev), ret, ktime_us_delta(rettime, calltime));
0a50f61c4   Todd Poynor   drivers: base: in...
653
654
  	return ret;
  }
d779249ed   Greg Kroah-Hartman   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   Andy Shevchenko   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   Greg Kroah-Hartman   Driver Core: add ...
668
669
670
671
672
  		return -EBUSY;
  	return 0;
  }
  
  /**
216773a78   Arjan van de Ven   Consolidate drive...
673
674
   * wait_for_device_probe
   * Wait for device probing to be completed.
216773a78   Arjan van de Ven   Consolidate drive...
675
   */
b23530ebc   Ming Lei   driver core: remo...
676
  void wait_for_device_probe(void)
216773a78   Arjan van de Ven   Consolidate drive...
677
  {
35a672363   John Stultz   driver core: Ensu...
678
679
  	/* wait for probe timeout */
  	wait_event(probe_timeout_waitqueue, !driver_deferred_probe_timeout);
013c074f8   Strashko, Grygorii   PM / sleep: prohi...
680
  	/* wait for the deferred probe workqueue to finish */
2c507e464   Bhaktipriya Shridhar   device core: Remo...
681
  	flush_work(&deferred_probe_work);
013c074f8   Strashko, Grygorii   PM / sleep: prohi...
682

216773a78   Arjan van de Ven   Consolidate drive...
683
  	/* wait for the known devices to complete their probing */
b23530ebc   Ming Lei   driver core: remo...
684
  	wait_event(probe_waitqueue, atomic_read(&probe_count) == 0);
216773a78   Arjan van de Ven   Consolidate drive...
685
  	async_synchronize_full();
216773a78   Arjan van de Ven   Consolidate drive...
686
  }
d4d5291c8   Arjan van de Ven   driver synchroniz...
687
  EXPORT_SYMBOL_GPL(wait_for_device_probe);
216773a78   Arjan van de Ven   Consolidate drive...
688
689
  
  /**
d779249ed   Greg Kroah-Hartman   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   Ming Lei   driver core: chec...
694
   * This function returns -ENODEV if the device is not registered,
af901ca18   André Goddard Rosa   tree-wide: fix as...
695
   * 1 if the device is bound successfully and 0 otherwise.
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
696
   *
8e9394ce2   Greg Kroah-Hartman   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   Rafael J. Wysocki   Driver core: wake...
699
700
   *
   * If the device has a parent, runtime-resume the parent before driver probing.
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
701
   */
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
702
  int driver_probe_device(struct device_driver *drv, struct device *dev)
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
703
  {
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
704
  	int ret = 0;
f2eaae197   Alan Stern   Driver core: Fix ...
705
706
  	if (!device_is_registered(dev))
  		return -ENODEV;
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
707

7dc72b284   Greg Kroah-Hartman   Driver core: clea...
708
709
  	pr_debug("bus: '%s': %s: matched device %s with driver %s
  ",
1e0b2cf93   Kay Sievers   driver core: stru...
710
  		 drv->bus->name, __func__, dev_name(dev), drv->name);
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
711

b06c0b2f0   Rafael J. Wysocki   Revert "PM / runt...
712
  	pm_runtime_get_suppliers(dev);
ddef08dd0   Rafael J. Wysocki   Driver core: wake...
713
714
  	if (dev->parent)
  		pm_runtime_get_sync(dev->parent);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
715
  	pm_runtime_barrier(dev);
0a50f61c4   Todd Poynor   drivers: base: in...
716
717
718
719
  	if (initcall_debug)
  		ret = really_probe_debug(dev, drv);
  	else
  		ret = really_probe(dev, drv);
fa180eb44   Ulf Hansson   PM / Runtime: Idl...
720
  	pm_request_idle(dev);
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
721

ddef08dd0   Rafael J. Wysocki   Driver core: wake...
722
723
  	if (dev->parent)
  		pm_runtime_put(dev->parent);
b06c0b2f0   Rafael J. Wysocki   Revert "PM / runt...
724
  	pm_runtime_put_suppliers(dev);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
725
  	return ret;
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
726
  }
1ea61b68d   Feng Tang   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   Christophe JAILLET   driver core: Add ...
736
737
  		pr_warn("Too long list of driver names for 'driver_async_probe'!
  ");
1ea61b68d   Feng Tang   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   Dmitry Torokhov   driver-core: add ...
743
  bool driver_allows_async_probing(struct device_driver *drv)
2287c322b   Patrick Mochel   [PATCH] Use bus_f...
744
  {
d173a137c   Luis R. Rodriguez   driver-core: enab...
745
746
  	switch (drv->probe_type) {
  	case PROBE_PREFER_ASYNCHRONOUS:
f2411da74   Luis R. Rodriguez   driver-core: add ...
747
  		return true;
d173a137c   Luis R. Rodriguez   driver-core: enab...
748
749
750
751
  	case PROBE_FORCE_SYNCHRONOUS:
  		return false;
  
  	default:
1ea61b68d   Feng Tang   async: Add cmdlin...
752
753
  		if (cmdline_requested_async_probing(drv->name))
  			return true;
80c6e1465   Dmitry Torokhov   driver-core: fix ...
754
  		if (module_requested_async_probing(drv->owner))
d173a137c   Luis R. Rodriguez   driver-core: enab...
755
  			return true;
f2411da74   Luis R. Rodriguez   driver-core: add ...
756

d173a137c   Luis R. Rodriguez   driver-core: enab...
757
758
  		return false;
  	}
765230b5f   Dmitry Torokhov   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   Tomeu Vizoso   ARM: 8524/1: driv...
799
  	int ret;
765230b5f   Dmitry Torokhov   driver-core: add ...
800

656b8035b   Tomeu Vizoso   ARM: 8524/1: driv...
801
802
803
  	ret = driver_match_device(drv, dev);
  	if (ret == 0) {
  		/* no match */
49b420a13   Ming Lei   driver core: chec...
804
  		return 0;
656b8035b   Tomeu Vizoso   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   Christophe JAILLET   driver core: Add ...
810
811
  		dev_dbg(dev, "Bus failed to match device: %d
  ", ret);
656b8035b   Tomeu Vizoso   ARM: 8524/1: driv...
812
813
  		return ret;
  	} /* ret > 0 means positive match */
49b420a13   Ming Lei   driver core: chec...
814

765230b5f   Dmitry Torokhov   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   Patrick Mochel   [PATCH] Driver Co...
822
  	return driver_probe_device(drv, dev);
2287c322b   Patrick Mochel   [PATCH] Use bus_f...
823
  }
765230b5f   Dmitry Torokhov   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   Alexander Duyck   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   Rafael J. Wysocki   Driver core: wake...
842
843
  	if (dev->parent)
  		pm_runtime_get_sync(dev->parent);
765230b5f   Dmitry Torokhov   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   Rafael J. Wysocki   Driver core: wake...
849
850
  	if (dev->parent)
  		pm_runtime_put(dev->parent);
3451a495e   Alexander Duyck   driver core: Esta...
851
  out_unlock:
765230b5f   Dmitry Torokhov   driver-core: add ...
852
853
854
855
  	device_unlock(dev);
  
  	put_device(dev);
  }
802a87fd5   Dmitry Torokhov   driver-core: make...
856
  static int __device_attach(struct device *dev, bool allow_async)
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
857
  {
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
858
  	int ret = 0;
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
859
  	device_lock(dev);
654888327   Lukas Wunner   driver core: Avoi...
860
861
862
  	if (dev->p->dead) {
  		goto out_unlock;
  	} else if (dev->driver) {
6b9cb4275   Tomeu Vizoso   device core: add ...
863
  		if (device_is_bound(dev)) {
8497d6a21   Sebastian Ott   driver-core: fix ...
864
865
866
  			ret = 1;
  			goto out_unlock;
  		}
f86db396f   Andrew Morton   drivers/base: che...
867
868
869
  		ret = device_bind_driver(dev);
  		if (ret == 0)
  			ret = 1;
c6a46696f   Cornelia Huck   driver core: don'...
870
871
872
873
  		else {
  			dev->driver = NULL;
  			ret = 0;
  		}
21c7f30b1   Cornelia Huck   driver core: per-...
874
  	} else {
765230b5f   Dmitry Torokhov   driver-core: add ...
875
876
877
878
879
  		struct device_attach_data data = {
  			.dev = dev,
  			.check_async = allow_async,
  			.want_async = false,
  		};
ddef08dd0   Rafael J. Wysocki   Driver core: wake...
880
881
  		if (dev->parent)
  			pm_runtime_get_sync(dev->parent);
765230b5f   Dmitry Torokhov   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   Alexander Duyck   driver core: Atta...
895
  			async_schedule_dev(__device_attach_async_helper, dev);
765230b5f   Dmitry Torokhov   driver-core: add ...
896
897
898
  		} else {
  			pm_request_idle(dev);
  		}
ddef08dd0   Rafael J. Wysocki   Driver core: wake...
899
900
901
  
  		if (dev->parent)
  			pm_runtime_put(dev->parent);
21c7f30b1   Cornelia Huck   driver core: per-...
902
  	}
8497d6a21   Sebastian Ott   driver-core: fix ...
903
  out_unlock:
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
904
  	device_unlock(dev);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
905
  	return ret;
2287c322b   Patrick Mochel   [PATCH] Use bus_f...
906
  }
765230b5f   Dmitry Torokhov   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   Greg Kroah-Hartman   Driver core: codi...
926
  EXPORT_SYMBOL_GPL(device_attach);
2287c322b   Patrick Mochel   [PATCH] Use bus_f...
927

765230b5f   Dmitry Torokhov   driver-core: add ...
928
929
930
931
  void device_initial_probe(struct device *dev)
  {
  	__device_attach(dev, true);
  }
ed88747c6   Alexander Duyck   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   Alexander Duyck   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   Greg Kroah-Hartman   Driver core: codi...
1013
  static int __driver_attach(struct device *dev, void *data)
2287c322b   Patrick Mochel   [PATCH] Use bus_f...
1014
  {
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1015
  	struct device_driver *drv = data;
656b8035b   Tomeu Vizoso   ARM: 8524/1: driv...
1016
  	int ret;
0d3e5a2e3   Patrick Mochel   [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   Tomeu Vizoso   ARM: 8524/1: driv...
1027
1028
1029
  	ret = driver_match_device(drv, dev);
  	if (ret == 0) {
  		/* no match */
6cd495860   Arjan van de Ven   device model: Do ...
1030
  		return 0;
656b8035b   Tomeu Vizoso   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   Christophe JAILLET   driver core: Add ...
1036
1037
  		dev_dbg(dev, "Bus failed to match device: %d
  ", ret);
656b8035b   Tomeu Vizoso   ARM: 8524/1: driv...
1038
1039
  		return ret;
  	} /* ret > 0 means positive match */
6cd495860   Arjan van de Ven   device model: Do ...
1040

ef0ff6835   Alexander Duyck   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   Alexander Duyck   driver core: Atta...
1055
  			async_schedule_dev(__driver_attach_async_helper, dev);
ef0ff6835   Alexander Duyck   driver core: Prob...
1056
1057
1058
1059
  		}
  		device_unlock(dev);
  		return 0;
  	}
ed88747c6   Alexander Duyck   device core: Cons...
1060
  	device_driver_attach(drv, dev);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
1061

07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1062
1063
1064
1065
  	return 0;
  }
  
  /**
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1066
1067
   * driver_attach - try to bind driver to devices.
   * @drv: driver.
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1068
   *
4a3ad20cc   Greg Kroah-Hartman   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   Patrick Mochel   [PATCH] Move devi...
1073
   */
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1074
  int driver_attach(struct device_driver *drv)
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1075
  {
f86db396f   Andrew Morton   drivers/base: che...
1076
  	return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1077
  }
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1078
  EXPORT_SYMBOL_GPL(driver_attach);
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1079

ab71c6f07   Stefan Richter   driver core: fix ...
1080
  /*
8e9394ce2   Greg Kroah-Hartman   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   Patrick Mochel   [PATCH] Move devi...
1083
   */
9ed989537   Rafael J. Wysocki   driver core: Func...
1084
  static void __device_release_driver(struct device *dev, struct device *parent)
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1085
  {
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1086
  	struct device_driver *drv;
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1087

ef2c51746   Alan Stern   Driver core: fix ...
1088
  	drv = dev->driver;
c95a6b057   Alan Stern   [PATCH] driver co...
1089
  	if (drv) {
9226c504e   Rafael J. Wysocki   PM: runtime: Resu...
1090
  		pm_runtime_get_sync(dev);
9ed989537   Rafael J. Wysocki   driver core: Func...
1091
  		while (device_links_busy(dev)) {
ed88747c6   Alexander Duyck   device core: Cons...
1092
  			__device_driver_unlock(dev, parent);
9ed989537   Rafael J. Wysocki   driver core: Func...
1093
1094
  
  			device_links_unbind_consumers(dev);
9ed989537   Rafael J. Wysocki   driver core: Func...
1095

ed88747c6   Alexander Duyck   device core: Cons...
1096
  			__device_driver_lock(dev, parent);
9ed989537   Rafael J. Wysocki   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   Rafael J. Wysocki   PM: runtime: Resu...
1102
1103
  			if (dev->driver != drv) {
  				pm_runtime_put(dev);
9ed989537   Rafael J. Wysocki   driver core: Func...
1104
  				return;
9226c504e   Rafael J. Wysocki   PM: runtime: Resu...
1105
  			}
9ed989537   Rafael J. Wysocki   driver core: Func...
1106
  		}
1901fb260   Kay Sievers   Driver core: fix ...
1107
  		driver_sysfs_remove(dev);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
1108

116af3782   Benjamin Herrenschmidt   Driver core: add ...
1109
  		if (dev->bus)
c6f7e72a3   Greg Kroah-Hartman   driver core: remo...
1110
  			blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
116af3782   Benjamin Herrenschmidt   Driver core: add ...
1111
1112
  						     BUS_NOTIFY_UNBIND_DRIVER,
  						     dev);
baab52ded   Rafael J. Wysocki   PM / runtime: Use...
1113
  		pm_runtime_put_sync(dev);
e1866b33b   Rafael J. Wysocki   PM / Runtime: Rew...
1114

8fd456ec0   Saravana Kannan   driver core: Add ...
1115
  		device_remove_file(dev, &dev_attr_state_synced);
23b690444   Dmitry Torokhov   driver core: add ...
1116
  		device_remove_groups(dev, drv->dev_groups);
0f836ca4c   Alan Stern   [PATCH] driver co...
1117
  		if (dev->bus && dev->bus->remove)
594c8281f   Russell King   [PATCH] Add bus_t...
1118
1119
  			dev->bus->remove(dev);
  		else if (drv->remove)
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
1120
  			drv->remove(dev);
9ed989537   Rafael J. Wysocki   driver core: Func...
1121
1122
  
  		device_links_driver_cleanup(dev);
09515ef5d   Sricharan R   of/acpi: Configur...
1123

9ac7849e3   Tejun Heo   devres: device re...
1124
  		devres_release_all(dev);
376991db4   Geert Uytterhoeven   driver core: Post...
1125
  		arch_teardown_dma_ops(dev);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
1126
  		dev->driver = NULL;
0998d0631   Hans de Goede   device-core: Ensu...
1127
  		dev_set_drvdata(dev, NULL);
e90d55327   Rafael J. Wysocki   driver core / PM:...
1128
1129
  		if (dev->pm_domain && dev->pm_domain->dismiss)
  			dev->pm_domain->dismiss(dev);
5de85b9d5   Ulf Hansson   PM / runtime: Re-...
1130
  		pm_runtime_reinit(dev);
08810a411   Rafael J. Wysocki   PM / core: Add NE...
1131
  		dev_pm_set_driver_flags(dev, 0);
e90d55327   Rafael J. Wysocki   driver core / PM:...
1132

8940b4f31   Greg Kroah-Hartman   driver core: move...
1133
  		klist_remove(&dev->p->knode_driver);
aa8e54b55   Tomeu Vizoso   PM / sleep: Go di...
1134
  		device_pm_check_callbacks(dev);
309b7d60a   Joerg Roedel   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   Dmitry Torokhov   driver core: emit...
1139
1140
  
  		kobject_uevent(&dev->kobj, KOBJ_UNBIND);
0d3e5a2e3   Patrick Mochel   [PATCH] Driver Co...
1141
  	}
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1142
  }
9ed989537   Rafael J. Wysocki   driver core: Func...
1143
1144
1145
  void device_release_driver_internal(struct device *dev,
  				    struct device_driver *drv,
  				    struct device *parent)
4bdb35506   Rafael J. Wysocki   driver core: Add ...
1146
  {
ed88747c6   Alexander Duyck   device core: Cons...
1147
  	__device_driver_lock(dev, parent);
4bdb35506   Rafael J. Wysocki   driver core: Add ...
1148

4bdb35506   Rafael J. Wysocki   driver core: Add ...
1149
  	if (!drv || drv == dev->driver)
9ed989537   Rafael J. Wysocki   driver core: Func...
1150
  		__device_release_driver(dev, parent);
4bdb35506   Rafael J. Wysocki   driver core: Add ...
1151

ed88747c6   Alexander Duyck   device core: Cons...
1152
  	__device_driver_unlock(dev, parent);
4bdb35506   Rafael J. Wysocki   driver core: Add ...
1153
  }
ab71c6f07   Stefan Richter   driver core: fix ...
1154
  /**
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1155
1156
   * device_release_driver - manually detach device from driver.
   * @dev: device.
ab71c6f07   Stefan Richter   driver core: fix ...
1157
   *
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1158
   * Manually detach device from driver.
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
1159
   * When called for a USB interface, @dev->parent lock must be held.
9ed989537   Rafael J. Wysocki   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   Stefan Richter   driver core: fix ...
1164
   */
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1165
  void device_release_driver(struct device *dev)
94e7b1c5f   Patrick Mochel   [PATCH] Add a kli...
1166
  {
c95a6b057   Alan Stern   [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   Rafael J. Wysocki   driver core: Add ...
1172
  	device_release_driver_internal(dev, NULL, NULL);
94e7b1c5f   Patrick Mochel   [PATCH] Add a kli...
1173
  }
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1174
  EXPORT_SYMBOL_GPL(device_release_driver);
c95a6b057   Alan Stern   [PATCH] driver co...
1175

07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1176
  /**
ed88747c6   Alexander Duyck   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   Patrick Mochel   [PATCH] Move devi...
1189
1190
1191
   * driver_detach - detach driver from all devices it controls.
   * @drv: driver.
   */
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1192
  void driver_detach(struct device_driver *drv)
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1193
  {
8940b4f31   Greg Kroah-Hartman   driver core: move...
1194
  	struct device_private *dev_prv;
4a3ad20cc   Greg Kroah-Hartman   Driver core: codi...
1195
  	struct device *dev;
c95a6b057   Alan Stern   [PATCH] driver co...
1196

c37d721c6   Alexander Duyck   driver core: Move...
1197
1198
  	if (driver_allows_async_probing(drv))
  		async_synchronize_full();
c95a6b057   Alan Stern   [PATCH] driver co...
1199
  	for (;;) {
e5dd12784   Greg Kroah-Hartman   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   Alan Stern   [PATCH] driver co...
1203
1204
  			break;
  		}
a3a87d66d   Andy Shevchenko   driver core: Repl...
1205
  		dev_prv = list_last_entry(&drv->p->klist_devices.k_list,
8940b4f31   Greg Kroah-Hartman   driver core: move...
1206
1207
1208
  				     struct device_private,
  				     knode_driver.n_node);
  		dev = dev_prv->device;
c95a6b057   Alan Stern   [PATCH] driver co...
1209
  		get_device(dev);
e5dd12784   Greg Kroah-Hartman   Driver core: move...
1210
  		spin_unlock(&drv->p->klist_devices.k_lock);
4bdb35506   Rafael J. Wysocki   driver core: Add ...
1211
  		device_release_driver_internal(dev, drv, dev->parent);
c95a6b057   Alan Stern   [PATCH] driver co...
1212
1213
  		put_device(dev);
  	}
07e4a3e27   Patrick Mochel   [PATCH] Move devi...
1214
  }