Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);