Skip to content

Commit

Permalink
Merge remote-tracking branch 'regulator/topic/max8660' into regulator…
Browse files Browse the repository at this point in the history
…-next
  • Loading branch information
broonie committed Sep 1, 2013
2 parents 3aba952 + d6c7e11 commit 6979380
Show file tree
Hide file tree
Showing 40 changed files with 188 additions and 53 deletions.
47 changes: 47 additions & 0 deletions Documentation/devicetree/bindings/regulator/max8660.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
Maxim MAX8660 voltage regulator

Required properties:
- compatible: must be one of "maxim,max8660", "maxim,max8661"
- reg: I2C slave address, usually 0x34
- any required generic properties defined in regulator.txt

Example:

i2c_master {
max8660@34 {
compatible = "maxim,max8660";
reg = <0x34>;

regulators {
regulator@0 {
regulator-compatible= "V3(DCDC)";
regulator-min-microvolt = <725000>;
regulator-max-microvolt = <1800000>;
};

regulator@1 {
regulator-compatible= "V4(DCDC)";
regulator-min-microvolt = <725000>;
regulator-max-microvolt = <1800000>;
};

regulator@2 {
regulator-compatible= "V5(LDO)";
regulator-min-microvolt = <1700000>;
regulator-max-microvolt = <2000000>;
};

regulator@3 {
regulator-compatible= "V6(LDO)";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
};

regulator@4 {
regulator-compatible= "V7(LDO)";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
};
};
};
};
2 changes: 1 addition & 1 deletion drivers/regulator/88pm800.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ static int pm800_regulator_dt_init(struct platform_device *pdev)
static int pm800_regulator_probe(struct platform_device *pdev)
{
struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
struct pm80x_platform_data *pdata = pdev->dev.parent->platform_data;
struct pm80x_platform_data *pdata = dev_get_platdata(pdev->dev.parent);
struct pm800_regulators *pm800_data;
struct pm800_regulator_info *info;
struct regulator_config config = { };
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/88pm8607.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ static int pm8607_regulator_probe(struct platform_device *pdev)
{
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
struct pm8607_regulator_info *info = NULL;
struct regulator_init_data *pdata = pdev->dev.platform_data;
struct regulator_init_data *pdata = dev_get_platdata(&pdev->dev);
struct regulator_config config = { };
struct resource *res;
int i;
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/aat2870-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ static int aat2870_regulator_probe(struct platform_device *pdev)

config.dev = &pdev->dev;
config.driver_data = ri;
config.init_data = pdev->dev.platform_data;
config.init_data = dev_get_platdata(&pdev->dev);

rdev = regulator_register(&ri->desc, &config);
if (IS_ERR(rdev)) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/ab3100.c
Original file line number Diff line number Diff line change
Expand Up @@ -660,7 +660,7 @@ ab3100_regulator_of_probe(struct platform_device *pdev, struct device_node *np)

static int ab3100_regulators_probe(struct platform_device *pdev)
{
struct ab3100_platform_data *plfdata = pdev->dev.platform_data;
struct ab3100_platform_data *plfdata = dev_get_platdata(&pdev->dev);
struct device_node *np = pdev->dev.of_node;
int err = 0;
u8 data;
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/ad5398.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ MODULE_DEVICE_TABLE(i2c, ad5398_id);
static int ad5398_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct regulator_init_data *init_data = client->dev.platform_data;
struct regulator_init_data *init_data = dev_get_platdata(&client->dev);
struct regulator_config config = { };
struct ad5398_chip_info *chip;
const struct ad5398_current_data_format *df =
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/da903x.c
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ static int da903x_regulator_probe(struct platform_device *pdev)
ri->desc.ops = &da9030_regulator_ldo1_15_ops;

config.dev = &pdev->dev;
config.init_data = pdev->dev.platform_data;
config.init_data = dev_get_platdata(&pdev->dev);
config.driver_data = ri;

rdev = regulator_register(&ri->desc, &config);
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/da9052-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ static int da9052_regulator_probe(struct platform_device *pdev)
return -ENOMEM;

da9052 = dev_get_drvdata(pdev->dev.parent);
pdata = da9052->dev->platform_data;
pdata = dev_get_platdata(da9052->dev);
regulator->da9052 = da9052;

regulator->info = find_regulator_info(regulator->da9052->chip_id,
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/da9055-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,7 @@ static int da9055_regulator_probe(struct platform_device *pdev)
struct regulator_config config = { };
struct da9055_regulator *regulator;
struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent);
struct da9055_pdata *pdata = da9055->dev->platform_data;
struct da9055_pdata *pdata = dev_get_platdata(da9055->dev);
int ret, irq;

if (pdata == NULL || pdata->regulators[pdev->id] == NULL)
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/fan53555.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ static int fan53555_regulator_probe(struct i2c_client *client,
unsigned int val;
int ret;

pdata = client->dev.platform_data;
pdata = dev_get_platdata(&client->dev);
if (!pdata || !pdata->regulator) {
dev_err(&client->dev, "Platform data not found!\n");
return -ENODEV;
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/fixed.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
if (IS_ERR(config))
return PTR_ERR(config);
} else {
config = pdev->dev.platform_data;
config = dev_get_platdata(&pdev->dev);
}

if (!config)
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/gpio-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ static struct regulator_ops gpio_regulator_current_ops = {

static int gpio_regulator_probe(struct platform_device *pdev)
{
struct gpio_regulator_config *config = pdev->dev.platform_data;
struct gpio_regulator_config *config = dev_get_platdata(&pdev->dev);
struct device_node *np = pdev->dev.of_node;
struct gpio_regulator_data *drvdata;
struct regulator_config cfg = { };
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/isl6271a-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ static int isl6271a_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct regulator_config config = { };
struct regulator_init_data *init_data = i2c->dev.platform_data;
struct regulator_init_data *init_data = dev_get_platdata(&i2c->dev);
struct isl_pmic *pmic;
int err, i;

Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/lp3971.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ static int lp3971_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct lp3971 *lp3971;
struct lp3971_platform_data *pdata = i2c->dev.platform_data;
struct lp3971_platform_data *pdata = dev_get_platdata(&i2c->dev);
int ret;
u16 val;

Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/lp3972.c
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ static int lp3972_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct lp3972 *lp3972;
struct lp3972_platform_data *pdata = i2c->dev.platform_data;
struct lp3972_platform_data *pdata = dev_get_platdata(&i2c->dev);
int ret;
u16 val;

Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/lp872x.c
Original file line number Diff line number Diff line change
Expand Up @@ -962,7 +962,7 @@ static int lp872x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
}

lp->dev = &cl->dev;
lp->pdata = cl->dev.platform_data;
lp->pdata = dev_get_platdata(&cl->dev);
lp->chipid = id->driver_data;
lp->num_regulators = num_regulators;
i2c_set_clientdata(cl, lp);
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/lp8755.c
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ static int lp8755_probe(struct i2c_client *client,
{
int ret, icnt;
struct lp8755_chip *pchip;
struct lp8755_platform_data *pdata = client->dev.platform_data;
struct lp8755_platform_data *pdata = dev_get_platdata(&client->dev);

if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
dev_err(&client->dev, "i2c functionality check fail.\n");
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/max1586.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ static int max1586_pmic_probe(struct i2c_client *client,
const struct i2c_device_id *i2c_id)
{
struct regulator_dev **rdev;
struct max1586_platform_data *pdata = client->dev.platform_data;
struct max1586_platform_data *pdata = dev_get_platdata(&client->dev);
struct regulator_config config = { };
struct max1586_data *max1586;
int i, id, ret = -ENOMEM;
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/max8649.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ static struct regmap_config max8649_regmap_config = {
static int max8649_regulator_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct max8649_platform_data *pdata = client->dev.platform_data;
struct max8649_platform_data *pdata = dev_get_platdata(&client->dev);
struct max8649_regulator_info *info = NULL;
struct regulator_config config = { };
unsigned int val;
Expand Down
108 changes: 98 additions & 10 deletions drivers/regulator/max8660.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@
#include <linux/regulator/driver.h>
#include <linux/slab.h>
#include <linux/regulator/max8660.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/regulator/of_regulator.h>

#define MAX8660_DCDC_MIN_UV 725000
#define MAX8660_DCDC_MAX_UV 1800000
Expand Down Expand Up @@ -305,21 +308,105 @@ static const struct regulator_desc max8660_reg[] = {
},
};

enum {
MAX8660 = 0,
MAX8661 = 1,
};

#ifdef CONFIG_OF
static const struct of_device_id max8660_dt_ids[] = {
{ .compatible = "maxim,max8660", .data = (void *) MAX8660 },
{ .compatible = "maxim,max8661", .data = (void *) MAX8661 },
{ }
};
MODULE_DEVICE_TABLE(of, max8660_dt_ids);

static int max8660_pdata_from_dt(struct device *dev,
struct device_node **of_node,
struct max8660_platform_data *pdata)
{
int matched, i;
struct device_node *np;
struct max8660_subdev_data *sub;
struct of_regulator_match rmatch[ARRAY_SIZE(max8660_reg)];

np = of_find_node_by_name(dev->of_node, "regulators");
if (!np) {
dev_err(dev, "missing 'regulators' subnode in DT\n");
return -EINVAL;
}

for (i = 0; i < ARRAY_SIZE(rmatch); i++)
rmatch[i].name = max8660_reg[i].name;

matched = of_regulator_match(dev, np, rmatch, ARRAY_SIZE(rmatch));
if (matched <= 0)
return matched;

pdata->subdevs = devm_kzalloc(dev, sizeof(struct max8660_subdev_data) *
matched, GFP_KERNEL);
if (!pdata->subdevs)
return -ENOMEM;

pdata->num_subdevs = matched;
sub = pdata->subdevs;

for (i = 0; i < matched; i++) {
sub->id = i;
sub->name = rmatch[i].name;
sub->platform_data = rmatch[i].init_data;
of_node[i] = rmatch[i].of_node;
sub++;
}

return 0;
}
#else
static inline int max8660_pdata_from_dt(struct device *dev,
struct device_node **of_node,
struct max8660_platform_data *pdata)
{
return 0;
}
#endif

static int max8660_probe(struct i2c_client *client,
const struct i2c_device_id *i2c_id)
{
struct regulator_dev **rdev;
struct max8660_platform_data *pdata = client->dev.platform_data;
struct device *dev = &client->dev;
struct max8660_platform_data *pdata = dev_get_platdata(dev);
struct regulator_config config = { };
struct max8660 *max8660;
int boot_on, i, id, ret = -EINVAL;
struct device_node *of_node[MAX8660_V_END];
unsigned long type;

if (dev->of_node && !pdata) {
const struct of_device_id *id;
struct max8660_platform_data pdata_of;

id = of_match_device(of_match_ptr(max8660_dt_ids), dev);
if (!id)
return -ENODEV;

ret = max8660_pdata_from_dt(dev, of_node, &pdata_of);
if (ret < 0)
return ret;

pdata = &pdata_of;
type = (unsigned long) id->data;
} else {
type = i2c_id->driver_data;
memset(of_node, 0, sizeof(of_node));
}

if (pdata->num_subdevs > MAX8660_V_END) {
dev_err(&client->dev, "Too many regulators found!\n");
dev_err(dev, "Too many regulators found!\n");
return -EINVAL;
}

max8660 = devm_kzalloc(&client->dev, sizeof(struct max8660) +
max8660 = devm_kzalloc(dev, sizeof(struct max8660) +
sizeof(struct regulator_dev *) * MAX8660_V_END,
GFP_KERNEL);
if (!max8660)
Expand Down Expand Up @@ -376,8 +463,8 @@ static int max8660_probe(struct i2c_client *client,
break;

case MAX8660_V7:
if (!strcmp(i2c_id->name, "max8661")) {
dev_err(&client->dev, "Regulator not on this chip!\n");
if (type == MAX8661) {
dev_err(dev, "Regulator not on this chip!\n");
goto err_out;
}

Expand All @@ -386,7 +473,7 @@ static int max8660_probe(struct i2c_client *client,
break;

default:
dev_err(&client->dev, "invalid regulator %s\n",
dev_err(dev, "invalid regulator %s\n",
pdata->subdevs[i].name);
goto err_out;
}
Expand All @@ -397,14 +484,15 @@ static int max8660_probe(struct i2c_client *client,

id = pdata->subdevs[i].id;

config.dev = &client->dev;
config.dev = dev;
config.init_data = pdata->subdevs[i].platform_data;
config.of_node = of_node[i];
config.driver_data = max8660;

rdev[i] = regulator_register(&max8660_reg[id], &config);
if (IS_ERR(rdev[i])) {
ret = PTR_ERR(rdev[i]);
dev_err(&client->dev, "failed to register %s\n",
dev_err(dev, "failed to register %s\n",
max8660_reg[id].name);
goto err_unregister;
}
Expand All @@ -431,8 +519,8 @@ static int max8660_remove(struct i2c_client *client)
}

static const struct i2c_device_id max8660_id[] = {
{ "max8660", 0 },
{ "max8661", 0 },
{ .name = "max8660", .driver_data = MAX8660 },
{ .name = "max8661", .driver_data = MAX8661 },
{ }
};
MODULE_DEVICE_TABLE(i2c, max8660_id);
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/max8925-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ static int max8925_regulator_dt_init(struct platform_device *pdev,
static int max8925_regulator_probe(struct platform_device *pdev)
{
struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
struct regulator_init_data *pdata = pdev->dev.platform_data;
struct regulator_init_data *pdata = dev_get_platdata(&pdev->dev);
struct regulator_config config = { };
struct max8925_regulator_info *ri;
struct resource *res;
Expand Down
2 changes: 1 addition & 1 deletion drivers/regulator/max8952.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ static int max8952_pmic_probe(struct i2c_client *client,
const struct i2c_device_id *i2c_id)
{
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
struct max8952_platform_data *pdata = client->dev.platform_data;
struct max8952_platform_data *pdata = dev_get_platdata(&client->dev);
struct regulator_config config = { };
struct max8952_data *max8952;

Expand Down
Loading

0 comments on commit 6979380

Please sign in to comment.