Takashi Iwai bb8104
From aea6cb99703e17019e025aa71643b4d3e0a24413 Mon Sep 17 00:00:00 2001
Takashi Iwai bb8104
From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= <mirq-linux@rere.qmqm.pl>
Takashi Iwai bb8104
Date: Sat, 26 Sep 2020 23:32:41 +0200
Takashi Iwai bb8104
Subject: [PATCH] regulator: resolve supply after creating regulator
Takashi Iwai bb8104
Mime-version: 1.0
Takashi Iwai bb8104
Content-type: text/plain; charset=UTF-8
Takashi Iwai bb8104
Content-transfer-encoding: 8bit
Takashi Iwai bb8104
Git-commit: aea6cb99703e17019e025aa71643b4d3e0a24413
Takashi Iwai bb8104
Patch-mainline: v5.10-rc1
Takashi Iwai bb8104
References: git-fixes
Takashi Iwai bb8104
Takashi Iwai bb8104
When creating a new regulator its supply cannot create the sysfs link
Takashi Iwai bb8104
because the device is not yet published. Remove early supply resolving
Takashi Iwai bb8104
since it will be done later anyway. This makes the following error
Takashi Iwai bb8104
disappear and the symlinks get created instead.
Takashi Iwai bb8104
Takashi Iwai bb8104
  DCDC_REG1: supplied by VSYS
Takashi Iwai bb8104
  VSYS: could not add device link regulator.3 err -2
Takashi Iwai bb8104
Takashi Iwai bb8104
Note: It doesn't fix the problem for bypassed regulators, though.
Takashi Iwai bb8104
Takashi Iwai bb8104
Fixes: 45389c47526d ("regulator: core: Add early supply resolution for regulators")
Takashi Iwai bb8104
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Takashi Iwai bb8104
Link: https://lore.kernel.org/r/ba09e0a8617ffeeb25cb4affffe6f3149319cef8.1601155770.git.mirq-linux@rere.qmqm.pl
Takashi Iwai bb8104
Signed-off-by: Mark Brown <broonie@kernel.org>
Takashi Iwai bb8104
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai bb8104
Takashi Iwai bb8104
---
Takashi Iwai bb8104
 drivers/regulator/core.c | 21 +++++++++++++--------
Takashi Iwai bb8104
 1 file changed, 13 insertions(+), 8 deletions(-)
Takashi Iwai bb8104
Takashi Iwai bb8104
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
Takashi Iwai bb8104
index ff8e99ca0306..9f704a6c4802 100644
Takashi Iwai bb8104
--- a/drivers/regulator/core.c
Takashi Iwai bb8104
+++ b/drivers/regulator/core.c
Takashi Iwai bb8104
@@ -5280,15 +5280,20 @@ regulator_register(const struct regulator_desc *regulator_desc,
Takashi Iwai bb8104
 	else if (regulator_desc->supply_name)
Takashi Iwai bb8104
 		rdev->supply_name = regulator_desc->supply_name;
Takashi Iwai bb8104
 
Takashi Iwai bb8104
-	/*
Takashi Iwai bb8104
-	 * Attempt to resolve the regulator supply, if specified,
Takashi Iwai bb8104
-	 * but don't return an error if we fail because we will try
Takashi Iwai bb8104
-	 * to resolve it again later as more regulators are added.
Takashi Iwai bb8104
-	 */
Takashi Iwai bb8104
-	if (regulator_resolve_supply(rdev))
Takashi Iwai bb8104
-		rdev_dbg(rdev, "unable to resolve supply\n");
Takashi Iwai bb8104
-
Takashi Iwai bb8104
 	ret = set_machine_constraints(rdev, constraints);
Takashi Iwai bb8104
+	if (ret == -EPROBE_DEFER) {
Takashi Iwai bb8104
+		/* Regulator might be in bypass mode and so needs its supply
Takashi Iwai bb8104
+		 * to set the constraints */
Takashi Iwai bb8104
+		/* FIXME: this currently triggers a chicken-and-egg problem
Takashi Iwai bb8104
+		 * when creating -SUPPLY symlink in sysfs to a regulator
Takashi Iwai bb8104
+		 * that is just being created */
Takashi Iwai bb8104
+		ret = regulator_resolve_supply(rdev);
Takashi Iwai bb8104
+		if (!ret)
Takashi Iwai bb8104
+			ret = set_machine_constraints(rdev, constraints);
Takashi Iwai bb8104
+		else
Takashi Iwai bb8104
+			rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
Takashi Iwai bb8104
+				 ERR_PTR(ret));
Takashi Iwai bb8104
+	}
Takashi Iwai bb8104
 	if (ret < 0)
Takashi Iwai bb8104
 		goto wash;
Takashi Iwai bb8104
 
Takashi Iwai bb8104
-- 
Takashi Iwai bb8104
2.16.4
Takashi Iwai bb8104