diff options
Diffstat (limited to 'drivers/base/dd.c')
-rw-r--r-- | drivers/base/dd.c | 55 |
1 files changed, 47 insertions, 8 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 0df9b4461766..994a90747420 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -235,6 +235,19 @@ static int __init deferred_probe_timeout_setup(char *str) | |||
235 | } | 235 | } |
236 | __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); | 236 | __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); |
237 | 237 | ||
238 | static int __driver_deferred_probe_check_state(struct device *dev) | ||
239 | { | ||
240 | if (!initcalls_done) | ||
241 | return -EPROBE_DEFER; | ||
242 | |||
243 | if (!deferred_probe_timeout) { | ||
244 | dev_WARN(dev, "deferred probe timeout, ignoring dependency"); | ||
245 | return -ETIMEDOUT; | ||
246 | } | ||
247 | |||
248 | return 0; | ||
249 | } | ||
250 | |||
238 | /** | 251 | /** |
239 | * driver_deferred_probe_check_state() - Check deferred probe state | 252 | * driver_deferred_probe_check_state() - Check deferred probe state |
240 | * @dev: device to check | 253 | * @dev: device to check |
@@ -248,14 +261,40 @@ __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); | |||
248 | */ | 261 | */ |
249 | int driver_deferred_probe_check_state(struct device *dev) | 262 | int driver_deferred_probe_check_state(struct device *dev) |
250 | { | 263 | { |
251 | if (initcalls_done) { | 264 | int ret; |
252 | if (!deferred_probe_timeout) { | 265 | |
253 | dev_WARN(dev, "deferred probe timeout, ignoring dependency"); | 266 | ret = __driver_deferred_probe_check_state(dev); |
254 | return -ETIMEDOUT; | 267 | if (ret < 0) |
255 | } | 268 | return ret; |
256 | dev_warn(dev, "ignoring dependency for device, assuming no driver"); | 269 | |
257 | return -ENODEV; | 270 | dev_warn(dev, "ignoring dependency for device, assuming no driver"); |
258 | } | 271 | |
272 | return -ENODEV; | ||
273 | } | ||
274 | |||
275 | /** | ||
276 | * driver_deferred_probe_check_state_continue() - check deferred probe state | ||
277 | * @dev: device to check | ||
278 | * | ||
279 | * Returns -ETIMEDOUT if deferred probe debug timeout has expired, or | ||
280 | * -EPROBE_DEFER otherwise. | ||
281 | * | ||
282 | * Drivers or subsystems can opt-in to calling this function instead of | ||
283 | * directly returning -EPROBE_DEFER. | ||
284 | * | ||
285 | * This is similar to driver_deferred_probe_check_state(), but it allows the | ||
286 | * subsystem to keep deferring probe after built-in drivers have had a chance | ||
287 | * to probe. One scenario where that is useful is if built-in drivers rely on | ||
288 | * resources that are provided by modular drivers. | ||
289 | */ | ||
290 | int driver_deferred_probe_check_state_continue(struct device *dev) | ||
291 | { | ||
292 | int ret; | ||
293 | |||
294 | ret = __driver_deferred_probe_check_state(dev); | ||
295 | if (ret < 0) | ||
296 | return ret; | ||
297 | |||
259 | return -EPROBE_DEFER; | 298 | return -EPROBE_DEFER; |
260 | } | 299 | } |
261 | 300 | ||