Skip to content

Commit

Permalink
regulator: core: Move registration of regulator device
Browse files Browse the repository at this point in the history
The public functions to acquire a regulator, such as regulator_get(),
internally look-up the regulator from the list of regulators that have
been registered with the regulator device class. The registration of
a new regulator with the regulator device class happens before the
regulator has been completely setup. Therefore, it is possible that
the regulator could be acquired before it has been setup successfully.
To avoid this move the device registration of the regulator to the end
of the regulator setup and update the error exit path accordingly.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Jon Hunter authored and Mark Brown committed Apr 22, 2016
1 parent f89ba33 commit c438b9d
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3970,14 +3970,6 @@ regulator_register(const struct regulator_desc *regulator_desc,
if (ret < 0)
goto wash;

ret = device_register(&rdev->dev);
if (ret != 0) {
put_device(&rdev->dev);
goto wash;
}

dev_set_drvdata(&rdev->dev, rdev);

if (init_data && init_data->supply_regulator)
rdev->supply_name = init_data->supply_regulator;
else if (regulator_desc->supply_name)
Expand All @@ -3997,9 +3989,17 @@ regulator_register(const struct regulator_desc *regulator_desc,
}
}

rdev_init_debugfs(rdev);
mutex_unlock(&regulator_list_mutex);

ret = device_register(&rdev->dev);
if (ret != 0) {
put_device(&rdev->dev);
goto unset_supplies;
}

dev_set_drvdata(&rdev->dev, rdev);
rdev_init_debugfs(rdev);

/* try to resolve regulators supply since a new one was registered */
class_for_each_device(&regulator_class, NULL, NULL,
regulator_register_resolve_supply);
Expand All @@ -4008,17 +4008,11 @@ regulator_register(const struct regulator_desc *regulator_desc,

unset_supplies:
unset_regulator_supplies(rdev);
regulator_ena_gpio_free(rdev);
device_unregister(&rdev->dev);
/* device core frees rdev */
goto out;

wash:
kfree(rdev->constraints);
regulator_ena_gpio_free(rdev);
clean:
kfree(rdev);
out:
mutex_unlock(&regulator_list_mutex);
kfree(config);
return ERR_PTR(ret);
Expand Down

0 comments on commit c438b9d

Please sign in to comment.