Messages in this thread Patch in this message |  | | From | Marco Scardovi <> | | Subject | [PATCH v2 2/3] [PATCH 2/3] gpio: acpi: modernize resource management using cleanup.h | | Date | Wed, 6 May 2026 14:35:35 +0200 |
| |
--- drivers/gpio/gpiolib-acpi-core.c | 38 ++++++++++++-------------------- 1 file changed, 14 insertions(+), 24 deletions(-)
diff --git a/drivers/gpio/gpiolib-acpi-core.c b/drivers/gpio/gpiolib-acpi-core.c index 7c17bffcd4e7..b6accbaba04d 100644 --- a/drivers/gpio/gpiolib-acpi-core.c +++ b/drivers/gpio/gpiolib-acpi-core.c @@ -410,31 +410,26 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, desc = acpi_request_own_gpiod(chip, agpio, 0, "ACPI:Event"); if (IS_ERR(desc)) { - dev_err(chip->parent, - "Failed to request GPIO for pin 0x%04X, err %pe\n", - pin, desc); + dev_err(chip->parent, "Failed to request GPIO for pin 0x%04X, err %pe\n", pin, desc); return AE_OK; } + desc_guard = desc; ret = gpiochip_lock_as_irq(chip, pin); if (ret) { - dev_err(chip->parent, - "Failed to lock GPIO pin 0x%04X as interrupt, err %d\n", - pin, ret); - goto fail_free_desc; + dev_err(chip->parent, "Failed to lock GPIO pin 0x%04X as interrupt, err %d\n", pin, ret); + return AE_OK; } irq = gpiod_to_irq(desc); if (irq < 0) { - dev_err(chip->parent, - "Failed to translate GPIO pin 0x%04X to IRQ, err %d\n", - pin, irq); - goto fail_unlock_irq; + dev_err(chip->parent, "Failed to translate GPIO pin 0x%04X to IRQ, err %d\n", pin, irq); + goto err_unlock; } event = kzalloc_obj(*event); if (!event) - goto fail_unlock_irq; + goto err_unlock; event->irqflags = IRQF_ONESHOT; if (agpio->triggering == ACPI_LEVEL_SENSITIVE) { @@ -462,17 +457,15 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, event->irq = irq; event->irq_is_wake = acpi_gpio_irq_is_wake(chip->parent, agpio); event->pin = pin; - event->desc = desc; + /* Transfer ownership to event, prevent auto-free */ + event->desc = no_free_ptr(desc_guard); list_add_tail(&event->node, &acpi_gpio->events); return AE_OK; -fail_unlock_irq: +err_unlock: gpiochip_unlock_as_irq(chip, pin); -fail_free_desc: - gpiochip_free_own_desc(desc); - return AE_OK; } @@ -1104,7 +1097,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, struct acpi_gpio_chip *achip = region_context; struct gpio_chip *chip = achip->chip; struct acpi_resource_gpio *agpio; - struct acpi_resource *ares; + struct acpi_resource *ares __free(acpi_free) = NULL; u16 pin_index = address; acpi_status status; int length; @@ -1115,20 +1108,17 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, if (ACPI_FAILURE(status)) return status; - if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) { - ACPI_FREE(ares); + if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) return AE_BAD_PARAMETER; - } agpio = &ares->data.gpio; if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT && - function == ACPI_WRITE)) { - ACPI_FREE(ares); + function == ACPI_WRITE)) return AE_BAD_PARAMETER; - } length = min(agpio->pin_table_length, pin_index + bits); + status = AE_OK; for (i = pin_index; i < length; ++i) { unsigned int pin = agpio->pin_table[i]; struct acpi_gpio_connection *conn; -- 2.54.0
|  |