diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index a7962ca2ac8e3..8589ddc24b076 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c @@ -2455,6 +2455,7 @@ static int imon_probe(struct usb_interface *interface, } usb_set_intfdata(interface, ictx); + mutex_unlock(&driver_lock); if (ifnum == 0) { mutex_lock(&ictx->lock); @@ -2477,7 +2478,6 @@ static int imon_probe(struct usb_interface *interface, vendor, product, ifnum, usbdev->bus->busnum, usbdev->devnum); - mutex_unlock(&driver_lock); usb_put_dev(usbdev); return 0; @@ -2501,8 +2501,13 @@ static void imon_disconnect(struct usb_interface *interface) /* prevent races with multi-interface device probing and display_open */ mutex_lock(&driver_lock); - ictx = usb_get_intfdata(interface); + usb_set_intfdata(interface, NULL); + mutex_unlock(&driver_lock); + + if (!ictx) + return; + dev = ictx->dev; ifnum = interface->cur_altsetting->desc.bInterfaceNumber; @@ -2513,8 +2518,6 @@ static void imon_disconnect(struct usb_interface *interface) sysfs_remove_group(&interface->dev.kobj, &imon_display_attr_group); sysfs_remove_group(&interface->dev.kobj, &imon_rf_attr_group); - usb_set_intfdata(interface, NULL); - /* Abort ongoing write */ if (ictx->tx.busy) { usb_kill_urb(ictx->tx_urb); @@ -2546,8 +2549,6 @@ static void imon_disconnect(struct usb_interface *interface) if (!ictx->dev_present_intf0 && !ictx->dev_present_intf1) free_imon_context(ictx); - mutex_unlock(&driver_lock); - dev_dbg(dev, "%s: iMON device (intf%d) disconnected\n", __func__, ifnum); }