Merge tag 'drm-next-2019-07-19' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-block.git] / drivers / base / dd.c
index 0df9b4461766c79499d695b10fa74ef8d6337877..994a9074742046edfed5afefe62011450e20669c 100644 (file)
@@ -235,6 +235,19 @@ static int __init deferred_probe_timeout_setup(char *str)
 }
 __setup("deferred_probe_timeout=", deferred_probe_timeout_setup);
 
+static int __driver_deferred_probe_check_state(struct device *dev)
+{
+       if (!initcalls_done)
+               return -EPROBE_DEFER;
+
+       if (!deferred_probe_timeout) {
+               dev_WARN(dev, "deferred probe timeout, ignoring dependency");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
 /**
  * driver_deferred_probe_check_state() - Check deferred probe state
  * @dev: device to check
@@ -248,14 +261,40 @@ __setup("deferred_probe_timeout=", deferred_probe_timeout_setup);
  */
 int driver_deferred_probe_check_state(struct device *dev)
 {
-       if (initcalls_done) {
-               if (!deferred_probe_timeout) {
-                       dev_WARN(dev, "deferred probe timeout, ignoring dependency");
-                       return -ETIMEDOUT;
-               }
-               dev_warn(dev, "ignoring dependency for device, assuming no driver");
-               return -ENODEV;
-       }
+       int ret;
+
+       ret = __driver_deferred_probe_check_state(dev);
+       if (ret < 0)
+               return ret;
+
+       dev_warn(dev, "ignoring dependency for device, assuming no driver");
+
+       return -ENODEV;
+}
+
+/**
+ * driver_deferred_probe_check_state_continue() - check deferred probe state
+ * @dev: device to check
+ *
+ * Returns -ETIMEDOUT if deferred probe debug timeout has expired, or
+ * -EPROBE_DEFER otherwise.
+ *
+ * Drivers or subsystems can opt-in to calling this function instead of
+ * directly returning -EPROBE_DEFER.
+ *
+ * This is similar to driver_deferred_probe_check_state(), but it allows the
+ * subsystem to keep deferring probe after built-in drivers have had a chance
+ * to probe. One scenario where that is useful is if built-in drivers rely on
+ * resources that are provided by modular drivers.
+ */
+int driver_deferred_probe_check_state_continue(struct device *dev)
+{
+       int ret;
+
+       ret = __driver_deferred_probe_check_state(dev);
+       if (ret < 0)
+               return ret;
+
        return -EPROBE_DEFER;
 }