1989d42e8SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
207e4a3e2Smochel@digitalimplant.org /*
307e4a3e2Smochel@digitalimplant.org * drivers/base/dd.c - The core device/driver interactions.
407e4a3e2Smochel@digitalimplant.org *
507e4a3e2Smochel@digitalimplant.org * This file contains the (sometimes tricky) code that controls the
607e4a3e2Smochel@digitalimplant.org * interactions between devices and drivers, which primarily includes
707e4a3e2Smochel@digitalimplant.org * driver binding and unbinding.
807e4a3e2Smochel@digitalimplant.org *
907e4a3e2Smochel@digitalimplant.org * All of this code used to exist in drivers/base/bus.c, but was
1007e4a3e2Smochel@digitalimplant.org * relocated to here in the name of compartmentalization (since it wasn't
1107e4a3e2Smochel@digitalimplant.org * strictly code just for the 'struct bus_type'.
1207e4a3e2Smochel@digitalimplant.org *
1307e4a3e2Smochel@digitalimplant.org * Copyright (c) 2002-5 Patrick Mochel
1407e4a3e2Smochel@digitalimplant.org * Copyright (c) 2002-3 Open Source Development Labs
15b4028437SGreg Kroah-Hartman * Copyright (c) 2007-2009 Greg Kroah-Hartman <gregkh@suse.de>
16b4028437SGreg Kroah-Hartman * Copyright (c) 2007-2009 Novell Inc.
1707e4a3e2Smochel@digitalimplant.org */
1807e4a3e2Smochel@digitalimplant.org
1928af109aSJavier Martinez Canillas #include <linux/debugfs.h>
2007e4a3e2Smochel@digitalimplant.org #include <linux/device.h>
21216773a7SArjan van de Ven #include <linux/delay.h>
220a0f0d8bSChristoph Hellwig #include <linux/dma-map-ops.h>
231f5000bdSTodd Poynor #include <linux/init.h>
2407e4a3e2Smochel@digitalimplant.org #include <linux/module.h>
25d779249eSGreg Kroah-Hartman #include <linux/kthread.h>
26735a7ffbSAndrew Morton #include <linux/wait.h>
27216773a7SArjan van de Ven #include <linux/async.h>
285e928f77SRafael J. Wysocki #include <linux/pm_runtime.h>
29ab78029eSLinus Walleij #include <linux/pinctrl/devinfo.h>
30d090b70eSAndrzej Hajda #include <linux/slab.h>
3107e4a3e2Smochel@digitalimplant.org
3207e4a3e2Smochel@digitalimplant.org #include "base.h"
3307e4a3e2Smochel@digitalimplant.org #include "power/power.h"
3407e4a3e2Smochel@digitalimplant.org
35d1c3414cSGrant Likely /*
36d1c3414cSGrant Likely * Deferred Probe infrastructure.
37d1c3414cSGrant Likely *
38d1c3414cSGrant Likely * Sometimes driver probe order matters, but the kernel doesn't always have
39d1c3414cSGrant Likely * dependency information which means some drivers will get probed before a
40d1c3414cSGrant Likely * resource it depends on is available. For example, an SDHCI driver may
41d1c3414cSGrant Likely * first need a GPIO line from an i2c GPIO controller before it can be
42d1c3414cSGrant Likely * initialized. If a required resource is not available yet, a driver can
43d1c3414cSGrant Likely * request probing to be deferred by returning -EPROBE_DEFER from its probe hook
44d1c3414cSGrant Likely *
45d1c3414cSGrant Likely * Deferred probe maintains two lists of devices, a pending list and an active
46d1c3414cSGrant Likely * list. A driver returning -EPROBE_DEFER causes the device to be added to the
47d1c3414cSGrant Likely * pending list. A successful driver probe will trigger moving all devices
48d1c3414cSGrant Likely * from the pending to the active list so that the workqueue will eventually
49d1c3414cSGrant Likely * retry them.
50d1c3414cSGrant Likely *
51d1c3414cSGrant Likely * The deferred_probe_mutex must be held any time the deferred_probe_*_list
52ef8a3fd6SGreg Kroah-Hartman * of the (struct device*)->p->deferred_probe pointers are manipulated
53d1c3414cSGrant Likely */
54d1c3414cSGrant Likely static DEFINE_MUTEX(deferred_probe_mutex);
55d1c3414cSGrant Likely static LIST_HEAD(deferred_probe_pending_list);
56d1c3414cSGrant Likely static LIST_HEAD(deferred_probe_active_list);
5758b116bcSGrant Likely static atomic_t deferred_trigger_count = ATOMIC_INIT(0);
5825b4e70dSRob Herring static bool initcalls_done;
59d1c3414cSGrant Likely
601ea61b68SFeng Tang /* Save the async probe drivers' name from kernel cmdline */
611ea61b68SFeng Tang #define ASYNC_DRV_NAMES_MAX_LEN 256
621ea61b68SFeng Tang static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN];
63f79f662eSSaravana Kannan static bool async_probe_default;
641ea61b68SFeng Tang
6541575335SThierry Reding /*
66013c074fSStrashko, Grygorii * In some cases, like suspend to RAM or hibernation, It might be reasonable
67013c074fSStrashko, Grygorii * to prohibit probing of devices as it could be unsafe.
68013c074fSStrashko, Grygorii * Once defer_all_probes is true all drivers probes will be forcibly deferred.
69013c074fSStrashko, Grygorii */
70013c074fSStrashko, Grygorii static bool defer_all_probes;
71013c074fSStrashko, Grygorii
__device_set_deferred_probe_reason(const struct device * dev,char * reason)7272a91f19SAhmad Fatoum static void __device_set_deferred_probe_reason(const struct device *dev, char *reason)
7372a91f19SAhmad Fatoum {
7472a91f19SAhmad Fatoum kfree(dev->p->deferred_probe_reason);
7572a91f19SAhmad Fatoum dev->p->deferred_probe_reason = reason;
7672a91f19SAhmad Fatoum }
7772a91f19SAhmad Fatoum
78013c074fSStrashko, Grygorii /*
79d1c3414cSGrant Likely * deferred_probe_work_func() - Retry probing devices in the active list.
80d1c3414cSGrant Likely */
deferred_probe_work_func(struct work_struct * work)81d1c3414cSGrant Likely static void deferred_probe_work_func(struct work_struct *work)
82d1c3414cSGrant Likely {
83d1c3414cSGrant Likely struct device *dev;
84ef8a3fd6SGreg Kroah-Hartman struct device_private *private;
85d1c3414cSGrant Likely /*
86d1c3414cSGrant Likely * This block processes every device in the deferred 'active' list.
87d1c3414cSGrant Likely * Each device is removed from the active list and passed to
88d1c3414cSGrant Likely * bus_probe_device() to re-attempt the probe. The loop continues
89d1c3414cSGrant Likely * until every device in the active list is removed and retried.
90d1c3414cSGrant Likely *
91d1c3414cSGrant Likely * Note: Once the device is removed from the list and the mutex is
92d1c3414cSGrant Likely * released, it is possible for the device get freed by another thread
93d1c3414cSGrant Likely * and cause a illegal pointer dereference. This code uses
94d1c3414cSGrant Likely * get/put_device() to ensure the device structure cannot disappear
95d1c3414cSGrant Likely * from under our feet.
96d1c3414cSGrant Likely */
97d1c3414cSGrant Likely mutex_lock(&deferred_probe_mutex);
98d1c3414cSGrant Likely while (!list_empty(&deferred_probe_active_list)) {
99ef8a3fd6SGreg Kroah-Hartman private = list_first_entry(&deferred_probe_active_list,
100ef8a3fd6SGreg Kroah-Hartman typeof(*dev->p), deferred_probe);
101ef8a3fd6SGreg Kroah-Hartman dev = private->device;
102ef8a3fd6SGreg Kroah-Hartman list_del_init(&private->deferred_probe);
103d1c3414cSGrant Likely
104d1c3414cSGrant Likely get_device(dev);
105d1c3414cSGrant Likely
10672a91f19SAhmad Fatoum __device_set_deferred_probe_reason(dev, NULL);
107f0acf637SAhmad Fatoum
1088b0372a2SGreg Kroah-Hartman /*
1098b0372a2SGreg Kroah-Hartman * Drop the mutex while probing each device; the probe path may
1108b0372a2SGreg Kroah-Hartman * manipulate the deferred list
1118b0372a2SGreg Kroah-Hartman */
112d1c3414cSGrant Likely mutex_unlock(&deferred_probe_mutex);
1138153584eSMark Brown
1148153584eSMark Brown /*
1158153584eSMark Brown * Force the device to the end of the dpm_list since
1168153584eSMark Brown * the PM code assumes that the order we add things to
1178153584eSMark Brown * the list is a good order for suspend but deferred
1188153584eSMark Brown * probe makes that very unsafe.
1198153584eSMark Brown */
120494fd7b7SFeng Kan device_pm_move_to_tail(dev);
1218153584eSMark Brown
122d1c3414cSGrant Likely dev_dbg(dev, "Retrying from deferred list\n");
123d1c3414cSGrant Likely bus_probe_device(dev);
124d1c3414cSGrant Likely mutex_lock(&deferred_probe_mutex);
125d1c3414cSGrant Likely
126d1c3414cSGrant Likely put_device(dev);
127d1c3414cSGrant Likely }
128d1c3414cSGrant Likely mutex_unlock(&deferred_probe_mutex);
129d1c3414cSGrant Likely }
130d1c3414cSGrant Likely static DECLARE_WORK(deferred_probe_work, deferred_probe_work_func);
131d1c3414cSGrant Likely
driver_deferred_probe_add(struct device * dev)132e7dd4010SRafael J. Wysocki void driver_deferred_probe_add(struct device *dev)
133d1c3414cSGrant Likely {
134f2db85b6SSaravana Kannan if (!dev->can_match)
135f2db85b6SSaravana Kannan return;
136f2db85b6SSaravana Kannan
137d1c3414cSGrant Likely mutex_lock(&deferred_probe_mutex);
138ef8a3fd6SGreg Kroah-Hartman if (list_empty(&dev->p->deferred_probe)) {
139d1c3414cSGrant Likely dev_dbg(dev, "Added to deferred list\n");
1401d29cfa5SKuninori Morimoto list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list);
141d1c3414cSGrant Likely }
142d1c3414cSGrant Likely mutex_unlock(&deferred_probe_mutex);
143d1c3414cSGrant Likely }
144d1c3414cSGrant Likely
driver_deferred_probe_del(struct device * dev)145d1c3414cSGrant Likely void driver_deferred_probe_del(struct device *dev)
146d1c3414cSGrant Likely {
147d1c3414cSGrant Likely mutex_lock(&deferred_probe_mutex);
148ef8a3fd6SGreg Kroah-Hartman if (!list_empty(&dev->p->deferred_probe)) {
149d1c3414cSGrant Likely dev_dbg(dev, "Removed from deferred list\n");
150ef8a3fd6SGreg Kroah-Hartman list_del_init(&dev->p->deferred_probe);
15172a91f19SAhmad Fatoum __device_set_deferred_probe_reason(dev, NULL);
152d1c3414cSGrant Likely }
153d1c3414cSGrant Likely mutex_unlock(&deferred_probe_mutex);
154d1c3414cSGrant Likely }
155d1c3414cSGrant Likely
15690158138Slizhe static bool driver_deferred_probe_enable;
157d1c3414cSGrant Likely /**
158d1c3414cSGrant Likely * driver_deferred_probe_trigger() - Kick off re-probing deferred devices
159d1c3414cSGrant Likely *
160d1c3414cSGrant Likely * This functions moves all devices from the pending list to the active
161d1c3414cSGrant Likely * list and schedules the deferred probe workqueue to process them. It
162d1c3414cSGrant Likely * should be called anytime a driver is successfully bound to a device.
16358b116bcSGrant Likely *
16458b116bcSGrant Likely * Note, there is a race condition in multi-threaded probe. In the case where
16558b116bcSGrant Likely * more than one device is probing at the same time, it is possible for one
16658b116bcSGrant Likely * probe to complete successfully while another is about to defer. If the second
16758b116bcSGrant Likely * depends on the first, then it will get put on the pending list after the
1689ba8af66SShailendra Verma * trigger event has already occurred and will be stuck there.
16958b116bcSGrant Likely *
17058b116bcSGrant Likely * The atomic 'deferred_trigger_count' is used to determine if a successful
17158b116bcSGrant Likely * trigger has occurred in the midst of probing a driver. If the trigger count
17258b116bcSGrant Likely * changes in the midst of a probe, then deferred processing should be triggered
17358b116bcSGrant Likely * again.
174d1c3414cSGrant Likely */
driver_deferred_probe_trigger(void)1752f8c3ae8SSaravana Kannan void driver_deferred_probe_trigger(void)
176d1c3414cSGrant Likely {
177d1c3414cSGrant Likely if (!driver_deferred_probe_enable)
178d1c3414cSGrant Likely return;
179d1c3414cSGrant Likely
1808b0372a2SGreg Kroah-Hartman /*
1818b0372a2SGreg Kroah-Hartman * A successful probe means that all the devices in the pending list
182d1c3414cSGrant Likely * should be triggered to be reprobed. Move all the deferred devices
1838b0372a2SGreg Kroah-Hartman * into the active list so they can be retried by the workqueue
1848b0372a2SGreg Kroah-Hartman */
185d1c3414cSGrant Likely mutex_lock(&deferred_probe_mutex);
18658b116bcSGrant Likely atomic_inc(&deferred_trigger_count);
187d1c3414cSGrant Likely list_splice_tail_init(&deferred_probe_pending_list,
188d1c3414cSGrant Likely &deferred_probe_active_list);
189d1c3414cSGrant Likely mutex_unlock(&deferred_probe_mutex);
190d1c3414cSGrant Likely
1918b0372a2SGreg Kroah-Hartman /*
1928b0372a2SGreg Kroah-Hartman * Kick the re-probe thread. It may already be scheduled, but it is
1938b0372a2SGreg Kroah-Hartman * safe to kick it again.
1948b0372a2SGreg Kroah-Hartman */
195e611f8cdSYogesh Lal queue_work(system_unbound_wq, &deferred_probe_work);
196d1c3414cSGrant Likely }
197d1c3414cSGrant Likely
198d1c3414cSGrant Likely /**
199dbf03d65SRandy Dunlap * device_block_probing() - Block/defer device's probes
200013c074fSStrashko, Grygorii *
201013c074fSStrashko, Grygorii * It will disable probing of devices and defer their probes instead.
202013c074fSStrashko, Grygorii */
device_block_probing(void)203013c074fSStrashko, Grygorii void device_block_probing(void)
204013c074fSStrashko, Grygorii {
205013c074fSStrashko, Grygorii defer_all_probes = true;
206013c074fSStrashko, Grygorii /* sync with probes to avoid races. */
207013c074fSStrashko, Grygorii wait_for_device_probe();
208013c074fSStrashko, Grygorii }
209013c074fSStrashko, Grygorii
210013c074fSStrashko, Grygorii /**
211013c074fSStrashko, Grygorii * device_unblock_probing() - Unblock/enable device's probes
212013c074fSStrashko, Grygorii *
213013c074fSStrashko, Grygorii * It will restore normal behavior and trigger re-probing of deferred
214013c074fSStrashko, Grygorii * devices.
215013c074fSStrashko, Grygorii */
device_unblock_probing(void)216013c074fSStrashko, Grygorii void device_unblock_probing(void)
217013c074fSStrashko, Grygorii {
218013c074fSStrashko, Grygorii defer_all_probes = false;
219013c074fSStrashko, Grygorii driver_deferred_probe_trigger();
220013c074fSStrashko, Grygorii }
221013c074fSStrashko, Grygorii
222d090b70eSAndrzej Hajda /**
223d090b70eSAndrzej Hajda * device_set_deferred_probe_reason() - Set defer probe reason message for device
224d090b70eSAndrzej Hajda * @dev: the pointer to the struct device
225d090b70eSAndrzej Hajda * @vaf: the pointer to va_format structure with message
226d090b70eSAndrzej Hajda */
device_set_deferred_probe_reason(const struct device * dev,struct va_format * vaf)227d090b70eSAndrzej Hajda void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf)
228d090b70eSAndrzej Hajda {
229d090b70eSAndrzej Hajda const char *drv = dev_driver_string(dev);
23072a91f19SAhmad Fatoum char *reason;
231d090b70eSAndrzej Hajda
232d090b70eSAndrzej Hajda mutex_lock(&deferred_probe_mutex);
233d090b70eSAndrzej Hajda
23472a91f19SAhmad Fatoum reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf);
23572a91f19SAhmad Fatoum __device_set_deferred_probe_reason(dev, reason);
236d090b70eSAndrzej Hajda
237d090b70eSAndrzej Hajda mutex_unlock(&deferred_probe_mutex);
238d090b70eSAndrzej Hajda }
239d090b70eSAndrzej Hajda
24028af109aSJavier Martinez Canillas /*
24128af109aSJavier Martinez Canillas * deferred_devs_show() - Show the devices in the deferred probe pending list.
24228af109aSJavier Martinez Canillas */
deferred_devs_show(struct seq_file * s,void * data)24328af109aSJavier Martinez Canillas static int deferred_devs_show(struct seq_file *s, void *data)
24428af109aSJavier Martinez Canillas {
24528af109aSJavier Martinez Canillas struct device_private *curr;
24628af109aSJavier Martinez Canillas
24728af109aSJavier Martinez Canillas mutex_lock(&deferred_probe_mutex);
24828af109aSJavier Martinez Canillas
24928af109aSJavier Martinez Canillas list_for_each_entry(curr, &deferred_probe_pending_list, deferred_probe)
250d090b70eSAndrzej Hajda seq_printf(s, "%s\t%s", dev_name(curr->device),
251d090b70eSAndrzej Hajda curr->device->p->deferred_probe_reason ?: "\n");
25228af109aSJavier Martinez Canillas
25328af109aSJavier Martinez Canillas mutex_unlock(&deferred_probe_mutex);
25428af109aSJavier Martinez Canillas
25528af109aSJavier Martinez Canillas return 0;
25628af109aSJavier Martinez Canillas }
25728af109aSJavier Martinez Canillas DEFINE_SHOW_ATTRIBUTE(deferred_devs);
25828af109aSJavier Martinez Canillas
259f516d01bSSaravana Kannan #ifdef CONFIG_MODULES
260504fa212SJavier Martinez Canillas static int driver_deferred_probe_timeout = 10;
261f516d01bSSaravana Kannan #else
262504fa212SJavier Martinez Canillas static int driver_deferred_probe_timeout;
263f516d01bSSaravana Kannan #endif
264f516d01bSSaravana Kannan
deferred_probe_timeout_setup(char * str)26525b4e70dSRob Herring static int __init deferred_probe_timeout_setup(char *str)
26625b4e70dSRob Herring {
26763c98047SMuchun Song int timeout;
26863c98047SMuchun Song
26963c98047SMuchun Song if (!kstrtoint(str, 10, &timeout))
27064c775fbSJohn Stultz driver_deferred_probe_timeout = timeout;
27125b4e70dSRob Herring return 1;
27225b4e70dSRob Herring }
27325b4e70dSRob Herring __setup("deferred_probe_timeout=", deferred_probe_timeout_setup);
27425b4e70dSRob Herring
27513a8e0f6SSaravana Kannan /**
27613a8e0f6SSaravana Kannan * driver_deferred_probe_check_state() - Check deferred probe state
27713a8e0f6SSaravana Kannan * @dev: device to check
27813a8e0f6SSaravana Kannan *
27913a8e0f6SSaravana Kannan * Return:
28013a8e0f6SSaravana Kannan * * -ENODEV if initcalls have completed and modules are disabled.
28113a8e0f6SSaravana Kannan * * -ETIMEDOUT if the deferred probe timeout was set and has expired
28213a8e0f6SSaravana Kannan * and modules are enabled.
28313a8e0f6SSaravana Kannan * * -EPROBE_DEFER in other cases.
28413a8e0f6SSaravana Kannan *
28513a8e0f6SSaravana Kannan * Drivers or subsystems can opt-in to calling this function instead of directly
28613a8e0f6SSaravana Kannan * returning -EPROBE_DEFER.
28713a8e0f6SSaravana Kannan */
driver_deferred_probe_check_state(struct device * dev)28813a8e0f6SSaravana Kannan int driver_deferred_probe_check_state(struct device *dev)
28913a8e0f6SSaravana Kannan {
29013a8e0f6SSaravana Kannan if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) {
29113a8e0f6SSaravana Kannan dev_warn(dev, "ignoring dependency for device, assuming no driver\n");
29213a8e0f6SSaravana Kannan return -ENODEV;
29313a8e0f6SSaravana Kannan }
29413a8e0f6SSaravana Kannan
29513a8e0f6SSaravana Kannan if (!driver_deferred_probe_timeout && initcalls_done) {
29613a8e0f6SSaravana Kannan dev_warn(dev, "deferred probe timeout, ignoring dependency\n");
29713a8e0f6SSaravana Kannan return -ETIMEDOUT;
29813a8e0f6SSaravana Kannan }
29913a8e0f6SSaravana Kannan
30013a8e0f6SSaravana Kannan return -EPROBE_DEFER;
30113a8e0f6SSaravana Kannan }
30213a8e0f6SSaravana Kannan EXPORT_SYMBOL_GPL(driver_deferred_probe_check_state);
30313a8e0f6SSaravana Kannan
deferred_probe_timeout_work_func(struct work_struct * work)30425b4e70dSRob Herring static void deferred_probe_timeout_work_func(struct work_struct *work)
30525b4e70dSRob Herring {
306eed6e418SSaravana Kannan struct device_private *p;
30725b4e70dSRob Herring
308d46f3e3eSSaravana Kannan fw_devlink_drivers_done();
309d46f3e3eSSaravana Kannan
31013a8e0f6SSaravana Kannan driver_deferred_probe_timeout = 0;
31125b4e70dSRob Herring driver_deferred_probe_trigger();
31225b4e70dSRob Herring flush_work(&deferred_probe_work);
31325b4e70dSRob Herring
314eed6e418SSaravana Kannan mutex_lock(&deferred_probe_mutex);
315eed6e418SSaravana Kannan list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe)
316eed6e418SSaravana Kannan dev_info(p->device, "deferred probe pending\n");
317eed6e418SSaravana Kannan mutex_unlock(&deferred_probe_mutex);
318ffbe08a8SSaravana Kannan
319ffbe08a8SSaravana Kannan fw_devlink_probing_done();
32025b4e70dSRob Herring }
32125b4e70dSRob Herring static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);
32225b4e70dSRob Herring
deferred_probe_extend_timeout(void)3232b28a1a8SSaravana Kannan void deferred_probe_extend_timeout(void)
3242b28a1a8SSaravana Kannan {
3252b28a1a8SSaravana Kannan /*
3262b28a1a8SSaravana Kannan * If the work hasn't been queued yet or if the work expired, don't
3272b28a1a8SSaravana Kannan * start a new one.
3282b28a1a8SSaravana Kannan */
3292b28a1a8SSaravana Kannan if (cancel_delayed_work(&deferred_probe_timeout_work)) {
3302b28a1a8SSaravana Kannan schedule_delayed_work(&deferred_probe_timeout_work,
3312b28a1a8SSaravana Kannan driver_deferred_probe_timeout * HZ);
3322b28a1a8SSaravana Kannan pr_debug("Extended deferred probe timeout by %d secs\n",
3332b28a1a8SSaravana Kannan driver_deferred_probe_timeout);
3342b28a1a8SSaravana Kannan }
3352b28a1a8SSaravana Kannan }
3362b28a1a8SSaravana Kannan
337013c074fSStrashko, Grygorii /**
338d1c3414cSGrant Likely * deferred_probe_initcall() - Enable probing of deferred devices
339d1c3414cSGrant Likely *
340d1c3414cSGrant Likely * We don't want to get in the way when the bulk of drivers are getting probed.
341d1c3414cSGrant Likely * Instead, this initcall makes sure that deferred probing is delayed until
342d1c3414cSGrant Likely * late_initcall time.
343d1c3414cSGrant Likely */
deferred_probe_initcall(void)344d1c3414cSGrant Likely static int deferred_probe_initcall(void)
345d1c3414cSGrant Likely {
3462942df67SGreg Kroah-Hartman debugfs_create_file("devices_deferred", 0444, NULL, NULL,
3472942df67SGreg Kroah-Hartman &deferred_devs_fops);
34828af109aSJavier Martinez Canillas
349d1c3414cSGrant Likely driver_deferred_probe_enable = true;
350d1c3414cSGrant Likely driver_deferred_probe_trigger();
351d72cca1eSGrant Likely /* Sort as many dependencies as possible before exiting initcalls */
3522c507e46SBhaktipriya Shridhar flush_work(&deferred_probe_work);
35325b4e70dSRob Herring initcalls_done = true;
35425b4e70dSRob Herring
355d46f3e3eSSaravana Kannan if (!IS_ENABLED(CONFIG_MODULES))
356d46f3e3eSSaravana Kannan fw_devlink_drivers_done();
357d46f3e3eSSaravana Kannan
35825b4e70dSRob Herring /*
35925b4e70dSRob Herring * Trigger deferred probe again, this time we won't defer anything
36025b4e70dSRob Herring * that is optional
36125b4e70dSRob Herring */
36225b4e70dSRob Herring driver_deferred_probe_trigger();
36325b4e70dSRob Herring flush_work(&deferred_probe_work);
36425b4e70dSRob Herring
36564c775fbSJohn Stultz if (driver_deferred_probe_timeout > 0) {
36625b4e70dSRob Herring schedule_delayed_work(&deferred_probe_timeout_work,
36764c775fbSJohn Stultz driver_deferred_probe_timeout * HZ);
36825b4e70dSRob Herring }
369ffbe08a8SSaravana Kannan
370ffbe08a8SSaravana Kannan if (!IS_ENABLED(CONFIG_MODULES))
371ffbe08a8SSaravana Kannan fw_devlink_probing_done();
372ffbe08a8SSaravana Kannan
373d1c3414cSGrant Likely return 0;
374d1c3414cSGrant Likely }
375d1c3414cSGrant Likely late_initcall(deferred_probe_initcall);
37607e4a3e2Smochel@digitalimplant.org
deferred_probe_exit(void)37728af109aSJavier Martinez Canillas static void __exit deferred_probe_exit(void)
37828af109aSJavier Martinez Canillas {
37936c893d3SGreg Kroah-Hartman debugfs_lookup_and_remove("devices_deferred", NULL);
38028af109aSJavier Martinez Canillas }
38128af109aSJavier Martinez Canillas __exitcall(deferred_probe_exit);
38228af109aSJavier Martinez Canillas
3836b9cb427STomeu Vizoso /**
3846b9cb427STomeu Vizoso * device_is_bound() - Check if device is bound to a driver
3856b9cb427STomeu Vizoso * @dev: device to check
3866b9cb427STomeu Vizoso *
3876b9cb427STomeu Vizoso * Returns true if passed device has already finished probing successfully
3886b9cb427STomeu Vizoso * against a driver.
3896b9cb427STomeu Vizoso *
3906b9cb427STomeu Vizoso * This function must be called with the device lock held.
3916b9cb427STomeu Vizoso */
device_is_bound(struct device * dev)3926b9cb427STomeu Vizoso bool device_is_bound(struct device *dev)
3936b9cb427STomeu Vizoso {
3943ded9104SRafael J. Wysocki return dev->p && klist_node_attached(&dev->p->knode_driver);
3956b9cb427STomeu Vizoso }
3966b9cb427STomeu Vizoso
driver_bound(struct device * dev)3971901fb26SKay Sievers static void driver_bound(struct device *dev)
3981901fb26SKay Sievers {
3996b9cb427STomeu Vizoso if (device_is_bound(dev)) {
400eb7fbc9fSChristophe JAILLET pr_warn("%s: device %s already bound\n",
4012b3a302aSHarvey Harrison __func__, kobject_name(&dev->kobj));
4021901fb26SKay Sievers return;
4031901fb26SKay Sievers }
4041901fb26SKay Sievers
40594f8cc0eSFrank Rowand pr_debug("driver: '%s': %s: bound to device '%s'\n", dev->driver->name,
40694f8cc0eSFrank Rowand __func__, dev_name(dev));
4071901fb26SKay Sievers
408fbb88fadSStefani Seibold klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
4099ed98953SRafael J. Wysocki device_links_driver_bound(dev);
410fbb88fadSStefani Seibold
411aa8e54b5STomeu Vizoso device_pm_check_callbacks(dev);
412aa8e54b5STomeu Vizoso
4138b0372a2SGreg Kroah-Hartman /*
4148b0372a2SGreg Kroah-Hartman * Make sure the device is no longer in one of the deferred lists and
4158b0372a2SGreg Kroah-Hartman * kick off retrying all pending devices
4168b0372a2SGreg Kroah-Hartman */
417d1c3414cSGrant Likely driver_deferred_probe_del(dev);
418d1c3414cSGrant Likely driver_deferred_probe_trigger();
419d1c3414cSGrant Likely
420ed9f9181SGreg Kroah-Hartman bus_notify(dev, BUS_NOTIFY_BOUND_DRIVER);
4211455cf8dSDmitry Torokhov kobject_uevent(&dev->kobj, KOBJ_BIND);
4221901fb26SKay Sievers }
4231901fb26SKay Sievers
coredump_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)4243c47d19fSArend van Spriel static ssize_t coredump_store(struct device *dev, struct device_attribute *attr,
4253c47d19fSArend van Spriel const char *buf, size_t count)
4263c47d19fSArend van Spriel {
4273c47d19fSArend van Spriel device_lock(dev);
4283c47d19fSArend van Spriel dev->driver->coredump(dev);
4293c47d19fSArend van Spriel device_unlock(dev);
4303c47d19fSArend van Spriel
4313c47d19fSArend van Spriel return count;
4323c47d19fSArend van Spriel }
4333c47d19fSArend van Spriel static DEVICE_ATTR_WO(coredump);
4343c47d19fSArend van Spriel
driver_sysfs_add(struct device * dev)4351901fb26SKay Sievers static int driver_sysfs_add(struct device *dev)
4361901fb26SKay Sievers {
4371901fb26SKay Sievers int ret;
4381901fb26SKay Sievers
439ed9f9181SGreg Kroah-Hartman bus_notify(dev, BUS_NOTIFY_BIND_DRIVER);
44045daef0fSMagnus Damm
441e5dd1278SGreg Kroah-Hartman ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj,
4421901fb26SKay Sievers kobject_name(&dev->kobj));
4433c47d19fSArend van Spriel if (ret)
4443c47d19fSArend van Spriel goto fail;
4453c47d19fSArend van Spriel
446e5dd1278SGreg Kroah-Hartman ret = sysfs_create_link(&dev->kobj, &dev->driver->p->kobj,
4471901fb26SKay Sievers "driver");
4481901fb26SKay Sievers if (ret)
4493c47d19fSArend van Spriel goto rm_dev;
4503c47d19fSArend van Spriel
451d225ef6fSJia-Ju Bai if (!IS_ENABLED(CONFIG_DEV_COREDUMP) || !dev->driver->coredump)
452d225ef6fSJia-Ju Bai return 0;
453d225ef6fSJia-Ju Bai
454d225ef6fSJia-Ju Bai ret = device_create_file(dev, &dev_attr_coredump);
455d225ef6fSJia-Ju Bai if (!ret)
4563c47d19fSArend van Spriel return 0;
4573c47d19fSArend van Spriel
4583c47d19fSArend van Spriel sysfs_remove_link(&dev->kobj, "driver");
4593c47d19fSArend van Spriel
4603c47d19fSArend van Spriel rm_dev:
461e5dd1278SGreg Kroah-Hartman sysfs_remove_link(&dev->driver->p->kobj,
4621901fb26SKay Sievers kobject_name(&dev->kobj));
4633c47d19fSArend van Spriel
4643c47d19fSArend van Spriel fail:
4651901fb26SKay Sievers return ret;
4661901fb26SKay Sievers }
4671901fb26SKay Sievers
driver_sysfs_remove(struct device * dev)4681901fb26SKay Sievers static void driver_sysfs_remove(struct device *dev)
4691901fb26SKay Sievers {
4701901fb26SKay Sievers struct device_driver *drv = dev->driver;
4711901fb26SKay Sievers
4721901fb26SKay Sievers if (drv) {
4733c47d19fSArend van Spriel if (drv->coredump)
4743c47d19fSArend van Spriel device_remove_file(dev, &dev_attr_coredump);
475e5dd1278SGreg Kroah-Hartman sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj));
4761901fb26SKay Sievers sysfs_remove_link(&dev->kobj, "driver");
4771901fb26SKay Sievers }
4781901fb26SKay Sievers }
4791901fb26SKay Sievers
48007e4a3e2Smochel@digitalimplant.org /**
48107e4a3e2Smochel@digitalimplant.org * device_bind_driver - bind a driver to one device.
48207e4a3e2Smochel@digitalimplant.org * @dev: device.
48307e4a3e2Smochel@digitalimplant.org *
48407e4a3e2Smochel@digitalimplant.org * Allow manual attachment of a driver to a device.
48507e4a3e2Smochel@digitalimplant.org * Caller must have already set @dev->driver.
48607e4a3e2Smochel@digitalimplant.org *
487fe940d73SLukas Wunner * Note that this does not modify the bus reference count.
488fe940d73SLukas Wunner * Please verify that is accounted for before calling this.
489fe940d73SLukas Wunner * (It is ok to call with no other effort from a driver's probe() method.)
4900d3e5a2eSPatrick Mochel *
4918e9394ceSGreg Kroah-Hartman * This function must be called with the device lock held.
4920d9f837cSJason Gunthorpe *
4930d9f837cSJason Gunthorpe * Callers should prefer to use device_driver_attach() instead.
49407e4a3e2Smochel@digitalimplant.org */
device_bind_driver(struct device * dev)495f86db396SAndrew Morton int device_bind_driver(struct device *dev)
49607e4a3e2Smochel@digitalimplant.org {
497cb986b74SCornelia Huck int ret;
498cb986b74SCornelia Huck
499cb986b74SCornelia Huck ret = driver_sysfs_add(dev);
500b6f617dfSSaravana Kannan if (!ret) {
501b6f617dfSSaravana Kannan device_links_force_bind(dev);
5021901fb26SKay Sievers driver_bound(dev);
503b6f617dfSSaravana Kannan }
504ed9f9181SGreg Kroah-Hartman else
505ed9f9181SGreg Kroah-Hartman bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND);
506cb986b74SCornelia Huck return ret;
50707e4a3e2Smochel@digitalimplant.org }
5084a3ad20cSGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_bind_driver);
50907e4a3e2Smochel@digitalimplant.org
510d779249eSGreg Kroah-Hartman static atomic_t probe_count = ATOMIC_INIT(0);
511735a7ffbSAndrew Morton static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue);
512735a7ffbSAndrew Morton
state_synced_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)513f8fb5766SSaravana Kannan static ssize_t state_synced_store(struct device *dev,
514f8fb5766SSaravana Kannan struct device_attribute *attr,
515f8fb5766SSaravana Kannan const char *buf, size_t count)
516f8fb5766SSaravana Kannan {
517f8fb5766SSaravana Kannan int ret = 0;
518f8fb5766SSaravana Kannan
519f8fb5766SSaravana Kannan if (strcmp("1", buf))
520f8fb5766SSaravana Kannan return -EINVAL;
521f8fb5766SSaravana Kannan
522f8fb5766SSaravana Kannan device_lock(dev);
523f8fb5766SSaravana Kannan if (!dev->state_synced) {
524f8fb5766SSaravana Kannan dev->state_synced = true;
525f8fb5766SSaravana Kannan dev_sync_state(dev);
526f8fb5766SSaravana Kannan } else {
527f8fb5766SSaravana Kannan ret = -EINVAL;
528f8fb5766SSaravana Kannan }
529f8fb5766SSaravana Kannan device_unlock(dev);
530f8fb5766SSaravana Kannan
531f8fb5766SSaravana Kannan return ret ? ret : count;
532f8fb5766SSaravana Kannan }
533f8fb5766SSaravana Kannan
state_synced_show(struct device * dev,struct device_attribute * attr,char * buf)5348fd456ecSSaravana Kannan static ssize_t state_synced_show(struct device *dev,
5358fd456ecSSaravana Kannan struct device_attribute *attr, char *buf)
5368fd456ecSSaravana Kannan {
5378fd456ecSSaravana Kannan bool val;
5388fd456ecSSaravana Kannan
5398fd456ecSSaravana Kannan device_lock(dev);
5408fd456ecSSaravana Kannan val = dev->state_synced;
5418fd456ecSSaravana Kannan device_unlock(dev);
542948b3edbSJoe Perches
543aa838896SJoe Perches return sysfs_emit(buf, "%u\n", val);
5448fd456ecSSaravana Kannan }
545f8fb5766SSaravana Kannan static DEVICE_ATTR_RW(state_synced);
5468fd456ecSSaravana Kannan
device_unbind_cleanup(struct device * dev)5479ad30721SRob Herring static void device_unbind_cleanup(struct device *dev)
5489ad30721SRob Herring {
5499ad30721SRob Herring devres_release_all(dev);
5509ad30721SRob Herring arch_teardown_dma_ops(dev);
5519ad30721SRob Herring kfree(dev->dma_range_map);
5529ad30721SRob Herring dev->dma_range_map = NULL;
5539ad30721SRob Herring dev->driver = NULL;
5549ad30721SRob Herring dev_set_drvdata(dev, NULL);
5559ad30721SRob Herring if (dev->pm_domain && dev->pm_domain->dismiss)
5569ad30721SRob Herring dev->pm_domain->dismiss(dev);
5579ad30721SRob Herring pm_runtime_reinit(dev);
5589ad30721SRob Herring dev_pm_set_driver_flags(dev, 0);
5599ad30721SRob Herring }
560e1499647SChristoph Hellwig
device_remove(struct device * dev)5614b775aafSRob Herring static void device_remove(struct device *dev)
5624b775aafSRob Herring {
5634b775aafSRob Herring device_remove_file(dev, &dev_attr_state_synced);
5644b775aafSRob Herring device_remove_groups(dev, dev->driver->dev_groups);
5654b775aafSRob Herring
5664b775aafSRob Herring if (dev->bus && dev->bus->remove)
5674b775aafSRob Herring dev->bus->remove(dev);
5684b775aafSRob Herring else if (dev->driver->remove)
5694b775aafSRob Herring dev->driver->remove(dev);
5704b775aafSRob Herring }
5714b775aafSRob Herring
call_driver_probe(struct device * dev,struct device_driver * drv)572e1499647SChristoph Hellwig static int call_driver_probe(struct device *dev, struct device_driver *drv)
573e1499647SChristoph Hellwig {
574e1499647SChristoph Hellwig int ret = 0;
575e1499647SChristoph Hellwig
576e1499647SChristoph Hellwig if (dev->bus->probe)
577e1499647SChristoph Hellwig ret = dev->bus->probe(dev);
578e1499647SChristoph Hellwig else if (drv->probe)
579e1499647SChristoph Hellwig ret = drv->probe(dev);
580e1499647SChristoph Hellwig
581e1499647SChristoph Hellwig switch (ret) {
582e1499647SChristoph Hellwig case 0:
583e1499647SChristoph Hellwig break;
584e1499647SChristoph Hellwig case -EPROBE_DEFER:
585e1499647SChristoph Hellwig /* Driver requested deferred probing */
586e1499647SChristoph Hellwig dev_dbg(dev, "Driver %s requests probe deferral\n", drv->name);
587e1499647SChristoph Hellwig break;
588e1499647SChristoph Hellwig case -ENODEV:
589e1499647SChristoph Hellwig case -ENXIO:
590e1499647SChristoph Hellwig pr_debug("%s: probe of %s rejects match %d\n",
591e1499647SChristoph Hellwig drv->name, dev_name(dev), ret);
592e1499647SChristoph Hellwig break;
593e1499647SChristoph Hellwig default:
594e1499647SChristoph Hellwig /* driver matched but the probe failed */
595e1499647SChristoph Hellwig pr_warn("%s: probe of %s failed with error %d\n",
596e1499647SChristoph Hellwig drv->name, dev_name(dev), ret);
597e1499647SChristoph Hellwig break;
598e1499647SChristoph Hellwig }
599e1499647SChristoph Hellwig
600e1499647SChristoph Hellwig return ret;
601e1499647SChristoph Hellwig }
602e1499647SChristoph Hellwig
really_probe(struct device * dev,struct device_driver * drv)60321c7f30bSCornelia Huck static int really_probe(struct device *dev, struct device_driver *drv)
60407e4a3e2Smochel@digitalimplant.org {
605c5f06274SRob Herring bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) &&
606c5f06274SRob Herring !drv->suppress_bind_attrs;
6072f8c3ae8SSaravana Kannan int ret, link_ret;
60807e4a3e2Smochel@digitalimplant.org
609013c074fSStrashko, Grygorii if (defer_all_probes) {
610013c074fSStrashko, Grygorii /*
611013c074fSStrashko, Grygorii * Value of defer_all_probes can be set only by
612dbf03d65SRandy Dunlap * device_block_probing() which, in turn, will call
613013c074fSStrashko, Grygorii * wait_for_device_probe() right after that to avoid any races.
614013c074fSStrashko, Grygorii */
615013c074fSStrashko, Grygorii dev_dbg(dev, "Driver %s force probe deferral\n", drv->name);
61645ddcb42SChristoph Hellwig return -EPROBE_DEFER;
617013c074fSStrashko, Grygorii }
618013c074fSStrashko, Grygorii
6192f8c3ae8SSaravana Kannan link_ret = device_links_check_suppliers(dev);
6202f8c3ae8SSaravana Kannan if (link_ret == -EPROBE_DEFER)
6212f8c3ae8SSaravana Kannan return link_ret;
6229ed98953SRafael J. Wysocki
6237dc72b28SGreg Kroah-Hartman pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
6241e0b2cf9SKay Sievers drv->bus->name, __func__, drv->name, dev_name(dev));
6257c35e699SGeert Uytterhoeven if (!list_empty(&dev->devres_head)) {
6267c35e699SGeert Uytterhoeven dev_crit(dev, "Resources present before probing\n");
627b292b50bSTetsuo Handa ret = -EBUSY;
628b292b50bSTetsuo Handa goto done;
6297c35e699SGeert Uytterhoeven }
63007e4a3e2Smochel@digitalimplant.org
631bea5b158SRob Herring re_probe:
63207e4a3e2Smochel@digitalimplant.org dev->driver = drv;
633ab78029eSLinus Walleij
634ab78029eSLinus Walleij /* If using pinctrl, bind pins now before probing */
635ab78029eSLinus Walleij ret = pinctrl_bind_pins(dev);
636ab78029eSLinus Walleij if (ret)
63714b6257aSAndy Shevchenko goto pinctrl_bind_failed;
638ab78029eSLinus Walleij
639ccf640f4SChristoph Hellwig if (dev->bus->dma_configure) {
640ccf640f4SChristoph Hellwig ret = dev->bus->dma_configure(dev);
64109515ef5SSricharan R if (ret)
64200eb74eaSLu Baolu goto pinctrl_bind_failed;
643ccf640f4SChristoph Hellwig }
64409515ef5SSricharan R
645f04948deSZhen Lei ret = driver_sysfs_add(dev);
646f04948deSZhen Lei if (ret) {
647eb7fbc9fSChristophe JAILLET pr_err("%s: driver_sysfs_add(%s) failed\n",
6481e0b2cf9SKay Sievers __func__, dev_name(dev));
649885e5025SLu Baolu goto sysfs_failed;
6501901fb26SKay Sievers }
6511901fb26SKay Sievers
652e90d5532SRafael J. Wysocki if (dev->pm_domain && dev->pm_domain->activate) {
653e90d5532SRafael J. Wysocki ret = dev->pm_domain->activate(dev);
654e90d5532SRafael J. Wysocki if (ret)
655e90d5532SRafael J. Wysocki goto probe_failed;
656e90d5532SRafael J. Wysocki }
657e90d5532SRafael J. Wysocki
65845ddcb42SChristoph Hellwig ret = call_driver_probe(dev, drv);
65945ddcb42SChristoph Hellwig if (ret) {
660e1499647SChristoph Hellwig /*
6612f8c3ae8SSaravana Kannan * If fw_devlink_best_effort is active (denoted by -EAGAIN), the
6622f8c3ae8SSaravana Kannan * device might actually probe properly once some of its missing
6632f8c3ae8SSaravana Kannan * suppliers have probed. So, treat this as if the driver
6642f8c3ae8SSaravana Kannan * returned -EPROBE_DEFER.
6652f8c3ae8SSaravana Kannan */
6662f8c3ae8SSaravana Kannan if (link_ret == -EAGAIN)
6672f8c3ae8SSaravana Kannan ret = -EPROBE_DEFER;
6682f8c3ae8SSaravana Kannan
6692f8c3ae8SSaravana Kannan /*
670ef6dcbddSChristoph Hellwig * Return probe errors as positive values so that the callers
671ef6dcbddSChristoph Hellwig * can distinguish them from other errors.
672e1499647SChristoph Hellwig */
67345ddcb42SChristoph Hellwig ret = -ret;
674d779249eSGreg Kroah-Hartman goto probe_failed;
67507e4a3e2Smochel@digitalimplant.org }
6761901fb26SKay Sievers
677f04948deSZhen Lei ret = device_add_groups(dev, drv->dev_groups);
678f04948deSZhen Lei if (ret) {
67923b69044SDmitry Torokhov dev_err(dev, "device_add_groups() failed\n");
68023b69044SDmitry Torokhov goto dev_groups_failed;
68123b69044SDmitry Torokhov }
68223b69044SDmitry Torokhov
683f04948deSZhen Lei if (dev_has_sync_state(dev)) {
684f04948deSZhen Lei ret = device_create_file(dev, &dev_attr_state_synced);
685f04948deSZhen Lei if (ret) {
6868fd456ecSSaravana Kannan dev_err(dev, "state_synced sysfs add failed\n");
6878fd456ecSSaravana Kannan goto dev_sysfs_state_synced_failed;
6888fd456ecSSaravana Kannan }
689f04948deSZhen Lei }
6908fd456ecSSaravana Kannan
691bea5b158SRob Herring if (test_remove) {
692bea5b158SRob Herring test_remove = false;
693bea5b158SRob Herring
6944b775aafSRob Herring device_remove(dev);
695bea5b158SRob Herring driver_sysfs_remove(dev);
696f429378aSJason Gunthorpe if (dev->bus && dev->bus->dma_cleanup)
697f429378aSJason Gunthorpe dev->bus->dma_cleanup(dev);
6989ad30721SRob Herring device_unbind_cleanup(dev);
699bea5b158SRob Herring
700bea5b158SRob Herring goto re_probe;
701bea5b158SRob Herring }
702bea5b158SRob Herring
703ef0eebc0SDouglas Anderson pinctrl_init_done(dev);
704ef0eebc0SDouglas Anderson
705e90d5532SRafael J. Wysocki if (dev->pm_domain && dev->pm_domain->sync)
706e90d5532SRafael J. Wysocki dev->pm_domain->sync(dev);
707e90d5532SRafael J. Wysocki
7081901fb26SKay Sievers driver_bound(dev);
7097dc72b28SGreg Kroah-Hartman pr_debug("bus: '%s': %s: bound device %s to driver %s\n",
7101e0b2cf9SKay Sievers drv->bus->name, __func__, dev_name(dev), drv->name);
711d779249eSGreg Kroah-Hartman goto done;
7120d3e5a2eSPatrick Mochel
7138fd456ecSSaravana Kannan dev_sysfs_state_synced_failed:
71423b69044SDmitry Torokhov dev_groups_failed:
7154b775aafSRob Herring device_remove(dev);
716d779249eSGreg Kroah-Hartman probe_failed:
717885e5025SLu Baolu driver_sysfs_remove(dev);
718885e5025SLu Baolu sysfs_failed:
719ed9f9181SGreg Kroah-Hartman bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND);
72025f3bcfcSLu Baolu if (dev->bus && dev->bus->dma_cleanup)
72125f3bcfcSLu Baolu dev->bus->dma_cleanup(dev);
72214b6257aSAndy Shevchenko pinctrl_bind_failed:
7239ed98953SRafael J. Wysocki device_links_no_driver(dev);
7249ad30721SRob Herring device_unbind_cleanup(dev);
725d779249eSGreg Kroah-Hartman done:
726d779249eSGreg Kroah-Hartman return ret;
727d779249eSGreg Kroah-Hartman }
728d779249eSGreg Kroah-Hartman
7290a50f61cSTodd Poynor /*
7300a50f61cSTodd Poynor * For initcall_debug, show the driver probe time.
7310a50f61cSTodd Poynor */
really_probe_debug(struct device * dev,struct device_driver * drv)7320a50f61cSTodd Poynor static int really_probe_debug(struct device *dev, struct device_driver *drv)
7330a50f61cSTodd Poynor {
734e3aa745fSZenghui Yu ktime_t calltime, rettime;
7350a50f61cSTodd Poynor int ret;
7360a50f61cSTodd Poynor
7370a50f61cSTodd Poynor calltime = ktime_get();
7380a50f61cSTodd Poynor ret = really_probe(dev, drv);
7390a50f61cSTodd Poynor rettime = ktime_get();
740e2f06aa8SStephen Boyd /*
741e2f06aa8SStephen Boyd * Don't change this to pr_debug() because that requires
742e2f06aa8SStephen Boyd * CONFIG_DYNAMIC_DEBUG and we want a simple 'initcall_debug' on the
743e2f06aa8SStephen Boyd * kernel commandline to print this all the time at the debug level.
744e2f06aa8SStephen Boyd */
745e2f06aa8SStephen Boyd printk(KERN_DEBUG "probe of %s returned %d after %lld usecs\n",
746e3aa745fSZenghui Yu dev_name(dev), ret, ktime_us_delta(rettime, calltime));
7470a50f61cSTodd Poynor return ret;
7480a50f61cSTodd Poynor }
7490a50f61cSTodd Poynor
750d779249eSGreg Kroah-Hartman /**
751d779249eSGreg Kroah-Hartman * driver_probe_done
752d779249eSGreg Kroah-Hartman * Determine if the probe sequence is finished or not.
753d779249eSGreg Kroah-Hartman *
754d779249eSGreg Kroah-Hartman * Should somehow figure out how to use a semaphore, not an atomic variable...
755d779249eSGreg Kroah-Hartman */
driver_probe_done(void)756aa5f6ed8SChristoph Hellwig bool __init driver_probe_done(void)
757d779249eSGreg Kroah-Hartman {
758927f8287SAndy Shevchenko int local_probe_count = atomic_read(&probe_count);
759927f8287SAndy Shevchenko
760927f8287SAndy Shevchenko pr_debug("%s: probe_count = %d\n", __func__, local_probe_count);
761aa5f6ed8SChristoph Hellwig return !local_probe_count;
762d779249eSGreg Kroah-Hartman }
763d779249eSGreg Kroah-Hartman
764d779249eSGreg Kroah-Hartman /**
765216773a7SArjan van de Ven * wait_for_device_probe
766216773a7SArjan van de Ven * Wait for device probing to be completed.
767216773a7SArjan van de Ven */
wait_for_device_probe(void)768b23530ebSMing Lei void wait_for_device_probe(void)
769216773a7SArjan van de Ven {
770013c074fSStrashko, Grygorii /* wait for the deferred probe workqueue to finish */
7712c507e46SBhaktipriya Shridhar flush_work(&deferred_probe_work);
772013c074fSStrashko, Grygorii
773216773a7SArjan van de Ven /* wait for the known devices to complete their probing */
774b23530ebSMing Lei wait_event(probe_waitqueue, atomic_read(&probe_count) == 0);
775216773a7SArjan van de Ven async_synchronize_full();
776216773a7SArjan van de Ven }
777d4d5291cSArjan van de Ven EXPORT_SYMBOL_GPL(wait_for_device_probe);
778216773a7SArjan van de Ven
__driver_probe_device(struct device_driver * drv,struct device * dev)77945ddcb42SChristoph Hellwig static int __driver_probe_device(struct device_driver *drv, struct device *dev)
780d779249eSGreg Kroah-Hartman {
781d779249eSGreg Kroah-Hartman int ret = 0;
782d779249eSGreg Kroah-Hartman
783204db60cSJason Gunthorpe if (dev->p->dead || !device_is_registered(dev))
784f2eaae19SAlan Stern return -ENODEV;
785204db60cSJason Gunthorpe if (dev->driver)
786204db60cSJason Gunthorpe return -EBUSY;
787d779249eSGreg Kroah-Hartman
788f2db85b6SSaravana Kannan dev->can_match = true;
7897dc72b28SGreg Kroah-Hartman pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
7901e0b2cf9SKay Sievers drv->bus->name, __func__, dev_name(dev), drv->name);
791d779249eSGreg Kroah-Hartman
792b06c0b2fSRafael J. Wysocki pm_runtime_get_suppliers(dev);
793ddef08ddSRafael J. Wysocki if (dev->parent)
794ddef08ddSRafael J. Wysocki pm_runtime_get_sync(dev->parent);
795ddef08ddSRafael J. Wysocki
7965e928f77SRafael J. Wysocki pm_runtime_barrier(dev);
7970a50f61cSTodd Poynor if (initcall_debug)
7980a50f61cSTodd Poynor ret = really_probe_debug(dev, drv);
7990a50f61cSTodd Poynor else
80021c7f30bSCornelia Huck ret = really_probe(dev, drv);
801fa180eb4SUlf Hansson pm_request_idle(dev);
802d779249eSGreg Kroah-Hartman
803ddef08ddSRafael J. Wysocki if (dev->parent)
804ddef08ddSRafael J. Wysocki pm_runtime_put(dev->parent);
805ddef08ddSRafael J. Wysocki
806b06c0b2fSRafael J. Wysocki pm_runtime_put_suppliers(dev);
8070d3e5a2eSPatrick Mochel return ret;
80807e4a3e2Smochel@digitalimplant.org }
80907e4a3e2Smochel@digitalimplant.org
81045ddcb42SChristoph Hellwig /**
81145ddcb42SChristoph Hellwig * driver_probe_device - attempt to bind device & driver together
81245ddcb42SChristoph Hellwig * @drv: driver to bind a device to
81345ddcb42SChristoph Hellwig * @dev: device to try to bind to the driver
81445ddcb42SChristoph Hellwig *
81545ddcb42SChristoph Hellwig * This function returns -ENODEV if the device is not registered, -EBUSY if it
81645ddcb42SChristoph Hellwig * already has a driver, 0 if the device is bound successfully and a positive
81745ddcb42SChristoph Hellwig * (inverted) error code for failures from the ->probe method.
81845ddcb42SChristoph Hellwig *
81945ddcb42SChristoph Hellwig * This function must be called with @dev lock held. When called for a
82045ddcb42SChristoph Hellwig * USB interface, @dev->parent lock must be held as well.
82145ddcb42SChristoph Hellwig *
82245ddcb42SChristoph Hellwig * If the device has a parent, runtime-resume the parent before driver probing.
82345ddcb42SChristoph Hellwig */
driver_probe_device(struct device_driver * drv,struct device * dev)82445ddcb42SChristoph Hellwig static int driver_probe_device(struct device_driver *drv, struct device *dev)
82545ddcb42SChristoph Hellwig {
82645ddcb42SChristoph Hellwig int trigger_count = atomic_read(&deferred_trigger_count);
82745ddcb42SChristoph Hellwig int ret;
82845ddcb42SChristoph Hellwig
82945ddcb42SChristoph Hellwig atomic_inc(&probe_count);
83045ddcb42SChristoph Hellwig ret = __driver_probe_device(drv, dev);
83145ddcb42SChristoph Hellwig if (ret == -EPROBE_DEFER || ret == EPROBE_DEFER) {
83245ddcb42SChristoph Hellwig driver_deferred_probe_add(dev);
83345ddcb42SChristoph Hellwig
83445ddcb42SChristoph Hellwig /*
83545ddcb42SChristoph Hellwig * Did a trigger occur while probing? Need to re-trigger if yes
83645ddcb42SChristoph Hellwig */
83745ddcb42SChristoph Hellwig if (trigger_count != atomic_read(&deferred_trigger_count) &&
83845ddcb42SChristoph Hellwig !defer_all_probes)
83945ddcb42SChristoph Hellwig driver_deferred_probe_trigger();
84045ddcb42SChristoph Hellwig }
84145ddcb42SChristoph Hellwig atomic_dec(&probe_count);
84245ddcb42SChristoph Hellwig wake_up_all(&probe_waitqueue);
84345ddcb42SChristoph Hellwig return ret;
84445ddcb42SChristoph Hellwig }
84545ddcb42SChristoph Hellwig
cmdline_requested_async_probing(const char * drv_name)8461ea61b68SFeng Tang static inline bool cmdline_requested_async_probing(const char *drv_name)
8471ea61b68SFeng Tang {
848f79f662eSSaravana Kannan bool async_drv;
849f79f662eSSaravana Kannan
850f79f662eSSaravana Kannan async_drv = parse_option_str(async_probe_drv_names, drv_name);
851f79f662eSSaravana Kannan
852f79f662eSSaravana Kannan return (async_probe_default != async_drv);
8531ea61b68SFeng Tang }
8541ea61b68SFeng Tang
8551ea61b68SFeng Tang /* The option format is "driver_async_probe=drv_name1,drv_name2,..." */
save_async_options(char * buf)8561ea61b68SFeng Tang static int __init save_async_options(char *buf)
8571ea61b68SFeng Tang {
8581ea61b68SFeng Tang if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN)
859eb7fbc9fSChristophe JAILLET pr_warn("Too long list of driver names for 'driver_async_probe'!\n");
8601ea61b68SFeng Tang
86107b7b883SWolfram Sang strscpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN);
862f79f662eSSaravana Kannan async_probe_default = parse_option_str(async_probe_drv_names, "*");
863f79f662eSSaravana Kannan
864f2aad547SRandy Dunlap return 1;
8651ea61b68SFeng Tang }
8661ea61b68SFeng Tang __setup("driver_async_probe=", save_async_options);
8671ea61b68SFeng Tang
driver_allows_async_probing(struct device_driver * drv)868189a87f8SChristoph Hellwig static bool driver_allows_async_probing(struct device_driver *drv)
8692287c322Smochel@digitalimplant.org {
870d173a137SLuis R. Rodriguez switch (drv->probe_type) {
871d173a137SLuis R. Rodriguez case PROBE_PREFER_ASYNCHRONOUS:
872f2411da7SLuis R. Rodriguez return true;
873f2411da7SLuis R. Rodriguez
874d173a137SLuis R. Rodriguez case PROBE_FORCE_SYNCHRONOUS:
875d173a137SLuis R. Rodriguez return false;
876d173a137SLuis R. Rodriguez
877d173a137SLuis R. Rodriguez default:
8781ea61b68SFeng Tang if (cmdline_requested_async_probing(drv->name))
8791ea61b68SFeng Tang return true;
8801ea61b68SFeng Tang
88180c6e146SDmitry Torokhov if (module_requested_async_probing(drv->owner))
882f2411da7SLuis R. Rodriguez return true;
883f2411da7SLuis R. Rodriguez
884f2411da7SLuis R. Rodriguez return false;
885765230b5SDmitry Torokhov }
886d173a137SLuis R. Rodriguez }
887765230b5SDmitry Torokhov
888765230b5SDmitry Torokhov struct device_attach_data {
889765230b5SDmitry Torokhov struct device *dev;
890765230b5SDmitry Torokhov
891765230b5SDmitry Torokhov /*
892b4ae8c2fSTom Rix * Indicates whether we are considering asynchronous probing or
893765230b5SDmitry Torokhov * not. Only initial binding after device or driver registration
894765230b5SDmitry Torokhov * (including deferral processing) may be done asynchronously, the
895765230b5SDmitry Torokhov * rest is always synchronous, as we expect it is being done by
896765230b5SDmitry Torokhov * request from userspace.
897765230b5SDmitry Torokhov */
898765230b5SDmitry Torokhov bool check_async;
899765230b5SDmitry Torokhov
900765230b5SDmitry Torokhov /*
901765230b5SDmitry Torokhov * Indicates if we are binding synchronous or asynchronous drivers.
902765230b5SDmitry Torokhov * When asynchronous probing is enabled we'll execute 2 passes
903765230b5SDmitry Torokhov * over drivers: first pass doing synchronous probing and second
904765230b5SDmitry Torokhov * doing asynchronous probing (if synchronous did not succeed -
905765230b5SDmitry Torokhov * most likely because there was no driver requiring synchronous
906765230b5SDmitry Torokhov * probing - and we found asynchronous driver during first pass).
907765230b5SDmitry Torokhov * The 2 passes are done because we can't shoot asynchronous
908765230b5SDmitry Torokhov * probe for given device and driver from bus_for_each_drv() since
909765230b5SDmitry Torokhov * driver pointer is not guaranteed to stay valid once
910765230b5SDmitry Torokhov * bus_for_each_drv() iterates to the next driver on the bus.
911765230b5SDmitry Torokhov */
912765230b5SDmitry Torokhov bool want_async;
913765230b5SDmitry Torokhov
914765230b5SDmitry Torokhov /*
915765230b5SDmitry Torokhov * We'll set have_async to 'true' if, while scanning for matching
916765230b5SDmitry Torokhov * driver, we'll encounter one that requests asynchronous probing.
917765230b5SDmitry Torokhov */
918765230b5SDmitry Torokhov bool have_async;
919765230b5SDmitry Torokhov };
920765230b5SDmitry Torokhov
__device_attach_driver(struct device_driver * drv,void * _data)921765230b5SDmitry Torokhov static int __device_attach_driver(struct device_driver *drv, void *_data)
922765230b5SDmitry Torokhov {
923765230b5SDmitry Torokhov struct device_attach_data *data = _data;
924765230b5SDmitry Torokhov struct device *dev = data->dev;
925765230b5SDmitry Torokhov bool async_allowed;
926656b8035STomeu Vizoso int ret;
927765230b5SDmitry Torokhov
928656b8035STomeu Vizoso ret = driver_match_device(drv, dev);
929656b8035STomeu Vizoso if (ret == 0) {
930656b8035STomeu Vizoso /* no match */
93149b420a1SMing Lei return 0;
932656b8035STomeu Vizoso } else if (ret == -EPROBE_DEFER) {
933656b8035STomeu Vizoso dev_dbg(dev, "Device match requests probe deferral\n");
934f2db85b6SSaravana Kannan dev->can_match = true;
935656b8035STomeu Vizoso driver_deferred_probe_add(dev);
93625e9fbf0SIsaac J. Manjarres /*
93725e9fbf0SIsaac J. Manjarres * Device can't match with a driver right now, so don't attempt
93825e9fbf0SIsaac J. Manjarres * to match or bind with other drivers on the bus.
93925e9fbf0SIsaac J. Manjarres */
94025e9fbf0SIsaac J. Manjarres return ret;
941656b8035STomeu Vizoso } else if (ret < 0) {
942eb7fbc9fSChristophe JAILLET dev_dbg(dev, "Bus failed to match device: %d\n", ret);
943656b8035STomeu Vizoso return ret;
944656b8035STomeu Vizoso } /* ret > 0 means positive match */
94549b420a1SMing Lei
946765230b5SDmitry Torokhov async_allowed = driver_allows_async_probing(drv);
947765230b5SDmitry Torokhov
948765230b5SDmitry Torokhov if (async_allowed)
949765230b5SDmitry Torokhov data->have_async = true;
950765230b5SDmitry Torokhov
951765230b5SDmitry Torokhov if (data->check_async && async_allowed != data->want_async)
952765230b5SDmitry Torokhov return 0;
953765230b5SDmitry Torokhov
954ef6dcbddSChristoph Hellwig /*
955ef6dcbddSChristoph Hellwig * Ignore errors returned by ->probe so that the next driver can try
956ef6dcbddSChristoph Hellwig * its luck.
957ef6dcbddSChristoph Hellwig */
958ef6dcbddSChristoph Hellwig ret = driver_probe_device(drv, dev);
959ef6dcbddSChristoph Hellwig if (ret < 0)
960ef6dcbddSChristoph Hellwig return ret;
961ef6dcbddSChristoph Hellwig return ret == 0;
9622287c322Smochel@digitalimplant.org }
9632287c322Smochel@digitalimplant.org
__device_attach_async_helper(void * _dev,async_cookie_t cookie)964765230b5SDmitry Torokhov static void __device_attach_async_helper(void *_dev, async_cookie_t cookie)
965765230b5SDmitry Torokhov {
966765230b5SDmitry Torokhov struct device *dev = _dev;
967765230b5SDmitry Torokhov struct device_attach_data data = {
968765230b5SDmitry Torokhov .dev = dev,
969765230b5SDmitry Torokhov .check_async = true,
970765230b5SDmitry Torokhov .want_async = true,
971765230b5SDmitry Torokhov };
972765230b5SDmitry Torokhov
973765230b5SDmitry Torokhov device_lock(dev);
974765230b5SDmitry Torokhov
9753451a495SAlexander Duyck /*
9763451a495SAlexander Duyck * Check if device has already been removed or claimed. This may
9773451a495SAlexander Duyck * happen with driver loading, device discovery/registration,
9783451a495SAlexander Duyck * and deferred probe processing happens all at once with
9793451a495SAlexander Duyck * multiple threads.
9803451a495SAlexander Duyck */
9813451a495SAlexander Duyck if (dev->p->dead || dev->driver)
9823451a495SAlexander Duyck goto out_unlock;
9833451a495SAlexander Duyck
984ddef08ddSRafael J. Wysocki if (dev->parent)
985ddef08ddSRafael J. Wysocki pm_runtime_get_sync(dev->parent);
986ddef08ddSRafael J. Wysocki
987765230b5SDmitry Torokhov bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver);
988765230b5SDmitry Torokhov dev_dbg(dev, "async probe completed\n");
989765230b5SDmitry Torokhov
990765230b5SDmitry Torokhov pm_request_idle(dev);
991765230b5SDmitry Torokhov
992ddef08ddSRafael J. Wysocki if (dev->parent)
993ddef08ddSRafael J. Wysocki pm_runtime_put(dev->parent);
9943451a495SAlexander Duyck out_unlock:
995765230b5SDmitry Torokhov device_unlock(dev);
996765230b5SDmitry Torokhov
997765230b5SDmitry Torokhov put_device(dev);
998765230b5SDmitry Torokhov }
999765230b5SDmitry Torokhov
__device_attach(struct device * dev,bool allow_async)1000802a87fdSDmitry Torokhov static int __device_attach(struct device *dev, bool allow_async)
1001765230b5SDmitry Torokhov {
1002765230b5SDmitry Torokhov int ret = 0;
1003b232b02bSZhang Wensheng bool async = false;
1004765230b5SDmitry Torokhov
1005765230b5SDmitry Torokhov device_lock(dev);
100665488832SLukas Wunner if (dev->p->dead) {
100765488832SLukas Wunner goto out_unlock;
100865488832SLukas Wunner } else if (dev->driver) {
10096b9cb427STomeu Vizoso if (device_is_bound(dev)) {
1010765230b5SDmitry Torokhov ret = 1;
1011765230b5SDmitry Torokhov goto out_unlock;
1012765230b5SDmitry Torokhov }
1013765230b5SDmitry Torokhov ret = device_bind_driver(dev);
1014765230b5SDmitry Torokhov if (ret == 0)
1015765230b5SDmitry Torokhov ret = 1;
1016765230b5SDmitry Torokhov else {
1017765230b5SDmitry Torokhov dev->driver = NULL;
1018765230b5SDmitry Torokhov ret = 0;
1019765230b5SDmitry Torokhov }
1020765230b5SDmitry Torokhov } else {
1021765230b5SDmitry Torokhov struct device_attach_data data = {
1022765230b5SDmitry Torokhov .dev = dev,
1023765230b5SDmitry Torokhov .check_async = allow_async,
1024765230b5SDmitry Torokhov .want_async = false,
1025765230b5SDmitry Torokhov };
1026765230b5SDmitry Torokhov
1027ddef08ddSRafael J. Wysocki if (dev->parent)
1028ddef08ddSRafael J. Wysocki pm_runtime_get_sync(dev->parent);
1029ddef08ddSRafael J. Wysocki
1030765230b5SDmitry Torokhov ret = bus_for_each_drv(dev->bus, NULL, &data,
1031765230b5SDmitry Torokhov __device_attach_driver);
1032765230b5SDmitry Torokhov if (!ret && allow_async && data.have_async) {
1033765230b5SDmitry Torokhov /*
1034765230b5SDmitry Torokhov * If we could not find appropriate driver
1035765230b5SDmitry Torokhov * synchronously and we are allowed to do
1036765230b5SDmitry Torokhov * async probes and there are drivers that
1037765230b5SDmitry Torokhov * want to probe asynchronously, we'll
1038765230b5SDmitry Torokhov * try them.
1039765230b5SDmitry Torokhov */
1040765230b5SDmitry Torokhov dev_dbg(dev, "scheduling asynchronous probe\n");
1041765230b5SDmitry Torokhov get_device(dev);
1042b232b02bSZhang Wensheng async = true;
1043765230b5SDmitry Torokhov } else {
1044765230b5SDmitry Torokhov pm_request_idle(dev);
1045765230b5SDmitry Torokhov }
1046ddef08ddSRafael J. Wysocki
1047ddef08ddSRafael J. Wysocki if (dev->parent)
1048ddef08ddSRafael J. Wysocki pm_runtime_put(dev->parent);
1049765230b5SDmitry Torokhov }
1050765230b5SDmitry Torokhov out_unlock:
1051765230b5SDmitry Torokhov device_unlock(dev);
1052b232b02bSZhang Wensheng if (async)
1053b232b02bSZhang Wensheng async_schedule_dev(__device_attach_async_helper, dev);
1054765230b5SDmitry Torokhov return ret;
1055765230b5SDmitry Torokhov }
1056765230b5SDmitry Torokhov
105707e4a3e2Smochel@digitalimplant.org /**
105807e4a3e2Smochel@digitalimplant.org * device_attach - try to attach device to a driver.
105907e4a3e2Smochel@digitalimplant.org * @dev: device.
106007e4a3e2Smochel@digitalimplant.org *
106107e4a3e2Smochel@digitalimplant.org * Walk the list of drivers that the bus has and call
106207e4a3e2Smochel@digitalimplant.org * driver_probe_device() for each pair. If a compatible
10635adc55daSAdrian Bunk * pair is found, break out and return.
10640d3e5a2eSPatrick Mochel *
1065ca2b94baSHannes Reinecke * Returns 1 if the device was bound to a driver;
106659a3cd7fSDmitry Torokhov * 0 if no matching driver was found;
1067c6a46696SCornelia Huck * -ENODEV if the device is not registered.
1068bf74ad5bSAlan Stern *
10698e9394ceSGreg Kroah-Hartman * When called for a USB interface, @dev->parent lock must be held.
107007e4a3e2Smochel@digitalimplant.org */
device_attach(struct device * dev)107107e4a3e2Smochel@digitalimplant.org int device_attach(struct device *dev)
107207e4a3e2Smochel@digitalimplant.org {
1073765230b5SDmitry Torokhov return __device_attach(dev, false);
10742287c322Smochel@digitalimplant.org }
10754a3ad20cSGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_attach);
10762287c322Smochel@digitalimplant.org
device_initial_probe(struct device * dev)1077765230b5SDmitry Torokhov void device_initial_probe(struct device *dev)
1078765230b5SDmitry Torokhov {
1079765230b5SDmitry Torokhov __device_attach(dev, true);
1080765230b5SDmitry Torokhov }
1081765230b5SDmitry Torokhov
1082ed88747cSAlexander Duyck /*
1083ed88747cSAlexander Duyck * __device_driver_lock - acquire locks needed to manipulate dev->drv
1084ed88747cSAlexander Duyck * @dev: Device we will update driver info for
1085ed88747cSAlexander Duyck * @parent: Parent device. Needed if the bus requires parent lock
1086ed88747cSAlexander Duyck *
1087ed88747cSAlexander Duyck * This function will take the required locks for manipulating dev->drv.
1088ed88747cSAlexander Duyck * Normally this will just be the @dev lock, but when called for a USB
1089ed88747cSAlexander Duyck * interface, @parent lock will be held as well.
1090ed88747cSAlexander Duyck */
__device_driver_lock(struct device * dev,struct device * parent)1091ed88747cSAlexander Duyck static void __device_driver_lock(struct device *dev, struct device *parent)
1092ed88747cSAlexander Duyck {
1093ed88747cSAlexander Duyck if (parent && dev->bus->need_parent_lock)
1094ed88747cSAlexander Duyck device_lock(parent);
1095ed88747cSAlexander Duyck device_lock(dev);
1096ed88747cSAlexander Duyck }
1097ed88747cSAlexander Duyck
1098ed88747cSAlexander Duyck /*
1099ed88747cSAlexander Duyck * __device_driver_unlock - release locks needed to manipulate dev->drv
1100ed88747cSAlexander Duyck * @dev: Device we will update driver info for
1101ed88747cSAlexander Duyck * @parent: Parent device. Needed if the bus requires parent lock
1102ed88747cSAlexander Duyck *
1103ed88747cSAlexander Duyck * This function will release the required locks for manipulating dev->drv.
1104b4ae8c2fSTom Rix * Normally this will just be the @dev lock, but when called for a
1105ed88747cSAlexander Duyck * USB interface, @parent lock will be released as well.
1106ed88747cSAlexander Duyck */
__device_driver_unlock(struct device * dev,struct device * parent)1107ed88747cSAlexander Duyck static void __device_driver_unlock(struct device *dev, struct device *parent)
1108ed88747cSAlexander Duyck {
1109ed88747cSAlexander Duyck device_unlock(dev);
1110ed88747cSAlexander Duyck if (parent && dev->bus->need_parent_lock)
1111ed88747cSAlexander Duyck device_unlock(parent);
1112ed88747cSAlexander Duyck }
1113ed88747cSAlexander Duyck
1114ed88747cSAlexander Duyck /**
1115ed88747cSAlexander Duyck * device_driver_attach - attach a specific driver to a specific device
1116ed88747cSAlexander Duyck * @drv: Driver to attach
1117ed88747cSAlexander Duyck * @dev: Device to attach it to
1118ed88747cSAlexander Duyck *
1119ed88747cSAlexander Duyck * Manually attach driver to a device. Will acquire both @dev lock and
1120ef6dcbddSChristoph Hellwig * @dev->parent lock if needed. Returns 0 on success, -ERR on failure.
1121ed88747cSAlexander Duyck */
device_driver_attach(struct device_driver * drv,struct device * dev)1122ed88747cSAlexander Duyck int device_driver_attach(struct device_driver *drv, struct device *dev)
1123ed88747cSAlexander Duyck {
1124204db60cSJason Gunthorpe int ret;
1125ed88747cSAlexander Duyck
1126ed88747cSAlexander Duyck __device_driver_lock(dev, dev->parent);
112745ddcb42SChristoph Hellwig ret = __driver_probe_device(drv, dev);
1128ed88747cSAlexander Duyck __device_driver_unlock(dev, dev->parent);
1129ed88747cSAlexander Duyck
1130ef6dcbddSChristoph Hellwig /* also return probe errors as normal negative errnos */
1131ef6dcbddSChristoph Hellwig if (ret > 0)
1132ef6dcbddSChristoph Hellwig ret = -ret;
113345ddcb42SChristoph Hellwig if (ret == -EPROBE_DEFER)
113445ddcb42SChristoph Hellwig return -EAGAIN;
1135ed88747cSAlexander Duyck return ret;
1136ed88747cSAlexander Duyck }
11370d9f837cSJason Gunthorpe EXPORT_SYMBOL_GPL(device_driver_attach);
1138ed88747cSAlexander Duyck
__driver_attach_async_helper(void * _dev,async_cookie_t cookie)1139ef0ff683SAlexander Duyck static void __driver_attach_async_helper(void *_dev, async_cookie_t cookie)
1140ef0ff683SAlexander Duyck {
1141ef0ff683SAlexander Duyck struct device *dev = _dev;
1142ef0ff683SAlexander Duyck struct device_driver *drv;
1143204db60cSJason Gunthorpe int ret;
1144ef0ff683SAlexander Duyck
1145ef0ff683SAlexander Duyck __device_driver_lock(dev, dev->parent);
1146ef0ff683SAlexander Duyck drv = dev->p->async_driver;
114784e7c678SMark-PK Tsai dev->p->async_driver = NULL;
1148ef0ff683SAlexander Duyck ret = driver_probe_device(drv, dev);
1149ef0ff683SAlexander Duyck __device_driver_unlock(dev, dev->parent);
1150ef0ff683SAlexander Duyck
1151ef0ff683SAlexander Duyck dev_dbg(dev, "driver %s async attach completed: %d\n", drv->name, ret);
1152ef0ff683SAlexander Duyck
1153ef0ff683SAlexander Duyck put_device(dev);
1154ef0ff683SAlexander Duyck }
1155ef0ff683SAlexander Duyck
__driver_attach(struct device * dev,void * data)11562287c322Smochel@digitalimplant.org static int __driver_attach(struct device *dev, void *data)
11572287c322Smochel@digitalimplant.org {
11582287c322Smochel@digitalimplant.org struct device_driver *drv = data;
115970fe7583SZhang Wensheng bool async = false;
1160656b8035STomeu Vizoso int ret;
11612287c322Smochel@digitalimplant.org
11620d3e5a2eSPatrick Mochel /*
11630d3e5a2eSPatrick Mochel * Lock device and try to bind to it. We drop the error
11640d3e5a2eSPatrick Mochel * here and always return 0, because we need to keep trying
11650d3e5a2eSPatrick Mochel * to bind to devices and some drivers will return an error
11660d3e5a2eSPatrick Mochel * simply if it didn't support the device.
11670d3e5a2eSPatrick Mochel *
11680d3e5a2eSPatrick Mochel * driver_probe_device() will spit a warning if there
11690d3e5a2eSPatrick Mochel * is an error.
11700d3e5a2eSPatrick Mochel */
11710d3e5a2eSPatrick Mochel
1172656b8035STomeu Vizoso ret = driver_match_device(drv, dev);
1173656b8035STomeu Vizoso if (ret == 0) {
1174656b8035STomeu Vizoso /* no match */
11756cd49586SArjan van de Ven return 0;
1176656b8035STomeu Vizoso } else if (ret == -EPROBE_DEFER) {
1177656b8035STomeu Vizoso dev_dbg(dev, "Device match requests probe deferral\n");
1178f2db85b6SSaravana Kannan dev->can_match = true;
1179656b8035STomeu Vizoso driver_deferred_probe_add(dev);
118025e9fbf0SIsaac J. Manjarres /*
118125e9fbf0SIsaac J. Manjarres * Driver could not match with device, but may match with
118225e9fbf0SIsaac J. Manjarres * another device on the bus.
118325e9fbf0SIsaac J. Manjarres */
118425e9fbf0SIsaac J. Manjarres return 0;
1185656b8035STomeu Vizoso } else if (ret < 0) {
1186eb7fbc9fSChristophe JAILLET dev_dbg(dev, "Bus failed to match device: %d\n", ret);
118727c0d217SIsaac J. Manjarres /*
118827c0d217SIsaac J. Manjarres * Driver could not match with device, but may match with
118927c0d217SIsaac J. Manjarres * another device on the bus.
119027c0d217SIsaac J. Manjarres */
119127c0d217SIsaac J. Manjarres return 0;
1192656b8035STomeu Vizoso } /* ret > 0 means positive match */
11936cd49586SArjan van de Ven
1194ef0ff683SAlexander Duyck if (driver_allows_async_probing(drv)) {
1195ef0ff683SAlexander Duyck /*
1196ef0ff683SAlexander Duyck * Instead of probing the device synchronously we will
1197ef0ff683SAlexander Duyck * probe it asynchronously to allow for more parallelism.
1198ef0ff683SAlexander Duyck *
1199ef0ff683SAlexander Duyck * We only take the device lock here in order to guarantee
1200ef0ff683SAlexander Duyck * that the dev->driver and async_driver fields are protected
1201ef0ff683SAlexander Duyck */
1202ef0ff683SAlexander Duyck dev_dbg(dev, "probing driver %s asynchronously\n", drv->name);
1203ef0ff683SAlexander Duyck device_lock(dev);
120484e7c678SMark-PK Tsai if (!dev->driver && !dev->p->async_driver) {
1205ef0ff683SAlexander Duyck get_device(dev);
1206ef0ff683SAlexander Duyck dev->p->async_driver = drv;
120770fe7583SZhang Wensheng async = true;
1208ef0ff683SAlexander Duyck }
1209ef0ff683SAlexander Duyck device_unlock(dev);
121070fe7583SZhang Wensheng if (async)
121170fe7583SZhang Wensheng async_schedule_dev(__driver_attach_async_helper, dev);
1212ef0ff683SAlexander Duyck return 0;
1213ef0ff683SAlexander Duyck }
1214ef0ff683SAlexander Duyck
1215ef6dcbddSChristoph Hellwig __device_driver_lock(dev, dev->parent);
1216ef6dcbddSChristoph Hellwig driver_probe_device(drv, dev);
1217ef6dcbddSChristoph Hellwig __device_driver_unlock(dev, dev->parent);
12180d3e5a2eSPatrick Mochel
121907e4a3e2Smochel@digitalimplant.org return 0;
122007e4a3e2Smochel@digitalimplant.org }
122107e4a3e2Smochel@digitalimplant.org
122207e4a3e2Smochel@digitalimplant.org /**
122307e4a3e2Smochel@digitalimplant.org * driver_attach - try to bind driver to devices.
122407e4a3e2Smochel@digitalimplant.org * @drv: driver.
122507e4a3e2Smochel@digitalimplant.org *
122607e4a3e2Smochel@digitalimplant.org * Walk the list of devices that the bus has on it and try to
122707e4a3e2Smochel@digitalimplant.org * match the driver with each one. If driver_probe_device()
122807e4a3e2Smochel@digitalimplant.org * returns 0 and the @dev->driver is set, we've found a
122907e4a3e2Smochel@digitalimplant.org * compatible pair.
123007e4a3e2Smochel@digitalimplant.org */
driver_attach(struct device_driver * drv)1231f86db396SAndrew Morton int driver_attach(struct device_driver *drv)
123207e4a3e2Smochel@digitalimplant.org {
1233f86db396SAndrew Morton return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
123407e4a3e2Smochel@digitalimplant.org }
12354a3ad20cSGreg Kroah-Hartman EXPORT_SYMBOL_GPL(driver_attach);
123607e4a3e2Smochel@digitalimplant.org
1237ab71c6f0SStefan Richter /*
12388e9394ceSGreg Kroah-Hartman * __device_release_driver() must be called with @dev lock held.
12398e9394ceSGreg Kroah-Hartman * When called for a USB interface, @dev->parent lock must be held as well.
124007e4a3e2Smochel@digitalimplant.org */
__device_release_driver(struct device * dev,struct device * parent)12419ed98953SRafael J. Wysocki static void __device_release_driver(struct device *dev, struct device *parent)
124207e4a3e2Smochel@digitalimplant.org {
12430d3e5a2eSPatrick Mochel struct device_driver *drv;
124407e4a3e2Smochel@digitalimplant.org
1245ef2c5174SAlan Stern drv = dev->driver;
1246c95a6b05SAlan Stern if (drv) {
12479226c504SRafael J. Wysocki pm_runtime_get_sync(dev);
12489226c504SRafael J. Wysocki
12499ed98953SRafael J. Wysocki while (device_links_busy(dev)) {
1250ed88747cSAlexander Duyck __device_driver_unlock(dev, parent);
12519ed98953SRafael J. Wysocki
12529ed98953SRafael J. Wysocki device_links_unbind_consumers(dev);
12539ed98953SRafael J. Wysocki
1254ed88747cSAlexander Duyck __device_driver_lock(dev, parent);
12559ed98953SRafael J. Wysocki /*
12569ed98953SRafael J. Wysocki * A concurrent invocation of the same function might
12579ed98953SRafael J. Wysocki * have released the driver successfully while this one
12589ed98953SRafael J. Wysocki * was waiting, so check for that.
12599ed98953SRafael J. Wysocki */
12609226c504SRafael J. Wysocki if (dev->driver != drv) {
12619226c504SRafael J. Wysocki pm_runtime_put(dev);
12629ed98953SRafael J. Wysocki return;
12639ed98953SRafael J. Wysocki }
12649226c504SRafael J. Wysocki }
12655e928f77SRafael J. Wysocki
12661901fb26SKay Sievers driver_sysfs_remove(dev);
126794e7b1c5Smochel@digitalimplant.org
1268ed9f9181SGreg Kroah-Hartman bus_notify(dev, BUS_NOTIFY_UNBIND_DRIVER);
1269116af378SBenjamin Herrenschmidt
1270baab52deSRafael J. Wysocki pm_runtime_put_sync(dev);
1271e1866b33SRafael J. Wysocki
12724b775aafSRob Herring device_remove(dev);
12739ed98953SRafael J. Wysocki
127425f3bcfcSLu Baolu if (dev->bus && dev->bus->dma_cleanup)
127525f3bcfcSLu Baolu dev->bus->dma_cleanup(dev);
127625f3bcfcSLu Baolu
12779ad30721SRob Herring device_unbind_cleanup(dev);
1278*e4eccf22SSaravana Kannan device_links_driver_cleanup(dev);
1279e90d5532SRafael J. Wysocki
12808940b4f3SGreg Kroah-Hartman klist_remove(&dev->p->knode_driver);
1281aa8e54b5STomeu Vizoso device_pm_check_callbacks(dev);
12821455cf8dSDmitry Torokhov
1283ed9f9181SGreg Kroah-Hartman bus_notify(dev, BUS_NOTIFY_UNBOUND_DRIVER);
12841455cf8dSDmitry Torokhov kobject_uevent(&dev->kobj, KOBJ_UNBIND);
12850d3e5a2eSPatrick Mochel }
1286c95a6b05SAlan Stern }
1287c95a6b05SAlan Stern
device_release_driver_internal(struct device * dev,struct device_driver * drv,struct device * parent)12889ed98953SRafael J. Wysocki void device_release_driver_internal(struct device *dev,
12894bdb3550SRafael J. Wysocki struct device_driver *drv,
12904bdb3550SRafael J. Wysocki struct device *parent)
12914bdb3550SRafael J. Wysocki {
1292ed88747cSAlexander Duyck __device_driver_lock(dev, parent);
12934bdb3550SRafael J. Wysocki
12944bdb3550SRafael J. Wysocki if (!drv || drv == dev->driver)
12959ed98953SRafael J. Wysocki __device_release_driver(dev, parent);
12964bdb3550SRafael J. Wysocki
1297ed88747cSAlexander Duyck __device_driver_unlock(dev, parent);
12984bdb3550SRafael J. Wysocki }
12994bdb3550SRafael J. Wysocki
1300ab71c6f0SStefan Richter /**
1301ab71c6f0SStefan Richter * device_release_driver - manually detach device from driver.
1302ab71c6f0SStefan Richter * @dev: device.
1303ab71c6f0SStefan Richter *
1304ab71c6f0SStefan Richter * Manually detach device from driver.
13058e9394ceSGreg Kroah-Hartman * When called for a USB interface, @dev->parent lock must be held.
13069ed98953SRafael J. Wysocki *
13079ed98953SRafael J. Wysocki * If this function is to be called with @dev->parent lock held, ensure that
13089ed98953SRafael J. Wysocki * the device's consumers are unbound in advance or that their locks can be
13099ed98953SRafael J. Wysocki * acquired under the @dev->parent lock.
1310ab71c6f0SStefan Richter */
device_release_driver(struct device * dev)1311c95a6b05SAlan Stern void device_release_driver(struct device *dev)
1312c95a6b05SAlan Stern {
1313c95a6b05SAlan Stern /*
1314c95a6b05SAlan Stern * If anyone calls device_release_driver() recursively from
1315c95a6b05SAlan Stern * within their ->remove callback for the same device, they
1316c95a6b05SAlan Stern * will deadlock right here.
1317c95a6b05SAlan Stern */
13184bdb3550SRafael J. Wysocki device_release_driver_internal(dev, NULL, NULL);
131907e4a3e2Smochel@digitalimplant.org }
13204a3ad20cSGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_release_driver);
132194e7b1c5Smochel@digitalimplant.org
132207e4a3e2Smochel@digitalimplant.org /**
1323ed88747cSAlexander Duyck * device_driver_detach - detach driver from a specific device
1324ed88747cSAlexander Duyck * @dev: device to detach driver from
1325ed88747cSAlexander Duyck *
1326ed88747cSAlexander Duyck * Detach driver from device. Will acquire both @dev lock and @dev->parent
1327ed88747cSAlexander Duyck * lock if needed.
1328ed88747cSAlexander Duyck */
device_driver_detach(struct device * dev)1329ed88747cSAlexander Duyck void device_driver_detach(struct device *dev)
1330ed88747cSAlexander Duyck {
1331ed88747cSAlexander Duyck device_release_driver_internal(dev, NULL, dev->parent);
1332ed88747cSAlexander Duyck }
1333ed88747cSAlexander Duyck
1334ed88747cSAlexander Duyck /**
133507e4a3e2Smochel@digitalimplant.org * driver_detach - detach driver from all devices it controls.
133607e4a3e2Smochel@digitalimplant.org * @drv: driver.
133707e4a3e2Smochel@digitalimplant.org */
driver_detach(struct device_driver * drv)133807e4a3e2Smochel@digitalimplant.org void driver_detach(struct device_driver *drv)
133907e4a3e2Smochel@digitalimplant.org {
13408940b4f3SGreg Kroah-Hartman struct device_private *dev_prv;
1341c95a6b05SAlan Stern struct device *dev;
1342c95a6b05SAlan Stern
1343c37d721cSAlexander Duyck if (driver_allows_async_probing(drv))
1344c37d721cSAlexander Duyck async_synchronize_full();
1345c37d721cSAlexander Duyck
1346c95a6b05SAlan Stern for (;;) {
1347e5dd1278SGreg Kroah-Hartman spin_lock(&drv->p->klist_devices.k_lock);
1348e5dd1278SGreg Kroah-Hartman if (list_empty(&drv->p->klist_devices.k_list)) {
1349e5dd1278SGreg Kroah-Hartman spin_unlock(&drv->p->klist_devices.k_lock);
1350c95a6b05SAlan Stern break;
1351c95a6b05SAlan Stern }
1352a3a87d66SAndy Shevchenko dev_prv = list_last_entry(&drv->p->klist_devices.k_list,
13538940b4f3SGreg Kroah-Hartman struct device_private,
13548940b4f3SGreg Kroah-Hartman knode_driver.n_node);
13558940b4f3SGreg Kroah-Hartman dev = dev_prv->device;
1356c95a6b05SAlan Stern get_device(dev);
1357e5dd1278SGreg Kroah-Hartman spin_unlock(&drv->p->klist_devices.k_lock);
13584bdb3550SRafael J. Wysocki device_release_driver_internal(dev, drv, dev->parent);
1359c95a6b05SAlan Stern put_device(dev);
1360c95a6b05SAlan Stern }
136107e4a3e2Smochel@digitalimplant.org }
1362