sound: usb-audio: make the MotU Fastlane work again
[safe/jmp/linux-2.6] / sound / usb / usbquirks.h
index 5c6b3da..5d955aa 100644 (file)
        .idProduct = prod, \
        .bInterfaceClass = USB_CLASS_VENDOR_SPEC
 
+/* Creative/Toshiba Multimedia Center SB-0500 */
+{
+       USB_DEVICE(0x041e, 0x3048),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Toshiba",
+               .product_name = "SB-0500",
+               .ifnum = QUIRK_NO_INTERFACE
+       }
+},
+
+/* Creative/E-Mu devices */
+{
+       USB_DEVICE(0x041e, 0x3010),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Creative Labs",
+               .product_name = "Sound Blaster MP3+",
+               .ifnum = QUIRK_NO_INTERFACE
+       }
+},
+{
+       /* E-Mu 0202 USB */
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
+       .idVendor = 0x041e,
+       .idProduct = 0x3f02,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+},
+{
+       /* E-Mu 0404 USB */
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
+       .idVendor = 0x041e,
+       .idProduct = 0x3f04,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+},
+{
+       /* E-Mu Tracker Pre */
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
+       .idVendor = 0x041e,
+       .idProduct = 0x3f0a,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+},
+
+/*
+ * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
+ * class matches do not take effect without an explicit ID match.
+ */
+{
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+                      USB_DEVICE_ID_MATCH_INT_CLASS |
+                      USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+       .idVendor = 0x046d,
+       .idProduct = 0x0850,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+       .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
+},
+{
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+                      USB_DEVICE_ID_MATCH_INT_CLASS |
+                      USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+       .idVendor = 0x046d,
+       .idProduct = 0x08ae,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+       .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
+},
+{
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+                      USB_DEVICE_ID_MATCH_INT_CLASS |
+                      USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+       .idVendor = 0x046d,
+       .idProduct = 0x08c6,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+       .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
+},
+{
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+                      USB_DEVICE_ID_MATCH_INT_CLASS |
+                      USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+       .idVendor = 0x046d,
+       .idProduct = 0x08f0,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+       .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
+},
+{
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+                      USB_DEVICE_ID_MATCH_INT_CLASS |
+                      USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+       .idVendor = 0x046d,
+       .idProduct = 0x08f5,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+       .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
+},
+{
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+                      USB_DEVICE_ID_MATCH_INT_CLASS |
+                      USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+       .idVendor = 0x046d,
+       .idProduct = 0x08f6,
+       .bInterfaceClass = USB_CLASS_AUDIO,
+       .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
+},
+{
+       USB_DEVICE(0x046d, 0x0990),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Logitech, Inc.",
+               .product_name = "QuickCam Pro 9000",
+               .ifnum = QUIRK_NO_INTERFACE
+       }
+},
+
 /*
  * Yamaha devices
  */
 
 #define YAMAHA_DEVICE(id, name) { \
        USB_DEVICE(0x0499, id), \
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) { \
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
                .vendor_name = "Yamaha", \
                .product_name = name, \
                .ifnum = QUIRK_ANY_INTERFACE, \
 }
 #define YAMAHA_INTERFACE(id, intf, name) { \
        USB_DEVICE_VENDOR_SPEC(0x0499, id), \
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) { \
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
                .vendor_name = "Yamaha", \
                .product_name = name, \
                .ifnum = intf, \
@@ -82,6 +190,7 @@ YAMAHA_DEVICE(0x1012, "TYROS"),
 YAMAHA_DEVICE(0x1013, "PF-500"),
 YAMAHA_DEVICE(0x1014, "S90"),
 YAMAHA_DEVICE(0x1015, "MOTIF-R"),
+YAMAHA_DEVICE(0x1016, "MDP-5"),
 YAMAHA_DEVICE(0x1017, "CVP-204"),
 YAMAHA_DEVICE(0x1018, "CVP-206"),
 YAMAHA_DEVICE(0x1019, "CVP-208"),
@@ -90,6 +199,7 @@ YAMAHA_DEVICE(0x101b, "PSR-1100"),
 YAMAHA_DEVICE(0x101c, "PSR-2100"),
 YAMAHA_DEVICE(0x101d, "CLP-175"),
 YAMAHA_DEVICE(0x101e, "PSR-K1"),
+YAMAHA_DEVICE(0x101f, "EZ-J24"),
 YAMAHA_DEVICE(0x1020, "EZ-250i"),
 YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
 YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
@@ -121,6 +231,15 @@ YAMAHA_DEVICE(0x103e, NULL),
 YAMAHA_DEVICE(0x103f, NULL),
 YAMAHA_DEVICE(0x1040, NULL),
 YAMAHA_DEVICE(0x1041, NULL),
+YAMAHA_DEVICE(0x1042, NULL),
+YAMAHA_DEVICE(0x1043, NULL),
+YAMAHA_DEVICE(0x1044, NULL),
+YAMAHA_DEVICE(0x1045, NULL),
+YAMAHA_INTERFACE(0x104e, 0, NULL),
+YAMAHA_DEVICE(0x104f, NULL),
+YAMAHA_DEVICE(0x1050, NULL),
+YAMAHA_DEVICE(0x1051, NULL),
+YAMAHA_DEVICE(0x1052, NULL),
 YAMAHA_DEVICE(0x2000, "DGP-7"),
 YAMAHA_DEVICE(0x2001, "DGP-5"),
 YAMAHA_DEVICE(0x2002, NULL),
@@ -139,6 +258,7 @@ YAMAHA_DEVICE(0x500b, "DME64N"),
 YAMAHA_DEVICE(0x500c, "DME24N"),
 YAMAHA_DEVICE(0x500d, NULL),
 YAMAHA_DEVICE(0x500e, NULL),
+YAMAHA_DEVICE(0x500f, NULL),
 YAMAHA_DEVICE(0x7000, "DTX"),
 YAMAHA_DEVICE(0x7010, "UB99"),
 #undef YAMAHA_DEVICE
@@ -149,12 +269,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
  */
 {
        USB_DEVICE(0x0582, 0x0000),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "UA-100",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_AUDIO_FIXED_ENDPOINT,
@@ -192,7 +312,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0007,
                                        .in_cables  = 0x0007
                                }
@@ -205,12 +325,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0002),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UM-4",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -222,7 +342,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x000f,
                                        .in_cables  = 0x000f
                                }
