int (*write)(struct sfp *, bool, u8, void *, size_t);
 
        struct gpio_desc *gpio[GPIO_MAX];
+       int gpio_irq[GPIO_MAX];
 
        bool attached;
        unsigned int state;
        struct i2c_adapter *i2c;
        struct sfp *sfp;
        bool poll = false;
-       int irq, err, i;
+       int err, i;
 
        sfp = sfp_alloc(&pdev->dev);
        if (IS_ERR(sfp))
                if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i])
                        continue;
 
-               irq = gpiod_to_irq(sfp->gpio[i]);
-               if (!irq) {
+               sfp->gpio_irq[i] = gpiod_to_irq(sfp->gpio[i]);
+               if (!sfp->gpio_irq[i]) {
                        poll = true;
                        continue;
                }
 
-               err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq,
+               err = devm_request_threaded_irq(sfp->dev, sfp->gpio_irq[i],
+                                               NULL, sfp_irq,
                                                IRQF_ONESHOT |
                                                IRQF_TRIGGER_RISING |
                                                IRQF_TRIGGER_FALLING,
                                                dev_name(sfp->dev), sfp);
-               if (err)
+               if (err) {
+                       sfp->gpio_irq[i] = 0;
                        poll = true;
+               }
        }
 
        if (poll)
        return 0;
 }
 
+static void sfp_shutdown(struct platform_device *pdev)
+{
+       struct sfp *sfp = platform_get_drvdata(pdev);
+       int i;
+
+       for (i = 0; i < GPIO_MAX; i++) {
+               if (!sfp->gpio_irq[i])
+                       continue;
+
+               devm_free_irq(sfp->dev, sfp->gpio_irq[i], sfp);
+       }
+
+       cancel_delayed_work_sync(&sfp->poll);
+       cancel_delayed_work_sync(&sfp->timeout);
+}
+
 static struct platform_driver sfp_driver = {
        .probe = sfp_probe,
        .remove = sfp_remove,
+       .shutdown = sfp_shutdown,
        .driver = {
                .name = "sfp",
                .of_match_table = sfp_of_match,