Patch adds device tree probe support for mc13783-regulator driver.

Signed-off-by: Alexander Shiyan <shc_w...@mail.ru>
---
 drivers/regulator/mc13783-regulator.c      | 55 ++++++++++++++++++++++--------
 drivers/regulator/mc13xxx-regulator-core.c |  2 ++
 2 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/drivers/regulator/mc13783-regulator.c 
b/drivers/regulator/mc13783-regulator.c
index c46c670..fba8d5e 100644
--- a/drivers/regulator/mc13783-regulator.c
+++ b/drivers/regulator/mc13783-regulator.c
@@ -398,33 +398,62 @@ static int mc13783_regulator_probe(struct platform_device 
*pdev)
        struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
        struct mc13xxx_regulator_platform_data *pdata =
                dev_get_platdata(&pdev->dev);
-       struct mc13xxx_regulator_init_data *init_data;
+       struct mc13xxx_regulator_init_data *mc13xxx_data;
        struct regulator_config config = { };
-       int i, ret;
+       int i, ret, num_regulators, num_parsed;
 
-       dev_dbg(&pdev->dev, "%s id %d\n", __func__, pdev->id);
+       num_regulators = mc13xxx_get_num_regulators_dt(pdev);
 
-       if (!pdata)
+       if (num_regulators <= 0 && pdata)
+               num_regulators = pdata->num_regulators;
+       if (num_regulators <= 0)
                return -EINVAL;
 
+       num_parsed = num_regulators;
+
        priv = devm_kzalloc(&pdev->dev, sizeof(*priv) +
-                       pdata->num_regulators * sizeof(priv->regulators[0]),
+                       num_regulators * sizeof(priv->regulators[0]),
                        GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
+       priv->num_regulators = num_regulators;
        priv->mc13xxx_regulators = mc13783_regulators;
        priv->mc13xxx = mc13783;
+       platform_set_drvdata(pdev, priv);
 
-       for (i = 0; i < pdata->num_regulators; i++) {
-               struct regulator_desc *desc;
+       mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13783_regulators,
+                                       ARRAY_SIZE(mc13783_regulators),
+                                       &num_parsed);
+       if (num_parsed != num_regulators) {
+               dev_warn(&pdev->dev,
+               "parsed %d != regulators %d - check your device tree!\n",
+                       num_parsed, num_regulators);
 
-               init_data = &pdata->regulators[i];
-               desc = &mc13783_regulators[init_data->id].desc;
+               num_regulators = num_parsed;
+               priv->num_regulators = num_regulators;
+       }
+
+       for (i = 0; i < num_regulators; i++) {
+               struct regulator_init_data *init_data;
+               struct regulator_desc *desc;
+               struct device_node *node = NULL;
+               int id;
+
+               if (mc13xxx_data) {
+                       id = mc13xxx_data[i].id;
+                       init_data = mc13xxx_data[i].init_data;
+                       node = mc13xxx_data[i].node;
+               } else {
+                       id = pdata->regulators[i].id;
+                       init_data = pdata->regulators[i].init_data;
+               }
+               desc = &mc13783_regulators[id].desc;
 
                config.dev = &pdev->dev;
-               config.init_data = init_data->init_data;
+               config.init_data = init_data;
                config.driver_data = priv;
+               config.of_node = node;
 
                priv->regulators[i] = regulator_register(desc, &config);
                if (IS_ERR(priv->regulators[i])) {
@@ -435,8 +464,6 @@ static int mc13783_regulator_probe(struct platform_device 
*pdev)
                }
        }
 
-       platform_set_drvdata(pdev, priv);
-
        return 0;
 err:
        while (--i >= 0)
@@ -448,13 +475,11 @@ err:
 static int mc13783_regulator_remove(struct platform_device *pdev)
 {
        struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev);
-       struct mc13xxx_regulator_platform_data *pdata =
-               dev_get_platdata(&pdev->dev);
        int i;
 
        platform_set_drvdata(pdev, NULL);
 
-       for (i = 0; i < pdata->num_regulators; i++)
+       for (i = 0; i < priv->num_regulators; i++)
                regulator_unregister(priv->regulators[i]);
 
        return 0;
diff --git a/drivers/regulator/mc13xxx-regulator-core.c 
b/drivers/regulator/mc13xxx-regulator-core.c
index 23cf9f9..836e21e 100644
--- a/drivers/regulator/mc13xxx-regulator-core.c
+++ b/drivers/regulator/mc13xxx-regulator-core.c
@@ -205,6 +205,8 @@ struct mc13xxx_regulator_init_data 
*mc13xxx_parse_regulators_dt(
 
        for_each_child_of_node(parent, child) {
                for (i = 0; i < num_regulators; i++) {
+                       if (!regulators[i].desc.name)
+                               continue;
                        if (!of_node_cmp(child->name,
                                         regulators[i].desc.name)) {
 
-- 
1.8.1.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to