]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpio: Fix return value mismatch of function gpiod_get_from_of_node()
authorWaibel Georg <Georg.Waibel@sensor-technik.de>
Thu, 20 Jun 2019 21:37:08 +0000 (21:37 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:12:44 +0000 (09:12 +0200)
[ Upstream commit 025bf37725f1929542361eef2245df30badf242e ]

In case the requested gpio property is not found in the device tree, some
callers of gpiod_get_from_of_node() expect a return value of NULL, others
expect -ENOENT.
In particular devm_fwnode_get_index_gpiod_from_child() expects -ENOENT.
Currently it gets a NULL, which breaks the loop that tries all
gpio_suffixes. The result is that a gpio property is not found, even
though it is there.

This patch changes gpiod_get_from_of_node() to return -ENOENT instead
of NULL when the requested gpio property is not found in the device
tree. Additionally it modifies all calling functions to properly
evaluate the return value.

Another approach would be to leave the return value of
gpiod_get_from_of_node() as is and fix the bug in
devm_fwnode_get_index_gpiod_from_child(). Other callers would still need
to be reworked. The effort would be the same as with the chosen solution.

Signed-off-by: Georg Waibel <georg.waibel@sensor-technik.de>
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpio/gpiolib.c
drivers/regulator/da9211-regulator.c
drivers/regulator/s2mps11.c
drivers/regulator/s5m8767.c
drivers/regulator/tps65090-regulator.c

index bca3e7740ef66c8fac2b8f89866935e3655fc9c3..fd1344056e1de671494ba71cb0e0cbed7488ec85 100644 (file)
@@ -4232,8 +4232,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_index);
  *
  * Returns:
  * On successful request the GPIO pin is configured in accordance with
- * provided @dflags. If the node does not have the requested GPIO
- * property, NULL is returned.
+ * provided @dflags.
  *
  * In case of error an ERR_PTR() is returned.
  */
@@ -4255,9 +4254,6 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node,
                                        index, &flags);
 
        if (!desc || IS_ERR(desc)) {
-               /* If it is not there, just return NULL */
-               if (PTR_ERR(desc) == -ENOENT)
-                       return NULL;
                return desc;
        }
 
index 4d7fe4819c1ce056c3cc8b09069a98f20e1ad2f2..4e95e3d0fcd5b6d416a414b60c7dbf8fea8ff56c 100644 (file)
@@ -299,6 +299,8 @@ static struct da9211_pdata *da9211_parse_regulators_dt(
                                  0,
                                  GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
                                  "da9211-enable");
+               if (IS_ERR(pdata->gpiod_ren[n]))
+                       pdata->gpiod_ren[n] = NULL;
                n++;
        }
 
index 134c62db36c5d5ebb6ce2adebcf430b59ca1c8d6..b518a81f75a32bde5dd41241673d0f7a41b03f74 100644 (file)
@@ -821,7 +821,9 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
                                0,
                                GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
                                "s2mps11-regulator");
-               if (IS_ERR(gpio[reg])) {
+               if (PTR_ERR(gpio[reg]) == -ENOENT)
+                       gpio[reg] = NULL;
+               else if (IS_ERR(gpio[reg])) {
                        dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
                                reg, rdata[reg].name);
                        continue;
index bb9d1a083299fc02b6aba71cc7e8ca7f17843c57..6ca27e9d5ef7d3981d4ab4ec6b5bc45f854076d9 100644 (file)
@@ -574,7 +574,9 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
                        0,
                        GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
                        "s5m8767");
-               if (IS_ERR(rdata->ext_control_gpiod))
+               if (PTR_ERR(rdata->ext_control_gpiod) == -ENOENT)
+                       rdata->ext_control_gpiod = NULL;
+               else if (IS_ERR(rdata->ext_control_gpiod))
                        return PTR_ERR(rdata->ext_control_gpiod);
 
                rdata->id = i;
index 0614551796a19a5877d0875d1097fecfeeb998a7..f6466db579003dfed9541dc451191ecbed92fc30 100644 (file)
@@ -381,11 +381,12 @@ static struct tps65090_platform_data *tps65090_parse_dt_reg_data(
                                                                    "dcdc-ext-control-gpios", 0,
                                                                    gflags,
                                                                    "tps65090");
-                       if (IS_ERR(rpdata->gpiod))
-                               return ERR_CAST(rpdata->gpiod);
-                       if (!rpdata->gpiod)
+                       if (PTR_ERR(rpdata->gpiod) == -ENOENT) {
                                dev_err(&pdev->dev,
                                        "could not find DCDC external control GPIO\n");
+                               rpdata->gpiod = NULL;
+                       } else if (IS_ERR(rpdata->gpiod))
+                               return ERR_CAST(rpdata->gpiod);
                }
 
                if (of_property_read_u32(tps65090_matches[idx].of_node,