Unverified Commit f8970d34 authored by Marco Felsch's avatar Marco Felsch Committed by Mark Brown
Browse files

regulator: core: make regulator_register() EPROBE_DEFER aware



Sometimes it can happen that the regulator_of_get_init_data() can't
retrieve the config due to a not probed device the regulator depends on.
Fix that by checking the return value of of_parse_cb() and return
EPROBE_DEFER in such cases.

Signed-off-by: default avatarMarco Felsch <m.felsch@pengutronix.de>
Link: https://lore.kernel.org/r/20190917154021.14693-4-m.felsch@pengutronix.de


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 131cb121
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -5053,6 +5053,19 @@ regulator_register(const struct regulator_desc *regulator_desc,

	init_data = regulator_of_get_init_data(dev, regulator_desc, config,
					       &rdev->dev.of_node);

	/*
	 * Sometimes not all resources are probed already so we need to take
	 * that into account. This happens most the time if the ena_gpiod comes
	 * from a gpio extender or something else.
	 */
	if (PTR_ERR(init_data) == -EPROBE_DEFER) {
		kfree(config);
		kfree(rdev);
		ret = -EPROBE_DEFER;
		goto rinse;
	}

	/*
	 * We need to keep track of any GPIO descriptor coming from the
	 * device tree until we have handled it over to the core. If the
+14 −5
Original line number Diff line number Diff line
@@ -445,12 +445,21 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
		goto error;
	}

	if (desc->of_parse_cb && desc->of_parse_cb(child, desc, config)) {
	if (desc->of_parse_cb) {
		int ret;

		ret = desc->of_parse_cb(child, desc, config);
		if (ret) {
			if (ret == -EPROBE_DEFER) {
				of_node_put(child);
				return ERR_PTR(-EPROBE_DEFER);
			}
			dev_err(dev,
				"driver callback failed to parse DT for regulator %pOFn\n",
				child);
			goto error;
		}
	}

	*node = child;