regulator: tps62360: add dt support

Add dt support for the pmu device tps62360 and
Add binding documentation with example.
With this patch driver will support both device-tree and
non-device tree registration.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Laxman Dewangan 2012-05-11 12:08:43 +05:30 committed by Mark Brown
parent 8bdca009e6
commit 684ae39b91
2 changed files with 117 additions and 1 deletions

View file

@ -0,0 +1,45 @@
TPS62360 Voltage regulators
Required properties:
- compatible: Must be one of the following.
"ti,tps62360"
"ti,tps62361",
"ti,tps62362",
"ti,tps62363",
- reg: I2C slave address
Optional properties:
- ti,enable-force-pwm: Enable force PWM mode. This is boolean value.
- ti,enable-vout-discharge: Enable output discharge. This is boolean value.
- ti,enable-pull-down: Enable pull down. This is boolean value.
- ti,vsel0-gpio: GPIO for controlling VSEL0 line.
If this property is missing, then assume that there is no GPIO
for vsel0 control.
- ti,vsel1-gpio: Gpio for controlling VSEL1 line.
If this property is missing, then assume that there is no GPIO
for vsel1 control.
- ti,vsel0-state-high: Inital state of vsel0 input is high.
If this property is missing, then assume the state as low (0).
- ti,vsel1-state-high: Inital state of vsel1 input is high.
If this property is missing, then assume the state as low (0).
Any property defined as part of the core regulator binding, defined in
regulator.txt, can also be used.
Example:
abc: tps62360 {
compatible = "ti,tps62361";
reg = <0x60>;
regulator-name = "tps62361-vout";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1500000>;
regulator-boot-on
ti,vsel0-gpio = <&gpio1 16 0>;
ti,vsel1-gpio = <&gpio1 17 0>;
ti,vsel0-state-high;
ti,vsel1-state-high;
ti,enable-pull-down;
ti,enable-force-pwm;
ti,enable-vout-discharge;
};

View file

@ -26,6 +26,10 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/regulator/of_regulator.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
@ -297,6 +301,56 @@ static const struct regmap_config tps62360_regmap_config = {
.cache_type = REGCACHE_RBTREE,
};
static struct tps62360_regulator_platform_data *
of_get_tps62360_platform_data(struct device *dev)
{
struct tps62360_regulator_platform_data *pdata;
struct device_node *np = dev->of_node;
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata) {
dev_err(dev, "Memory alloc failed for platform data\n");
return NULL;
}
pdata->reg_init_data = of_get_regulator_init_data(dev, dev->of_node);
if (!pdata->reg_init_data) {
dev_err(dev, "Not able to get OF regulator init data\n");
return NULL;
}
pdata->vsel0_gpio = of_get_named_gpio(np, "vsel0-gpio", 0);
pdata->vsel1_gpio = of_get_named_gpio(np, "vsel1-gpio", 0);
if (of_find_property(np, "ti,vsel0-state-high", NULL))
pdata->vsel0_def_state = 1;
if (of_find_property(np, "ti,vsel1-state-high", NULL))
pdata->vsel1_def_state = 1;
if (of_find_property(np, "ti,enable-pull-down", NULL))
pdata->en_internal_pulldn = true;
if (of_find_property(np, "ti,enable-force-pwm", NULL))
pdata->en_force_pwm = true;
if (of_find_property(np, "ti,enable-vout-discharge", NULL))
pdata->en_discharge = true;
return pdata;
}
#if defined(CONFIG_OF)
static const struct of_device_id tps62360_of_match[] = {
{ .compatible = "ti,tps62360", .data = (void *)TPS62360},
{ .compatible = "ti,tps62361", .data = (void *)TPS62361},
{ .compatible = "ti,tps62362", .data = (void *)TPS62362},
{ .compatible = "ti,tps62363", .data = (void *)TPS62363},
{},
}
MODULE_DEVICE_TABLE(of, tps62360_of_match);
#endif
static int __devinit tps62360_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@ -306,8 +360,24 @@ static int __devinit tps62360_probe(struct i2c_client *client,
struct tps62360_chip *tps;
int ret;
int i;
int chip_id;
pdata = client->dev.platform_data;
chip_id = id->driver_data;
if (client->dev.of_node) {
const struct of_device_id *match;
match = of_match_device(of_match_ptr(tps62360_of_match),
&client->dev);
if (!match) {
dev_err(&client->dev, "Error: No device match found\n");
return -ENODEV;
}
chip_id = (int)match->data;
if (!pdata)
pdata = of_get_tps62360_platform_data(&client->dev);
}
if (!pdata) {
dev_err(&client->dev, "%s(): Platform data not found\n",
__func__);
@ -328,7 +398,7 @@ static int __devinit tps62360_probe(struct i2c_client *client,
tps->vsel1_gpio = pdata->vsel1_gpio;
tps->dev = &client->dev;
switch (id->driver_data) {
switch (chip_id) {
case TPS62360:
case TPS62362:
tps->voltage_base = TPS62360_BASE_VOLTAGE;
@ -484,6 +554,7 @@ static struct i2c_driver tps62360_i2c_driver = {
.driver = {
.name = "tps62360",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(tps62360_of_match),
},
.probe = tps62360_probe,
.remove = __devexit_p(tps62360_remove),