diff options
author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2015-01-05 12:48:41 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-01-08 20:15:44 +0000 |
commit | 1b3de223385d6bf2ab9bf2e9e80aebb26fedd426 (patch) | |
tree | df211408227bee0a34a932cfe9bc4263141d8174 /drivers/regulator | |
parent | 97bf6af1f928216fd6c5a66e8a57bfa95a659672 (diff) | |
download | linux-stable-1b3de223385d6bf2ab9bf2e9e80aebb26fedd426.tar.gz linux-stable-1b3de223385d6bf2ab9bf2e9e80aebb26fedd426.tar.bz2 linux-stable-1b3de223385d6bf2ab9bf2e9e80aebb26fedd426.zip |
regulator: Copy config passed during registration
Copy the 'regulator_config' structure passed to regulator_register()
function so the driver could safely modify it after parsing init data.
The driver may want to change the config as a result of specific init
data parsed by regulator core (e.g. when core handled parsing device
tree).
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/regulator')
-rw-r--r-- | drivers/regulator/core.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e225711bb8bc..c13b557a560e 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -3581,20 +3581,21 @@ static void rdev_init_debugfs(struct regulator_dev *rdev) */ struct regulator_dev * regulator_register(const struct regulator_desc *regulator_desc, - const struct regulator_config *config) + const struct regulator_config *cfg) { const struct regulation_constraints *constraints = NULL; const struct regulator_init_data *init_data; + struct regulator_config *config = NULL; static atomic_t regulator_no = ATOMIC_INIT(0); struct regulator_dev *rdev; struct device *dev; int ret, i; const char *supply = NULL; - if (regulator_desc == NULL || config == NULL) + if (regulator_desc == NULL || cfg == NULL) return ERR_PTR(-EINVAL); - dev = config->dev; + dev = cfg->dev; WARN_ON(!dev); if (regulator_desc->name == NULL || regulator_desc->ops == NULL) @@ -3624,6 +3625,16 @@ regulator_register(const struct regulator_desc *regulator_desc, if (rdev == NULL) return ERR_PTR(-ENOMEM); + /* + * Duplicate the config so the driver could override it after + * parsing init data. + */ + config = kmemdup(cfg, sizeof(*cfg), GFP_KERNEL); + if (config == NULL) { + kfree(rdev); + return ERR_PTR(-ENOMEM); + } + init_data = regulator_of_get_init_data(dev, regulator_desc, &rdev->dev.of_node); if (!init_data) { @@ -3752,6 +3763,7 @@ add_dev: rdev_init_debugfs(rdev); out: mutex_unlock(®ulator_list_mutex); + kfree(config); return rdev; unset_supplies: |