Skip to content

Commit

Permalink
regulator: core: let dt properties override driver init_data
Browse files Browse the repository at this point in the history
This reverts commit cd7a38c.

When submitting the change above, it was thought that the origin of the
init_data should be a clear choice, from the driver or from DT but not
both.

It turns out some devices, such as qcom-msm8974-lge-nexus5-hammerhead,
relied on the old behaviour to override the init_data provided by the
driver, making it some kind of default if none is provided by the platform.

Using the init_data provided by the driver when it is present broke these
devices so revert the change to fixup the situation and add a comment
to make things a bit more clear

Reported-by: Luca Weiss <[email protected]>
Closes: https://lore.kernel.org/lkml/[email protected]
Fixes: cd7a38c ("regulator: core: do not silently ignore provided init_data")
Signed-off-by: Jerome Brunet <[email protected]>
Link: https://patch.msgid.link/20250211-regulator-init-data-fixup-v1-1-5ce1c6cff990@baylibre.com
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
jbrun3t authored and broonie committed Feb 11, 2025
1 parent b0eddc2 commit 35e21de
Showing 1 changed file with 27 additions and 34 deletions.
61 changes: 27 additions & 34 deletions drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -5774,43 +5774,36 @@ regulator_register(struct device *dev,
goto clean;
}

if (config->init_data) {
/*
* Providing of_match means the framework is expected to parse
* DT to get the init_data. This would conflict with provided
* init_data, if set. Warn if it happens.
*/
if (regulator_desc->of_match)
dev_warn(dev, "Using provided init data - OF match ignored\n");
/*
* DT may override the config->init_data provided if the platform
* needs to do so. If so, config->init_data is completely ignored.
*/
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) {
ret = -EPROBE_DEFER;
goto clean;
}

/*
* 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
* config that was passed in to this function DOES NOT contain
* a descriptor, and the config after this call DOES contain
* a descriptor, we definitely got one from parsing the device
* tree.
*/
if (!cfg->ena_gpiod && config->ena_gpiod)
dangling_of_gpiod = true;
if (!init_data) {
init_data = config->init_data;
rdev->dev.of_node = of_node_get(config->of_node);

} else {
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) {
ret = -EPROBE_DEFER;
goto clean;
}

/*
* 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
* config that was passed in to this function DOES NOT contain a
* descriptor, and the config after this call DOES contain a
* descriptor, we definitely got one from parsing the device
* tree.
*/
if (!cfg->ena_gpiod && config->ena_gpiod)
dangling_of_gpiod = true;
}

ww_mutex_init(&rdev->mutex, &regulator_ww_class);
Expand Down

0 comments on commit 35e21de

Please sign in to comment.