gpiolib: of: factor out code overriding gpio line polarity
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 18 Oct 2022 05:41:09 +0000 (22:41 -0700)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 20 Oct 2022 11:54:46 +0000 (13:54 +0200)
There are several instances where we use a separate property to
override polarity specified in gpio property. Factor it out into
a separate function.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-of.c

index d22498c..6faf0dc 100644 (file)
@@ -130,6 +130,28 @@ bool of_gpio_need_valid_mask(const struct gpio_chip *gc)
        return false;
 }
 
+/*
+ * Overrides stated polarity of a gpio line and warns when there is a
+ * discrepancy.
+ */
+static void of_gpio_quirk_polarity(const struct device_node *np,
+                                  bool active_high,
+                                  enum of_gpio_flags *flags)
+{
+       if (active_high) {
+               if (*flags & OF_GPIO_ACTIVE_LOW) {
+                       pr_warn("%s GPIO handle specifies active low - ignored\n",
+                               of_node_full_name(np));
+                       *flags &= ~OF_GPIO_ACTIVE_LOW;
+               }
+       } else {
+               if (!(*flags & OF_GPIO_ACTIVE_LOW))
+                       pr_info("%s enforce active low on GPIO handle\n",
+                               of_node_full_name(np));
+               *flags |= OF_GPIO_ACTIVE_LOW;
+       }
+}
+
 static void of_gpio_flags_quirks(const struct device_node *np,
                                 const char *propname,
                                 enum of_gpio_flags *flags,
@@ -145,7 +167,7 @@ static void of_gpio_flags_quirks(const struct device_node *np,
             (!(strcmp(propname, "enable-gpio") &&
                strcmp(propname, "enable-gpios")) &&
              of_device_is_compatible(np, "regulator-gpio")))) {
-               bool active_low = !of_property_read_bool(np,
+               bool active_high = of_property_read_bool(np,
                                                         "enable-active-high");
                /*
                 * The regulator GPIO handles are specified such that the
@@ -153,13 +175,7 @@ static void of_gpio_flags_quirks(const struct device_node *np,
                 * the polarity of the GPIO line. Any phandle flags must
                 * be actively ignored.
                 */
-               if ((*flags & OF_GPIO_ACTIVE_LOW) && !active_low) {
-                       pr_warn("%s GPIO handle specifies active low - ignored\n",
-                               of_node_full_name(np));
-                       *flags &= ~OF_GPIO_ACTIVE_LOW;
-               }
-               if (active_low)
-                       *flags |= OF_GPIO_ACTIVE_LOW;
+               of_gpio_quirk_polarity(np, active_high, flags);
        }
        /*
         * Legacy open drain handling for fixed voltage regulators.
@@ -200,18 +216,10 @@ static void of_gpio_flags_quirks(const struct device_node *np,
                                 * conflict and the "spi-cs-high" flag will
                                 * take precedence.
                                 */
-                               if (of_property_read_bool(child, "spi-cs-high")) {
-                                       if (*flags & OF_GPIO_ACTIVE_LOW) {
-                                               pr_warn("%s GPIO handle specifies active low - ignored\n",
-                                                       of_node_full_name(child));
-                                               *flags &= ~OF_GPIO_ACTIVE_LOW;
-                                       }
-                               } else {
-                                       if (!(*flags & OF_GPIO_ACTIVE_LOW))
-                                               pr_info("%s enforce active low on chipselect handle\n",
-                                                       of_node_full_name(child));
-                                       *flags |= OF_GPIO_ACTIVE_LOW;
-                               }
+                               bool active_high = of_property_read_bool(child,
+                                                               "spi-cs-high");
+                               of_gpio_quirk_polarity(child, active_high,
+                                                      flags);
                                of_node_put(child);
                                break;
                        }