regulator: Add missing of_node_put()
authorAxel Lin <axel.lin@ingics.com>
Sun, 27 Jan 2013 13:16:56 +0000 (21:16 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 30 Jan 2013 10:50:27 +0000 (18:50 +0800)
of_find_node_by_name() returns a node pointer with refcount incremented, use
of_node_put() on it when done.

of_find_node_by_name() will call of_node_put() against from parameter,
thus we also need to call of_node_get(from) before calling
of_find_node_by_name().

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/regulator/88pm8607.c
drivers/regulator/da9052-regulator.c
drivers/regulator/max8907-regulator.c
drivers/regulator/max8925-regulator.c
drivers/regulator/max8997.c
drivers/regulator/mc13xxx-regulator-core.c
drivers/regulator/palmas-regulator.c
drivers/regulator/tps65910-regulator.c

index 2b55711..e99a3e4 100644 (file)
@@ -372,7 +372,7 @@ static int pm8607_regulator_dt_init(struct platform_device *pdev,
                                    struct regulator_config *config)
 {
        struct device_node *nproot, *np;
                                    struct regulator_config *config)
 {
        struct device_node *nproot, *np;
-       nproot = pdev->dev.parent->of_node;
+       nproot = of_node_get(pdev->dev.parent->of_node);
        if (!nproot)
                return -ENODEV;
        nproot = of_find_node_by_name(nproot, "regulators");
        if (!nproot)
                return -ENODEV;
        nproot = of_find_node_by_name(nproot, "regulators");
@@ -388,6 +388,7 @@ static int pm8607_regulator_dt_init(struct platform_device *pdev,
                        break;
                }
        }
                        break;
                }
        }
+       of_node_put(nproot);
        return 0;
 }
 #else
        return 0;
 }
 #else
index d096309..29d194c 100644 (file)
@@ -395,9 +395,9 @@ static int da9052_regulator_probe(struct platform_device *pdev)
                config.init_data = pdata->regulators[pdev->id];
        } else {
 #ifdef CONFIG_OF
                config.init_data = pdata->regulators[pdev->id];
        } else {
 #ifdef CONFIG_OF
-               struct device_node *nproot = da9052->dev->of_node;
-               struct device_node *np;
+               struct device_node *nproot, *np;
 
 
+               nproot = of_node_get(da9052->dev->of_node);
                if (!nproot)
                        return -ENODEV;
 
                if (!nproot)
                        return -ENODEV;
 
@@ -414,6 +414,7 @@ static int da9052_regulator_probe(struct platform_device *pdev)
                                break;
                        }
                }
                                break;
                        }
                }
+               of_node_put(nproot);
 #endif
        }
 
 #endif
        }
 
index d40cf7f..4568c15 100644 (file)
@@ -224,11 +224,11 @@ static struct of_regulator_match max8907_matches[] = {
 
 static int max8907_regulator_parse_dt(struct platform_device *pdev)
 {
 
 static int max8907_regulator_parse_dt(struct platform_device *pdev)
 {
-       struct device_node *np = pdev->dev.parent->of_node;
-       struct device_node *regulators;
+       struct device_node *np, *regulators;
        int ret;
 
        int ret;
 
-       if (!pdev->dev.parent->of_node)
+       np = of_node_get(pdev->dev.parent->of_node);
+       if (!np)
                return 0;
 
        regulators = of_find_node_by_name(np, "regulators");
                return 0;
 
        regulators = of_find_node_by_name(np, "regulators");
@@ -239,6 +239,7 @@ static int max8907_regulator_parse_dt(struct platform_device *pdev)
 
        ret = of_regulator_match(&pdev->dev, regulators, max8907_matches,
                                 ARRAY_SIZE(max8907_matches));
 
        ret = of_regulator_match(&pdev->dev, regulators, max8907_matches,
                                 ARRAY_SIZE(max8907_matches));
+       of_node_put(regulators);
        if (ret < 0) {
                dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
                        ret);
        if (ret < 0) {
                dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
                        ret);
index 446a854..0d5f64a 100644 (file)
@@ -252,7 +252,7 @@ static int max8925_regulator_dt_init(struct platform_device *pdev,
 {
        struct device_node *nproot, *np;
        int rcount;
 {
        struct device_node *nproot, *np;
        int rcount;
-       nproot = pdev->dev.parent->of_node;
+       nproot = of_node_get(pdev->dev.parent->of_node);
        if (!nproot)
                return -ENODEV;
        np = of_find_node_by_name(nproot, "regulators");
        if (!nproot)
                return -ENODEV;
        np = of_find_node_by_name(nproot, "regulators");
@@ -263,6 +263,7 @@ static int max8925_regulator_dt_init(struct platform_device *pdev,
 
        rcount = of_regulator_match(&pdev->dev, np,
                                &max8925_regulator_matches[ridx], 1);
 
        rcount = of_regulator_match(&pdev->dev, np,
                                &max8925_regulator_matches[ridx], 1);
+       of_node_put(np);
        if (rcount < 0)
                return -ENODEV;
        config->init_data =     max8925_regulator_matches[ridx].init_data;
        if (rcount < 0)
                return -ENODEV;
        config->init_data =     max8925_regulator_matches[ridx].init_data;
index 836908c..5abd0d3 100644 (file)
@@ -960,7 +960,7 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
        struct max8997_regulator_data *rdata;
        unsigned int i, dvs_voltage_nr = 1, ret;
 
        struct max8997_regulator_data *rdata;
        unsigned int i, dvs_voltage_nr = 1, ret;
 
-       pmic_np = iodev->dev->of_node;
+       pmic_np = of_node_get(iodev->dev->of_node);
        if (!pmic_np) {
                dev_err(&pdev->dev, "could not find pmic sub-node\n");
                return -ENODEV;
        if (!pmic_np) {
                dev_err(&pdev->dev, "could not find pmic sub-node\n");
                return -ENODEV;
@@ -980,6 +980,7 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
        rdata = devm_kzalloc(&pdev->dev, sizeof(*rdata) *
                                pdata->num_regulators, GFP_KERNEL);
        if (!rdata) {
        rdata = devm_kzalloc(&pdev->dev, sizeof(*rdata) *
                                pdata->num_regulators, GFP_KERNEL);
        if (!rdata) {
+               of_node_put(regulators_np);
                dev_err(&pdev->dev, "could not allocate memory for regulator data\n");
                return -ENOMEM;
        }
                dev_err(&pdev->dev, "could not allocate memory for regulator data\n");
                return -ENOMEM;
        }
@@ -1002,6 +1003,7 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
                rdata->reg_node = reg_np;
                rdata++;
        }
                rdata->reg_node = reg_np;
                rdata++;
        }
+       of_node_put(regulators_np);
 
        if (of_get_property(pmic_np, "max8997,pmic-buck1-uses-gpio-dvs", NULL))
                pdata->buck1_gpiodvs = true;
 
        if (of_get_property(pmic_np, "max8997,pmic-buck1-uses-gpio-dvs", NULL))
                pdata->buck1_gpiodvs = true;
index 2ecf1d8..5d2ab2e 100644 (file)
@@ -175,6 +175,7 @@ int mc13xxx_get_num_regulators_dt(struct platform_device *pdev)
        for_each_child_of_node(parent, child)
                num++;
 
        for_each_child_of_node(parent, child)
                num++;
 
+       of_node_put(parent);
        return num;
 }
 EXPORT_SYMBOL_GPL(mc13xxx_get_num_regulators_dt);
        return num;
 }
 EXPORT_SYMBOL_GPL(mc13xxx_get_num_regulators_dt);
@@ -197,8 +198,11 @@ struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data) * priv->num_regulators,
                            GFP_KERNEL);
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data) * priv->num_regulators,
                            GFP_KERNEL);
-       if (!data)
+       if (!data) {
+               of_node_put(parent);
                return NULL;
                return NULL;
+       }
+
        p = data;
 
        for_each_child_of_node(parent, child) {
        p = data;
 
        for_each_child_of_node(parent, child) {
@@ -217,6 +221,7 @@ struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
                        }
                }
        }
                        }
                }
        }
