Commit 9a8f5e07 authored by Mark Brown's avatar Mark Brown

regulator: Allow regulators to register with no init_data

This allows read-only access to the device configuration which may be
useful for diagnostics.
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarLiam Girdwood <lrg@ti.com>
parent 979268cd
...@@ -912,8 +912,12 @@ static int set_machine_constraints(struct regulator_dev *rdev, ...@@ -912,8 +912,12 @@ static int set_machine_constraints(struct regulator_dev *rdev,
int ret = 0; int ret = 0;
struct regulator_ops *ops = rdev->desc->ops; struct regulator_ops *ops = rdev->desc->ops;
rdev->constraints = kmemdup(constraints, sizeof(*constraints), if (constraints)
GFP_KERNEL); rdev->constraints = kmemdup(constraints, sizeof(*constraints),
GFP_KERNEL);
else
rdev->constraints = kzalloc(sizeof(*constraints),
GFP_KERNEL);
if (!rdev->constraints) if (!rdev->constraints)
return -ENOMEM; return -ENOMEM;
...@@ -922,7 +926,7 @@ static int set_machine_constraints(struct regulator_dev *rdev, ...@@ -922,7 +926,7 @@ static int set_machine_constraints(struct regulator_dev *rdev,
goto out; goto out;
/* do we need to setup our suspend state */ /* do we need to setup our suspend state */
if (constraints->initial_state) { if (rdev->constraints->initial_state) {
ret = suspend_prepare(rdev, rdev->constraints->initial_state); ret = suspend_prepare(rdev, rdev->constraints->initial_state);
if (ret < 0) { if (ret < 0) {
rdev_err(rdev, "failed to set suspend state\n"); rdev_err(rdev, "failed to set suspend state\n");
...@@ -930,7 +934,7 @@ static int set_machine_constraints(struct regulator_dev *rdev, ...@@ -930,7 +934,7 @@ static int set_machine_constraints(struct regulator_dev *rdev,
} }
} }
if (constraints->initial_mode) { if (rdev->constraints->initial_mode) {
if (!ops->set_mode) { if (!ops->set_mode) {
rdev_err(rdev, "no set_mode operation\n"); rdev_err(rdev, "no set_mode operation\n");
ret = -EINVAL; ret = -EINVAL;
...@@ -2697,6 +2701,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, ...@@ -2697,6 +2701,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
struct device *dev, const struct regulator_init_data *init_data, struct device *dev, const struct regulator_init_data *init_data,
void *driver_data, struct device_node *of_node) void *driver_data, struct device_node *of_node)
{ {
const struct regulation_constraints *constraints = NULL;
static atomic_t regulator_no = ATOMIC_INIT(0); static atomic_t regulator_no = ATOMIC_INIT(0);
struct regulator_dev *rdev; struct regulator_dev *rdev;
int ret, i; int ret, i;
...@@ -2712,9 +2717,6 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, ...@@ -2712,9 +2717,6 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
regulator_desc->type != REGULATOR_CURRENT) regulator_desc->type != REGULATOR_CURRENT)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
if (!init_data)
return ERR_PTR(-EINVAL);
/* Only one of each should be implemented */ /* Only one of each should be implemented */
WARN_ON(regulator_desc->ops->get_voltage && WARN_ON(regulator_desc->ops->get_voltage &&
regulator_desc->ops->get_voltage_sel); regulator_desc->ops->get_voltage_sel);
...@@ -2747,7 +2749,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, ...@@ -2747,7 +2749,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
INIT_DELAYED_WORK(&rdev->disable_work, regulator_disable_work); INIT_DELAYED_WORK(&rdev->disable_work, regulator_disable_work);
/* preform any regulator specific init */ /* preform any regulator specific init */
if (init_data->regulator_init) { if (init_data && init_data->regulator_init) {
ret = init_data->regulator_init(rdev->reg_data); ret = init_data->regulator_init(rdev->reg_data);
if (ret < 0) if (ret < 0)
goto clean; goto clean;
...@@ -2768,7 +2770,10 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, ...@@ -2768,7 +2770,10 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
dev_set_drvdata(&rdev->dev, rdev); dev_set_drvdata(&rdev->dev, rdev);
/* set regulator constraints */ /* set regulator constraints */
ret = set_machine_constraints(rdev, &init_data->constraints); if (init_data)
constraints = &init_data->constraints;
ret = set_machine_constraints(rdev, constraints);
if (ret < 0) if (ret < 0)
goto scrub; goto scrub;
...@@ -2777,7 +2782,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, ...@@ -2777,7 +2782,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
if (ret < 0) if (ret < 0)
goto scrub; goto scrub;
if (init_data->supply_regulator) if (init_data && init_data->supply_regulator)
supply = init_data->supply_regulator; supply = init_data->supply_regulator;
else if (regulator_desc->supply_name) else if (regulator_desc->supply_name)
supply = regulator_desc->supply_name; supply = regulator_desc->supply_name;
...@@ -2799,15 +2804,17 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, ...@@ -2799,15 +2804,17 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
} }
/* add consumers devices */ /* add consumers devices */
for (i = 0; i < init_data->num_consumer_supplies; i++) { if (init_data) {
ret = set_consumer_device_supply(rdev, for (i = 0; i < init_data->num_consumer_supplies; i++) {
init_data->consumer_supplies[i].dev, ret = set_consumer_device_supply(rdev,
init_data->consumer_supplies[i].dev_name, init_data->consumer_supplies[i].dev,
init_data->consumer_supplies[i].supply); init_data->consumer_supplies[i].dev_name,
if (ret < 0) {
dev_err(dev, "Failed to set supply %s\n",
init_data->consumer_supplies[i].supply); init_data->consumer_supplies[i].supply);
goto unset_supplies; if (ret < 0) {
dev_err(dev, "Failed to set supply %s\n",
init_data->consumer_supplies[i].supply);
goto unset_supplies;
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment