/**
  * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
- * @acpi_gpio:      ACPI GPIO chip
+ * @chip:      GPIO chip
  *
  * ACPI5 platforms can use GPIO signaled ACPI events. These GPIO interrupts are
  * handled by ACPI event methods which need to be called from the GPIO
  * gpio pins have acpi event methods and assigns interrupt handlers that calls
  * the acpi event methods for those pins.
  */
-static void acpi_gpiochip_request_interrupts(struct acpi_gpio_chip *acpi_gpio)
+void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
 {
-       struct gpio_chip *chip = acpi_gpio->chip;
+       struct acpi_gpio_chip *acpi_gpio;
+       acpi_handle handle;
+       acpi_status status;
+
+       if (!chip->dev || !chip->to_irq)
+               return;
 
-       if (!chip->to_irq)
+       handle = ACPI_HANDLE(chip->dev);
+       if (!handle)
+               return;
+
+       status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
+       if (ACPI_FAILURE(status))
                return;
 
        INIT_LIST_HEAD(&acpi_gpio->events);
 
 /**
  * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
- * @acpi_gpio:      ACPI GPIO chip
+ * @chip:      GPIO chip
  *
  * Free interrupts associated with GPIO ACPI event method for the given
  * GPIO chip.
  */
-static void acpi_gpiochip_free_interrupts(struct acpi_gpio_chip *acpi_gpio)
+void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
 {
+       struct acpi_gpio_chip *acpi_gpio;
        struct acpi_gpio_event *event, *ep;
-       struct gpio_chip *chip = acpi_gpio->chip;
+       acpi_handle handle;
+       acpi_status status;
+
+       if (!chip->dev || !chip->to_irq)
+               return;
 
-       if (!chip->to_irq)
+       handle = ACPI_HANDLE(chip->dev);
+       if (!handle)
+               return;
+
+       status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
+       if (ACPI_FAILURE(status))
                return;
 
        list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
                return;
        }
 
-       acpi_gpiochip_request_interrupts(acpi_gpio);
        acpi_gpiochip_request_regions(acpi_gpio);
 }
 
        }
 
        acpi_gpiochip_free_regions(acpi_gpio);
-       acpi_gpiochip_free_interrupts(acpi_gpio);
 
        acpi_detach_data(handle, acpi_gpio_chip_dh);
        kfree(acpi_gpio);
 
 {
        unsigned int offset;
 
+       acpi_gpiochip_free_interrupts(gpiochip);
+
        /* Remove all IRQ mappings and delete the domain */
        if (gpiochip->irqdomain) {
                for (offset = 0; offset < gpiochip->ngpio; offset++)
                        gpiochip->irq_base = irq_base;
        }
 
+       acpi_gpiochip_request_interrupts(gpiochip);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(gpiochip_irqchip_add);
 
 void acpi_gpiochip_add(struct gpio_chip *chip);
 void acpi_gpiochip_remove(struct gpio_chip *chip);
 
+void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);
+void acpi_gpiochip_free_interrupts(struct gpio_chip *chip);
+
 struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
                                          struct acpi_gpio_info *info);
 #else
 static inline void acpi_gpiochip_add(struct gpio_chip *chip) { }
 static inline void acpi_gpiochip_remove(struct gpio_chip *chip) { }
 
+static inline void
+acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { }
+
+static inline void
+acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { }
+
 static inline struct gpio_desc *
 acpi_get_gpiod_by_index(struct device *dev, int index,
                        struct acpi_gpio_info *info)