diff options
Diffstat (limited to 'drivers/base/dd.c')
-rw-r--r-- | drivers/base/dd.c | 148 |
1 files changed, 147 insertions, 1 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 142e3d600f14..1b1cbb571d38 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -28,6 +28,141 @@ | |||
28 | #include "base.h" | 28 | #include "base.h" |
29 | #include "power/power.h" | 29 | #include "power/power.h" |
30 | 30 | ||
31 | /* | ||
32 | * Deferred Probe infrastructure. | ||
33 | * | ||
34 | * Sometimes driver probe order matters, but the kernel doesn't always have | ||
35 | * dependency information which means some drivers will get probed before a | ||
36 | * resource it depends on is available. For example, an SDHCI driver may | ||
37 | * first need a GPIO line from an i2c GPIO controller before it can be | ||
38 | * initialized. If a required resource is not available yet, a driver can | ||
39 | * request probing to be deferred by returning -EPROBE_DEFER from its probe hook | ||
40 | * | ||
41 | * Deferred probe maintains two lists of devices, a pending list and an active | ||
42 | * list. A driver returning -EPROBE_DEFER causes the device to be added to the | ||
43 | * pending list. A successful driver probe will trigger moving all devices | ||
44 | * from the pending to the active list so that the workqueue will eventually | ||
45 | * retry them. | ||
46 | * | ||
47 | * The deferred_probe_mutex must be held any time the deferred_probe_*_list | ||
48 | * of the (struct device*)->p->deferred_probe pointers are manipulated | ||
49 | */ | ||
50 | static DEFINE_MUTEX(deferred_probe_mutex); | ||
51 | static LIST_HEAD(deferred_probe_pending_list); | ||
52 | static LIST_HEAD(deferred_probe_active_list); | ||
53 | static struct workqueue_struct *deferred_wq; | ||
54 | |||
55 | /** | ||
56 | * deferred_probe_work_func() - Retry probing devices in the active list. | ||
57 | */ | ||
58 | static void deferred_probe_work_func(struct work_struct *work) | ||
59 | { | ||
60 | struct device *dev; | ||
61 | struct device_private *private; | ||
62 | /* | ||
63 | * This block processes every device in the deferred 'active' list. | ||
64 | * Each device is removed from the active list and passed to | ||
65 | * bus_probe_device() to re-attempt the probe. The loop continues | ||
66 | * until every device in the active list is removed and retried. | ||
67 | * | ||
68 | * Note: Once the device is removed from the list and the mutex is | ||
69 | * released, it is possible for the device get freed by another thread | ||
70 | * and cause a illegal pointer dereference. This code uses | ||
71 | * get/put_device() to ensure the device structure cannot disappear | ||
72 | * from under our feet. | ||
73 | */ | ||
74 | mutex_lock(&deferred_probe_mutex); | ||
75 | while (!list_empty(&deferred_probe_active_list)) { | ||
76 | private = list_first_entry(&deferred_probe_active_list, | ||
77 | typeof(*dev->p), deferred_probe); | ||
78 | dev = private->device; | ||
79 | list_del_init(&private->deferred_probe); | ||
80 | |||
81 | get_device(dev); | ||
82 | |||
83 | /* | ||
84 | * Drop the mutex while probing each device; the probe path may | ||
85 | * manipulate the deferred list | ||
86 | */ | ||
87 | mutex_unlock(&deferred_probe_mutex); | ||
88 | dev_dbg(dev, "Retrying from deferred list\n"); | ||
89 | bus_probe_device(dev); | ||
90 | mutex_lock(&deferred_probe_mutex); | ||
91 | |||
92 | put_device(dev); | ||
93 | } | ||
94 | mutex_unlock(&deferred_probe_mutex); | ||
95 | } | ||
96 | static DECLARE_WORK(deferred_probe_work, deferred_probe_work_func); | ||
97 | |||
98 | static void driver_deferred_probe_add(struct device *dev) | ||
99 | { | ||
100 | mutex_lock(&deferred_probe_mutex); | ||
101 | if (list_empty(&dev->p->deferred_probe)) { | ||
102 | dev_dbg(dev, "Added to deferred list\n"); | ||
103 | list_add(&dev->p->deferred_probe, &deferred_probe_pending_list); | ||
104 | } | ||
105 | mutex_unlock(&deferred_probe_mutex); | ||
106 | } | ||
107 | |||
108 | void driver_deferred_probe_del(struct device *dev) | ||
109 | { | ||
110 | mutex_lock(&deferred_probe_mutex); | ||
111 | if (!list_empty(&dev->p->deferred_probe)) { | ||
112 | dev_dbg(dev, "Removed from deferred list\n"); | ||
113 | list_del_init(&dev->p->deferred_probe); | ||
114 | } | ||
115 | mutex_unlock(&deferred_probe_mutex); | ||
116 | } | ||
117 | |||
118 | static bool driver_deferred_probe_enable = false; | ||
119 | /** | ||
120 | * driver_deferred_probe_trigger() - Kick off re-probing deferred devices | ||
121 | * | ||
122 | * This functions moves all devices from the pending list to the active | ||
123 | * list and schedules the deferred probe workqueue to process them. It | ||
124 | * should be called anytime a driver is successfully bound to a device. | ||
125 | */ | ||
126 | static void driver_deferred_probe_trigger(void) | ||
127 | { | ||
128 | if (!driver_deferred_probe_enable) | ||
129 | return; | ||
130 | |||
131 | /* | ||
132 | * A successful probe means that all the devices in the pending list | ||
133 | * should be triggered to be reprobed. Move all the deferred devices | ||
134 | * into the active list so they can be retried by the workqueue | ||
135 | */ | ||
136 | mutex_lock(&deferred_probe_mutex); | ||
137 | list_splice_tail_init(&deferred_probe_pending_list, | ||
138 | &deferred_probe_active_list); | ||
139 | mutex_unlock(&deferred_probe_mutex); | ||
140 | |||
141 | /* | ||
142 | * Kick the re-probe thread. It may already be scheduled, but it is | ||
143 | * safe to kick it again. | ||
144 | */ | ||
145 | queue_work(deferred_wq, &deferred_probe_work); | ||
146 | } | ||
147 | |||
148 | /** | ||
149 | * deferred_probe_initcall() - Enable probing of deferred devices | ||
150 | * | ||
151 | * We don't want to get in the way when the bulk of drivers are getting probed. | ||
152 | * Instead, this initcall makes sure that deferred probing is delayed until | ||
153 | * late_initcall time. | ||
154 | */ | ||
155 | static int deferred_probe_initcall(void) | ||
156 | { | ||
157 | deferred_wq = create_singlethread_workqueue("deferwq"); | ||
158 | if (WARN_ON(!deferred_wq)) | ||
159 | return -ENOMEM; | ||
160 | |||
161 | driver_deferred_probe_enable = true; | ||
162 | driver_deferred_probe_trigger(); | ||
163 | return 0; | ||
164 | } | ||
165 | late_initcall(deferred_probe_initcall); | ||
31 | 166 | ||
32 | static void driver_bound(struct device *dev) | 167 | static void driver_bound(struct device *dev) |
33 | { | 168 | { |
@@ -42,6 +177,13 @@ static void driver_bound(struct device *dev) | |||
42 | 177 | ||
43 | klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); | 178 | klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); |
44 | 179 | ||
180 | /* | ||
181 | * Make sure the device is no longer in one of the deferred lists and | ||
182 | * kick off retrying all pending devices | ||
183 | */ | ||
184 | driver_deferred_probe_del(dev); | ||
185 | driver_deferred_probe_trigger(); | ||
186 | |||
45 | if (dev->bus) | 187 | if (dev->bus) |
46 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, | 188 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
47 | BUS_NOTIFY_BOUND_DRIVER, dev); | 189 | BUS_NOTIFY_BOUND_DRIVER, dev); |
@@ -142,7 +284,11 @@ probe_failed: | |||
142 | driver_sysfs_remove(dev); | 284 | driver_sysfs_remove(dev); |
143 | dev->driver = NULL; | 285 | dev->driver = NULL; |
144 | 286 | ||
145 | if (ret != -ENODEV && ret != -ENXIO) { | 287 | if (ret == -EPROBE_DEFER) { |
288 | /* Driver requested deferred probing */ | ||
289 | dev_info(dev, "Driver %s requests probe deferral\n", drv->name); | ||
290 | driver_deferred_probe_add(dev); | ||
291 | } else if (ret != -ENODEV && ret != -ENXIO) { | ||
146 | /* driver matched but the probe failed */ | 292 | /* driver matched but the probe failed */ |
147 | printk(KERN_WARNING | 293 | printk(KERN_WARNING |
148 | "%s: probe of %s failed with error %d\n", | 294 | "%s: probe of %s failed with error %d\n", |