Skip to content

Commit

Permalink
regulator: s2mps11: Add DT support
Browse files Browse the repository at this point in the history
This patch adds DT support for parsing regulators constraints for parent(mfd)
node and moves some common intialising code out of loop while registering.

Signed-off-by: Yadwinder Singh Brar <yadi.brar@samsung.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
  • Loading branch information
Yadwinder Singh Brar authored and Mark Brown committed Jul 15, 2013
1 parent 939c027 commit a50c6b3
Showing 1 changed file with 38 additions and 11 deletions.
49 changes: 38 additions & 11 deletions drivers/regulator/s2mps11.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@
#include <linux/gpio.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/regmap.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
#include <linux/mfd/samsung/core.h>
#include <linux/mfd/samsung/s2mps11.h>

#define S2MPS11_REGULATOR_CNT ARRAY_SIZE(regulators)

struct s2mps11_info {
struct regulator_dev *rdev[S2MPS11_REGULATOR_MAX];

Expand Down Expand Up @@ -407,22 +411,38 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
{
struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
struct sec_platform_data *pdata = dev_get_platdata(iodev->dev);
struct of_regulator_match rdata[S2MPS11_REGULATOR_MAX];
struct device_node *reg_np = NULL;
struct regulator_config config = { };
struct s2mps11_info *s2mps11;
int i, ret;
unsigned char ramp_enable, ramp_reg = 0;

if (!pdata) {
dev_err(pdev->dev.parent, "Platform data not supplied\n");
return -ENODEV;
}

s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
GFP_KERNEL);
if (!s2mps11)
return -ENOMEM;

platform_set_drvdata(pdev, s2mps11);
if (!iodev->dev->of_node)
goto p_data;

for (i = 0; i < S2MPS11_REGULATOR_CNT; i++)
rdata[i].name = regulators[i].name;

reg_np = of_find_node_by_name(iodev->dev->of_node, "regulators");
if (!reg_np) {
dev_err(&pdev->dev, "could not find regulators sub-node\n");
return -EINVAL;
}

of_regulator_match(&pdev->dev, reg_np, rdata, S2MPS11_REGULATOR_MAX);

goto common_reg;
p_data:
if (!pdata) {
dev_err(pdev->dev.parent, "Platform data not supplied\n");
return -ENODEV;
}

s2mps11->ramp_delay2 = pdata->buck2_ramp_delay;
s2mps11->ramp_delay34 = pdata->buck34_ramp_delay;
Expand Down Expand Up @@ -454,12 +474,19 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
ramp_reg |= get_ramp_delay(s2mps11->ramp_delay9);
sec_reg_write(iodev, S2MPS11_REG_RAMP_BUCK, ramp_reg);

for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) {
common_reg:
platform_set_drvdata(pdev, s2mps11);

config.dev = &pdev->dev;
config.regmap = iodev->regmap;
config.init_data = pdata->regulators[i].initdata;
config.driver_data = s2mps11;
config.dev = &pdev->dev;
config.regmap = iodev->regmap;
config.driver_data = s2mps11;
for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) {
if (!reg_np) {
config.init_data = pdata->regulators[i].initdata;
} else {
config.init_data = rdata[i].init_data;
config.of_node = rdata[i].of_node;
}

s2mps11->rdev[i] = regulator_register(&regulators[i], &config);
if (IS_ERR(s2mps11->rdev[i])) {
Expand Down

0 comments on commit a50c6b3

Please sign in to comment.