summary refs log tree commit diff
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2014-11-05 15:37:22 +0100
committerTakashi Iwai <tiwai@suse.de>2014-11-05 15:37:22 +0100
commit19566b0bd93c34e4941822ed3c0d76a5abddcf82 (patch)
tree7e1894610584133feb4ee6e08bb3e05eb3d6acc1 /sound/usb
parent9161bd0d1cf375492f0a6aa86b3e4c28b070fb7c (diff)
parent0725dda207e95ff25f1aa01432250323e0ec49d6 (diff)
downloadlinux-19566b0bd93c34e4941822ed3c0d76a5abddcf82.tar.gz
Merge branch 'for-linus' into for-next
This merges the USB-audio disconnect fix and resolves the conflicts
so that we can continue working on development of usb-audio stuff.

Conflicts:
	sound/usb/card.c
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/card.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c
index 69725d5fa2d6..1fab9778807a 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -585,18 +585,19 @@ static void usb_audio_disconnect(struct usb_interface *intf)
 	struct snd_usb_audio *chip = usb_get_intfdata(intf);
 	struct snd_card *card;
 	struct list_head *p;
+	bool was_shutdown;
 
 	if (chip == (void *)-1L)
 		return;
 
 	card = chip->card;
 	down_write(&chip->shutdown_rwsem);
+	was_shutdown = chip->shutdown;
 	chip->shutdown = 1;
 	up_write(&chip->shutdown_rwsem);
 
 	mutex_lock(&register_mutex);
-	chip->num_interfaces--;
-	if (chip->num_interfaces <= 0) {
+	if (!was_shutdown) {
 		struct snd_usb_stream *as;
 		struct snd_usb_endpoint *ep;
 		struct usb_mixer_interface *mixer;
@@ -618,6 +619,10 @@ static void usb_audio_disconnect(struct usb_interface *intf)
 		list_for_each_entry(mixer, &chip->mixer_list, list) {
 			snd_usb_mixer_disconnect(mixer);
 		}
+	}
+
+	chip->num_interfaces--;
+	if (chip->num_interfaces <= 0) {
 		usb_chip[chip->index] = NULL;
 		mutex_unlock(&register_mutex);
 		snd_card_free_when_closed(card);