Skip to content

Commit

Permalink
regulator: max77686: Add device tree support.
Browse files Browse the repository at this point in the history
This patch device tree support for regulator driver. It uses the parent
(mfd's) DT node to parse the regulator data for max77686.

Signed-off-by: Yadwinder Singh Brar <yadi.brar@samsung.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Yadwinder Singh Brar authored and Mark Brown committed Jul 5, 2012
1 parent 6c3b956 commit 4706fca
Showing 1 changed file with 57 additions and 1 deletion.
58 changes: 57 additions & 1 deletion drivers/regulator/max77686.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
#include <linux/mfd/max77686.h>
#include <linux/mfd/max77686-private.h>

Expand Down Expand Up @@ -233,6 +234,50 @@ static struct regulator_desc regulators[] = {
regulator_desc_buck(9),
};

#ifdef CONFIG_OF
static int max77686_pmic_dt_parse_pdata(struct max77686_dev *iodev,
struct max77686_platform_data *pdata)
{
struct device_node *pmic_np, *regulators_np;
struct max77686_regulator_data *rdata;
struct of_regulator_match rmatch;
unsigned int i;

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

pdata->num_regulators = ARRAY_SIZE(regulators);
rdata = devm_kzalloc(iodev->dev, sizeof(*rdata) *
pdata->num_regulators, GFP_KERNEL);
if (!rdata) {
dev_err(iodev->dev,
"could not allocate memory for regulator data\n");
return -ENOMEM;
}

for (i = 0; i < pdata->num_regulators; i++) {
rmatch.name = regulators[i].name;
rmatch.init_data = NULL;
of_regulator_match(iodev->dev, regulators_np, &rmatch, 1);
rdata[i].initdata = rmatch.init_data;
}

pdata->regulators = rdata;

return 0;
}
#else
static int max77686_pmic_dt_parse_pdata(struct max77686_dev *iodev,
struct max77686_platform_data *pdata)
{
return 0;
}
#endif /* CONFIG_OF */

static __devinit int max77686_pmic_probe(struct platform_device *pdev)
{
struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
Expand All @@ -245,7 +290,18 @@ static __devinit int max77686_pmic_probe(struct platform_device *pdev)

dev_dbg(&pdev->dev, "%s\n", __func__);

if (!pdata || pdata->num_regulators != MAX77686_REGULATORS) {
if (!pdata) {
dev_err(&pdev->dev, "no platform data found for regulator\n");
return -ENODEV;
}

if (iodev->dev->of_node) {
ret = max77686_pmic_dt_parse_pdata(iodev, pdata);
if (ret)
return ret;
}

if (pdata->num_regulators != MAX77686_REGULATORS) {
dev_err(&pdev->dev,
"Invalid initial data for regulator's initialiation\n");
return -EINVAL;
Expand Down

0 comments on commit 4706fca

Please sign in to comment.