diff options
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/usbaudio.c | 10 | ||||
-rw-r--r-- | sound/usb/usbmixer.c | 2 |
2 files changed, 9 insertions, 3 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 3d7f36fb4cf0..19bdcc74c96c 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -2471,7 +2471,13 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform | |||
2471 | fp->nr_rates = nr_rates; | 2471 | fp->nr_rates = nr_rates; |
2472 | fp->rate_min = fp->rate_max = combine_triple(&fmt[8]); | 2472 | fp->rate_min = fp->rate_max = combine_triple(&fmt[8]); |
2473 | for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) { | 2473 | for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) { |
2474 | unsigned int rate = fp->rate_table[r] = combine_triple(&fmt[idx]); | 2474 | unsigned int rate = combine_triple(&fmt[idx]); |
2475 | /* C-Media CM6501 mislabels its 96 kHz altsetting */ | ||
2476 | if (rate == 48000 && nr_rates == 1 && | ||
2477 | chip->usb_id == USB_ID(0x0d8c, 0x0201) && | ||
2478 | fp->altsetting == 5 && fp->maxpacksize == 392) | ||
2479 | rate = 96000; | ||
2480 | fp->rate_table[r] = rate; | ||
2475 | if (rate < fp->rate_min) | 2481 | if (rate < fp->rate_min) |
2476 | fp->rate_min = rate; | 2482 | fp->rate_min = rate; |
2477 | else if (rate > fp->rate_max) | 2483 | else if (rate > fp->rate_max) |
@@ -3280,6 +3286,7 @@ static void snd_usb_audio_create_proc(struct snd_usb_audio *chip) | |||
3280 | 3286 | ||
3281 | static int snd_usb_audio_free(struct snd_usb_audio *chip) | 3287 | static int snd_usb_audio_free(struct snd_usb_audio *chip) |
3282 | { | 3288 | { |
3289 | usb_chip[chip->index] = NULL; | ||
3283 | kfree(chip); | 3290 | kfree(chip); |
3284 | return 0; | 3291 | return 0; |
3285 | } | 3292 | } |
@@ -3541,7 +3548,6 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr) | |||
3541 | list_for_each(p, &chip->mixer_list) { | 3548 | list_for_each(p, &chip->mixer_list) { |
3542 | snd_usb_mixer_disconnect(p); | 3549 | snd_usb_mixer_disconnect(p); |
3543 | } | 3550 | } |
3544 | usb_chip[chip->index] = NULL; | ||
3545 | mutex_unlock(®ister_mutex); | 3551 | mutex_unlock(®ister_mutex); |
3546 | snd_card_free_when_closed(card); | 3552 | snd_card_free_when_closed(card); |
3547 | } else { | 3553 | } else { |
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index e74eb1bc8d87..7b3bf3545a3b 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c | |||
@@ -1526,7 +1526,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi | |||
1526 | namelist[i] = kmalloc(MAX_ITEM_NAME_LEN, GFP_KERNEL); | 1526 | namelist[i] = kmalloc(MAX_ITEM_NAME_LEN, GFP_KERNEL); |
1527 | if (! namelist[i]) { | 1527 | if (! namelist[i]) { |
1528 | snd_printk(KERN_ERR "cannot malloc\n"); | 1528 | snd_printk(KERN_ERR "cannot malloc\n"); |
1529 | while (--i > 0) | 1529 | while (i--) |
1530 | kfree(namelist[i]); | 1530 | kfree(namelist[i]); |
1531 | kfree(namelist); | 1531 | kfree(namelist); |
1532 | kfree(cval); | 1532 | kfree(cval); |