+       of_node_put(parent);
 
        *num_parsed = parsed;
        return data;
 
        *num_parsed = parsed;
        return data;
index c9e912f..cbaf226 100644 (file)
@@ -527,6 +527,7 @@ static void palmas_dt_to_pdata(struct device *dev,
        u32 prop;
        int idx, ret;
 
        u32 prop;
        int idx, ret;
 
+       node = of_node_get(node);
        regulators = of_find_node_by_name(node, "regulators");
        if (!regulators) {
                dev_info(dev, "regulator node not found\n");
        regulators = of_find_node_by_name(node, "regulators");
        if (!regulators) {
                dev_info(dev, "regulator node not found\n");
@@ -535,6 +536,7 @@ static void palmas_dt_to_pdata(struct device *dev,
 
        ret = of_regulator_match(dev, regulators, palmas_matches,
                        PALMAS_NUM_REGS);
 
        ret = of_regulator_match(dev, regulators, palmas_matches,
                        PALMAS_NUM_REGS);
+       of_node_put(regulators);
        if (ret < 0) {
                dev_err(dev, "Error parsing regulator init data: %d\n", ret);
                return;
        if (ret < 0) {
                dev_err(dev, "Error parsing regulator init data: %d\n", ret);
                return;
index b0e4c0b..6ba6931 100644 (file)
@@ -964,8 +964,7 @@ static struct tps65910_board *tps65910_parse_dt_reg_data(
 {
        struct tps65910_board *pmic_plat_data;
        struct tps65910 *tps65910 = dev_get_drvdata(pdev->dev.parent);
 {
        struct tps65910_board *pmic_plat_data;
        struct tps65910 *tps65910 = dev_get_drvdata(pdev->dev.parent);
-       struct device_node *np = pdev->dev.parent->of_node;
-       struct device_node *regulators;
+       struct device_node *np, *regulators;
        struct of_regulator_match *matches;
        unsigned int prop;
        int idx = 0, ret, count;
        struct of_regulator_match *matches;
        unsigned int prop;
        int idx = 0, ret, count;
@@ -978,6 +977,7 @@ static struct tps65910_board *tps65910_parse_dt_reg_data(
                return NULL;
        }
 
                return NULL;
        }
 
+       np = of_node_get(pdev->dev.parent->of_node);
        regulators = of_find_node_by_name(np, "regulators");
        if (!regulators) {
                dev_err(&pdev->dev, "regulator node not found\n");
        regulators = of_find_node_by_name(np, "regulators");
        if (!regulators) {
                dev_err(&pdev->dev, "regulator node not found\n");
@@ -994,11 +994,13 @@ static struct tps65910_board *tps65910_parse_dt_reg_data(
                matches = tps65911_matches;
                break;
        default:
                matches = tps65911_matches;
                break;
        default:
+               of_node_put(regulators);
                dev_err(&pdev->dev, "Invalid tps chip version\n");
                return NULL;
        }
 
        ret = of_regulator_match(&pdev->dev, regulators, matches, count);
                dev_err(&pdev->dev, "Invalid tps chip version\n");
                return NULL;
        }
 
        ret = of_regulator_match(&pdev->dev, regulators, matches, count);
+       of_node_put(regulators);
        if (ret < 0) {
                dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
                        ret);
        if (ret < 0) {
                dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
                        ret);