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: Marco Felsch <m.felsch@pengutronix.de> Link: https://lore.kernel.org/r/20190917154021.14693-4-m.felsch@pengutronix.de Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
131cb1210d
commit
f8970d341e
@ -5053,6 +5053,19 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
|||||||
|
|
||||||
init_data = regulator_of_get_init_data(dev, regulator_desc, config,
|
init_data = regulator_of_get_init_data(dev, regulator_desc, config,
|
||||||
&rdev->dev.of_node);
|
&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
|
* 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
|
* device tree until we have handled it over to the core. If the
|
||||||
|
@ -445,11 +445,20 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desc->of_parse_cb && desc->of_parse_cb(child, desc, config)) {
|
if (desc->of_parse_cb) {
|
||||||
dev_err(dev,
|
int ret;
|
||||||
"driver callback failed to parse DT for regulator %pOFn\n",
|
|
||||||
child);
|
ret = desc->of_parse_cb(child, desc, config);
|
||||||
goto error;
|
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;
|
*node = child;
|
||||||
|
Loading…
Reference in New Issue
Block a user