media: imon: drop references only after device is no longer used
authorOliver Neukum <oneukum@suse.com>
Thu, 28 Apr 2022 13:34:55 +0000 (15:34 +0200)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 13 May 2022 09:02:23 +0000 (11:02 +0200)
The point of using get/put_device() is to keep references
for as long as the device may be in use. That means dropping
them must be the penultimate action right before freeing the memory.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/rc/imon.c

index 8dbeab4..ad8bca8 100644 (file)
@@ -2523,7 +2523,6 @@ static void imon_disconnect(struct usb_interface *interface)
        if (ifnum == 0) {
                ictx->dev_present_intf0 = false;
                usb_kill_urb(ictx->rx_urb_intf0);
-               usb_put_dev(ictx->usbdev_intf0);
                input_unregister_device(ictx->idev);
                rc_unregister_device(ictx->rdev);
                if (ictx->display_supported) {
@@ -2532,14 +2531,15 @@ static void imon_disconnect(struct usb_interface *interface)
                        else if (ictx->display_type == IMON_DISPLAY_TYPE_VFD)
                                usb_deregister_dev(interface, &imon_vfd_class);
                }
+               usb_put_dev(ictx->usbdev_intf0);
        } else {
                ictx->dev_present_intf1 = false;
                usb_kill_urb(ictx->rx_urb_intf1);
-               usb_put_dev(ictx->usbdev_intf1);
                if (ictx->display_type == IMON_DISPLAY_TYPE_VGA) {
                        del_timer_sync(&ictx->ttimer);
                        input_unregister_device(ictx->touch);
                }
+               usb_put_dev(ictx->usbdev_intf1);
        }
 
        if (!ictx->dev_present_intf0 && !ictx->dev_present_intf1)