diff options
author | zoro <long17.cool@163.com> | 2018-11-14 12:38:22 +0300 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-11-16 01:15:32 +0300 |
commit | fe06051dbf8abf5962d9258c4a863056bdfa6eae (patch) | |
tree | 4c171e969a9fb8981445fa2d6c95cd244e207732 /drivers/regulator/core.c | |
parent | 96392c3d8ca47f6654dfa40680c926b1a3419754 (diff) | |
download | linux-fe06051dbf8abf5962d9258c4a863056bdfa6eae.tar.xz |
regulator/of_get_regulator: add child path to find the regulator supplier
when the VIR_LDO1 regulator supplier is it's brother,
we can't find the supplier.
example code :
&vir_regulator {
ldo0_vir: ldo0-virtual {
regulator-compatible = "VIR_LDO0";
regulator-name= "VIR_LDO0";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <2000000>;
};
ldo1_vir: ldo1-virtual {
regulator-compatible = "VIR_LDO1";
regulator-name= "VIR_LDO1";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3000000>;
ldo1-supply = <&ldo0_vir>;
};
...
}
so we add the child ptah to find the suppier.
Signed-off-by: zoro <long17.cool@163.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/regulator/core.c')
-rw-r--r-- | drivers/regulator/core.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 2c66b528aede..55207264c212 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -228,6 +228,37 @@ static void regulator_unlock_supply(struct regulator_dev *rdev) } /** + * of_get_child_regulator - get a child regulator device node + * based on supply name + * @parent: Parent device node + * @prop_name: Combination regulator supply name and "-supply" + * + * Traverse all child nodes. + * Extract the child regulator device node corresponding to the supply name. + * returns the device node corresponding to the regulator if found, else + * returns NULL. + */ +static struct device_node *of_get_child_regulator(struct device_node *parent, + const char *prop_name) +{ + struct device_node *regnode = NULL; + struct device_node *child = NULL; + + for_each_child_of_node(parent, child) { + regnode = of_parse_phandle(child, prop_name, 0); + + if (!regnode) { + regnode = of_get_child_regulator(child, prop_name); + if (regnode) + return regnode; + } else { + return regnode; + } + } + return NULL; +} + +/** * of_get_regulator - get a regulator device node based on supply name * @dev: Device pointer for the consumer (of regulator) device * @supply: regulator supply name @@ -247,6 +278,10 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp regnode = of_parse_phandle(dev->of_node, prop_name, 0); if (!regnode) { + regnode = of_get_child_regulator(dev->of_node, prop_name); + if (regnode) + return regnode; + dev_dbg(dev, "Looking up %s property in node %pOF failed\n", prop_name, dev->of_node); return NULL; |