diff options
Diffstat (limited to 'sound/usb/card.c')
-rw-r--r-- | sound/usb/card.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c index 4a7be7b98331..d5b5c3388e28 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
@@ -131,8 +131,9 @@ static void snd_usb_stream_disconnect(struct list_head *head) | |||
131 | subs = &as->substream[idx]; | 131 | subs = &as->substream[idx]; |
132 | if (!subs->num_formats) | 132 | if (!subs->num_formats) |
133 | continue; | 133 | continue; |
134 | snd_usb_release_substream_urbs(subs, 1); | ||
135 | subs->interface = -1; | 134 | subs->interface = -1; |
135 | subs->data_endpoint = NULL; | ||
136 | subs->sync_endpoint = NULL; | ||
136 | } | 137 | } |
137 | } | 138 | } |
138 | 139 | ||
@@ -276,6 +277,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) | |||
276 | 277 | ||
277 | static int snd_usb_audio_free(struct snd_usb_audio *chip) | 278 | static int snd_usb_audio_free(struct snd_usb_audio *chip) |
278 | { | 279 | { |
280 | mutex_destroy(&chip->mutex); | ||
279 | kfree(chip); | 281 | kfree(chip); |
280 | return 0; | 282 | return 0; |
281 | } | 283 | } |
@@ -336,6 +338,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx, | |||
336 | return -ENOMEM; | 338 | return -ENOMEM; |
337 | } | 339 | } |
338 | 340 | ||
341 | mutex_init(&chip->mutex); | ||
339 | mutex_init(&chip->shutdown_mutex); | 342 | mutex_init(&chip->shutdown_mutex); |
340 | chip->index = idx; | 343 | chip->index = idx; |
341 | chip->dev = dev; | 344 | chip->dev = dev; |
@@ -348,6 +351,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx, | |||
348 | chip->usb_id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), | 351 | chip->usb_id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), |
349 | le16_to_cpu(dev->descriptor.idProduct)); | 352 | le16_to_cpu(dev->descriptor.idProduct)); |
350 | INIT_LIST_HEAD(&chip->pcm_list); | 353 | INIT_LIST_HEAD(&chip->pcm_list); |
354 | INIT_LIST_HEAD(&chip->ep_list); | ||
351 | INIT_LIST_HEAD(&chip->midi_list); | 355 | INIT_LIST_HEAD(&chip->midi_list); |
352 | INIT_LIST_HEAD(&chip->mixer_list); | 356 | INIT_LIST_HEAD(&chip->mixer_list); |
353 | 357 | ||
@@ -565,6 +569,10 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
565 | list_for_each(p, &chip->pcm_list) { | 569 | list_for_each(p, &chip->pcm_list) { |
566 | snd_usb_stream_disconnect(p); | 570 | snd_usb_stream_disconnect(p); |
567 | } | 571 | } |
572 | /* release the endpoint resources */ | ||
573 | list_for_each(p, &chip->ep_list) { | ||
574 | snd_usb_endpoint_free(p); | ||
575 | } | ||
568 | /* release the midi resources */ | 576 | /* release the midi resources */ |
569 | list_for_each(p, &chip->midi_list) { | 577 | list_for_each(p, &chip->midi_list) { |
570 | snd_usbmidi_disconnect(p); | 578 | snd_usbmidi_disconnect(p); |