gpiolib: of: add a quirk for reset line polarity for Himax LCDs
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 18 Oct 2022 05:41:11 +0000 (22:41 -0700)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 20 Oct 2022 11:57:54 +0000 (13:57 +0200)
Existing DTS that use legacy (non-standard) property name for the reset
line "gpios-reset" also specify incorrect polarity (0 which maps to
"active high"). Add a quirk to force polarity to "active low" so that
once driver is converted to gpiod API that pays attention to line
polarity it will work properly.

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 c2a55ffb2b2032a26dced83bc6a144af5d66d9c2..52616848a37c40d1c609b0ebf019563f073378f6 100644 (file)
@@ -152,11 +152,47 @@ static void of_gpio_quirk_polarity(const struct device_node *np,
        }
 }
 
+/*
+ * This quirk does static polarity overrides in cases where existing
+ * DTS specified incorrect polarity.
+ */
+static void of_gpio_try_fixup_polarity(const struct device_node *np,
+                                      const char *propname,
+                                      enum of_gpio_flags *flags)
+{
+       static const struct {
+               const char *compatible;
+               const char *propname;
+               bool active_high;
+       } gpios[] = {
+#if !IS_ENABLED(CONFIG_LCD_HX8357)
+               /*
+                * Himax LCD controllers used incorrectly named
+                * "gpios-reset" property and also specified wrong
+                * polarity.
+                */
+               { "himax,hx8357",       "gpios-reset",  false },
+               { "himax,hx8369",       "gpios-reset",  false },
+#endif
+       };
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(gpios); i++) {
+               if (of_device_is_compatible(np, gpios[i].compatible) &&
+                   !strcmp(propname, gpios[i].propname)) {
+                       of_gpio_quirk_polarity(np, gpios[i].active_high, flags);
+                       break;
+               }
+       }
+}
+
 static void of_gpio_flags_quirks(const struct device_node *np,
                                 const char *propname,
                                 enum of_gpio_flags *flags,
                                 int index)
 {
+       of_gpio_try_fixup_polarity(np, propname, flags);
+
        /*
         * Some GPIO fixed regulator quirks.
         * Note that active low is the default.