diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-04-04 14:40:20 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-04-04 14:40:20 -0400 |
| commit | 308ac7563944787f8afc508568a3cda601c35a48 (patch) | |
| tree | 509f767dbc5e594098ca04ed7552cdb852c6f7e0 | |
| parent | b824a957bfb3f7f5ab2f7216239882f9092d2c27 (diff) | |
| parent | 693bdaa164b40b7aa6018b98af6f7e40dbd52457 (diff) | |
Merge tag 'gpio-v4.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull late GPIO fixes from Linus Walleij:
"Some late coming ACPI fixes for GPIO.
We're dealing with ACPI issues here. The first is related to wake IRQs
on Bay Trail/Cherry Trail CPUs which are common in laptops. The second
is about proper probe deferral when reading _CRS properties.
For my untrained eye it seems there was some quarrel between the BIOS
and the kernel about who is supposed to deal with wakeups from GPIO
lines"
* tag 'gpio-v4.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
ACPI / gpio: do not fall back to parsing _CRS when we get a deferral
gpio: acpi: Call enable_irq_wake for _IAE GpioInts with Wake set
| -rw-r--r-- | drivers/gpio/gpiolib-acpi.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index 9b37a3692b3f..2bd683e2be02 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c | |||
| @@ -266,6 +266,9 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, | |||
| 266 | goto fail_free_event; | 266 | goto fail_free_event; |
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | if (agpio->wake_capable == ACPI_WAKE_CAPABLE) | ||
| 270 | enable_irq_wake(irq); | ||
| 271 | |||
| 269 | list_add_tail(&event->node, &acpi_gpio->events); | 272 | list_add_tail(&event->node, &acpi_gpio->events); |
| 270 | return AE_OK; | 273 | return AE_OK; |
| 271 | 274 | ||
| @@ -339,6 +342,9 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip) | |||
| 339 | list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) { | 342 | list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) { |
| 340 | struct gpio_desc *desc; | 343 | struct gpio_desc *desc; |
| 341 | 344 | ||
| 345 | if (irqd_is_wakeup_set(irq_get_irq_data(event->irq))) | ||
| 346 | disable_irq_wake(event->irq); | ||
| 347 | |||
| 342 | free_irq(event->irq, event); | 348 | free_irq(event->irq, event); |
| 343 | desc = event->desc; | 349 | desc = event->desc; |
| 344 | if (WARN_ON(IS_ERR(desc))) | 350 | if (WARN_ON(IS_ERR(desc))) |
| @@ -571,8 +577,10 @@ struct gpio_desc *acpi_find_gpio(struct device *dev, | |||
| 571 | } | 577 | } |
| 572 | 578 | ||
| 573 | desc = acpi_get_gpiod_by_index(adev, propname, idx, &info); | 579 | desc = acpi_get_gpiod_by_index(adev, propname, idx, &info); |
| 574 | if (!IS_ERR(desc) || (PTR_ERR(desc) == -EPROBE_DEFER)) | 580 | if (!IS_ERR(desc)) |
| 575 | break; | 581 | break; |
| 582 | if (PTR_ERR(desc) == -EPROBE_DEFER) | ||
| 583 | return ERR_CAST(desc); | ||
| 576 | } | 584 | } |
| 577 | 585 | ||
| 578 | /* Then from plain _CRS GPIOs */ | 586 | /* Then from plain _CRS GPIOs */ |
