Merge remote-tracking branch 'regulator/topic/dt' into regulator-next
This commit is contained in:
commit
924ee2c962
@ -0,0 +1,29 @@
|
||||
Fixed Voltage regulators
|
||||
|
||||
Required properties:
|
||||
- compatible: Must be "regulator-fixed";
|
||||
|
||||
Optional properties:
|
||||
- gpio: gpio to use for enable control
|
||||
- startup-delay-us: startup time in microseconds
|
||||
- enable-active-high: Polarity of GPIO is Active high
|
||||
If this property is missing, the default assumed is Active low.
|
||||
|
||||
Any property defined as part of the core regulator
|
||||
binding, defined in regulator.txt, can also be used.
|
||||
However a fixed voltage regulator is expected to have the
|
||||
regulator-min-microvolt and regulator-max-microvolt
|
||||
to be the same.
|
||||
|
||||
Example:
|
||||
|
||||
abc: fixedregulator@0 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-supply";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
gpio = <&gpio1 16 0>;
|
||||
startup-delay-us = <70000>;
|
||||
enable-active-high;
|
||||
regulator-boot-on
|
||||
};
|
54
Documentation/devicetree/bindings/regulator/regulator.txt
Normal file
54
Documentation/devicetree/bindings/regulator/regulator.txt
Normal file
@ -0,0 +1,54 @@
|
||||
Voltage/Current Regulators
|
||||
|
||||
Optional properties:
|
||||
- regulator-name: A string used as a descriptive name for regulator outputs
|
||||
- regulator-min-microvolt: smallest voltage consumers may set
|
||||
- regulator-max-microvolt: largest voltage consumers may set
|
||||
- regulator-microvolt-offset: Offset applied to voltages to compensate for voltage drops
|
||||
- regulator-min-microamp: smallest current consumers may set
|
||||
- regulator-max-microamp: largest current consumers may set
|
||||
- regulator-always-on: boolean, regulator should never be disabled
|
||||
- regulator-boot-on: bootloader/firmware enabled regulator
|
||||
- <name>-supply: phandle to the parent supply/regulator node
|
||||
|
||||
Example:
|
||||
|
||||
xyzreg: regulator@0 {
|
||||
regulator-min-microvolt = <1000000>;
|
||||
regulator-max-microvolt = <2500000>;
|
||||
regulator-always-on;
|
||||
vin-supply = <&vin>;
|
||||
};
|
||||
|
||||
Regulator Consumers:
|
||||
Consumer nodes can reference one or more of its supplies/
|
||||
regulators using the below bindings.
|
||||
|
||||
- <name>-supply: phandle to the regulator node
|
||||
|
||||
These are the same bindings that a regulator in the above
|
||||
example used to reference its own supply, in which case
|
||||
its just seen as a special case of a regulator being a
|
||||
consumer itself.
|
||||
|
||||
Example of a consumer device node (mmc) referencing two
|
||||
regulators (twl-reg1 and twl-reg2),
|
||||
|
||||
twl-reg1: regulator@0 {
|
||||
...
|
||||
...
|
||||
...
|
||||
};
|
||||
|
||||
twl-reg2: regulator@1 {
|
||||
...
|
||||
...
|
||||
...
|
||||
};
|
||||
|
||||
mmc: mmc@0x0 {
|
||||
...
|
||||
...
|
||||
vmmc-supply = <&twl-reg1>;
|
||||
vmmcaux-supply = <&twl-reg2>;
|
||||
};
|
@ -427,7 +427,7 @@ static int __devinit pm8607_regulator_probe(struct platform_device *pdev)
|
||||
|
||||
/* replace driver_data with info */
|
||||
info->regulator = regulator_register(&info->desc, &pdev->dev,
|
||||
pdata, info);
|
||||
pdata, info, NULL);
|
||||
if (IS_ERR(info->regulator)) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
info->desc.name);
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
|
||||
obj-$(CONFIG_REGULATOR) += core.o dummy.o
|
||||
obj-$(CONFIG_OF) += of_regulator.o
|
||||
obj-$(CONFIG_REGULATOR_FIXED_VOLTAGE) += fixed.o
|
||||
obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o
|
||||
obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
|
||||
|
@ -188,7 +188,7 @@ static int aat2870_regulator_probe(struct platform_device *pdev)
|
||||
ri->pdev = pdev;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &pdev->dev,
|
||||
pdev->dev.platform_data, ri);
|
||||
pdev->dev.platform_data, ri, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "Failed to register regulator %s\n",
|
||||
ri->desc.name);
|
||||
|
@ -634,7 +634,7 @@ static int __devinit ab3100_regulators_probe(struct platform_device *pdev)
|
||||
rdev = regulator_register(&ab3100_regulator_desc[i],
|
||||
&pdev->dev,
|
||||
&plfdata->reg_constraints[i],
|
||||
reg);
|
||||
reg, NULL);
|
||||
|
||||
if (IS_ERR(rdev)) {
|
||||
err = PTR_ERR(rdev);
|
||||
|
@ -822,7 +822,7 @@ static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
||||
|
||||
/* register regulator with framework */
|
||||
info->regulator = regulator_register(&info->desc, &pdev->dev,
|
||||
&pdata->regulator[i], info);
|
||||
&pdata->regulator[i], info, NULL);
|
||||
if (IS_ERR(info->regulator)) {
|
||||
err = PTR_ERR(info->regulator);
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
|
@ -233,7 +233,7 @@ static int __devinit ad5398_probe(struct i2c_client *client,
|
||||
chip->current_mask = (chip->current_level - 1) << chip->current_offset;
|
||||
|
||||
chip->rdev = regulator_register(&ad5398_reg, &client->dev,
|
||||
init_data, chip);
|
||||
init_data, chip, NULL);
|
||||
if (IS_ERR(chip->rdev)) {
|
||||
ret = PTR_ERR(chip->rdev);
|
||||
dev_err(&client->dev, "failed to register %s %s\n",
|
||||
|
@ -107,7 +107,7 @@ static int __init bq24022_probe(struct platform_device *pdev)
|
||||
ret = gpio_direction_output(pdata->gpio_nce, 1);
|
||||
|
||||
bq24022 = regulator_register(&bq24022_desc, &pdev->dev,
|
||||
pdata->init_data, pdata);
|
||||
pdata->init_data, pdata, NULL);
|
||||
if (IS_ERR(bq24022)) {
|
||||
dev_dbg(&pdev->dev, "couldn't register regulator\n");
|
||||
ret = PTR_ERR(bq24022);
|
||||
|
@ -25,6 +25,8 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regulator/of_regulator.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
@ -132,6 +134,33 @@ static struct regulator *get_device_regulator(struct device *dev)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_get_regulator - get a regulator device node based on supply name
|
||||
* @dev: Device pointer for the consumer (of regulator) device
|
||||
* @supply: regulator supply name
|
||||
*
|
||||
* Extract the regulator device node corresponding to the supply name.
|
||||
* retruns the device node corresponding to the regulator if found, else
|
||||
* returns NULL.
|
||||
*/
|
||||
static struct device_node *of_get_regulator(struct device *dev, const char *supply)
|
||||
{
|
||||
struct device_node *regnode = NULL;
|
||||
char prop_name[32]; /* 32 is max size of property name */
|
||||
|
||||
dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
|
||||
|
||||
snprintf(prop_name, 32, "%s-supply", supply);
|
||||
regnode = of_parse_phandle(dev->of_node, prop_name, 0);
|
||||
|
||||
if (!regnode) {
|
||||
dev_warn(dev, "%s property in node %s references invalid phandle",
|
||||
prop_name, dev->of_node->full_name);
|
||||
return NULL;
|
||||
}
|
||||
return regnode;
|
||||
}
|
||||
|
||||
/* Platform voltage constraint check */
|
||||
static int regulator_check_voltage(struct regulator_dev *rdev,
|
||||
int *min_uV, int *max_uV)
|
||||
@ -1148,6 +1177,30 @@ static int _regulator_get_enable_time(struct regulator_dev *rdev)
|
||||
return rdev->desc->ops->enable_time(rdev);
|
||||
}
|
||||
|
||||
static struct regulator_dev *regulator_dev_lookup(struct device *dev,
|
||||
const char *supply)
|
||||
{
|
||||
struct regulator_dev *r;
|
||||
struct device_node *node;
|
||||
|
||||
/* first do a dt based lookup */
|
||||
if (dev && dev->of_node) {
|
||||
node = of_get_regulator(dev, supply);
|
||||
if (node)
|
||||
list_for_each_entry(r, ®ulator_list, list)
|
||||
if (r->dev.parent &&
|
||||
node == r->dev.of_node)
|
||||
return r;
|
||||
}
|
||||
|
||||
/* if not found, try doing it non-dt way */
|
||||
list_for_each_entry(r, ®ulator_list, list)
|
||||
if (strcmp(rdev_get_name(r), supply) == 0)
|
||||
return r;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Internal regulator request function */
|
||||
static struct regulator *_regulator_get(struct device *dev, const char *id,
|
||||
int exclusive)
|
||||
@ -1168,6 +1221,10 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
|
||||
|
||||
mutex_lock(®ulator_list_mutex);
|
||||
|
||||
rdev = regulator_dev_lookup(dev, id);
|
||||
if (rdev)
|
||||
goto found;
|
||||
|
||||
list_for_each_entry(map, ®ulator_map_list, list) {
|
||||
/* If the mapping has a device set up it must match */
|
||||
if (map->dev_name &&
|
||||
@ -2638,11 +2695,12 @@ static void rdev_init_debugfs(struct regulator_dev *rdev)
|
||||
*/
|
||||
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||
struct device *dev, const struct regulator_init_data *init_data,
|
||||
void *driver_data)
|
||||
void *driver_data, struct device_node *of_node)
|
||||
{
|
||||
static atomic_t regulator_no = ATOMIC_INIT(0);
|
||||
struct regulator_dev *rdev;
|
||||
int ret, i;
|
||||
const char *supply = NULL;
|
||||
|
||||
if (regulator_desc == NULL)
|
||||
return ERR_PTR(-EINVAL);
|
||||
@ -2697,6 +2755,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||
|
||||
/* register with sysfs */
|
||||
rdev->dev.class = ®ulator_class;
|
||||
rdev->dev.of_node = of_node;
|
||||
rdev->dev.parent = dev;
|
||||
dev_set_name(&rdev->dev, "regulator.%d",
|
||||
atomic_inc_return(®ulator_no) - 1);
|
||||
@ -2718,21 +2777,18 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||
if (ret < 0)
|
||||
goto scrub;
|
||||
|
||||
if (init_data->supply_regulator) {
|
||||
if (init_data->supply_regulator)
|
||||
supply = init_data->supply_regulator;
|
||||
else if (regulator_desc->supply_name)
|
||||
supply = regulator_desc->supply_name;
|
||||
|
||||
if (supply) {
|
||||
struct regulator_dev *r;
|
||||
int found = 0;
|
||||
|
||||
list_for_each_entry(r, ®ulator_list, list) {
|
||||
if (strcmp(rdev_get_name(r),
|
||||
init_data->supply_regulator) == 0) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
r = regulator_dev_lookup(dev, supply);
|
||||
|
||||
if (!found) {
|
||||
dev_err(dev, "Failed to find supply %s\n",
|
||||
init_data->supply_regulator);
|
||||
if (!r) {
|
||||
dev_err(dev, "Failed to find supply %s\n", supply);
|
||||
ret = -ENODEV;
|
||||
goto scrub;
|
||||
}
|
||||
|
@ -537,7 +537,7 @@ static int __devinit da903x_regulator_probe(struct platform_device *pdev)
|
||||
ri->desc.ops = &da9030_regulator_ldo1_15_ops;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &pdev->dev,
|
||||
pdev->dev.platform_data, ri);
|
||||
pdev->dev.platform_data, ri, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
ri->desc.name);
|
||||
|
@ -486,7 +486,7 @@ static int __devinit db8500_regulator_probe(struct platform_device *pdev)
|
||||
|
||||
/* register with the regulator framework */
|
||||
info->rdev = regulator_register(&info->desc, &pdev->dev,
|
||||
init_data, info);
|
||||
init_data, info, NULL);
|
||||
if (IS_ERR(info->rdev)) {
|
||||
err = PTR_ERR(info->rdev);
|
||||
dev_err(&pdev->dev, "failed to register %s: err %i\n",
|
||||
|
@ -42,7 +42,7 @@ static int __devinit dummy_regulator_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
|
||||
dummy_regulator_rdev = regulator_register(&dummy_desc, NULL,
|
||||
&dummy_initdata, NULL);
|
||||
&dummy_initdata, NULL, NULL);
|
||||
if (IS_ERR(dummy_regulator_rdev)) {
|
||||
ret = PTR_ERR(dummy_regulator_rdev);
|
||||
pr_err("Failed to register regulator: %d\n", ret);
|
||||
|
@ -27,6 +27,10 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/regulator/of_regulator.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
struct fixed_voltage_data {
|
||||
struct regulator_desc desc;
|
||||
@ -38,6 +42,53 @@ struct fixed_voltage_data {
|
||||
bool is_enabled;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* of_get_fixed_voltage_config - extract fixed_voltage_config structure info
|
||||
* @dev: device requesting for fixed_voltage_config
|
||||
*
|
||||
* Populates fixed_voltage_config structure by extracting data from device
|
||||
* tree node, returns a pointer to the populated structure of NULL if memory
|
||||
* alloc fails.
|
||||
*/
|
||||
struct fixed_voltage_config *of_get_fixed_voltage_config(struct device *dev)
|
||||
{
|
||||
struct fixed_voltage_config *config;
|
||||
struct device_node *np = dev->of_node;
|
||||
const __be32 *delay;
|
||||
struct regulator_init_data *init_data;
|
||||
|
||||
config = devm_kzalloc(dev, sizeof(struct fixed_voltage_config),
|
||||
GFP_KERNEL);
|
||||
if (!config)
|
||||
return NULL;
|
||||
|
||||
config->init_data = of_get_regulator_init_data(dev);
|
||||
init_data = config->init_data;
|
||||
|
||||
config->supply_name = init_data->constraints.name;
|
||||
if (init_data->constraints.min_uV == init_data->constraints.max_uV) {
|
||||
config->microvolts = init_data->constraints.min_uV;
|
||||
} else {
|
||||
dev_err(dev,
|
||||
"Fixed regulator specified with variable voltages\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (init_data->constraints.boot_on)
|
||||
config->enabled_at_boot = true;
|
||||
|
||||
config->gpio = of_get_named_gpio(np, "gpio", 0);
|
||||
delay = of_get_property(np, "startup-delay-us", NULL);
|
||||
if (delay)
|
||||
config->startup_delay = be32_to_cpu(*delay);
|
||||
|
||||
if (of_find_property(np, "enable-active-high", NULL))
|
||||
config->enable_high = true;
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
static int fixed_voltage_is_enabled(struct regulator_dev *dev)
|
||||
{
|
||||
struct fixed_voltage_data *data = rdev_get_drvdata(dev);
|
||||
@ -112,6 +163,9 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
struct fixed_voltage_data *drvdata;
|
||||
int ret;
|
||||
|
||||
if (pdev->dev.of_node)
|
||||
config = of_get_fixed_voltage_config(&pdev->dev);
|
||||
|
||||
drvdata = kzalloc(sizeof(struct fixed_voltage_data), GFP_KERNEL);
|
||||
if (drvdata == NULL) {
|
||||
dev_err(&pdev->dev, "Failed to allocate device data\n");
|
||||
@ -183,7 +237,7 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
drvdata->dev = regulator_register(&drvdata->desc, &pdev->dev,
|
||||
config->init_data, drvdata);
|
||||
config->init_data, drvdata, NULL);
|
||||
if (IS_ERR(drvdata->dev)) {
|
||||
ret = PTR_ERR(drvdata->dev);
|
||||
dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
|
||||
@ -220,12 +274,23 @@ static int __devexit reg_fixed_voltage_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id fixed_of_match[] __devinitconst = {
|
||||
{ .compatible = "regulator-fixed", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, fixed_of_match);
|
||||
#else
|
||||
#define fixed_of_match NULL
|
||||
#endif
|
||||
|
||||
static struct platform_driver regulator_fixed_voltage_driver = {
|
||||
.probe = reg_fixed_voltage_probe,
|
||||
.remove = __devexit_p(reg_fixed_voltage_remove),
|
||||
.driver = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = fixed_of_match,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -170,7 +170,7 @@ static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
pmic->rdev[i] = regulator_register(&isl_rd[i], &i2c->dev,
|
||||
init_data, pmic);
|
||||
init_data, pmic, NULL);
|
||||
if (IS_ERR(pmic->rdev[i])) {
|
||||
dev_err(&i2c->dev, "failed to register %s\n", id->name);
|
||||
err = PTR_ERR(pmic->rdev[i]);
|
||||
|
@ -451,7 +451,7 @@ static int __devinit setup_regulators(struct lp3971 *lp3971,
|
||||
for (i = 0; i < pdata->num_regulators; i++) {
|
||||
struct lp3971_regulator_subdev *reg = &pdata->regulators[i];
|
||||
lp3971->rdev[i] = regulator_register(®ulators[reg->id],
|
||||
lp3971->dev, reg->initdata, lp3971);
|
||||
lp3971->dev, reg->initdata, lp3971, NULL);
|
||||
|
||||
if (IS_ERR(lp3971->rdev[i])) {
|
||||
err = PTR_ERR(lp3971->rdev[i]);
|
||||
|
@ -555,7 +555,7 @@ static int __devinit setup_regulators(struct lp3972 *lp3972,
|
||||
for (i = 0; i < pdata->num_regulators; i++) {
|
||||
struct lp3972_regulator_subdev *reg = &pdata->regulators[i];
|
||||
lp3972->rdev[i] = regulator_register(®ulators[reg->id],
|
||||
lp3972->dev, reg->initdata, lp3972);
|
||||
lp3972->dev, reg->initdata, lp3972, NULL);
|
||||
|
||||
if (IS_ERR(lp3972->rdev[i])) {
|
||||
err = PTR_ERR(lp3972->rdev[i]);
|
||||
|
@ -214,7 +214,7 @@ static int __devinit max1586_pmic_probe(struct i2c_client *client,
|
||||
}
|
||||
rdev[i] = regulator_register(&max1586_reg[id], &client->dev,
|
||||
pdata->subdevs[i].platform_data,
|
||||
max1586);
|
||||
max1586, NULL);
|
||||
if (IS_ERR(rdev[i])) {
|
||||
ret = PTR_ERR(rdev[i]);
|
||||
dev_err(&client->dev, "failed to register %s\n",
|
||||
|
@ -299,7 +299,7 @@ static int __devinit max8649_regulator_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
info->regulator = regulator_register(&dcdc_desc, &client->dev,
|
||||
pdata->regulator, info);
|
||||
pdata->regulator, info, NULL);
|
||||
if (IS_ERR(info->regulator)) {
|
||||
dev_err(info->dev, "failed to register regulator %s\n",
|
||||
dcdc_desc.name);
|
||||
|
@ -449,7 +449,7 @@ static int __devinit max8660_probe(struct i2c_client *client,
|
||||
|
||||
rdev[i] = regulator_register(&max8660_reg[id], &client->dev,
|
||||
pdata->subdevs[i].platform_data,
|
||||
max8660);
|
||||
max8660, NULL);
|
||||
if (IS_ERR(rdev[i])) {
|
||||
ret = PTR_ERR(rdev[i]);
|
||||
dev_err(&client->dev, "failed to register %s\n",
|
||||
|
@ -266,7 +266,7 @@ static int __devinit max8925_regulator_probe(struct platform_device *pdev)
|
||||
ri->chip = chip;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &pdev->dev,
|
||||
pdata->regulator[pdev->id], ri);
|
||||
pdata->regulator[pdev->id], ri, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
ri->desc.name);
|
||||
|
@ -208,7 +208,7 @@ static int __devinit max8952_pmic_probe(struct i2c_client *client,
|
||||
max8952->pdata = pdata;
|
||||
|
||||
max8952->rdev = regulator_register(®ulator, max8952->dev,
|
||||
&pdata->reg_data, max8952);
|
||||
&pdata->reg_data, max8952, NULL);
|
||||
|
||||
if (IS_ERR(max8952->rdev)) {
|
||||
ret = PTR_ERR(max8952->rdev);
|
||||
|
@ -1146,7 +1146,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev)
|
||||
regulators[id].n_voltages = 16;
|
||||
|
||||
rdev[i] = regulator_register(®ulators[id], max8997->dev,
|
||||
pdata->regulators[i].initdata, max8997);
|
||||
pdata->regulators[i].initdata, max8997, NULL);
|
||||
if (IS_ERR(rdev[i])) {
|
||||
ret = PTR_ERR(rdev[i]);
|
||||
dev_err(max8997->dev, "regulator init failed for %d\n",
|
||||
|
@ -847,7 +847,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
||||
regulators[index].n_voltages = count;
|
||||
}
|
||||
rdev[i] = regulator_register(®ulators[index], max8998->dev,
|
||||
pdata->regulators[i].initdata, max8998);
|
||||
pdata->regulators[i].initdata, max8998, NULL);
|
||||
if (IS_ERR(rdev[i])) {
|
||||
ret = PTR_ERR(rdev[i]);
|
||||
dev_err(max8998->dev, "regulator init failed\n");
|
||||
|
@ -357,7 +357,7 @@ static int __devinit mc13783_regulator_probe(struct platform_device *pdev)
|
||||
init_data = &pdata->regulators[i];
|
||||
priv->regulators[i] = regulator_register(
|
||||
&mc13783_regulators[init_data->id].desc,
|
||||
&pdev->dev, init_data->init_data, priv);
|
||||
&pdev->dev, init_data->init_data, priv, NULL);
|
||||
|
||||
if (IS_ERR(priv->regulators[i])) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
|
@ -573,7 +573,7 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)
|
||||
init_data = &pdata->regulators[i];
|
||||
priv->regulators[i] = regulator_register(
|
||||
&mc13892_regulators[init_data->id].desc,
|
||||
&pdev->dev, init_data->init_data, priv);
|
||||
&pdev->dev, init_data->init_data, priv, NULL);
|
||||
|
||||
if (IS_ERR(priv->regulators[i])) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
|
81
drivers/regulator/of_regulator.c
Normal file
81
drivers/regulator/of_regulator.c
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* OF helpers for regulator framework
|
||||
*
|
||||
* Copyright (C) 2011 Texas Instruments, Inc.
|
||||
* Rajendra Nayak <rnayak@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
static void of_get_regulation_constraints(struct device_node *np,
|
||||
struct regulator_init_data **init_data)
|
||||
{
|
||||
const __be32 *min_uV, *max_uV, *uV_offset;
|
||||
const __be32 *min_uA, *max_uA;
|
||||
struct regulation_constraints *constraints = &(*init_data)->constraints;
|
||||
|
||||
constraints->name = of_get_property(np, "regulator-name", NULL);
|
||||
|
||||
min_uV = of_get_property(np, "regulator-min-microvolt", NULL);
|
||||
if (min_uV)
|
||||
constraints->min_uV = be32_to_cpu(*min_uV);
|
||||
max_uV = of_get_property(np, "regulator-max-microvolt", NULL);
|
||||
if (max_uV)
|
||||
constraints->max_uV = be32_to_cpu(*max_uV);
|
||||
|
||||
/* Voltage change possible? */
|
||||
if (constraints->min_uV != constraints->max_uV)
|
||||
constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE;
|
||||
|
||||
uV_offset = of_get_property(np, "regulator-microvolt-offset", NULL);
|
||||
if (uV_offset)
|
||||
constraints->uV_offset = be32_to_cpu(*uV_offset);
|
||||
min_uA = of_get_property(np, "regulator-min-microamp", NULL);
|
||||
if (min_uA)
|
||||
constraints->min_uA = be32_to_cpu(*min_uA);
|
||||
max_uA = of_get_property(np, "regulator-max-microamp", NULL);
|
||||
if (max_uA)
|
||||
constraints->max_uA = be32_to_cpu(*max_uA);
|
||||
|
||||
/* Current change possible? */
|
||||
if (constraints->min_uA != constraints->max_uA)
|
||||
constraints->valid_ops_mask |= REGULATOR_CHANGE_CURRENT;
|
||||
|
||||
if (of_find_property(np, "regulator-boot-on", NULL))
|
||||
constraints->boot_on = true;
|
||||
|
||||
if (of_find_property(np, "regulator-always-on", NULL))
|
||||
constraints->always_on = true;
|
||||
else /* status change should be possible if not always on. */
|
||||
constraints->valid_ops_mask |= REGULATOR_CHANGE_STATUS;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_get_regulator_init_data - extract regulator_init_data structure info
|
||||
* @dev: device requesting for regulator_init_data
|
||||
*
|
||||
* Populates regulator_init_data structure by extracting data from device
|
||||
* tree node, returns a pointer to the populated struture or NULL if memory
|
||||
* alloc fails.
|
||||
*/
|
||||
struct regulator_init_data *of_get_regulator_init_data(struct device *dev)
|
||||
{
|
||||
struct regulator_init_data *init_data;
|
||||
|
||||
if (!dev->of_node)
|
||||
return NULL;
|
||||
|
||||
init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL);
|
||||
if (!init_data)
|
||||
return NULL; /* Out of memory? */
|
||||
|
||||
of_get_regulation_constraints(dev->of_node, &init_data);
|
||||
return init_data;
|
||||
}
|
@ -277,7 +277,7 @@ static int __devinit pcap_regulator_probe(struct platform_device *pdev)
|
||||
void *pcap = dev_get_drvdata(pdev->dev.parent);
|
||||
|
||||
rdev = regulator_register(&pcap_regulators[pdev->id], &pdev->dev,
|
||||
pdev->dev.platform_data, pcap);
|
||||
pdev->dev.platform_data, pcap, NULL);
|
||||
if (IS_ERR(rdev))
|
||||
return PTR_ERR(rdev);
|
||||
|
||||
|
@ -320,7 +320,7 @@ static int __devinit pcf50633_regulator_probe(struct platform_device *pdev)
|
||||
pcf = dev_to_pcf50633(pdev->dev.parent);
|
||||
|
||||
rdev = regulator_register(®ulators[pdev->id], &pdev->dev,
|
||||
pdev->dev.platform_data, pcf);
|
||||
pdev->dev.platform_data, pcf, NULL);
|
||||
if (IS_ERR(rdev))
|
||||
return PTR_ERR(rdev);
|
||||
|
||||
|
@ -151,7 +151,8 @@ static int __devinit tps6105x_regulator_probe(struct platform_device *pdev)
|
||||
/* Register regulator with framework */
|
||||
tps6105x->regulator = regulator_register(&tps6105x_regulator_desc,
|
||||
&tps6105x->client->dev,
|
||||
pdata->regulator_data, tps6105x);
|
||||
pdata->regulator_data, tps6105x,
|
||||
NULL);
|
||||
if (IS_ERR(tps6105x->regulator)) {
|
||||
ret = PTR_ERR(tps6105x->regulator);
|
||||
dev_err(&tps6105x->client->dev,
|
||||
|
@ -473,7 +473,7 @@ static int __devinit tps_65023_probe(struct i2c_client *client,
|
||||
|
||||
/* Register the regulators */
|
||||
rdev = regulator_register(&tps->desc[i], &client->dev,
|
||||
init_data, tps);
|
||||
init_data, tps, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&client->dev, "failed to register %s\n",
|
||||
id->name);
|
||||
|
@ -599,7 +599,7 @@ int tps6507x_pmic_probe(struct platform_device *pdev)
|
||||
tps->desc[i].owner = THIS_MODULE;
|
||||
|
||||
rdev = regulator_register(&tps->desc[i],
|
||||
tps6507x_dev->dev, init_data, tps);
|
||||
tps6507x_dev->dev, init_data, tps, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(tps6507x_dev->dev,
|
||||
"failed to register %s regulator\n",
|
||||
|
@ -651,7 +651,7 @@ static int __devinit pmic_probe(struct spi_device *spi)
|
||||
hw->desc[i].n_voltages = 1;
|
||||
|
||||
hw->rdev[i] = regulator_register(&hw->desc[i], dev,
|
||||
init_data, hw);
|
||||
init_data, hw, NULL);
|
||||
if (IS_ERR(hw->rdev[i])) {
|
||||
ret = PTR_ERR(hw->rdev[i]);
|
||||
hw->rdev[i] = NULL;
|
||||
|
@ -396,7 +396,7 @@ static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
|
||||
return err;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &pdev->dev,
|
||||
pdev->dev.platform_data, ri);
|
||||
pdev->dev.platform_data, ri, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
ri->desc.name);
|
||||
|
@ -948,7 +948,7 @@ static __devinit int tps65910_probe(struct platform_device *pdev)
|
||||
pmic->desc[i].owner = THIS_MODULE;
|
||||
|
||||
rdev = regulator_register(&pmic->desc[i],
|
||||
tps65910->dev, reg_data, pmic);
|
||||
tps65910->dev, reg_data, pmic, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(tps65910->dev,
|
||||
"failed to register %s regulator\n",
|
||||
|
@ -727,7 +727,7 @@ static __devinit int tps65912_probe(struct platform_device *pdev)
|
||||
pmic->desc[i].owner = THIS_MODULE;
|
||||
range = tps65912_get_range(pmic, i);
|
||||
rdev = regulator_register(&pmic->desc[i],
|
||||
tps65912->dev, reg_data, pmic);
|
||||
tps65912->dev, reg_data, pmic, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(tps65912->dev,
|
||||
"failed to register %s regulator\n",
|
||||
|
@ -1070,7 +1070,7 @@ static int __devinit twlreg_probe(struct platform_device *pdev)
|
||||
break;
|
||||
}
|
||||
|
||||
rdev = regulator_register(&info->desc, &pdev->dev, initdata, info);
|
||||
rdev = regulator_register(&info->desc, &pdev->dev, initdata, info, NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "can't register %s, %ld\n",
|
||||
info->desc.name, PTR_ERR(rdev));
|
||||
|
@ -553,7 +553,7 @@ static __devinit int wm831x_buckv_probe(struct platform_device *pdev)
|
||||
wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
|
||||
|
||||
dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
|
||||
pdata->dcdc[id], dcdc);
|
||||
pdata->dcdc[id], dcdc, NULL);
|
||||
if (IS_ERR(dcdc->regulator)) {
|
||||
ret = PTR_ERR(dcdc->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
|
||||
@ -747,7 +747,7 @@ static __devinit int wm831x_buckp_probe(struct platform_device *pdev)
|
||||
dcdc->desc.owner = THIS_MODULE;
|
||||
|
||||
dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
|
||||
pdata->dcdc[id], dcdc);
|
||||
pdata->dcdc[id], dcdc, NULL);
|
||||
if (IS_ERR(dcdc->regulator)) {
|
||||
ret = PTR_ERR(dcdc->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
|
||||
@ -874,7 +874,7 @@ static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
|
||||
dcdc->desc.owner = THIS_MODULE;
|
||||
|
||||
dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
|
||||
pdata->dcdc[id], dcdc);
|
||||
pdata->dcdc[id], dcdc, NULL);
|
||||
if (IS_ERR(dcdc->regulator)) {
|
||||
ret = PTR_ERR(dcdc->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
|
||||
@ -973,7 +973,7 @@ static __devinit int wm831x_epe_probe(struct platform_device *pdev)
|
||||
dcdc->desc.owner = THIS_MODULE;
|
||||
|
||||
dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
|
||||
pdata->epe[id], dcdc);
|
||||
pdata->epe[id], dcdc, NULL);
|
||||
if (IS_ERR(dcdc->regulator)) {
|
||||
ret = PTR_ERR(dcdc->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
|
||||
|
@ -189,7 +189,7 @@ static __devinit int wm831x_isink_probe(struct platform_device *pdev)
|
||||
isink->desc.owner = THIS_MODULE;
|
||||
|
||||
isink->regulator = regulator_register(&isink->desc, &pdev->dev,
|
||||
pdata->isink[id], isink);
|
||||
pdata->isink[id], isink, NULL);
|
||||
if (IS_ERR(isink->regulator)) {
|
||||
ret = PTR_ERR(isink->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register ISINK%d: %d\n",
|
||||
|
@ -351,7 +351,7 @@ static __devinit int wm831x_gp_ldo_probe(struct platform_device *pdev)
|
||||
ldo->desc.owner = THIS_MODULE;
|
||||
|
||||
ldo->regulator = regulator_register(&ldo->desc, &pdev->dev,
|
||||
pdata->ldo[id], ldo);
|
||||
pdata->ldo[id], ldo, NULL);
|
||||
if (IS_ERR(ldo->regulator)) {
|
||||
ret = PTR_ERR(ldo->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
|
||||
@ -621,7 +621,7 @@ static __devinit int wm831x_aldo_probe(struct platform_device *pdev)
|
||||
ldo->desc.owner = THIS_MODULE;
|
||||
|
||||
ldo->regulator = regulator_register(&ldo->desc, &pdev->dev,
|
||||
pdata->ldo[id], ldo);
|
||||
pdata->ldo[id], ldo, NULL);
|
||||
if (IS_ERR(ldo->regulator)) {
|
||||
ret = PTR_ERR(ldo->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
|
||||
@ -818,7 +818,7 @@ static __devinit int wm831x_alive_ldo_probe(struct platform_device *pdev)
|
||||
ldo->desc.owner = THIS_MODULE;
|
||||
|
||||
ldo->regulator = regulator_register(&ldo->desc, &pdev->dev,
|
||||
pdata->ldo[id], ldo);
|
||||
pdata->ldo[id], ldo, NULL);
|
||||
if (IS_ERR(ldo->regulator)) {
|
||||
ret = PTR_ERR(ldo->regulator);
|
||||
dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
|
||||
|
@ -1428,7 +1428,7 @@ static int wm8350_regulator_probe(struct platform_device *pdev)
|
||||
/* register regulator */
|
||||
rdev = regulator_register(&wm8350_reg[pdev->id], &pdev->dev,
|
||||
pdev->dev.platform_data,
|
||||
dev_get_drvdata(&pdev->dev));
|
||||
dev_get_drvdata(&pdev->dev), NULL);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "failed to register %s\n",
|
||||
wm8350_reg[pdev->id].name);
|
||||
|
@ -326,7 +326,7 @@ static int __devinit wm8400_regulator_probe(struct platform_device *pdev)
|
||||
struct regulator_dev *rdev;
|
||||
|
||||
rdev = regulator_register(®ulators[pdev->id], &pdev->dev,
|
||||
pdev->dev.platform_data, wm8400);
|
||||
pdev->dev.platform_data, wm8400, NULL);
|
||||
|
||||
if (IS_ERR(rdev))
|
||||
return PTR_ERR(rdev);
|
||||
|
@ -269,7 +269,7 @@ static __devinit int wm8994_ldo_probe(struct platform_device *pdev)
|
||||
ldo->is_enabled = true;
|
||||
|
||||
ldo->regulator = regulator_register(&wm8994_ldo_desc[id], &pdev->dev,
|
||||
pdata->ldo[id].init_data, ldo);
|
||||
pdata->ldo[id].init_data, ldo, NULL);
|
||||
if (IS_ERR(ldo->regulator)) {
|
||||
ret = PTR_ERR(ldo->regulator);
|
||||
dev_err(wm8994->dev, "Failed to register LDO%d: %d\n",
|
||||
|
@ -154,6 +154,7 @@ enum regulator_type {
|
||||
* this type.
|
||||
*
|
||||
* @name: Identifying name for the regulator.
|
||||
* @supply_name: Identifying the regulator supply
|
||||
* @id: Numerical identifier for the regulator.
|
||||
* @n_voltages: Number of selectors available for ops.list_voltage().
|
||||
* @ops: Regulator operations table.
|
||||
@ -163,6 +164,7 @@ enum regulator_type {
|
||||
*/
|
||||
struct regulator_desc {
|
||||
const char *name;
|
||||
const char *supply_name;
|
||||
int id;
|
||||
unsigned n_voltages;
|
||||
struct regulator_ops *ops;
|
||||
@ -212,7 +214,7 @@ struct regulator_dev {
|
||||
|
||||
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||
struct device *dev, const struct regulator_init_data *init_data,
|
||||
void *driver_data);
|
||||
void *driver_data, struct device_node *of_node);
|
||||
void regulator_unregister(struct regulator_dev *rdev);
|
||||
|
||||
int regulator_notifier_call_chain(struct regulator_dev *rdev,
|
||||
|
20
include/linux/regulator/of_regulator.h
Normal file
20
include/linux/regulator/of_regulator.h
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* OpenFirmware regulator support routines
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_OF_REG_H
|
||||
#define __LINUX_OF_REG_H
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
extern struct regulator_init_data
|
||||
*of_get_regulator_init_data(struct device *dev);
|
||||
#else
|
||||
static inline struct regulator_init_data
|
||||
*of_get_regulator_init_data(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
#endif /* __LINUX_OF_REG_H */
|
@ -833,7 +833,7 @@ static int ldo_regulator_register(struct snd_soc_codec *codec,
|
||||
ldo->voltage = voltage;
|
||||
|
||||
ldo->dev = regulator_register(&ldo->desc, codec->dev,
|
||||
init_data, ldo);
|
||||
init_data, ldo, NULL);
|
||||
if (IS_ERR(ldo->dev)) {
|
||||
int ret = PTR_ERR(ldo->dev);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user