diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index b7ff300b9f96..d72c2e650c8d 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -856,6 +856,18 @@ static void uaudio_dev_intf_cleanup(struct usb_device *udev, info->in_use = false; } +static void uaudio_event_ring_cleanup_free(struct uaudio_dev *dev) +{ + clear_bit(dev->card_num, &uaudio_qdev->card_slot); + /* all audio devices are disconnected */ + if (!uaudio_qdev->card_slot) { + uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE, + PAGE_SIZE); + xhci_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); + uaudio_dbg("all audio devices disconnected\n"); + } +} + static void uaudio_dev_cleanup(struct uaudio_dev *dev) { int if_idx; @@ -879,17 +891,7 @@ static void uaudio_dev_cleanup(struct uaudio_dev *dev) /* free interface info */ kfree(dev->info); dev->info = NULL; - - clear_bit(dev->card_num, &uaudio_qdev->card_slot); - - /* all audio devices are disconnected */ - if (!uaudio_qdev->card_slot) { - uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE, - PAGE_SIZE); - xhci_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); - uaudio_dbg("all audio devices disconnected\n"); - } - + uaudio_event_ring_cleanup_free(dev); dev->udev = NULL; } @@ -961,17 +963,7 @@ static void uaudio_dev_release(struct kref *kref) uaudio_dbg("for dev %pK\n", dev); atomic_set(&dev->in_use, 0); - - clear_bit(dev->card_num, &uaudio_qdev->card_slot); - - /* all audio devices are disconnected */ - if (!uaudio_qdev->card_slot) { - xhci_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); - uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE, - PAGE_SIZE); - uaudio_dbg("all audio devices disconnected\n"); - } - + uaudio_event_ring_cleanup_free(dev); wake_up(&dev->disconnect_wq); }