@@ -235,12 +355,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0003),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "SC-8850",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -252,7 +372,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x003f,
                                        .in_cables  = 0x003f
                                }
@@ -265,12 +385,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0004),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "U-8",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -282,7 +402,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0005,
                                        .in_cables  = 0x0005
                                }
@@ -294,13 +414,15 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* Has ID 0x0099 when not in "Advanced Driver" mode.
+        * The UM-2EX has only one input, but we cannot detect this. */
        USB_DEVICE(0x0582, 0x0005),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UM-2",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -312,7 +434,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0003,
                                        .in_cables  = 0x0003
                                }
@@ -325,12 +447,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0007),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "SC-8820",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -342,7 +464,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0013,
                                        .in_cables  = 0x0013
                                }
@@ -355,12 +477,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0008),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "PC-300",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -372,7 +494,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0001,
                                        .in_cables  = 0x0001
                                }
@@ -384,13 +506,14 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x009d when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0009),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UM-1",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -402,7 +525,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0001,
                                        .in_cables  = 0x0001
                                }
@@ -415,12 +538,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x000b),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "SK-500",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -432,7 +555,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0013,
                                        .in_cables  = 0x0013
                                }
@@ -447,12 +570,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        /* thanks to Emiliano Grilli <emillo@libero.it>
         * for helping researching this data */
        USB_DEVICE(0x0582, 0x000c),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "SC-D70",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_AUDIO_FIXED_ENDPOINT,
@@ -490,7 +613,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0007,
                                        .in_cables  = 0x0007
                                }
