aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/card.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/usb/card.c')
-rw-r--r--sound/usb/card.c10
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
277static int snd_usb_audio_free(struct snd_usb_audio *chip) 278static 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);