Revert "regulator: Defer init completion for a while after late_initcall"
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Dec 2019 14:10:24 +0000 (15:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Dec 2019 09:42:28 +0000 (10:42 +0100)
This reverts commit 8b8c8d69b1a31004517d4c71a490f47bdf3405a2 which is
commit 55576cf1853798e86f620766e23b604c9224c19c upstream.

It's causing "odd" interactions with older kernels, so it probably isn't
a good idea to cause timing changes there.  This has been reported to
cause oopses on Pixel devices.

Reported-by: Siddharth Kapoor <ksiddharth@google.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/regulator/core.c

index 47e6c8a..18d57c0 100644 (file)
@@ -4452,7 +4452,7 @@ static int __init regulator_init(void)
 /* init early to allow our consumers to complete system booting */
 core_initcall(regulator_init);
 
-static int regulator_late_cleanup(struct device *dev, void *data)
+static int __init regulator_late_cleanup(struct device *dev, void *data)
 {
        struct regulator_dev *rdev = dev_to_rdev(dev);
        const struct regulator_ops *ops = rdev->desc->ops;
@@ -4501,9 +4501,18 @@ unlock:
        return 0;
 }
 
-static void regulator_init_complete_work_function(struct work_struct *work)
+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;
+
+       /*
         * Regulators may had failed to resolve their input supplies
         * when were registered, either because the input supply was
         * not registered yet or because its parent device was not
@@ -4520,35 +4529,6 @@ static void regulator_init_complete_work_function(struct work_struct *work)
         */
        class_for_each_device(&regulator_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(&regulator_init_complete_work,
-                             msecs_to_jiffies(30000));
 
        return 0;
 }