|
|
@@ -4789,7 +4789,7 @@ static int __init regulator_init(void)
|
|
|
/* init early to allow our consumers to complete system booting */
|
|
|
core_initcall(regulator_init);
|
|
|
|
|
|
-static int __init regulator_late_cleanup(struct device *dev, void *data)
|
|
|
+static int regulator_late_cleanup(struct device *dev, void *data)
|
|
|
{
|
|
|
struct regulator_dev *rdev = dev_to_rdev(dev);
|
|
|
const struct regulator_ops *ops = rdev->desc->ops;
|
|
|
@@ -4838,17 +4838,8 @@ unlock:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __init regulator_init_complete(void)
|
|
|
+static void regulator_init_complete_work_function(struct work_struct *work)
|
|
|
{
|
|
|
- /*
|
|
|
- * Since DT doesn't provide an idiomatic mechanism for
|
|
|
- * enabling full constraints and since it's much more natural
|
|
|
- * with DT to provide them just assume that a DT enabled
|
|
|
- * system has full constraints.
|
|
|
- */
|
|
|
- if (of_have_populated_dt())
|
|
|
- has_full_constraints = true;
|
|
|
-
|
|
|
/*
|
|
|
* Regulators may had failed to resolve their input supplies
|
|
|
* when were registered, either because the input supply was
|
|
|
@@ -4866,6 +4857,35 @@ static int __init regulator_init_complete(void)
|
|
|
*/
|
|
|
class_for_each_device(®ulator_class, NULL, NULL,
|
|
|
regulator_late_cleanup);
|
|
|
+}
|
|
|
+
|
|
|
+static DECLARE_DELAYED_WORK(regulator_init_complete_work,
|
|
|
+ regulator_init_complete_work_function);
|
|
|
+
|
|
|
+static int __init regulator_init_complete(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Since DT doesn't provide an idiomatic mechanism for
|
|
|
+ * enabling full constraints and since it's much more natural
|
|
|
+ * with DT to provide them just assume that a DT enabled
|
|
|
+ * system has full constraints.
|
|
|
+ */
|
|
|
+ if (of_have_populated_dt())
|
|
|
+ has_full_constraints = true;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We punt completion for an arbitrary amount of time since
|
|
|
+ * systems like distros will load many drivers from userspace
|
|
|
+ * so consumers might not always be ready yet, this is
|
|
|
+ * particularly an issue with laptops where this might bounce
|
|
|
+ * the display off then on. Ideally we'd get a notification
|
|
|
+ * from userspace when this happens but we don't so just wait
|
|
|
+ * a bit and hope we waited long enough. It'd be better if
|
|
|
+ * we'd only do this on systems that need it, and a kernel
|
|
|
+ * command line option might be useful.
|
|
|
+ */
|
|
|
+ schedule_delayed_work(®ulator_init_complete_work,
|
|
|
+ msecs_to_jiffies(30000));
|
|
|
|
|
|
class_for_each_device(®ulator_class, NULL, NULL,
|
|
|
regulator_register_fill_coupling_array);
|