^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ACPI helpers for GPIO API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2012, Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Authors: Mathias Nyman <mathias.nyman@linux.intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Mika Westerberg <mika.westerberg@linux.intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/gpio/driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/gpio/machine.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/pinctrl/pinctrl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include "gpiolib.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include "gpiolib-acpi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static int run_edge_events_on_boot = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) module_param(run_edge_events_on_boot, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) MODULE_PARM_DESC(run_edge_events_on_boot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) static char *ignore_wake;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) module_param(ignore_wake, charp, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) MODULE_PARM_DESC(ignore_wake,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) "controller@pin combos on which to ignore the ACPI wake flag "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) "ignore_wake=controller@pin[,controller@pin[,...]]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct acpi_gpiolib_dmi_quirk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) bool no_edge_events_on_boot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) char *ignore_wake;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * struct acpi_gpio_event - ACPI GPIO event handler data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * @node: list-entry of the events list of the struct acpi_gpio_chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * @handle: handle of ACPI method to execute when the IRQ triggers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * @handler: handler function to pass to request_irq() when requesting the IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * @pin: GPIO pin number on the struct gpio_chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * @irq: Linux IRQ number for the event, for request_irq() / free_irq()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * @irqflags: flags to pass to request_irq() when requesting the IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * @irq_is_wake: If the ACPI flags indicate the IRQ is a wakeup source
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * @irq_requested:True if request_irq() has been done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * @desc: struct gpio_desc for the GPIO pin for this event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct acpi_gpio_event {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) irq_handler_t handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned int pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) unsigned int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned long irqflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) bool irq_is_wake;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) bool irq_requested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct acpi_gpio_connection {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) unsigned int pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct acpi_gpio_chip {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * ACPICA requires that the first field of the context parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * passed to acpi_install_address_space_handler() is large enough
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * to hold struct acpi_connection_info.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct acpi_connection_info conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct list_head conns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct mutex conn_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct gpio_chip *chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct list_head events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct list_head deferred_req_irqs_list_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * For GPIO chips which call acpi_gpiochip_request_interrupts() before late_init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * (so builtin drivers) we register the ACPI GpioInt IRQ handlers from a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * late_initcall_sync() handler, so that other builtin drivers can register their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * OpRegions before the event handlers can run. This list contains GPIO chips
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * for which the acpi_gpiochip_request_irqs() call has been deferred.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static DEFINE_MUTEX(acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static LIST_HEAD(acpi_gpio_deferred_req_irqs_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static bool acpi_gpio_deferred_req_irqs_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (!gc->parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return ACPI_HANDLE(gc->parent) == data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * @path: ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * @pin: ACPI GPIO pin number (0-based, controller-relative)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * Return: GPIO descriptor to use with Linux generic GPIO API, or ERR_PTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * controller does not have GPIO chip registered at the moment. This is to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * support probe deferral.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct gpio_chip *chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) status = acpi_get_handle(NULL, path, &handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) chip = gpiochip_find(handle, acpi_gpiochip_find);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (!chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return ERR_PTR(-EPROBE_DEFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return gpiochip_get_desc(chip, pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) struct acpi_gpio_event *event = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) acpi_evaluate_object(event->handle, NULL, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct acpi_gpio_event *event = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) acpi_execute_simple_method(event->handle, NULL, event->pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static void acpi_gpio_chip_dh(acpi_handle handle, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* The address of this function is used as a key. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct acpi_resource_gpio **agpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) struct acpi_resource_gpio *gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) gpio = &ares->data.gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) *agpio = gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) EXPORT_SYMBOL_GPL(acpi_gpio_get_irq_resource);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) static void acpi_gpiochip_request_irq(struct acpi_gpio_chip *acpi_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) struct acpi_gpio_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) int ret, value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ret = request_threaded_irq(event->irq, NULL, event->handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) event->irqflags | IRQF_ONESHOT, "ACPI:Event", event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) dev_err(acpi_gpio->chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) "Failed to setup interrupt handler for %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) event->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) if (event->irq_is_wake)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) enable_irq_wake(event->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) event->irq_requested = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) /* Make sure we trigger the initial state of edge-triggered IRQs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (run_edge_events_on_boot &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) (event->irqflags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) value = gpiod_get_raw_value_cansleep(event->desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) event->handler(event->irq, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) static void acpi_gpiochip_request_irqs(struct acpi_gpio_chip *acpi_gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct acpi_gpio_event *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) list_for_each_entry(event, &acpi_gpio->events, node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) acpi_gpiochip_request_irq(acpi_gpio, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) static bool acpi_gpio_in_ignore_list(const char *controller_in, int pin_in)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) const char *controller, *pin_str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) int len, pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) char *endp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) controller = ignore_wake;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) while (controller) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) pin_str = strchr(controller, '@');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (!pin_str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) len = pin_str - controller;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (len == strlen(controller_in) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) strncmp(controller, controller_in, len) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) pin = simple_strtoul(pin_str + 1, &endp, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (*endp != 0 && *endp != ',')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (pin == pin_in)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) controller = strchr(controller, ',');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (controller)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) controller++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) pr_err_once("Error invalid value for gpiolib_acpi.ignore_wake: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) ignore_wake);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static bool acpi_gpio_irq_is_wake(struct device *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) struct acpi_resource_gpio *agpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) int pin = agpio->pin_table[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) if (agpio->wake_capable != ACPI_WAKE_CAPABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (acpi_gpio_in_ignore_list(dev_name(parent), pin)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) dev_info(parent, "Ignoring wakeup on pin %d\n", pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /* Always returns AE_OK so that we keep looping over the resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) void *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct acpi_gpio_chip *acpi_gpio = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct gpio_chip *chip = acpi_gpio->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct acpi_resource_gpio *agpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) acpi_handle handle, evt_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct acpi_gpio_event *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) irq_handler_t handler = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) int ret, pin, irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (!acpi_gpio_get_irq_resource(ares, &agpio))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) pin = agpio->pin_table[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (pin <= 255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) char ev_name[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) sprintf(ev_name, "_%c%02hhX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) handler = acpi_gpio_irq_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (!handler) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) handler = acpi_gpio_irq_handler_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) if (!handler)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) GPIO_ACTIVE_HIGH, GPIOD_IN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (IS_ERR(desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) dev_err(chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) "Failed to request GPIO for pin 0x%04X, err %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) pin, PTR_ERR(desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) ret = gpiochip_lock_as_irq(chip, pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) dev_err(chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) "Failed to lock GPIO pin 0x%04X as interrupt, err %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) pin, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) goto fail_free_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) irq = gpiod_to_irq(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (irq < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) dev_err(chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) "Failed to translate GPIO pin 0x%04X to IRQ, err %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) pin, irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) goto fail_unlock_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) event = kzalloc(sizeof(*event), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (!event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) goto fail_unlock_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) event->irqflags = IRQF_ONESHOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) if (agpio->triggering == ACPI_LEVEL_SENSITIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (agpio->polarity == ACPI_ACTIVE_HIGH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) event->irqflags |= IRQF_TRIGGER_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) event->irqflags |= IRQF_TRIGGER_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) switch (agpio->polarity) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) case ACPI_ACTIVE_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) event->irqflags |= IRQF_TRIGGER_RISING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) case ACPI_ACTIVE_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) event->irqflags |= IRQF_TRIGGER_FALLING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) event->irqflags |= IRQF_TRIGGER_RISING |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) IRQF_TRIGGER_FALLING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) event->handle = evt_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) event->handler = handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) event->irq = irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) event->irq_is_wake = acpi_gpio_irq_is_wake(chip->parent, agpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) event->pin = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) event->desc = desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) list_add_tail(&event->node, &acpi_gpio->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) fail_unlock_irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) gpiochip_unlock_as_irq(chip, pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) fail_free_desc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) gpiochip_free_own_desc(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * @chip: GPIO chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * ACPI5 platforms can use GPIO signaled ACPI events. These GPIO interrupts are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * handled by ACPI event methods which need to be called from the GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * chip's interrupt handler. acpi_gpiochip_request_interrupts() finds out which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * GPIO pins have ACPI event methods and assigns interrupt handlers that calls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) * the ACPI event methods for those pins.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) struct acpi_gpio_chip *acpi_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) bool defer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (!chip->parent || !chip->to_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) if (!handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) acpi_walk_resources(handle, "_AEI",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) acpi_gpiochip_alloc_event, acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) defer = !acpi_gpio_deferred_req_irqs_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (defer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) list_add(&acpi_gpio->deferred_req_irqs_list_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) &acpi_gpio_deferred_req_irqs_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (defer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) acpi_gpiochip_request_irqs(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) EXPORT_SYMBOL_GPL(acpi_gpiochip_request_interrupts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * @chip: GPIO chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) * Free interrupts associated with GPIO ACPI event method for the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) * GPIO chip.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) struct acpi_gpio_chip *acpi_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) struct acpi_gpio_event *event, *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (!chip->parent || !chip->to_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) if (!handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (!list_empty(&acpi_gpio->deferred_req_irqs_list_entry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) list_del_init(&acpi_gpio->deferred_req_irqs_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (event->irq_requested) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (event->irq_is_wake)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) disable_irq_wake(event->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) free_irq(event->irq, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) gpiochip_unlock_as_irq(chip, event->pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) gpiochip_free_own_desc(event->desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) list_del(&event->node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) kfree(event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) EXPORT_SYMBOL_GPL(acpi_gpiochip_free_interrupts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) int acpi_dev_add_driver_gpios(struct acpi_device *adev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) const struct acpi_gpio_mapping *gpios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (adev && gpios) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) adev->driver_gpios = gpios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) void acpi_dev_remove_driver_gpios(struct acpi_device *adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) adev->driver_gpios = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) EXPORT_SYMBOL_GPL(acpi_dev_remove_driver_gpios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) static void devm_acpi_dev_release_driver_gpios(struct device *dev, void *res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) acpi_dev_remove_driver_gpios(ACPI_COMPANION(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) int devm_acpi_dev_add_driver_gpios(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) const struct acpi_gpio_mapping *gpios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) void *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) res = devres_alloc(devm_acpi_dev_release_driver_gpios, 0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (!res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), gpios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) devres_free(res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) devres_add(dev, res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) EXPORT_SYMBOL_GPL(devm_acpi_dev_add_driver_gpios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) void devm_acpi_dev_remove_driver_gpios(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) WARN_ON(devres_release(dev, devm_acpi_dev_release_driver_gpios, NULL, NULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) EXPORT_SYMBOL_GPL(devm_acpi_dev_remove_driver_gpios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) const char *name, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct fwnode_reference_args *args,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) unsigned int *quirks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) const struct acpi_gpio_mapping *gm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (!adev->driver_gpios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) for (gm = adev->driver_gpios; gm->name; gm++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) const struct acpi_gpio_params *par = gm->data + index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) args->fwnode = acpi_fwnode_handle(adev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) args->args[0] = par->crs_entry_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) args->args[1] = par->line_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) args->args[2] = par->active_low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) args->nargs = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) *quirks = gm->quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) static enum gpiod_flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) switch (agpio->io_restriction) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) case ACPI_IO_RESTRICT_INPUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return GPIOD_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) case ACPI_IO_RESTRICT_OUTPUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) * ACPI GPIO resources don't contain an initial value for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) * GPIO. Therefore we deduce that value from the pull field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) * instead. If the pin is pulled up we assume default to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) * high, if it is pulled down we assume default to be low,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) * otherwise we leave pin untouched.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) switch (agpio->pin_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) case ACPI_PIN_CONFIG_PULLUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) return GPIOD_OUT_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) case ACPI_PIN_CONFIG_PULLDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return GPIOD_OUT_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) * Assume that the BIOS has configured the direction and pull
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) * accordingly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) return GPIOD_ASIS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) __acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, enum gpiod_flags update)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) const enum gpiod_flags mask =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) GPIOD_FLAGS_BIT_DIR_VAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) * Check if the BIOS has IoRestriction with explicitly set direction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * and update @flags accordingly. Otherwise use whatever caller asked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * for.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) if (update & GPIOD_FLAGS_BIT_DIR_SET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) enum gpiod_flags diff = *flags ^ update;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) * Check if caller supplied incompatible GPIO initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) * flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) * Return %-EINVAL to notify that firmware has different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * settings and we are going to use them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) if (((*flags & GPIOD_FLAGS_BIT_DIR_SET) && (diff & GPIOD_FLAGS_BIT_DIR_OUT)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) ((*flags & GPIOD_FLAGS_BIT_DIR_OUT) && (diff & GPIOD_FLAGS_BIT_DIR_VAL)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) *flags = (*flags & ~mask) | (update & mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) struct device *dev = &info->adev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) enum gpiod_flags old = *flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) ret = __acpi_gpio_update_gpiod_flags(&old, info->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) dev_warn(dev, FW_BUG "GPIO not in correct mode, fixing\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) dev_dbg(dev, "Override GPIO initialization flags\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) *flags = old;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) struct acpi_gpio_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) switch (info->pin_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) case ACPI_PIN_CONFIG_PULLUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) *lookupflags |= GPIO_PULL_UP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) case ACPI_PIN_CONFIG_PULLDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) *lookupflags |= GPIO_PULL_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if (info->polarity == GPIO_ACTIVE_LOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) *lookupflags |= GPIO_ACTIVE_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) struct acpi_gpio_lookup {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) struct acpi_gpio_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) int pin_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) bool active_low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) struct acpi_gpio_lookup *lookup = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) if (!lookup->desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) const struct acpi_resource_gpio *agpio = &ares->data.gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) bool gpioint = agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) int pin_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) lookup->index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) if (lookup->n++ != lookup->index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) pin_index = lookup->pin_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) if (pin_index >= agpio->pin_table_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) if (lookup->info.quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) desc = gpio_to_desc(agpio->pin_table[pin_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) agpio->pin_table[pin_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) lookup->desc = desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) lookup->info.pin_config = agpio->pin_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) lookup->info.gpioint = gpioint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) * Polarity and triggering are only specified for GpioInt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) * resource.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) * Note: we expect here:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) if (lookup->info.gpioint) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) lookup->info.flags = GPIOD_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) lookup->info.polarity = agpio->polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) lookup->info.triggering = agpio->triggering;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) lookup->info.polarity = lookup->active_low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct acpi_gpio_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) struct acpi_device *adev = lookup->info.adev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) struct list_head res_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) INIT_LIST_HEAD(&res_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) ret = acpi_dev_get_resources(adev, &res_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) acpi_populate_gpio_lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) acpi_dev_free_resource_list(&res_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (!lookup->desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if (info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) *info = lookup->info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) const char *propname, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) struct acpi_gpio_lookup *lookup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct fwnode_reference_args args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) unsigned int quirks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) memset(&args, 0, sizeof(args));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) ret = __acpi_node_get_property_reference(fwnode, propname, index, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) &args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct acpi_device *adev = to_acpi_device_node(fwnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) if (!adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) if (!acpi_get_driver_gpio_data(adev, propname, index, &args,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) &quirks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * The property was found and resolved, so need to lookup the GPIO based
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * on returned args.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) if (!to_acpi_device_node(args.fwnode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) if (args.nargs != 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) lookup->index = args.args[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) lookup->pin_index = args.args[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) lookup->active_low = !!args.args[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) lookup->info.adev = to_acpi_device_node(args.fwnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) lookup->info.quirks = quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) * @adev: pointer to a ACPI device to get GPIO from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) * @propname: Property name of the GPIO (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) * @index: index of GpioIo/GpioInt resource (starting from %0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) * @info: info pointer to fill in (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * Function goes through ACPI resources for @adev and based on @index looks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) * up a GpioIo/GpioInt resource, translates it to the Linux GPIO descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) * and returns it. @index matches GpioIo/GpioInt resources only so if there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) * are total %3 GPIO resources, the index goes from %0 to %2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) * If @propname is specified the GPIO is looked using device property. In
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) * that case @index is used to select the GPIO entry in the property value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) * (in case of multiple).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) * If the GPIO cannot be translated or there is an error, an ERR_PTR is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) * returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) * Note: if the GPIO resource has multiple entries in the pin list, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) * function only returns the first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) const char *propname, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) struct acpi_gpio_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) struct acpi_gpio_lookup lookup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) if (!adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) memset(&lookup, 0, sizeof(lookup));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) lookup.index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) if (propname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) propname, index, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %d %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) dev_name(&lookup.info.adev->dev), lookup.index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) lookup.pin_index, lookup.active_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) lookup.info.adev = adev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) ret = acpi_gpio_resource_lookup(&lookup, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return ret ? ERR_PTR(ret) : lookup.desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) static bool acpi_can_fallback_to_crs(struct acpi_device *adev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) const char *con_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) /* Never allow fallback if the device has properties */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) if (acpi_dev_has_props(adev) || adev->driver_gpios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) return con_id == NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct gpio_desc *acpi_find_gpio(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) const char *con_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) unsigned int idx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) enum gpiod_flags *dflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) unsigned long *lookupflags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) struct acpi_device *adev = ACPI_COMPANION(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) struct acpi_gpio_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) char propname[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) /* Try first from _DSD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) if (con_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) snprintf(propname, sizeof(propname), "%s-%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) con_id, gpio_suffixes[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) snprintf(propname, sizeof(propname), "%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) gpio_suffixes[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) desc = acpi_get_gpiod_by_index(adev, propname, idx, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (!IS_ERR(desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (PTR_ERR(desc) == -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) return ERR_CAST(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) /* Then from plain _CRS GPIOs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (IS_ERR(desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) if (!acpi_can_fallback_to_crs(adev, con_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) return ERR_PTR(-ENOENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if (IS_ERR(desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) return desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (info.gpioint &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) (*dflags == GPIOD_OUT_LOW || *dflags == GPIOD_OUT_HIGH)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) dev_dbg(dev, "refusing GpioInt() entry when doing GPIOD_OUT_* lookup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) return ERR_PTR(-ENOENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) acpi_gpio_update_gpiod_flags(dflags, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) return desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) * @fwnode: pointer to an ACPI firmware node to get the GPIO information from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) * @propname: Property name of the GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) * @index: index of GpioIo/GpioInt resource (starting from %0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) * @info: info pointer to fill in (optional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) * If @fwnode is an ACPI device object, call acpi_get_gpiod_by_index() for it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) * Otherwise (i.e. it is a data-only non-device object), use the property-based
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) * GPIO lookup to get to the GPIO resource with the relevant information and use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) * that to obtain the GPIO descriptor to return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) * If the GPIO cannot be translated or there is an error an ERR_PTR is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) * returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) const char *propname, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) struct acpi_gpio_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) struct acpi_gpio_lookup lookup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) struct acpi_device *adev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) adev = to_acpi_device_node(fwnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) if (adev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) return acpi_get_gpiod_by_index(adev, propname, index, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) if (!is_acpi_data_node(fwnode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) if (!propname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) memset(&lookup, 0, sizeof(lookup));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) lookup.index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) ret = acpi_gpio_resource_lookup(&lookup, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) return ret ? ERR_PTR(ret) : lookup.desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) * acpi_dev_gpio_irq_get_by() - Find GpioInt and translate it to Linux IRQ number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * @adev: pointer to a ACPI device to get IRQ from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) * @name: optional name of GpioInt resource
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) * @index: index of GpioInt resource (starting from %0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * If the device has one or more GpioInt resources, this function can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) * used to translate from the GPIO offset in the resource to the Linux IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) * number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) * The function is idempotent, though each time it runs it will configure GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) * pin direction according to the flags in GpioInt resource.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) * The function takes optional @name parameter. If the resource has a property
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * name, then only those will be taken into account.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) * Return: Linux IRQ number (> %0) on success, negative errno on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) int idx, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) unsigned int irq_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) for (i = 0, idx = 0; idx <= index; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) struct acpi_gpio_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) desc = acpi_get_gpiod_by_index(adev, name, i, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) /* Ignore -EPROBE_DEFER, it only matters if idx matches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) return PTR_ERR(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) if (info.gpioint && idx++ == index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) char label[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (IS_ERR(desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) return PTR_ERR(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) irq = gpiod_to_irq(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (irq < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) return irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) snprintf(label, sizeof(label), "GpioInt() %d", index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) ret = gpiod_configure_flags(desc, label, lflags, info.flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) irq_flags = acpi_dev_get_irq_type(info.triggering,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) info.polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) * If the IRQ is not already in use then set type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) * if specified and different than the current one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (can_request_irq(irq, irq_flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) if (irq_flags != IRQ_TYPE_NONE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) irq_flags != irq_get_trigger_type(irq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) irq_set_irq_type(irq, irq_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) dev_dbg(&adev->dev, "IRQ %d already in use\n", irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) return irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get_by);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) u32 bits, u64 *value, void *handler_context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) void *region_context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) struct acpi_gpio_chip *achip = region_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) struct gpio_chip *chip = achip->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) struct acpi_resource_gpio *agpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) struct acpi_resource *ares;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) int pin_index = (int)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) status = acpi_buffer_to_resource(achip->conn_info.connection,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) achip->conn_info.length, &ares);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) ACPI_FREE(ares);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) return AE_BAD_PARAMETER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) agpio = &ares->data.gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) function == ACPI_WRITE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) ACPI_FREE(ares);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) return AE_BAD_PARAMETER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) length = min(agpio->pin_table_length, (u16)(pin_index + bits));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) for (i = pin_index; i < length; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) int pin = agpio->pin_table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct acpi_gpio_connection *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) bool found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) mutex_lock(&achip->conn_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) found = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) list_for_each_entry(conn, &achip->conns, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) if (conn->pin == pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) found = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) desc = conn->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) * The same GPIO can be shared between operation region and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) * event but only if the access here is ACPI_READ. In that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) * case we "borrow" the event GPIO instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (!found && agpio->shareable == ACPI_SHARED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) function == ACPI_READ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) struct acpi_gpio_event *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) list_for_each_entry(event, &achip->events, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (event->pin == pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) desc = event->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) found = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) if (!found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) const char *label = "ACPI:OpRegion";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) desc = gpiochip_request_own_desc(chip, pin, label,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) GPIO_ACTIVE_HIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (IS_ERR(desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) status = AE_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) mutex_unlock(&achip->conn_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) conn = kzalloc(sizeof(*conn), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (!conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) gpiochip_free_own_desc(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) mutex_unlock(&achip->conn_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) conn->pin = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) conn->desc = desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) list_add_tail(&conn->node, &achip->conns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) mutex_unlock(&achip->conn_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) if (function == ACPI_WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) gpiod_set_raw_value_cansleep(desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) !!((1 << i) & *value));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) *value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) ACPI_FREE(ares);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) static void acpi_gpiochip_request_regions(struct acpi_gpio_chip *achip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) struct gpio_chip *chip = achip->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) acpi_handle handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) INIT_LIST_HEAD(&achip->conns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) mutex_init(&achip->conn_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) status = acpi_install_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) acpi_gpio_adr_space_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) NULL, achip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) dev_err(chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) "Failed to install GPIO OpRegion handler\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) static void acpi_gpiochip_free_regions(struct acpi_gpio_chip *achip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) struct gpio_chip *chip = achip->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) acpi_handle handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) struct acpi_gpio_connection *conn, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) status = acpi_remove_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) acpi_gpio_adr_space_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) dev_err(chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) "Failed to remove GPIO OpRegion handler\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) gpiochip_free_own_desc(conn->desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) list_del(&conn->node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) kfree(conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) static struct gpio_desc *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) acpi_gpiochip_parse_own_gpio(struct acpi_gpio_chip *achip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) struct fwnode_handle *fwnode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) const char **name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) unsigned long *lflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) enum gpiod_flags *dflags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) struct gpio_chip *chip = achip->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) u32 gpios[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) *lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) *dflags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) *name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) ARRAY_SIZE(gpios));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) desc = gpiochip_get_desc(chip, gpios[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) if (IS_ERR(desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) return desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) if (gpios[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) *lflags |= GPIO_ACTIVE_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) if (fwnode_property_present(fwnode, "input"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) *dflags |= GPIOD_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) else if (fwnode_property_present(fwnode, "output-low"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) *dflags |= GPIOD_OUT_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) else if (fwnode_property_present(fwnode, "output-high"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) *dflags |= GPIOD_OUT_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) fwnode_property_read_string(fwnode, "line-name", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) return desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) static void acpi_gpiochip_scan_gpios(struct acpi_gpio_chip *achip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) struct gpio_chip *chip = achip->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) struct fwnode_handle *fwnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) device_for_each_child_node(chip->parent, fwnode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) unsigned long lflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) enum gpiod_flags dflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) struct gpio_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) if (!fwnode_property_present(fwnode, "gpio-hog"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) desc = acpi_gpiochip_parse_own_gpio(achip, fwnode, &name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) &lflags, &dflags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) if (IS_ERR(desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) ret = gpiod_hog(desc, name, lflags, dflags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) dev_err(chip->parent, "Failed to hog GPIO\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) fwnode_handle_put(fwnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) void acpi_gpiochip_add(struct gpio_chip *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) struct acpi_gpio_chip *acpi_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) if (!chip || !chip->parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) if (!handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) acpi_gpio = kzalloc(sizeof(*acpi_gpio), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) if (!acpi_gpio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) dev_err(chip->parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) "Failed to allocate memory for ACPI GPIO chip\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) acpi_gpio->chip = chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) INIT_LIST_HEAD(&acpi_gpio->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) INIT_LIST_HEAD(&acpi_gpio->deferred_req_irqs_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) status = acpi_attach_data(handle, acpi_gpio_chip_dh, acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) kfree(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) acpi_gpiochip_request_regions(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) acpi_gpiochip_scan_gpios(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) acpi_walk_dep_device_list(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) void acpi_gpiochip_remove(struct gpio_chip *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) struct acpi_gpio_chip *acpi_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) acpi_handle handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) if (!chip || !chip->parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) handle = ACPI_HANDLE(chip->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) if (!handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) acpi_gpiochip_free_regions(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) acpi_detach_data(handle, acpi_gpio_chip_dh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) kfree(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) static int acpi_gpio_package_count(const union acpi_object *obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) const union acpi_object *element = obj->package.elements;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) const union acpi_object *end = element + obj->package.count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) unsigned int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) while (element < end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) switch (element->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) case ACPI_TYPE_LOCAL_REFERENCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) element += 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) case ACPI_TYPE_INTEGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) element++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) static int acpi_find_gpio_count(struct acpi_resource *ares, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) unsigned int *count = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) if (ares->type == ACPI_RESOURCE_TYPE_GPIO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) *count += ares->data.gpio.pin_table_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) * acpi_gpio_count - count the GPIOs associated with a device / function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) * @dev: GPIO consumer, can be %NULL for system-global GPIOs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) * @con_id: function within the GPIO consumer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) * Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) * The number of GPIOs associated with a device / function or %-ENOENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) * if no GPIO has been assigned to the requested function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) int acpi_gpio_count(struct device *dev, const char *con_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) struct acpi_device *adev = ACPI_COMPANION(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) const union acpi_object *obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) const struct acpi_gpio_mapping *gm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) int count = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) char propname[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) /* Try first from _DSD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (con_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) snprintf(propname, sizeof(propname), "%s-%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) con_id, gpio_suffixes[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) snprintf(propname, sizeof(propname), "%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) gpio_suffixes[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_ANY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) &obj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) if (obj->type == ACPI_TYPE_LOCAL_REFERENCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) else if (obj->type == ACPI_TYPE_PACKAGE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) count = acpi_gpio_package_count(obj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) } else if (adev->driver_gpios) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) for (gm = adev->driver_gpios; gm->name; gm++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) if (strcmp(propname, gm->name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) count = gm->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) if (count > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) /* Then from plain _CRS GPIOs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) if (count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) struct list_head resource_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) unsigned int crs_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) if (!acpi_can_fallback_to_crs(adev, con_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) INIT_LIST_HEAD(&resource_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) acpi_dev_get_resources(adev, &resource_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) acpi_find_gpio_count, &crs_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) acpi_dev_free_resource_list(&resource_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) if (crs_count > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) count = crs_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) return count ? count : -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /* Run deferred acpi_gpiochip_request_irqs() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) static int __init acpi_gpio_handle_deferred_request_irqs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) struct acpi_gpio_chip *acpi_gpio, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) list_for_each_entry_safe(acpi_gpio, tmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) &acpi_gpio_deferred_req_irqs_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) deferred_req_irqs_list_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) acpi_gpiochip_request_irqs(acpi_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) acpi_gpio_deferred_req_irqs_done = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) /* We must use _sync so that this runs after the first deferred_probe run */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) late_initcall_sync(acpi_gpio_handle_deferred_request_irqs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) static const struct dmi_system_id gpiolib_acpi_quirks[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) * The Minix Neo Z83-4 has a micro-USB-B id-pin handler for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) * a non existing micro-USB-B connector which puts the HDMI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) * DDC pins in GPIO mode, breaking HDMI support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) DMI_MATCH(DMI_SYS_VENDOR, "MINIX"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) .no_edge_events_on_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) * The Terra Pad 1061 has a micro-USB-B id-pin handler, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) * instead of controlling the actual micro-USB-B turns the 5V
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) * boost for its USB-A connector off. The actual micro-USB-B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) * connector is wired for charging only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) DMI_MATCH(DMI_SYS_VENDOR, "Wortmann_AG"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) DMI_MATCH(DMI_PRODUCT_NAME, "TERRA_PAD_1061"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) .no_edge_events_on_boot = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) * The Dell Venue 10 Pro 5055, with Bay Trail SoC + TI PMIC uses an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) * external embedded-controller connected via I2C + an ACPI GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) * event handler on INT33FFC:02 pin 12, causing spurious wakeups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) DMI_MATCH(DMI_PRODUCT_NAME, "Venue 10 Pro 5055"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) .ignore_wake = "INT33FC:02@12",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) * HP X2 10 models with Cherry Trail SoC + TI PMIC use an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) * external embedded-controller connected via I2C + an ACPI GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) * event handler on INT33FF:01 pin 0, causing spurious wakeups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) * When suspending by closing the LID, the power to the USB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) * keyboard is turned off, causing INT0002 ACPI events to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) * trigger once the XHCI controller notices the keyboard is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) * gone. So INT0002 events cause spurious wakeups too. Ignoring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) * EC wakes breaks wakeup when opening the lid, the user needs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) * to press the power-button to wakeup the system. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) * alternative is suspend simply not working, which is worse.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) DMI_MATCH(DMI_SYS_VENDOR, "HP"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) .ignore_wake = "INT33FF:01@0,INT0002:00@2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) * HP X2 10 models with Bay Trail SoC + AXP288 PMIC use an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) * external embedded-controller connected via I2C + an ACPI GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) * event handler on INT33FC:02 pin 28, causing spurious wakeups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) DMI_MATCH(DMI_BOARD_NAME, "815D"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) .ignore_wake = "INT33FC:02@28",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) * HP X2 10 models with Cherry Trail SoC + AXP288 PMIC use an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) * external embedded-controller connected via I2C + an ACPI GPIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) * event handler on INT33FF:01 pin 0, causing spurious wakeups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) DMI_MATCH(DMI_SYS_VENDOR, "HP"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) DMI_MATCH(DMI_BOARD_NAME, "813E"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) .ignore_wake = "INT33FF:01@0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) {} /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) static int __init acpi_gpio_setup_params(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) const struct acpi_gpiolib_dmi_quirk *quirk = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) const struct dmi_system_id *id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) id = dmi_first_match(gpiolib_acpi_quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) if (id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) quirk = id->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) if (run_edge_events_on_boot < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) if (quirk && quirk->no_edge_events_on_boot)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) run_edge_events_on_boot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) run_edge_events_on_boot = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) if (ignore_wake == NULL && quirk && quirk->ignore_wake)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) ignore_wake = quirk->ignore_wake;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) /* Directly after dmi_setup() which runs as core_initcall() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) postcore_initcall(acpi_gpio_setup_params);