@@ -511,12 +634,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * the 96kHz sample rate.
         */
        USB_DEVICE(0x0582, 0x0010),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UA-5",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 1,
                                .type = QUIRK_AUDIO_STANDARD_INTERFACE
@@ -532,39 +655,42 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x0013 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0012),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "XV-5050",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
        }
 },
 {
+       /* has ID 0x0015 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0014),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UM-880",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x01ff,
                        .in_cables  = 0x01ff
                }
        }
 },
 {
+       /* has ID 0x0017 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0016),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "SD-90",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -576,7 +702,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x000f,
                                        .in_cables  = 0x000f
                                }
@@ -588,13 +714,14 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x001c when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x001b),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "MMP-2",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -606,7 +733,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 2,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0001,
                                        .in_cables  = 0x0001
                                }
@@ -618,26 +745,28 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x001e when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x001d),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "V-SYNTH",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
        }
 },
 {
+       /* has ID 0x0024 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0023),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UM-550",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x003f,
                        .in_cables  = 0x003f
                }
@@ -650,23 +779,57 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * and no MIDI.
         */
        USB_DEVICE(0x0582, 0x0025),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UA-20",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_IGNORE_INTERFACE
+                       },
                        {
                                .ifnum = 1,
-                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                               .type = QUIRK_AUDIO_FIXED_ENDPOINT,
+                               .data = & (const struct audioformat) {
+                                       .format = SNDRV_PCM_FORMAT_S24_3LE,
+                                       .channels = 2,
+                                       .iface = 1,
+                                       .altsetting = 1,
+                                       .altset_idx = 1,
+                                       .attributes = 0,
+                                       .endpoint = 0x01,
+                                       .ep_attr = 0x01,
+                                       .rates = SNDRV_PCM_RATE_CONTINUOUS,
+                                       .rate_min = 44100,
+                                       .rate_max = 44100,
+                               }
                        },
                        {
                                .ifnum = 2,
-                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                               .type = QUIRK_AUDIO_FIXED_ENDPOINT,
+                               .data = & (const struct audioformat) {
+                                       .format = SNDRV_PCM_FORMAT_S24_3LE,
+                                       .channels = 2,
+                                       .iface = 2,
+                                       .altsetting = 1,
+                                       .altset_idx = 1,
+                                       .attributes = 0,
+                                       .endpoint = 0x82,
+                                       .ep_attr = 0x01,
+                                       .rates = SNDRV_PCM_RATE_CONTINUOUS,
+                                       .rate_min = 44100,
+                                       .rate_max = 44100,
+                               }
                        },
                        {
                                .ifnum = 3,
-                               .type = QUIRK_MIDI_STANDARD_INTERFACE
+                               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
+                                       .out_cables = 0x0001,
+                                       .in_cables  = 0x0001
+                               }
                        },
                        {
                                .ifnum = -1
@@ -675,26 +838,28 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x0028 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0027),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "SD-20",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0003,
                        .in_cables  = 0x0007
                }
        }
 },
 {
+       /* has ID 0x002a when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0029),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "SD-80",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x000f,
                        .in_cables  = 0x000f
                }
@@ -707,23 +872,23 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * but offers only 16-bit PCM and no MIDI.
         */
        USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UA-700",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 1,
-                               .type = QUIRK_AUDIO_EDIROL_UA700_UA25
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
                        },
                        {
                                .ifnum = 2,
-                               .type = QUIRK_AUDIO_EDIROL_UA700_UA25
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
                        },
                        {
                                .ifnum = 3,
-                               .type = QUIRK_AUDIO_EDIROL_UA700_UA25
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
                        },
                        {
                                .ifnum = -1
@@ -732,52 +897,60 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x002e when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x002d),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "XV-2020",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
        }
 },
 {
+       /* has ID 0x0030 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x002f),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "VariOS",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0007,
                        .in_cables  = 0x0007
                }
        }
 },
 {
+       /* has ID 0x0034 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0033),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "PCR",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0003,
                        .in_cables  = 0x0007
                }
        }
 },
+       /* TODO: add Roland M-1000 support */
 {
+       /*
+        * Has ID 0x0038 when not in "Advanced Driver" mode;
+        * later revisions use IDs 0x0054 and 0x00a2.
+        */
        USB_DEVICE(0x0582, 0x0037),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "Digital Piano",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -790,12 +963,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * and no MIDI.
         */
        USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "BOSS",
                .product_name = "GS-10",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = & (const snd_usb_audio_quirk_t[]) {
+               .data = & (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 1,
                                .type = QUIRK_AUDIO_STANDARD_INTERFACE
@@ -815,26 +988,28 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x0041 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0040),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "GI-20",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
        }
 },
 {
+       /* has ID 0x0043 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0042),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "RS-70",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -842,12 +1017,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0044),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "UA-1000",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 1,
                                .type = QUIRK_AUDIO_EDIROL_UA1000
@@ -859,7 +1034,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 3,
                                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0003,
                                        .in_cables  = 0x0003
                                }
@@ -871,26 +1046,76 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x0049 when not in "Advanced Driver" mode */
+       USB_DEVICE(0x0582, 0x0047),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               /* .vendor_name = "EDIROL", */
+               /* .product_name = "UR-80", */
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       /* in the 96 kHz modes, only interface 1 is there */
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       /* has ID 0x004a when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0048),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
-               .vendor_name = "EDIROL",
-               .product_name = "UR-80",
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               /* .vendor_name = "EDIROL", */
+               /* .product_name = "UR-80", */
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0003,
                        .in_cables  = 0x0007
                }
        }
 },
