struct gpio_desc *gpio_privacy;
        int irq;
 
-       gpio_privacy = devm_gpiod_get_optional(&dev->udev->dev, "privacy",
+       gpio_privacy = devm_gpiod_get_optional(&dev->intf->dev, "privacy",
                                               GPIOD_IN);
        if (IS_ERR_OR_NULL(gpio_privacy))
                return PTR_ERR_OR_ZERO(gpio_privacy);
 
        irq = gpiod_to_irq(gpio_privacy);
        if (irq < 0)
-               return dev_err_probe(&dev->udev->dev, irq,
+               return dev_err_probe(&dev->intf->dev, irq,
                                     "No IRQ for privacy GPIO\n");
 
        unit = uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT,
 static int uvc_gpio_init_irq(struct uvc_device *dev)
 {
        struct uvc_entity *unit = dev->gpio_unit;
+       int ret;
 
        if (!unit || unit->gpio.irq < 0)
                return 0;
 
-       return devm_request_threaded_irq(&dev->udev->dev, unit->gpio.irq, NULL,
-                                        uvc_gpio_irq,
-                                        IRQF_ONESHOT | IRQF_TRIGGER_FALLING |
-                                        IRQF_TRIGGER_RISING,
-                                        "uvc_privacy_gpio", dev);
+       ret = request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq,
+                                  IRQF_ONESHOT | IRQF_TRIGGER_FALLING |
+                                  IRQF_TRIGGER_RISING,
+                                  "uvc_privacy_gpio", dev);
+
+       unit->gpio.initialized = !ret;
+
+       return ret;
+}
+
+static void uvc_gpio_deinit(struct uvc_device *dev)
+{
+       if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized)
+               return;
+
+       free_irq(dev->gpio_unit->gpio.irq, dev);
 }
 
 /* ------------------------------------------------------------------------
 {
        struct uvc_streaming *stream;
 
+       uvc_gpio_deinit(dev);
+
        list_for_each_entry(stream, &dev->streams, list) {
                /* Nothing to do here, continue. */
                if (!video_is_registered(&stream->vdev))