Signed-off-by: Haojian Zhuang <haojian.zhu...@marvell.com> --- drivers/regulator/max8649.c | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 70 insertions(+), 0 deletions(-)
diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c index 30eb9e5..4316a37 100644 --- a/drivers/regulator/max8649.c +++ b/drivers/regulator/max8649.c @@ -15,6 +15,7 @@ #include <linux/platform_device.h> #include <linux/regulator/driver.h> #include <linux/slab.h> +#include <linux/of_regulator.h> #include <linux/regulator/max8649.h> #define MAX8649_DCDC_VMIN 750000 /* uV */ @@ -275,6 +276,69 @@ static struct regulator_desc dcdc_desc = { .owner = THIS_MODULE, }; +#ifdef CONFIG_OF_REGULATOR +static struct max8649_platform_data __devinit +*max8649_get_alt_pdata(struct i2c_client *client) +{ + struct device_node *np = client->dev.of_node; + struct max8649_platform_data *pdata; + const __be32 *mode, *extclk, *ramp; + int ret = 0; + + if (np == NULL) + goto out; + + mode = of_get_property(np, "max8649-mode", NULL); + if (mode == NULL) { + dev_err(&client->dev, "mode property is missed\n"); + goto out; + } + extclk = of_get_property(np, "ext-clock-frequency", NULL); + if (extclk == NULL) + dev_dbg(&client->dev, "ext-clock-frequency is not set\n"); + ramp = of_get_property(np, "max8649-ramp", NULL); + if (ramp == NULL) { + dev_err(&client->dev, "ramp is missed\n"); + goto out; + } + + pdata = kzalloc(sizeof(struct max8649_platform_data), GFP_KERNEL); + if (pdata == NULL) + goto out; + pdata->mode = be32_to_cpu(*mode); + if (extclk) { + pdata->extclk = 1; + pdata->extclk_freq = be32_to_cpu(*extclk); + } + if (ramp) { + pdata->ramp_timing = be32_to_cpu(*ramp++); + pdata->ramp_down = be32_to_cpu(*ramp); + } + + pdata->regulator = kzalloc(sizeof(struct regulator_init_data), + GFP_KERNEL); + if (pdata->regulator == NULL) + goto out_pdata; + ret = of_regulator_init_data(np, pdata->regulator); + if (ret < 0) + goto out_regulator; + return pdata; + +out_regulator: + kfree(pdata->regulator); +out_pdata: + kfree(pdata); +out: + return NULL; +} +#else +static struct max8649_platform_data __devinit +*max8649_get_alt_pdata(struct i2c_client *client) +{ + return 0; +} +#endif + static int __devinit max8649_regulator_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -294,6 +358,12 @@ static int __devinit max8649_regulator_probe(struct i2c_client *client, mutex_init(&info->io_lock); i2c_set_clientdata(client, info); + if (pdata == NULL) { + pdata = max8649_get_alt_pdata(client); + if (pdata == NULL) + return -ENODEV; + } + info->mode = pdata->mode; switch (info->mode) { case 0: -- 1.5.6.5 _______________________________________________ devicetree-discuss mailing list devicetree-discuss@lists.ozlabs.org https://lists.ozlabs.org/listinfo/devicetree-discuss