+       /* TODO: add Edirol M-100FX support */
+{
+       /* has ID 0x004e when not in "Advanced Driver" mode */
+       USB_DEVICE(0x0582, 0x004c),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "PCR-A",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
 {
+       /* has ID 0x004f when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x004d),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "PCR-A",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0003,
                        .in_cables  = 0x0007
                }
@@ -902,12 +1127,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * is standard compliant, but has only 16-bit PCM.
         */
        USB_DEVICE(0x0582, 0x0050),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UA-3FX",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 1,
                                .type = QUIRK_AUDIO_STANDARD_INTERFACE
@@ -924,7 +1149,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x0582, 0x0052),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UM-1SX",
                .ifnum = 0,
@@ -932,39 +1157,51 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       USB_DEVICE(0x0582, 0x0060),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Roland",
+               .product_name = "EXR Series",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_STANDARD_INTERFACE
+       }
+},
+{
+       /* has ID 0x0067 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0065),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "PCR-1",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0003
                }
        }
 },
 {
+       /* has ID 0x006b when not in "Advanced Driver" mode */
        USB_DEVICE_VENDOR_SPEC(0x0582, 0x006a),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "SP-606",
                .ifnum = 3,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
        }
 },
 {
+       /* has ID 0x006e when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x006d),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
                .product_name = "FANTOM-X",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -977,23 +1214,23 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * offers only 16-bit PCM at 44.1 kHz and no MIDI.
         */
        USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "EDIROL",
                .product_name = "UA-25",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = (const snd_usb_audio_quirk_t[]) {
+               .data = (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
-                               .type = QUIRK_AUDIO_EDIROL_UA700_UA25
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
                        },
                        {
                                .ifnum = 1,
-                               .type = QUIRK_AUDIO_EDIROL_UA700_UA25
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
                        },
                        {
                                .ifnum = 2,
-                               .type = QUIRK_AUDIO_EDIROL_UA700_UA25
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
                        },
                        {
                                .ifnum = -1
@@ -1002,41 +1239,326 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 {
+       /* has ID 0x0076 when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x0075),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "BOSS",
                .product_name = "DR-880",
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
        }
 },
 {
+       /* has ID 0x007b when not in "Advanced Driver" mode */
        USB_DEVICE_VENDOR_SPEC(0x0582, 0x007a),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Roland",
-               /* RD-700SX, RD-300SX */
+               /* "RD" or "RD-700SX"? */
                .ifnum = 0,
                .type = QUIRK_MIDI_FIXED_ENDPOINT,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0003,
                        .in_cables  = 0x0003
                }
        }
 },
+/* Roland UA-101 in High-Speed Mode only */
+{
+       USB_DEVICE(0x0582, 0x007d),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Roland",
+               .product_name = "UA-101",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_EDIROL_UA101
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_EDIROL_UA101
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
+                                       .out_cables = 0x0001,
+                                       .in_cables  = 0x0001
+                               }
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       /* has ID 0x0081 when not in "Advanced Driver" mode */
+       USB_DEVICE(0x0582, 0x0080),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Roland",
+               .product_name = "G-70",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+               .data = & (const struct snd_usb_midi_endpoint_info) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
+       }
+},
+       /* TODO: add Roland V-SYNTH XT support */
+       /* TODO: add BOSS GT-PRO support */
+{
+       /* has ID 0x008c when not in "Advanced Driver" mode */
+       USB_DEVICE(0x0582, 0x008b),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "PC-50",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+               .data = & (const struct snd_usb_midi_endpoint_info) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
+       }
+},
+       /* TODO: add Edirol PC-80 support */
+{
+       USB_DEVICE(0x0582, 0x0096),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "UA-1EX",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       USB_DEVICE(0x0582, 0x009a),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "UM-3EX",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+               .data = & (const struct snd_usb_midi_endpoint_info) {
+                       .out_cables = 0x000f,
+                       .in_cables  = 0x000f
+               }
+       }
+},
+{
+       /*
+        * This quirk is for the "Advanced Driver" mode. If off, the UA-4FX
+        * is standard compliant, but has only 16-bit PCM and no MIDI.
+        */
+       USB_DEVICE(0x0582, 0x00a3),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "UA-4FX",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+       /* TODO: add Edirol MD-P1 support */
+{
+       USB_DEVICE(0x582, 0x00a6),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Roland",
+               .product_name = "Juno-G",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+               .data = & (const struct snd_usb_midi_endpoint_info) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
+       }
+},
+{
+       /* Roland SH-201 */
+       USB_DEVICE(0x0582, 0x00ad),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Roland",
+               .product_name = "SH-201",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
+                                       .out_cables = 0x0001,
+                                       .in_cables  = 0x0001
+                               }
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       /* Roland SonicCell */
+       USB_DEVICE(0x0582, 0x00c2),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Roland",
+               .product_name = "SonicCell",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
+                                       .out_cables = 0x0001,
+                                       .in_cables  = 0x0001
+                               }
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       /* BOSS GT-10 */
+       USB_DEVICE(0x0582, 0x00da),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
+                                       .out_cables = 0x0001,
+                                       .in_cables  = 0x0001
+                               }
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       /* Advanced modes of the Edirol UA-25EX.
+        * For the standard mode, UA-25EX has ID 0582:00e7, which
+        * offers only 16-bit PCM at 44.1 kHz and no MIDI.
+        */
+       USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "UA-25EX",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_EDIROL_UAXX
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+
+/* Guillemot devices */
+{
+       /*
+        * This is for the "Windows Edition" where the external MIDI ports are
+        * the only MIDI ports; the control data is reported through HID
+        * interfaces.  The "Macintosh Edition" has ID 0xd002 and uses standard
+        * compliant USB MIDI ports for external MIDI and controls.
+        */
+       USB_DEVICE_VENDOR_SPEC(0x06f8, 0xb000),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Hercules",
+               .product_name = "DJ Console (WE)",
+               .ifnum = 4,
+               .type = QUIRK_MIDI_FIXED_ENDPOINT,
+               .data = & (const struct snd_usb_midi_endpoint_info) {
+                       .out_cables = 0x0001,
+                       .in_cables = 0x0001
+               }
+       }
+},
 
 /* Midiman/M-Audio devices */
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "MidiSport 2x2",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0003,
                        .in_cables  = 0x0003
                }
