]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
regulator: check that dummy regulator has been probed before using it
authorChristian Eggers <ceggers@arri.de>
Thu, 13 Mar 2025 10:27:39 +0000 (11:27 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 28 Mar 2025 20:59:54 +0000 (21:59 +0100)
commit 2c7a50bec4958f1d1c84d19cde518d0e96a676fd upstream.

Due to asynchronous driver probing there is a chance that the dummy
regulator hasn't already been probed when first accessing it.

Cc: stable@vger.kernel.org
Signed-off-by: Christian Eggers <ceggers@arri.de>
Link: https://patch.msgid.link/20250313103051.32430-3-ceggers@arri.de
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/regulator/core.c

index 352131d2df4cade5eb09b59fe6c3d7b700c9e6f5..d2e21dc61dd7d548fb1d7a31e25726e99d528225 100644 (file)
@@ -2084,6 +2084,10 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 
                if (have_full_constraints()) {
                        r = dummy_regulator_rdev;
+                       if (!r) {
+                               ret = -EPROBE_DEFER;
+                               goto out;
+                       }
                        get_device(&r->dev);
                } else {
                        dev_err(dev, "Failed to resolve %s-supply for %s\n",
@@ -2101,6 +2105,10 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
                        goto out;
                }
                r = dummy_regulator_rdev;
+               if (!r) {
+                       ret = -EPROBE_DEFER;
+                       goto out;
+               }
                get_device(&r->dev);
        }
 
@@ -2209,8 +2217,10 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
                         * enabled, even if it isn't hooked up, and just
                         * provide a dummy.
                         */
-                       dev_warn(dev, "supply %s not found, using dummy regulator\n", id);
                        rdev = dummy_regulator_rdev;
+                       if (!rdev)
+                               return ERR_PTR(-EPROBE_DEFER);
+                       dev_warn(dev, "supply %s not found, using dummy regulator\n", id);
                        get_device(&rdev->dev);
                        break;