summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/usb/em28xx/em28xx-cards.c5
-rw-r--r--drivers/media/usb/em28xx/em28xx-core.c2
2 files changed, 5 insertions, 2 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c
index 551cbc294190..154e6f028fd2 100644
--- a/drivers/media/usb/em28xx/em28xx-cards.c
+++ b/drivers/media/usb/em28xx/em28xx-cards.c
@@ -3485,9 +3485,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
dev->disconnected = 1;
if (dev->is_audio_only) {
- mutex_lock(&dev->lock);
em28xx_close_extension(dev);
- mutex_unlock(&dev->lock);
return;
}
@@ -3506,10 +3504,13 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE);
em28xx_uninit_usb_xfer(dev, EM28XX_DIGITAL_MODE);
}
+ mutex_unlock(&dev->lock);
em28xx_close_extension(dev);
+
/* NOTE: must be called BEFORE the resources are released */
+ mutex_lock(&dev->lock);
if (!dev->users)
em28xx_release_resources(dev);
diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c
index 3012912d2997..f77301773aee 100644
--- a/drivers/media/usb/em28xx/em28xx-core.c
+++ b/drivers/media/usb/em28xx/em28xx-core.c
@@ -1094,10 +1094,12 @@ void em28xx_close_extension(struct em28xx *dev)
const struct em28xx_ops *ops = NULL;
mutex_lock(&em28xx_devlist_mutex);
+ mutex_lock(&dev->lock);
list_for_each_entry(ops, &em28xx_extension_devlist, next) {
if (ops->fini)
ops->fini(dev);
}
+ mutex_unlock(&dev->lock);
list_del(&dev->devlist);
mutex_unlock(&em28xx_devlist_mutex);
}