@@ -1044,12 +1566,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "MidiSport 1x1",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -1057,12 +1579,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "Keystation",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -1070,12 +1592,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "MidiSport 4x4",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x000f,
                        .in_cables  = 0x000f
                }
@@ -1088,12 +1610,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
         * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de>
         */
        USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "MidiSport 8x8",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x01ff,
                        .in_cables  = 0x01ff
                }
@@ -1101,12 +1623,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "MidiSport 8x8",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x01ff,
                        .in_cables  = 0x01ff
                }
@@ -1114,12 +1636,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "MidiSport 2x4",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x000f,
                        .in_cables  = 0x0003
                }
@@ -1127,12 +1649,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "Quattro",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = & (const snd_usb_audio_quirk_t[]) {
+               .data = & (const struct snd_usb_audio_quirk[]) {
                        /*
                         * Interfaces 0-2 are "Windows-compatible", 16-bit only,
                         * and share endpoints with the other interfaces.
@@ -1178,7 +1700,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 9,
                                .type = QUIRK_MIDI_MIDIMAN,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0001,
                                        .in_cables  = 0x0001
                                }
@@ -1191,12 +1713,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "AudioPhile",
                .ifnum = 6,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -1204,12 +1726,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "Ozone",
                .ifnum = 3,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x0001,
                        .in_cables  = 0x0001
                }
@@ -1217,12 +1739,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "M-Audio",
                .product_name = "OmniStudio",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = & (const snd_usb_audio_quirk_t[]) {
+               .data = & (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
@@ -1262,7 +1784,41 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        {
                                .ifnum = 9,
                                .type = QUIRK_MIDI_MIDIMAN,
-                               .data = & (const snd_usb_midi_endpoint_info_t) {
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
+                                       .out_cables = 0x0001,
+                                       .in_cables  = 0x0001
+                               }
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
+{
+       USB_DEVICE(0x0763, 0x2019),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               /* .vendor_name = "M-Audio", */
+               /* .product_name = "Ozone Academic", */
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = & (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 3,
+                               .type = QUIRK_MIDI_MIDIMAN,
+                               .data = & (const struct snd_usb_midi_endpoint_info) {
                                        .out_cables = 0x0001,
                                        .in_cables  = 0x0001
                                }
@@ -1274,6 +1830,27 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 
+/* Casio devices */
+{
+       USB_DEVICE(0x07cf, 0x6801),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Casio",
+               .product_name = "PL-40R",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_YAMAHA
+       }
+},
+{
+       /* this ID is used by several devices without a product ID */
+       USB_DEVICE(0x07cf, 0x6802),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Casio",
+               .product_name = "Keyboard",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_YAMAHA
+       }
+},
+
 /* Mark of the Unicorn devices */
 {
        /* thanks to Robert A. Lerche <ral 'at' msbit.com> */
@@ -1283,15 +1860,15 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        .idVendor = 0x07fd,
        .idProduct = 0x0001,
        .bDeviceSubClass = 2,
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "MOTU",
                .product_name = "Fastlane",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_COMPOSITE,
-               .data = & (const snd_usb_audio_quirk_t[]) {
+               .data = & (const struct snd_usb_audio_quirk[]) {
                        {
                                .ifnum = 0,
-                               .type = QUIRK_MIDI_RAW
+                               .type = QUIRK_MIDI_FASTLANE
                        },
                        {
                                .ifnum = 1,
@@ -1304,26 +1881,15 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 
-{
-       /* Creative Sound Blaster MP3+ */
-       USB_DEVICE(0x041e, 0x3010),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
-               .vendor_name = "Creative Labs",
-               .product_name = "Sound Blaster MP3+",
-               .ifnum = QUIRK_NO_INTERFACE
-       }
-       
-},
-
 /* Emagic devices */
 {
        USB_DEVICE(0x086a, 0x0001),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Emagic",
                /* .product_name = "Unitor8", */
                .ifnum = 2,
                .type = QUIRK_MIDI_EMAGIC,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x80ff,
                        .in_cables  = 0x80ff
                }
@@ -1331,12 +1897,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x086a, 0x0002),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Emagic",
                /* .product_name = "AMT8", */
                .ifnum = 2,
                .type = QUIRK_MIDI_EMAGIC,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x80ff,
                        .in_cables  = 0x80ff
                }
@@ -1344,32 +1910,78 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE(0x086a, 0x0003),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Emagic",
                /* .product_name = "MT4", */
                .ifnum = 2,
                .type = QUIRK_MIDI_EMAGIC,
-               .data = & (const snd_usb_midi_endpoint_info_t) {
+               .data = & (const struct snd_usb_midi_endpoint_info) {
                        .out_cables = 0x800f,
                        .in_cables  = 0x8003
                }
        }
 },
 
+/* TerraTec devices */
+{
+       USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "TerraTec",
+               .product_name = "PHASE 26",
+               .ifnum = 3,
+               .type = QUIRK_MIDI_STANDARD_INTERFACE
+       }
+},
 {
        USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
-               .vendor_name = "Terratec",
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "TerraTec",
+               .product_name = "PHASE 26",
+               .ifnum = 3,
+               .type = QUIRK_MIDI_STANDARD_INTERFACE
+       }
+},
+{
+       USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "TerraTec",
                .product_name = "PHASE 26",
                .ifnum = 3,
                .type = QUIRK_MIDI_STANDARD_INTERFACE
        }
 },
