diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-06 15:14:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-06 15:14:22 -0500 |
commit | 9991357259a5718813881bae96d3704bb3f531e2 (patch) | |
tree | 1d57363d0658ecdfe18bce35ffecfb9f09bb7b3b /sound/usb | |
parent | c861cd3e92d92ae946e19099f198018fcb4fd887 (diff) | |
parent | f441917256c9727d3573ca2f89f657a75e06a262 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hda - Revert the check of NO_PRESENCE pincfg default bit
ALSA: hda - Fix a regression for DMA-position check with CA0110
ALSA: hda - Fix silent output regression with ALC861
ALSA: control: remove compilation warning on 32-bit
ALSA: ua101: fix crash when unplugging
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/misc/ua101.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c index 67bec7612442..c0609c210303 100644 --- a/sound/usb/misc/ua101.c +++ b/sound/usb/misc/ua101.c | |||
@@ -459,7 +459,8 @@ static void kill_stream_urbs(struct ua101_stream *stream) | |||
459 | unsigned int i; | 459 | unsigned int i; |
460 | 460 | ||
461 | for (i = 0; i < stream->queue_length; ++i) | 461 | for (i = 0; i < stream->queue_length; ++i) |
462 | usb_kill_urb(&stream->urbs[i]->urb); | 462 | if (stream->urbs[i]) |
463 | usb_kill_urb(&stream->urbs[i]->urb); | ||
463 | } | 464 | } |
464 | 465 | ||
465 | static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index) | 466 | static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index) |
@@ -484,6 +485,9 @@ static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index) | |||
484 | { | 485 | { |
485 | struct usb_host_interface *alts; | 486 | struct usb_host_interface *alts; |
486 | 487 | ||
488 | if (!ua->intf[intf_index]) | ||
489 | return; | ||
490 | |||
487 | alts = ua->intf[intf_index]->cur_altsetting; | 491 | alts = ua->intf[intf_index]->cur_altsetting; |
488 | if (alts->desc.bAlternateSetting != 0) { | 492 | if (alts->desc.bAlternateSetting != 0) { |
489 | int err = usb_set_interface(ua->dev, | 493 | int err = usb_set_interface(ua->dev, |
@@ -1144,27 +1148,37 @@ static void free_stream_urbs(struct ua101_stream *stream) | |||
1144 | { | 1148 | { |
1145 | unsigned int i; | 1149 | unsigned int i; |
1146 | 1150 | ||
1147 | for (i = 0; i < stream->queue_length; ++i) | 1151 | for (i = 0; i < stream->queue_length; ++i) { |
1148 | kfree(stream->urbs[i]); | 1152 | kfree(stream->urbs[i]); |
1153 | stream->urbs[i] = NULL; | ||
1154 | } | ||
1149 | } | 1155 | } |
1150 | 1156 | ||
1151 | static void free_usb_related_resources(struct ua101 *ua, | 1157 | static void free_usb_related_resources(struct ua101 *ua, |
1152 | struct usb_interface *interface) | 1158 | struct usb_interface *interface) |
1153 | { | 1159 | { |
1154 | unsigned int i; | 1160 | unsigned int i; |
1161 | struct usb_interface *intf; | ||
1155 | 1162 | ||
1163 | mutex_lock(&ua->mutex); | ||
1156 | free_stream_urbs(&ua->capture); | 1164 | free_stream_urbs(&ua->capture); |
1157 | free_stream_urbs(&ua->playback); | 1165 | free_stream_urbs(&ua->playback); |
1166 | mutex_unlock(&ua->mutex); | ||
1158 | free_stream_buffers(ua, &ua->capture); | 1167 | free_stream_buffers(ua, &ua->capture); |
1159 | free_stream_buffers(ua, &ua->playback); | 1168 | free_stream_buffers(ua, &ua->playback); |
1160 | 1169 | ||
1161 | for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) | 1170 | for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) { |
1162 | if (ua->intf[i]) { | 1171 | mutex_lock(&ua->mutex); |
1163 | usb_set_intfdata(ua->intf[i], NULL); | 1172 | intf = ua->intf[i]; |
1164 | if (ua->intf[i] != interface) | 1173 | ua->intf[i] = NULL; |
1174 | mutex_unlock(&ua->mutex); | ||
1175 | if (intf) { | ||
1176 | usb_set_intfdata(intf, NULL); | ||
1177 | if (intf != interface) | ||
1165 | usb_driver_release_interface(&ua101_driver, | 1178 | usb_driver_release_interface(&ua101_driver, |
1166 | ua->intf[i]); | 1179 | intf); |
1167 | } | 1180 | } |
1181 | } | ||
1168 | } | 1182 | } |
1169 | 1183 | ||
1170 | static void ua101_card_free(struct snd_card *card) | 1184 | static void ua101_card_free(struct snd_card *card) |