diff options
author | Jisheng Zhang <jszhang@marvell.com> | 2016-11-10 04:21:29 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-11-11 10:38:08 -0500 |
commit | 09f2ba0b0b7c44ecea49cf69a708203b76ba5535 (patch) | |
tree | 042df33ac99f77d8b86ac427431e267c33561c35 | |
parent | 1001354ca34179f3db924eb66672442a173147dc (diff) |
regulator: gpio: properly check return value of of_get_named_gpio
The function of_get_named_gpio() could return -ENOENT, -EPROBE_DEFER
-EINVAL and so on. Currently, for the optional property "enable-gpio",
we only check -EPROBE_DEFER, this is not enough since there may be
misconfigured "enable-gpio" in the DTB, of_get_named_gpio() will return
-EINVAL in this case, we should return immediately here. And for the
optional property "gpios", we didn't check the return value, the driver
will continue to the point where gpio_request_array() is called, it
doesn't make sense to continue if we got -EPROBE_DEFER or -EINVAL here.
This patch tries to address these two issues by properly checking the
return value of of_get_named_gpio.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/regulator/gpio-regulator.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c index 83e89e5d4752..0fce06acfaec 100644 --- a/drivers/regulator/gpio-regulator.c +++ b/drivers/regulator/gpio-regulator.c | |||
@@ -162,8 +162,8 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np, | |||
162 | of_property_read_u32(np, "startup-delay-us", &config->startup_delay); | 162 | of_property_read_u32(np, "startup-delay-us", &config->startup_delay); |
163 | 163 | ||
164 | config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0); | 164 | config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0); |
165 | if (config->enable_gpio == -EPROBE_DEFER) | 165 | if (config->enable_gpio < 0 && config->enable_gpio != -ENOENT) |
166 | return ERR_PTR(-EPROBE_DEFER); | 166 | return ERR_PTR(config->enable_gpio); |
167 | 167 | ||
168 | /* Fetch GPIOs. - optional property*/ | 168 | /* Fetch GPIOs. - optional property*/ |
169 | ret = of_gpio_count(np); | 169 | ret = of_gpio_count(np); |
@@ -190,8 +190,11 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np, | |||
190 | 190 | ||
191 | for (i = 0; i < config->nr_gpios; i++) { | 191 | for (i = 0; i < config->nr_gpios; i++) { |
192 | gpio = of_get_named_gpio(np, "gpios", i); | 192 | gpio = of_get_named_gpio(np, "gpios", i); |
193 | if (gpio < 0) | 193 | if (gpio < 0) { |
194 | if (gpio != -ENOENT) | ||
195 | return ERR_PTR(gpio); | ||
194 | break; | 196 | break; |
197 | } | ||
195 | config->gpios[i].gpio = gpio; | 198 | config->gpios[i].gpio = gpio; |
196 | if (proplen > 0) { | 199 | if (proplen > 0) { |
197 | of_property_read_u32_index(np, "gpios-states", | 200 | of_property_read_u32_index(np, "gpios-states", |