+{
+       USB_DEVICE(0x0ccd, 0x0035),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Miditech",
+               .product_name = "Play'n Roll",
+               .ifnum = 0,
+               .type = QUIRK_MIDI_CME
+       }
+},
+
+/* Stanton/N2IT Final Scratch v1 device ('Scratchamp') */
+{
+       USB_DEVICE(0x103d, 0x0100),
+               .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Stanton",
+               .product_name = "ScratchAmp",
+               .ifnum = QUIRK_NO_INTERFACE
+       }
+},
+{
+       USB_DEVICE(0x103d, 0x0101),
+               .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Stanton",
+               .product_name = "ScratchAmp",
+               .ifnum = QUIRK_NO_INTERFACE
+       }
+},
 
 /* Novation EMS devices */
 {
        USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Novation",
                .product_name = "ReMOTE Audio/XStation",
                .ifnum = 4,
@@ -1378,7 +1990,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Novation",
                .product_name = "Speedio",
                .ifnum = 3,
@@ -1387,7 +1999,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 },
 {
        USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Novation",
                .product_name = "ReMOTE25",
                .ifnum = 0,
@@ -1395,22 +2007,35 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 
+/* */
+{
+       /* aka. Serato Scratch Live DJ Box */
+       USB_DEVICE(0x13e5, 0x0001),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "Rane",
+               .product_name = "SL-1",
+               .ifnum = QUIRK_NO_INTERFACE
+       }
+},
+
+/* Miditech devices */
 {
        USB_DEVICE(0x4752, 0x0011),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .vendor_name = "Miditech",
                .product_name = "Midistart-2",
                .ifnum = 0,
-               .type = QUIRK_MIDI_MIDITECH
+               .type = QUIRK_MIDI_CME
        }
 },
+
+/* Central Music devices */
 {
+       /* this ID used by both Miditech MidiStudio-2 and CME UF-x */
        USB_DEVICE(0x7104, 0x2202),
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
-               .vendor_name = "Miditech",
-               .product_name = "MidiStudio-2",
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .ifnum = 0,
-               .type = QUIRK_MIDI_MIDITECH
+               .type = QUIRK_MIDI_CME
        }
 },
 
@@ -1423,7 +2048,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
        .bInterfaceClass = USB_CLASS_AUDIO,
        .bInterfaceSubClass = USB_SUBCLASS_MIDI_STREAMING,
-       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_STANDARD_INTERFACE
        }