Skip to content

Commit

Permalink
Merge branch 'topic/of' of git://git.kernel.org/pub/scm/linux/kernel/…
Browse files Browse the repository at this point in the history
…git/broonie/regulator into regulator-tps65217
  • Loading branch information
Mark Brown committed Sep 10, 2014
2 parents c2542d2 + a0c7b16 commit dc1e0b1
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 3 deletions.
10 changes: 7 additions & 3 deletions drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3516,12 +3516,17 @@ regulator_register(const struct regulator_desc *regulator_desc,
return ERR_PTR(-EINVAL);
}

init_data = config->init_data;

rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL);
if (rdev == NULL)
return ERR_PTR(-ENOMEM);

init_data = regulator_of_get_init_data(dev, regulator_desc,
&rdev->dev.of_node);
if (!init_data) {
init_data = config->init_data;
rdev->dev.of_node = of_node_get(config->of_node);
}

mutex_lock(&regulator_list_mutex);

mutex_init(&rdev->mutex);
Expand All @@ -3548,7 +3553,6 @@ regulator_register(const struct regulator_desc *regulator_desc,

/* register with sysfs */
rdev->dev.class = &regulator_class;
rdev->dev.of_node = of_node_get(config->of_node);
rdev->dev.parent = dev;
dev_set_name(&rdev->dev, "regulator.%d",
atomic_inc_return(&regulator_no) - 1);
Expand Down
4 changes: 4 additions & 0 deletions drivers/regulator/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ struct regulator {
struct dentry *debugfs;
};

struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
const struct regulator_desc *desc,
struct device_node **node);

#endif
51 changes: 51 additions & 0 deletions drivers/regulator/of_regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/of_regulator.h>

#include "internal.h"

static void of_get_regulation_constraints(struct device_node *np,
struct regulator_init_data **init_data)
{
Expand Down Expand Up @@ -189,3 +192,51 @@ int of_regulator_match(struct device *dev, struct device_node *node,
return count;
}
EXPORT_SYMBOL_GPL(of_regulator_match);

struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
const struct regulator_desc *desc,
struct device_node **node)
{
struct device_node *search, *child;
struct regulator_init_data *init_data = NULL;
const char *name;

if (!dev->of_node || !desc->of_match)
return NULL;

if (desc->regulators_node)
search = of_get_child_by_name(dev->of_node,
desc->regulators_node);
else
search = dev->of_node;

if (!search) {
dev_err(dev, "Failed to find regulator container node\n");
return NULL;
}

for_each_child_of_node(search, child) {
name = of_get_property(child, "regulator-compatible", NULL);
if (!name)
name = child->name;

if (strcmp(desc->of_match, name))
continue;

init_data = of_get_regulator_init_data(dev, child);
if (!init_data) {
dev_err(dev,
"failed to parse DT for regulator %s\n",
child->name);
break;
}

of_node_get(child);
*node = child;
break;
}

of_node_put(search);

return init_data;
}
4 changes: 4 additions & 0 deletions include/linux/regulator/driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ enum regulator_type {
*
* @name: Identifying name for the regulator.
* @supply_name: Identifying the regulator supply
* @of_match: Name used to identify regulator in DT.
* @regulators_node: Name of node containing regulator definitions in DT.
* @id: Numerical identifier for the regulator.
* @ops: Regulator operations table.
* @irq: Interrupt number for the regulator.
Expand Down Expand Up @@ -242,6 +244,8 @@ enum regulator_type {
struct regulator_desc {
const char *name;
const char *supply_name;
const char *of_match;
const char *regulators_node;
int id;
bool continuous_voltage_range;
unsigned n_voltages;
Expand Down

0 comments on commit dc1e0b1

Please sign in to comment.