gpiolib: acpi: Introduce NO_RESTRICTION quirk
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 10 Nov 2017 13:40:33 +0000 (15:40 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 30 Nov 2017 09:53:52 +0000 (10:53 +0100)
Allow to relax IoRestriction for certain cases.

One of the use case is incorrectly cooked ACPI table where interrupt pin is
defined with GpioIo() macro with IoRestrictionOutputOnly.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib-acpi.c
include/linux/acpi.h

index 711f64b..430a147 100644 (file)
@@ -496,11 +496,18 @@ int
 acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
 {
        struct device *dev = &info->adev->dev;
+       enum gpiod_flags old = *flags;
        int ret;
 
-       ret = __acpi_gpio_update_gpiod_flags(flags, info->flags);
-       if (ret)
-               dev_dbg(dev, "Override GPIO initialization flags\n");
+       ret = __acpi_gpio_update_gpiod_flags(&old, info->flags);
+       if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) {
+               if (ret)
+                       dev_warn(dev, FW_BUG "GPIO not in correct mode, fixing\n");
+       } else {
+               if (ret)
+                       dev_dbg(dev, "Override GPIO initialization flags\n");
+               *flags = old;
+       }
 
        return ret;
 }
index 25fe77f..06b6eb7 100644 (file)
@@ -978,6 +978,10 @@ struct acpi_gpio_mapping {
        const char *name;
        const struct acpi_gpio_params *data;
        unsigned int size;
+
+/* Ignore IoRestriction field */
+#define ACPI_GPIO_QUIRK_NO_IO_RESTRICTION      BIT(0)
+
        unsigned int quirks;
 };