struct fusb302_chip *chip = dev_id;
        unsigned long flags;
 
+       /* Disable our level triggered IRQ until our irq_work has cleared it */
+       disable_irq_nosync(chip->gpio_int_n_irq);
+
        spin_lock_irqsave(&chip->irq_lock, flags);
        if (chip->irq_suspended)
                chip->irq_while_suspended = true;
        }
 done:
        mutex_unlock(&chip->lock);
+       enable_irq(chip->gpio_int_n_irq);
 }
 
 static int init_gpio(struct fusb302_chip *chip)
                goto destroy_workqueue;
        }
 
-       ret = devm_request_threaded_irq(dev, chip->gpio_int_n_irq,
-                                       NULL, fusb302_irq_intn,
-                                       IRQF_ONESHOT | IRQF_TRIGGER_LOW,
-                                       "fsc_interrupt_int_n", chip);
+       ret = request_irq(chip->gpio_int_n_irq, fusb302_irq_intn,
+                         IRQF_ONESHOT | IRQF_TRIGGER_LOW,
+                         "fsc_interrupt_int_n", chip);
        if (ret < 0) {
                dev_err(dev, "cannot request IRQ for GPIO Int_N, ret=%d", ret);
                goto tcpm_unregister_port;
        struct fusb302_chip *chip = i2c_get_clientdata(client);
 
        disable_irq_wake(chip->gpio_int_n_irq);
+       free_irq(chip->gpio_int_n_irq, chip);
        cancel_work_sync(&chip->irq_work);
        cancel_delayed_work_sync(&chip->bc_lvl_handler);
        tcpm_unregister_port(chip->tcpm_port);