Lines Matching +full:irq +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0
22 #include "gpiolib-acpi.h"
24 static int run_edge_events_on_boot = -1;
27 "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto");
41 * struct acpi_gpio_event - ACPI GPIO event handler data
43 * @node: list-entry of the events list of the struct acpi_gpio_chip
44 * @handle: handle of ACPI method to execute when the IRQ triggers
45 * @handler: handler function to pass to request_irq() when requesting the IRQ
47 * @irq: Linux IRQ number for the event, for request_irq() / free_irq()
48 * @irqflags: flags to pass to request_irq() when requesting the IRQ
49 * @irq_is_wake: If the ACPI flags indicate the IRQ is a wakeup source
58 unsigned int irq; member
87 * (so builtin drivers) we register the ACPI GpioInt IRQ handlers from a
98 if (!gc->parent) in acpi_gpiochip_find()
101 return ACPI_HANDLE(gc->parent) == data; in acpi_gpiochip_find()
105 * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
107 * @pin: ACPI GPIO pin number (0-based, controller-relative)
110 * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
122 return ERR_PTR(-ENODEV); in acpi_get_gpiod()
126 return ERR_PTR(-EPROBE_DEFER); in acpi_get_gpiod()
131 static irqreturn_t acpi_gpio_irq_handler(int irq, void *data) in acpi_gpio_irq_handler() argument
135 acpi_evaluate_object(event->handle, NULL, NULL, NULL); in acpi_gpio_irq_handler()
140 static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data) in acpi_gpio_irq_handler_evt() argument
144 acpi_execute_simple_method(event->handle, NULL, event->pin); in acpi_gpio_irq_handler_evt()
159 if (ares->type != ACPI_RESOURCE_TYPE_GPIO) in acpi_gpio_get_irq_resource()
162 gpio = &ares->data.gpio; in acpi_gpio_get_irq_resource()
163 if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT) in acpi_gpio_get_irq_resource()
176 ret = request_threaded_irq(event->irq, NULL, event->handler, in acpi_gpiochip_request_irq()
177 event->irqflags, "ACPI:Event", event); in acpi_gpiochip_request_irq()
179 dev_err(acpi_gpio->chip->parent, in acpi_gpiochip_request_irq()
181 event->irq); in acpi_gpiochip_request_irq()
185 if (event->irq_is_wake) in acpi_gpiochip_request_irq()
186 enable_irq_wake(event->irq); in acpi_gpiochip_request_irq()
188 event->irq_requested = true; in acpi_gpiochip_request_irq()
190 /* Make sure we trigger the initial state of edge-triggered IRQs */ in acpi_gpiochip_request_irq()
192 (event->irqflags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))) { in acpi_gpiochip_request_irq()
193 value = gpiod_get_raw_value_cansleep(event->desc); in acpi_gpiochip_request_irq()
194 if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) || in acpi_gpiochip_request_irq()
195 ((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0)) in acpi_gpiochip_request_irq()
196 event->handler(event->irq, event); in acpi_gpiochip_request_irq()
204 list_for_each_entry(event, &acpi_gpio->events, node) in acpi_gpiochip_request_irqs()
220 len = pin_str - controller; in acpi_gpio_in_ignore_list()
246 int pin = agpio->pin_table[0]; in acpi_gpio_irq_is_wake()
248 if (agpio->wake_capable != ACPI_WAKE_CAPABLE) in acpi_gpio_irq_is_wake()
264 struct gpio_chip *chip = acpi_gpio->chip; in acpi_gpiochip_alloc_event()
270 int ret, pin, irq; in acpi_gpiochip_alloc_event() local
275 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_alloc_event()
276 pin = agpio->pin_table[0]; in acpi_gpiochip_alloc_event()
281 agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L', in acpi_gpiochip_alloc_event()
296 dev_err(chip->parent, in acpi_gpiochip_alloc_event()
304 dev_err(chip->parent, in acpi_gpiochip_alloc_event()
310 irq = gpiod_to_irq(desc); in acpi_gpiochip_alloc_event()
311 if (irq < 0) { in acpi_gpiochip_alloc_event()
312 dev_err(chip->parent, in acpi_gpiochip_alloc_event()
313 "Failed to translate GPIO pin 0x%04X to IRQ, err %d\n", in acpi_gpiochip_alloc_event()
314 pin, irq); in acpi_gpiochip_alloc_event()
322 event->irqflags = IRQF_ONESHOT; in acpi_gpiochip_alloc_event()
323 if (agpio->triggering == ACPI_LEVEL_SENSITIVE) { in acpi_gpiochip_alloc_event()
324 if (agpio->polarity == ACPI_ACTIVE_HIGH) in acpi_gpiochip_alloc_event()
325 event->irqflags |= IRQF_TRIGGER_HIGH; in acpi_gpiochip_alloc_event()
327 event->irqflags |= IRQF_TRIGGER_LOW; in acpi_gpiochip_alloc_event()
329 switch (agpio->polarity) { in acpi_gpiochip_alloc_event()
331 event->irqflags |= IRQF_TRIGGER_RISING; in acpi_gpiochip_alloc_event()
334 event->irqflags |= IRQF_TRIGGER_FALLING; in acpi_gpiochip_alloc_event()
337 event->irqflags |= IRQF_TRIGGER_RISING | in acpi_gpiochip_alloc_event()
343 event->handle = evt_handle; in acpi_gpiochip_alloc_event()
344 event->handler = handler; in acpi_gpiochip_alloc_event()
345 event->irq = irq; in acpi_gpiochip_alloc_event()
346 event->irq_is_wake = acpi_gpio_irq_is_wake(chip->parent, agpio); in acpi_gpiochip_alloc_event()
347 event->pin = pin; in acpi_gpiochip_alloc_event()
348 event->desc = desc; in acpi_gpiochip_alloc_event()
350 list_add_tail(&event->node, &acpi_gpio->events); in acpi_gpiochip_alloc_event()
363 * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
379 if (!chip->parent || !chip->to_irq) in acpi_gpiochip_request_interrupts()
382 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_request_interrupts()
396 list_add(&acpi_gpio->deferred_req_irqs_list_entry, in acpi_gpiochip_request_interrupts()
408 * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
421 if (!chip->parent || !chip->to_irq) in acpi_gpiochip_free_interrupts()
424 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_free_interrupts()
433 if (!list_empty(&acpi_gpio->deferred_req_irqs_list_entry)) in acpi_gpiochip_free_interrupts()
434 list_del_init(&acpi_gpio->deferred_req_irqs_list_entry); in acpi_gpiochip_free_interrupts()
437 list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) { in acpi_gpiochip_free_interrupts()
438 if (event->irq_requested) { in acpi_gpiochip_free_interrupts()
439 if (event->irq_is_wake) in acpi_gpiochip_free_interrupts()
440 disable_irq_wake(event->irq); in acpi_gpiochip_free_interrupts()
442 free_irq(event->irq, event); in acpi_gpiochip_free_interrupts()
445 gpiochip_unlock_as_irq(chip, event->pin); in acpi_gpiochip_free_interrupts()
446 gpiochip_free_own_desc(event->desc); in acpi_gpiochip_free_interrupts()
447 list_del(&event->node); in acpi_gpiochip_free_interrupts()
454 const struct acpi_gpio_mapping *gpios) in acpi_dev_add_driver_gpios() argument
456 if (adev && gpios) { in acpi_dev_add_driver_gpios()
457 adev->driver_gpios = gpios; in acpi_dev_add_driver_gpios()
460 return -EINVAL; in acpi_dev_add_driver_gpios()
467 adev->driver_gpios = NULL; in acpi_dev_remove_driver_gpios()
477 const struct acpi_gpio_mapping *gpios) in devm_acpi_dev_add_driver_gpios() argument
484 return -ENOMEM; in devm_acpi_dev_add_driver_gpios()
486 ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), gpios); in devm_acpi_dev_add_driver_gpios()
509 if (!adev->driver_gpios) in acpi_get_driver_gpio_data()
512 for (gm = adev->driver_gpios; gm->name; gm++) in acpi_get_driver_gpio_data()
513 if (!strcmp(name, gm->name) && gm->data && index < gm->size) { in acpi_get_driver_gpio_data()
514 const struct acpi_gpio_params *par = gm->data + index; in acpi_get_driver_gpio_data()
516 args->fwnode = acpi_fwnode_handle(adev); in acpi_get_driver_gpio_data()
517 args->args[0] = par->crs_entry_index; in acpi_get_driver_gpio_data()
518 args->args[1] = par->line_index; in acpi_get_driver_gpio_data()
519 args->args[2] = par->active_low; in acpi_get_driver_gpio_data()
520 args->nargs = 3; in acpi_get_driver_gpio_data()
522 *quirks = gm->quirks; in acpi_get_driver_gpio_data()
532 switch (agpio->io_restriction) { in acpi_gpio_to_gpiod_flags()
543 switch (agpio->pin_config) { in acpi_gpio_to_gpiod_flags()
582 * Return %-EINVAL to notify that firmware has different in __acpi_gpio_update_gpiod_flags()
587 ret = -EINVAL; in __acpi_gpio_update_gpiod_flags()
596 struct device *dev = &info->adev->dev; in acpi_gpio_update_gpiod_flags()
600 ret = __acpi_gpio_update_gpiod_flags(&old, info->flags); in acpi_gpio_update_gpiod_flags()
601 if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) { in acpi_gpio_update_gpiod_flags()
616 switch (info->pin_config) { in acpi_gpio_update_gpiod_lookup_flags()
627 if (info->polarity == GPIO_ACTIVE_LOW) in acpi_gpio_update_gpiod_lookup_flags()
646 if (ares->type != ACPI_RESOURCE_TYPE_GPIO) in acpi_populate_gpio_lookup()
649 if (!lookup->desc) { in acpi_populate_gpio_lookup()
650 const struct acpi_resource_gpio *agpio = &ares->data.gpio; in acpi_populate_gpio_lookup()
651 bool gpioint = agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT; in acpi_populate_gpio_lookup()
654 if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) in acpi_populate_gpio_lookup()
655 lookup->index++; in acpi_populate_gpio_lookup()
657 if (lookup->n++ != lookup->index) in acpi_populate_gpio_lookup()
660 pin_index = lookup->pin_index; in acpi_populate_gpio_lookup()
661 if (pin_index >= agpio->pin_table_length) in acpi_populate_gpio_lookup()
664 lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr, in acpi_populate_gpio_lookup()
665 agpio->pin_table[pin_index]); in acpi_populate_gpio_lookup()
666 lookup->info.pin_config = agpio->pin_config; in acpi_populate_gpio_lookup()
667 lookup->info.gpioint = gpioint; in acpi_populate_gpio_lookup()
673 * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW in acpi_populate_gpio_lookup()
674 * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH in acpi_populate_gpio_lookup()
676 if (lookup->info.gpioint) { in acpi_populate_gpio_lookup()
677 lookup->info.flags = GPIOD_IN; in acpi_populate_gpio_lookup()
678 lookup->info.polarity = agpio->polarity; in acpi_populate_gpio_lookup()
679 lookup->info.triggering = agpio->triggering; in acpi_populate_gpio_lookup()
681 lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio); in acpi_populate_gpio_lookup()
682 lookup->info.polarity = lookup->active_low; in acpi_populate_gpio_lookup()
692 struct acpi_device *adev = lookup->info.adev; in acpi_gpio_resource_lookup()
706 if (!lookup->desc) in acpi_gpio_resource_lookup()
707 return -ENOENT; in acpi_gpio_resource_lookup()
710 *info = lookup->info; in acpi_gpio_resource_lookup()
740 return -EINVAL; in acpi_gpio_property_lookup()
742 return -EPROTO; in acpi_gpio_property_lookup()
744 lookup->index = args.args[0]; in acpi_gpio_property_lookup()
745 lookup->pin_index = args.args[1]; in acpi_gpio_property_lookup()
746 lookup->active_low = !!args.args[2]; in acpi_gpio_property_lookup()
748 lookup->info.adev = to_acpi_device_node(args.fwnode); in acpi_gpio_property_lookup()
749 lookup->info.quirks = quirks; in acpi_gpio_property_lookup()
755 * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
784 return ERR_PTR(-ENODEV); in acpi_get_gpiod_by_index()
790 dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname); in acpi_get_gpiod_by_index()
797 dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %d %u\n", in acpi_get_gpiod_by_index()
798 dev_name(&lookup.info.adev->dev), lookup.index, in acpi_get_gpiod_by_index()
801 dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index); in acpi_get_gpiod_by_index()
813 if (acpi_dev_has_props(adev) || adev->driver_gpios) in acpi_can_fallback_to_crs()
834 snprintf(propname, sizeof(propname), "%s-%s", in acpi_find_gpio()
844 if (PTR_ERR(desc) == -EPROBE_DEFER) in acpi_find_gpio()
848 /* Then from plain _CRS GPIOs */ in acpi_find_gpio()
851 return ERR_PTR(-ENOENT); in acpi_find_gpio()
861 return ERR_PTR(-ENOENT); in acpi_find_gpio()
870 * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources
877 * Otherwise (i.e. it is a data-only non-device object), use the property-based
897 return ERR_PTR(-ENODEV); in acpi_node_get_gpiod()
900 return ERR_PTR(-EINVAL); in acpi_node_get_gpiod()
914 * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number
915 * @adev: pointer to a ACPI device to get IRQ from
919 * used to translate from the GPIO offset in the resource to the Linux IRQ
925 * Return: Linux IRQ number (> %0) on success, negative errno on failure.
939 /* Ignore -EPROBE_DEFER, it only matters if idx matches */ in acpi_dev_gpio_irq_get()
940 if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER) in acpi_dev_gpio_irq_get()
946 int irq; in acpi_dev_gpio_irq_get() local
951 irq = gpiod_to_irq(desc); in acpi_dev_gpio_irq_get()
952 if (irq < 0) in acpi_dev_gpio_irq_get()
953 return irq; in acpi_dev_gpio_irq_get()
965 irq_flags != irq_get_trigger_type(irq)) in acpi_dev_gpio_irq_get()
966 irq_set_irq_type(irq, irq_flags); in acpi_dev_gpio_irq_get()
968 return irq; in acpi_dev_gpio_irq_get()
972 return -ENOENT; in acpi_dev_gpio_irq_get()
982 struct gpio_chip *chip = achip->chip; in acpi_gpio_adr_space_handler()
990 status = acpi_buffer_to_resource(achip->conn_info.connection, in acpi_gpio_adr_space_handler()
991 achip->conn_info.length, &ares); in acpi_gpio_adr_space_handler()
995 if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) { in acpi_gpio_adr_space_handler()
1000 agpio = &ares->data.gpio; in acpi_gpio_adr_space_handler()
1002 if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT && in acpi_gpio_adr_space_handler()
1008 length = min(agpio->pin_table_length, (u16)(pin_index + bits)); in acpi_gpio_adr_space_handler()
1010 int pin = agpio->pin_table[i]; in acpi_gpio_adr_space_handler()
1015 mutex_lock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1018 list_for_each_entry(conn, &achip->conns, node) { in acpi_gpio_adr_space_handler()
1019 if (conn->pin == pin) { in acpi_gpio_adr_space_handler()
1021 desc = conn->desc; in acpi_gpio_adr_space_handler()
1031 if (!found && agpio->shareable == ACPI_SHARED && in acpi_gpio_adr_space_handler()
1035 list_for_each_entry(event, &achip->events, node) { in acpi_gpio_adr_space_handler()
1036 if (event->pin == pin) { in acpi_gpio_adr_space_handler()
1037 desc = event->desc; in acpi_gpio_adr_space_handler()
1053 mutex_unlock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1061 mutex_unlock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1065 conn->pin = pin; in acpi_gpio_adr_space_handler()
1066 conn->desc = desc; in acpi_gpio_adr_space_handler()
1067 list_add_tail(&conn->node, &achip->conns); in acpi_gpio_adr_space_handler()
1070 mutex_unlock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1086 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_request_regions()
1087 acpi_handle handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_request_regions()
1090 INIT_LIST_HEAD(&achip->conns); in acpi_gpiochip_request_regions()
1091 mutex_init(&achip->conn_lock); in acpi_gpiochip_request_regions()
1096 dev_err(chip->parent, in acpi_gpiochip_request_regions()
1102 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_free_regions()
1103 acpi_handle handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_free_regions()
1110 dev_err(chip->parent, in acpi_gpiochip_free_regions()
1115 list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) { in acpi_gpiochip_free_regions()
1116 gpiochip_free_own_desc(conn->desc); in acpi_gpiochip_free_regions()
1117 list_del(&conn->node); in acpi_gpiochip_free_regions()
1129 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_parse_own_gpio()
1131 u32 gpios[2]; in acpi_gpiochip_parse_own_gpio() local
1138 ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios, in acpi_gpiochip_parse_own_gpio()
1139 ARRAY_SIZE(gpios)); in acpi_gpiochip_parse_own_gpio()
1143 desc = gpiochip_get_desc(chip, gpios[0]); in acpi_gpiochip_parse_own_gpio()
1147 if (gpios[1]) in acpi_gpiochip_parse_own_gpio()
1152 else if (fwnode_property_present(fwnode, "output-low")) in acpi_gpiochip_parse_own_gpio()
1154 else if (fwnode_property_present(fwnode, "output-high")) in acpi_gpiochip_parse_own_gpio()
1157 return ERR_PTR(-EINVAL); in acpi_gpiochip_parse_own_gpio()
1159 fwnode_property_read_string(fwnode, "line-name", name); in acpi_gpiochip_parse_own_gpio()
1166 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_scan_gpios()
1169 device_for_each_child_node(chip->parent, fwnode) { in acpi_gpiochip_scan_gpios()
1176 if (!fwnode_property_present(fwnode, "gpio-hog")) in acpi_gpiochip_scan_gpios()
1186 dev_err(chip->parent, "Failed to hog GPIO\n"); in acpi_gpiochip_scan_gpios()
1199 if (!chip || !chip->parent) in acpi_gpiochip_add()
1202 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_add()
1208 dev_err(chip->parent, in acpi_gpiochip_add()
1213 acpi_gpio->chip = chip; in acpi_gpiochip_add()
1214 INIT_LIST_HEAD(&acpi_gpio->events); in acpi_gpiochip_add()
1215 INIT_LIST_HEAD(&acpi_gpio->deferred_req_irqs_list_entry); in acpi_gpiochip_add()
1219 dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n"); in acpi_gpiochip_add()
1235 if (!chip || !chip->parent) in acpi_gpiochip_remove()
1238 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_remove()
1244 dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n"); in acpi_gpiochip_remove()
1256 const union acpi_object *element = obj->package.elements; in acpi_gpio_package_count()
1257 const union acpi_object *end = element + obj->package.count; in acpi_gpio_package_count()
1261 switch (element->type) { in acpi_gpio_package_count()
1271 return -EPROTO; in acpi_gpio_package_count()
1282 if (ares->type == ACPI_RESOURCE_TYPE_GPIO) in acpi_find_gpio_count()
1283 *count += ares->data.gpio.pin_table_length; in acpi_find_gpio_count()
1289 * acpi_gpio_count - count the GPIOs associated with a device / function
1290 * @dev: GPIO consumer, can be %NULL for system-global GPIOs
1294 * The number of GPIOs associated with a device / function or %-ENOENT,
1302 int count = -ENOENT; in acpi_gpio_count()
1310 snprintf(propname, sizeof(propname), "%s-%s", in acpi_gpio_count()
1319 if (obj->type == ACPI_TYPE_LOCAL_REFERENCE) in acpi_gpio_count()
1321 else if (obj->type == ACPI_TYPE_PACKAGE) in acpi_gpio_count()
1323 } else if (adev->driver_gpios) { in acpi_gpio_count()
1324 for (gm = adev->driver_gpios; gm->name; gm++) in acpi_gpio_count()
1325 if (strcmp(propname, gm->name) == 0) { in acpi_gpio_count()
1326 count = gm->size; in acpi_gpio_count()
1334 /* Then from plain _CRS GPIOs */ in acpi_gpio_count()
1349 return count ? count : -ENOENT; in acpi_gpio_count()
1374 * The Minix Neo Z83-4 has a micro-USB-B id-pin handler for
1375 * a non existing micro-USB-B connector which puts the HDMI
1380 DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
1388 * The Terra Pad 1061 has a micro-USB-B id-pin handler, which
1389 * instead of controlling the actual micro-USB-B turns the 5V
1390 * boost for its USB-A connector off. The actual micro-USB-B
1404 * external embedded-controller connected via I2C + an ACPI GPIO
1411 * to press the power-button to wakeup the system. The
1416 DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"),
1425 * external embedded-controller connected via I2C + an ACPI GPIO
1429 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1440 * external embedded-controller connected via I2C + an ACPI GPIO
1462 quirk = id->driver_data; in acpi_gpio_setup_params()
1465 if (quirk && quirk->no_edge_events_on_boot) in acpi_gpio_setup_params()
1471 if (ignore_wake == NULL && quirk && quirk->ignore_wake) in acpi_gpio_setup_params()
1472 ignore_wake = quirk->ignore_wake; in acpi_gpio_setup_params()