diff options
Diffstat (limited to 'sound/usb/quirks.c')
-rw-r--r-- | sound/usb/quirks.c | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index cf8bf088394b..355759bad581 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
@@ -425,6 +425,34 @@ static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev) | |||
425 | } | 425 | } |
426 | 426 | ||
427 | /* | 427 | /* |
428 | * Some sound cards from Native Instruments are in fact compliant to the USB | ||
429 | * audio standard of version 2 and other approved USB standards, even though | ||
430 | * they come up as vendor-specific device when first connected. | ||
431 | * | ||
432 | * However, they can be told to come up with a new set of descriptors | ||
433 | * upon their next enumeration, and the interfaces announced by the new | ||
434 | * descriptors will then be handled by the kernel's class drivers. As the | ||
435 | * product ID will also change, no further checks are required. | ||
436 | */ | ||
437 | |||
438 | static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev) | ||
439 | { | ||
440 | int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
441 | 0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
442 | cpu_to_le16(1), 0, NULL, 0, 1000); | ||
443 | |||
444 | if (ret < 0) | ||
445 | return ret; | ||
446 | |||
447 | usb_reset_device(dev); | ||
448 | |||
449 | /* return -EAGAIN, so the creation of an audio interface for this | ||
450 | * temporary device is aborted. The device will reconnect with a | ||
451 | * new product ID */ | ||
452 | return -EAGAIN; | ||
453 | } | ||
454 | |||
455 | /* | ||
428 | * Setup quirks | 456 | * Setup quirks |
429 | */ | 457 | */ |
430 | #define AUDIOPHILE_SET 0x01 /* if set, parse device_setup */ | 458 | #define AUDIOPHILE_SET 0x01 /* if set, parse device_setup */ |
@@ -489,27 +517,33 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, | |||
489 | u32 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), | 517 | u32 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), |
490 | le16_to_cpu(dev->descriptor.idProduct)); | 518 | le16_to_cpu(dev->descriptor.idProduct)); |
491 | 519 | ||
492 | /* SB Extigy needs special boot-up sequence */ | 520 | switch (id) { |
493 | /* if more models come, this will go to the quirk list. */ | 521 | case USB_ID(0x041e, 0x3000): |
494 | if (id == USB_ID(0x041e, 0x3000)) | 522 | /* SB Extigy needs special boot-up sequence */ |
523 | /* if more models come, this will go to the quirk list. */ | ||
495 | return snd_usb_extigy_boot_quirk(dev, intf); | 524 | return snd_usb_extigy_boot_quirk(dev, intf); |
496 | 525 | ||
497 | /* SB Audigy 2 NX needs its own boot-up magic, too */ | 526 | case USB_ID(0x041e, 0x3020): |
498 | if (id == USB_ID(0x041e, 0x3020)) | 527 | /* SB Audigy 2 NX needs its own boot-up magic, too */ |
499 | return snd_usb_audigy2nx_boot_quirk(dev); | 528 | return snd_usb_audigy2nx_boot_quirk(dev); |
500 | 529 | ||
501 | /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */ | 530 | case USB_ID(0x10f5, 0x0200): |
502 | if (id == USB_ID(0x10f5, 0x0200)) | 531 | /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */ |
503 | return snd_usb_cm106_boot_quirk(dev); | 532 | return snd_usb_cm106_boot_quirk(dev); |
504 | 533 | ||
505 | /* C-Media CM6206 / CM106-Like Sound Device */ | 534 | case USB_ID(0x0d8c, 0x0102): |
506 | if (id == USB_ID(0x0d8c, 0x0102)) | 535 | /* C-Media CM6206 / CM106-Like Sound Device */ |
507 | return snd_usb_cm6206_boot_quirk(dev); | 536 | return snd_usb_cm6206_boot_quirk(dev); |
508 | 537 | ||
509 | /* Access Music VirusTI Desktop */ | 538 | case USB_ID(0x133e, 0x0815): |
510 | if (id == USB_ID(0x133e, 0x0815)) | 539 | /* Access Music VirusTI Desktop */ |
511 | return snd_usb_accessmusic_boot_quirk(dev); | 540 | return snd_usb_accessmusic_boot_quirk(dev); |
512 | 541 | ||
542 | case USB_ID(0x17cc, 0x1010): /* Traktor Audio 6 */ | ||
543 | case USB_ID(0x17cc, 0x1020): /* Traktor Audio 10 */ | ||
544 | return snd_usb_nativeinstruments_boot_quirk(dev); | ||
545 | } | ||
546 | |||
513 | return 0; | 547 | return 0; |
514 | } | 548 | } |
515 | 549 | ||
@@ -532,7 +566,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, struct audioformat | |||
532 | } | 566 | } |
533 | 567 | ||
534 | /* | 568 | /* |
535 | * For E-Mu 0404USB/0202USB/TrackerPre sample rate should be set for device, | 569 | * For E-Mu 0404USB/0202USB/TrackerPre/0204 sample rate should be set for device, |
536 | * not for interface. | 570 | * not for interface. |
537 | */ | 571 | */ |
538 | 572 | ||
@@ -589,6 +623,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, | |||
589 | case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */ | 623 | case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */ |
590 | case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */ | 624 | case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */ |
591 | case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */ | 625 | case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */ |
626 | case USB_ID(0x041e, 0x3f19): /* E-Mu 0204 USB */ | ||
592 | set_format_emu_quirk(subs, fmt); | 627 | set_format_emu_quirk(subs, fmt); |
593 | break; | 628 | break; |
594 | } | 629 | } |