int parent_irq,
                                  irq_flow_handler_t parent_handler)
 {
+       if (gpiochip->can_sleep) {
+               chip_err(gpiochip, "you cannot have chained interrupts on a chip that may sleep\n");
+               return;
+       }
+
        irq_set_chained_handler(parent_irq, parent_handler);
        /*
         * The parent irqchip is already using the chip_data for this
 
        irq_set_chip_data(irq, chip);
        irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler);
+       /* Chips that can sleep need nested thread handlers */
+       if (chip->can_sleep)
+               irq_set_nested_thread(irq, 1);
 #ifdef CONFIG_ARM
        set_irq_flags(irq, IRQF_VALID);
 #else
 
 static void gpiochip_irq_unmap(struct irq_domain *d, unsigned int irq)
 {
+       struct gpio_chip *chip = d->host_data;
+
 #ifdef CONFIG_ARM
        set_irq_flags(irq, 0);
 #endif
+       if (chip->can_sleep)
+               irq_set_nested_thread(irq, 0);
        irq_set_chip_and_handler(irq, NULL, NULL);
        irq_set_chip_data(irq, NULL);
 }
 
  *      format specifier for an unsigned int.  It is substituted by the actual
  *      number of the gpio.
  * @can_sleep: flag must be set iff get()/set() methods sleep, as they
- *     must while accessing GPIO expander chips over I2C or SPI
+ *     must while accessing GPIO expander chips over I2C or SPI. This
+ *     implies that if the chip supports IRQs, these IRQs need to be threaded
+ *     as the chip access may sleep when e.g. reading out the IRQ status
+ *     registers.
  * @exported: flags if the gpiochip is exported for use from sysfs. Private.
  *
  * A gpio_chip can help platforms abstract various sources of GPIOs so