gpiolib: acpi: Introduce NO_RESTRICTION quirk

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>
This commit is contained in:
Andy Shevchenko 2017-11-10 15:40:33 +02:00 коммит произвёл Linus Walleij
Родитель ce0929d222
Коммит 1b2ca32ab0
2 изменённых файлов: 14 добавлений и 3 удалений

Просмотреть файл

@ -496,11 +496,18 @@ int
acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info) acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
{ {
struct device *dev = &info->adev->dev; struct device *dev = &info->adev->dev;
enum gpiod_flags old = *flags;
int ret; int ret;
ret = __acpi_gpio_update_gpiod_flags(flags, info->flags); ret = __acpi_gpio_update_gpiod_flags(&old, info->flags);
if (ret) if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) {
dev_dbg(dev, "Override GPIO initialization flags\n"); 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; return ret;
} }

Просмотреть файл

@ -978,6 +978,10 @@ struct acpi_gpio_mapping {
const char *name; const char *name;
const struct acpi_gpio_params *data; const struct acpi_gpio_params *data;
unsigned int size; unsigned int size;
/* Ignore IoRestriction field */
#define ACPI_GPIO_QUIRK_NO_IO_RESTRICTION BIT(0)
unsigned int quirks; unsigned int quirks;
}; };