1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * ALSA USB Audio Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>, 6*4882a593Smuzhiyun * Clemens Ladisch <clemens@ladisch.de> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* 10*4882a593Smuzhiyun * The contents of this file are part of the driver's id_table. 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * In a perfect world, this file would be empty. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * Use this for devices where other interfaces are standard compliant, 17*4882a593Smuzhiyun * to prevent the quirk being applied to those interfaces. (To work with 18*4882a593Smuzhiyun * hotplugging, bDeviceClass must be set to USB_CLASS_PER_INTERFACE.) 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun #define USB_DEVICE_VENDOR_SPEC(vend, prod) \ 21*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_VENDOR | \ 22*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_PRODUCT | \ 23*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_INT_CLASS, \ 24*4882a593Smuzhiyun .idVendor = vend, \ 25*4882a593Smuzhiyun .idProduct = prod, \ 26*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_VENDOR_SPEC 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* A standard entry matching with vid/pid and the audio class/subclass */ 29*4882a593Smuzhiyun #define USB_AUDIO_DEVICE(vend, prod) \ 30*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ 31*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_INT_CLASS | \ 32*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_INT_SUBCLASS, \ 33*4882a593Smuzhiyun .idVendor = vend, \ 34*4882a593Smuzhiyun .idProduct = prod, \ 35*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_AUDIO, \ 36*4882a593Smuzhiyun .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* FTDI devices */ 39*4882a593Smuzhiyun { 40*4882a593Smuzhiyun USB_DEVICE(0x0403, 0xb8d8), 41*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 42*4882a593Smuzhiyun /* .vendor_name = "STARR LABS", */ 43*4882a593Smuzhiyun /* .product_name = "Starr Labs MIDI USB device", */ 44*4882a593Smuzhiyun .ifnum = 0, 45*4882a593Smuzhiyun .type = QUIRK_MIDI_FTDI 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun }, 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun { 50*4882a593Smuzhiyun /* Creative BT-D1 */ 51*4882a593Smuzhiyun USB_DEVICE(0x041e, 0x0005), 52*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 53*4882a593Smuzhiyun .ifnum = 1, 54*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 55*4882a593Smuzhiyun .data = &(const struct audioformat) { 56*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 57*4882a593Smuzhiyun .channels = 2, 58*4882a593Smuzhiyun .iface = 1, 59*4882a593Smuzhiyun .altsetting = 1, 60*4882a593Smuzhiyun .altset_idx = 1, 61*4882a593Smuzhiyun .endpoint = 0x03, 62*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 63*4882a593Smuzhiyun .attributes = 0, 64*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 65*4882a593Smuzhiyun .rate_min = 48000, 66*4882a593Smuzhiyun .rate_max = 48000, 67*4882a593Smuzhiyun } 68*4882a593Smuzhiyun } 69*4882a593Smuzhiyun }, 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* E-Mu 0202 USB */ 72*4882a593Smuzhiyun { USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f02) }, 73*4882a593Smuzhiyun /* E-Mu 0404 USB */ 74*4882a593Smuzhiyun { USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f04) }, 75*4882a593Smuzhiyun /* E-Mu Tracker Pre */ 76*4882a593Smuzhiyun { USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f0a) }, 77*4882a593Smuzhiyun /* E-Mu 0204 USB */ 78*4882a593Smuzhiyun { USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f19) }, 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * Creative Technology, Ltd Live! Cam Sync HD [VF0770] 82*4882a593Smuzhiyun * The device advertises 8 formats, but only a rate of 48kHz is honored by the 83*4882a593Smuzhiyun * hardware and 24 bits give chopped audio, so only report the one working 84*4882a593Smuzhiyun * combination. 85*4882a593Smuzhiyun */ 86*4882a593Smuzhiyun { 87*4882a593Smuzhiyun USB_AUDIO_DEVICE(0x041e, 0x4095), 88*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 89*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 90*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 91*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 92*4882a593Smuzhiyun { 93*4882a593Smuzhiyun .ifnum = 2, 94*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 95*4882a593Smuzhiyun }, 96*4882a593Smuzhiyun { 97*4882a593Smuzhiyun .ifnum = 3, 98*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 99*4882a593Smuzhiyun .data = &(const struct audioformat) { 100*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 101*4882a593Smuzhiyun .channels = 2, 102*4882a593Smuzhiyun .fmt_bits = 16, 103*4882a593Smuzhiyun .iface = 3, 104*4882a593Smuzhiyun .altsetting = 4, 105*4882a593Smuzhiyun .altset_idx = 4, 106*4882a593Smuzhiyun .endpoint = 0x82, 107*4882a593Smuzhiyun .ep_attr = 0x05, 108*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 109*4882a593Smuzhiyun .rate_min = 48000, 110*4882a593Smuzhiyun .rate_max = 48000, 111*4882a593Smuzhiyun .nr_rates = 1, 112*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 48000 }, 113*4882a593Smuzhiyun }, 114*4882a593Smuzhiyun }, 115*4882a593Smuzhiyun { 116*4882a593Smuzhiyun .ifnum = -1 117*4882a593Smuzhiyun }, 118*4882a593Smuzhiyun }, 119*4882a593Smuzhiyun }, 120*4882a593Smuzhiyun }, 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* 123*4882a593Smuzhiyun * HP Wireless Audio 124*4882a593Smuzhiyun * When not ignored, causes instability issues for some users, forcing them to 125*4882a593Smuzhiyun * skip the entire module. 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun { 128*4882a593Smuzhiyun USB_DEVICE(0x0424, 0xb832), 129*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 130*4882a593Smuzhiyun .vendor_name = "Standard Microsystems Corp.", 131*4882a593Smuzhiyun .product_name = "HP Wireless Audio", 132*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 133*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 134*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 135*4882a593Smuzhiyun /* Mixer */ 136*4882a593Smuzhiyun { 137*4882a593Smuzhiyun .ifnum = 0, 138*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE, 139*4882a593Smuzhiyun }, 140*4882a593Smuzhiyun /* Playback */ 141*4882a593Smuzhiyun { 142*4882a593Smuzhiyun .ifnum = 1, 143*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE, 144*4882a593Smuzhiyun }, 145*4882a593Smuzhiyun /* Capture */ 146*4882a593Smuzhiyun { 147*4882a593Smuzhiyun .ifnum = 2, 148*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE, 149*4882a593Smuzhiyun }, 150*4882a593Smuzhiyun /* HID Device, .ifnum = 3 */ 151*4882a593Smuzhiyun { 152*4882a593Smuzhiyun .ifnum = -1, 153*4882a593Smuzhiyun } 154*4882a593Smuzhiyun } 155*4882a593Smuzhiyun } 156*4882a593Smuzhiyun }, 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* 159*4882a593Smuzhiyun * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface 160*4882a593Smuzhiyun * class matches do not take effect without an explicit ID match. 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x0850) }, 163*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x08ae) }, 164*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x08c6) }, 165*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x08f0) }, 166*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x08f5) }, 167*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x08f6) }, 168*4882a593Smuzhiyun { USB_AUDIO_DEVICE(0x046d, 0x0990) }, 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* 171*4882a593Smuzhiyun * Yamaha devices 172*4882a593Smuzhiyun */ 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define YAMAHA_DEVICE(id, name) { \ 175*4882a593Smuzhiyun USB_DEVICE(0x0499, id), \ 176*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \ 177*4882a593Smuzhiyun .vendor_name = "Yamaha", \ 178*4882a593Smuzhiyun .product_name = name, \ 179*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, \ 180*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA \ 181*4882a593Smuzhiyun } \ 182*4882a593Smuzhiyun } 183*4882a593Smuzhiyun #define YAMAHA_INTERFACE(id, intf, name) { \ 184*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0499, id), \ 185*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \ 186*4882a593Smuzhiyun .vendor_name = "Yamaha", \ 187*4882a593Smuzhiyun .product_name = name, \ 188*4882a593Smuzhiyun .ifnum = intf, \ 189*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA \ 190*4882a593Smuzhiyun } \ 191*4882a593Smuzhiyun } 192*4882a593Smuzhiyun YAMAHA_DEVICE(0x1000, "UX256"), 193*4882a593Smuzhiyun YAMAHA_DEVICE(0x1001, "MU1000"), 194*4882a593Smuzhiyun YAMAHA_DEVICE(0x1002, "MU2000"), 195*4882a593Smuzhiyun YAMAHA_DEVICE(0x1003, "MU500"), 196*4882a593Smuzhiyun YAMAHA_INTERFACE(0x1004, 3, "UW500"), 197*4882a593Smuzhiyun YAMAHA_DEVICE(0x1005, "MOTIF6"), 198*4882a593Smuzhiyun YAMAHA_DEVICE(0x1006, "MOTIF7"), 199*4882a593Smuzhiyun YAMAHA_DEVICE(0x1007, "MOTIF8"), 200*4882a593Smuzhiyun YAMAHA_DEVICE(0x1008, "UX96"), 201*4882a593Smuzhiyun YAMAHA_DEVICE(0x1009, "UX16"), 202*4882a593Smuzhiyun YAMAHA_INTERFACE(0x100a, 3, "EOS BX"), 203*4882a593Smuzhiyun YAMAHA_DEVICE(0x100c, "UC-MX"), 204*4882a593Smuzhiyun YAMAHA_DEVICE(0x100d, "UC-KX"), 205*4882a593Smuzhiyun YAMAHA_DEVICE(0x100e, "S08"), 206*4882a593Smuzhiyun YAMAHA_DEVICE(0x100f, "CLP-150"), 207*4882a593Smuzhiyun YAMAHA_DEVICE(0x1010, "CLP-170"), 208*4882a593Smuzhiyun YAMAHA_DEVICE(0x1011, "P-250"), 209*4882a593Smuzhiyun YAMAHA_DEVICE(0x1012, "TYROS"), 210*4882a593Smuzhiyun YAMAHA_DEVICE(0x1013, "PF-500"), 211*4882a593Smuzhiyun YAMAHA_DEVICE(0x1014, "S90"), 212*4882a593Smuzhiyun YAMAHA_DEVICE(0x1015, "MOTIF-R"), 213*4882a593Smuzhiyun YAMAHA_DEVICE(0x1016, "MDP-5"), 214*4882a593Smuzhiyun YAMAHA_DEVICE(0x1017, "CVP-204"), 215*4882a593Smuzhiyun YAMAHA_DEVICE(0x1018, "CVP-206"), 216*4882a593Smuzhiyun YAMAHA_DEVICE(0x1019, "CVP-208"), 217*4882a593Smuzhiyun YAMAHA_DEVICE(0x101a, "CVP-210"), 218*4882a593Smuzhiyun YAMAHA_DEVICE(0x101b, "PSR-1100"), 219*4882a593Smuzhiyun YAMAHA_DEVICE(0x101c, "PSR-2100"), 220*4882a593Smuzhiyun YAMAHA_DEVICE(0x101d, "CLP-175"), 221*4882a593Smuzhiyun YAMAHA_DEVICE(0x101e, "PSR-K1"), 222*4882a593Smuzhiyun YAMAHA_DEVICE(0x101f, "EZ-J24"), 223*4882a593Smuzhiyun YAMAHA_DEVICE(0x1020, "EZ-250i"), 224*4882a593Smuzhiyun YAMAHA_DEVICE(0x1021, "MOTIF ES 6"), 225*4882a593Smuzhiyun YAMAHA_DEVICE(0x1022, "MOTIF ES 7"), 226*4882a593Smuzhiyun YAMAHA_DEVICE(0x1023, "MOTIF ES 8"), 227*4882a593Smuzhiyun YAMAHA_DEVICE(0x1024, "CVP-301"), 228*4882a593Smuzhiyun YAMAHA_DEVICE(0x1025, "CVP-303"), 229*4882a593Smuzhiyun YAMAHA_DEVICE(0x1026, "CVP-305"), 230*4882a593Smuzhiyun YAMAHA_DEVICE(0x1027, "CVP-307"), 231*4882a593Smuzhiyun YAMAHA_DEVICE(0x1028, "CVP-309"), 232*4882a593Smuzhiyun YAMAHA_DEVICE(0x1029, "CVP-309GP"), 233*4882a593Smuzhiyun YAMAHA_DEVICE(0x102a, "PSR-1500"), 234*4882a593Smuzhiyun YAMAHA_DEVICE(0x102b, "PSR-3000"), 235*4882a593Smuzhiyun YAMAHA_DEVICE(0x102e, "ELS-01/01C"), 236*4882a593Smuzhiyun YAMAHA_DEVICE(0x1030, "PSR-295/293"), 237*4882a593Smuzhiyun YAMAHA_DEVICE(0x1031, "DGX-205/203"), 238*4882a593Smuzhiyun YAMAHA_DEVICE(0x1032, "DGX-305"), 239*4882a593Smuzhiyun YAMAHA_DEVICE(0x1033, "DGX-505"), 240*4882a593Smuzhiyun YAMAHA_DEVICE(0x1034, NULL), 241*4882a593Smuzhiyun YAMAHA_DEVICE(0x1035, NULL), 242*4882a593Smuzhiyun YAMAHA_DEVICE(0x1036, NULL), 243*4882a593Smuzhiyun YAMAHA_DEVICE(0x1037, NULL), 244*4882a593Smuzhiyun YAMAHA_DEVICE(0x1038, NULL), 245*4882a593Smuzhiyun YAMAHA_DEVICE(0x1039, NULL), 246*4882a593Smuzhiyun YAMAHA_DEVICE(0x103a, NULL), 247*4882a593Smuzhiyun YAMAHA_DEVICE(0x103b, NULL), 248*4882a593Smuzhiyun YAMAHA_DEVICE(0x103c, NULL), 249*4882a593Smuzhiyun YAMAHA_DEVICE(0x103d, NULL), 250*4882a593Smuzhiyun YAMAHA_DEVICE(0x103e, NULL), 251*4882a593Smuzhiyun YAMAHA_DEVICE(0x103f, NULL), 252*4882a593Smuzhiyun YAMAHA_DEVICE(0x1040, NULL), 253*4882a593Smuzhiyun YAMAHA_DEVICE(0x1041, NULL), 254*4882a593Smuzhiyun YAMAHA_DEVICE(0x1042, NULL), 255*4882a593Smuzhiyun YAMAHA_DEVICE(0x1043, NULL), 256*4882a593Smuzhiyun YAMAHA_DEVICE(0x1044, NULL), 257*4882a593Smuzhiyun YAMAHA_DEVICE(0x1045, NULL), 258*4882a593Smuzhiyun YAMAHA_INTERFACE(0x104e, 0, NULL), 259*4882a593Smuzhiyun YAMAHA_DEVICE(0x104f, NULL), 260*4882a593Smuzhiyun YAMAHA_DEVICE(0x1050, NULL), 261*4882a593Smuzhiyun YAMAHA_DEVICE(0x1051, NULL), 262*4882a593Smuzhiyun YAMAHA_DEVICE(0x1052, NULL), 263*4882a593Smuzhiyun YAMAHA_INTERFACE(0x1053, 0, NULL), 264*4882a593Smuzhiyun YAMAHA_INTERFACE(0x1054, 0, NULL), 265*4882a593Smuzhiyun YAMAHA_DEVICE(0x1055, NULL), 266*4882a593Smuzhiyun YAMAHA_DEVICE(0x1056, NULL), 267*4882a593Smuzhiyun YAMAHA_DEVICE(0x1057, NULL), 268*4882a593Smuzhiyun YAMAHA_DEVICE(0x1058, NULL), 269*4882a593Smuzhiyun YAMAHA_DEVICE(0x1059, NULL), 270*4882a593Smuzhiyun YAMAHA_DEVICE(0x105a, NULL), 271*4882a593Smuzhiyun YAMAHA_DEVICE(0x105b, NULL), 272*4882a593Smuzhiyun YAMAHA_DEVICE(0x105c, NULL), 273*4882a593Smuzhiyun YAMAHA_DEVICE(0x105d, NULL), 274*4882a593Smuzhiyun { 275*4882a593Smuzhiyun USB_DEVICE(0x0499, 0x1503), 276*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 277*4882a593Smuzhiyun /* .vendor_name = "Yamaha", */ 278*4882a593Smuzhiyun /* .product_name = "MOX6/MOX8", */ 279*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 280*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 281*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 282*4882a593Smuzhiyun { 283*4882a593Smuzhiyun .ifnum = 1, 284*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 285*4882a593Smuzhiyun }, 286*4882a593Smuzhiyun { 287*4882a593Smuzhiyun .ifnum = 2, 288*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 289*4882a593Smuzhiyun }, 290*4882a593Smuzhiyun { 291*4882a593Smuzhiyun .ifnum = 3, 292*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 293*4882a593Smuzhiyun }, 294*4882a593Smuzhiyun { 295*4882a593Smuzhiyun .ifnum = -1 296*4882a593Smuzhiyun } 297*4882a593Smuzhiyun } 298*4882a593Smuzhiyun } 299*4882a593Smuzhiyun }, 300*4882a593Smuzhiyun { 301*4882a593Smuzhiyun USB_DEVICE(0x0499, 0x1507), 302*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 303*4882a593Smuzhiyun /* .vendor_name = "Yamaha", */ 304*4882a593Smuzhiyun /* .product_name = "THR10", */ 305*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 306*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 307*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 308*4882a593Smuzhiyun { 309*4882a593Smuzhiyun .ifnum = 1, 310*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 311*4882a593Smuzhiyun }, 312*4882a593Smuzhiyun { 313*4882a593Smuzhiyun .ifnum = 2, 314*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 315*4882a593Smuzhiyun }, 316*4882a593Smuzhiyun { 317*4882a593Smuzhiyun .ifnum = 3, 318*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 319*4882a593Smuzhiyun }, 320*4882a593Smuzhiyun { 321*4882a593Smuzhiyun .ifnum = -1 322*4882a593Smuzhiyun } 323*4882a593Smuzhiyun } 324*4882a593Smuzhiyun } 325*4882a593Smuzhiyun }, 326*4882a593Smuzhiyun { 327*4882a593Smuzhiyun USB_DEVICE(0x0499, 0x1509), 328*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 329*4882a593Smuzhiyun /* .vendor_name = "Yamaha", */ 330*4882a593Smuzhiyun /* .product_name = "Steinberg UR22", */ 331*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 332*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 333*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 334*4882a593Smuzhiyun { 335*4882a593Smuzhiyun .ifnum = 1, 336*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 337*4882a593Smuzhiyun }, 338*4882a593Smuzhiyun { 339*4882a593Smuzhiyun .ifnum = 2, 340*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 341*4882a593Smuzhiyun }, 342*4882a593Smuzhiyun { 343*4882a593Smuzhiyun .ifnum = 3, 344*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 345*4882a593Smuzhiyun }, 346*4882a593Smuzhiyun { 347*4882a593Smuzhiyun .ifnum = 4, 348*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 349*4882a593Smuzhiyun }, 350*4882a593Smuzhiyun { 351*4882a593Smuzhiyun .ifnum = -1 352*4882a593Smuzhiyun } 353*4882a593Smuzhiyun } 354*4882a593Smuzhiyun } 355*4882a593Smuzhiyun }, 356*4882a593Smuzhiyun { 357*4882a593Smuzhiyun USB_DEVICE(0x0499, 0x150a), 358*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 359*4882a593Smuzhiyun /* .vendor_name = "Yamaha", */ 360*4882a593Smuzhiyun /* .product_name = "THR5A", */ 361*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 362*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 363*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 364*4882a593Smuzhiyun { 365*4882a593Smuzhiyun .ifnum = 1, 366*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 367*4882a593Smuzhiyun }, 368*4882a593Smuzhiyun { 369*4882a593Smuzhiyun .ifnum = 2, 370*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 371*4882a593Smuzhiyun }, 372*4882a593Smuzhiyun { 373*4882a593Smuzhiyun .ifnum = 3, 374*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 375*4882a593Smuzhiyun }, 376*4882a593Smuzhiyun { 377*4882a593Smuzhiyun .ifnum = -1 378*4882a593Smuzhiyun } 379*4882a593Smuzhiyun } 380*4882a593Smuzhiyun } 381*4882a593Smuzhiyun }, 382*4882a593Smuzhiyun { 383*4882a593Smuzhiyun USB_DEVICE(0x0499, 0x150c), 384*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 385*4882a593Smuzhiyun /* .vendor_name = "Yamaha", */ 386*4882a593Smuzhiyun /* .product_name = "THR10C", */ 387*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 388*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 389*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 390*4882a593Smuzhiyun { 391*4882a593Smuzhiyun .ifnum = 1, 392*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 393*4882a593Smuzhiyun }, 394*4882a593Smuzhiyun { 395*4882a593Smuzhiyun .ifnum = 2, 396*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 397*4882a593Smuzhiyun }, 398*4882a593Smuzhiyun { 399*4882a593Smuzhiyun .ifnum = 3, 400*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 401*4882a593Smuzhiyun }, 402*4882a593Smuzhiyun { 403*4882a593Smuzhiyun .ifnum = -1 404*4882a593Smuzhiyun } 405*4882a593Smuzhiyun } 406*4882a593Smuzhiyun } 407*4882a593Smuzhiyun }, 408*4882a593Smuzhiyun YAMAHA_DEVICE(0x2000, "DGP-7"), 409*4882a593Smuzhiyun YAMAHA_DEVICE(0x2001, "DGP-5"), 410*4882a593Smuzhiyun YAMAHA_DEVICE(0x2002, NULL), 411*4882a593Smuzhiyun YAMAHA_DEVICE(0x2003, NULL), 412*4882a593Smuzhiyun YAMAHA_DEVICE(0x5000, "CS1D"), 413*4882a593Smuzhiyun YAMAHA_DEVICE(0x5001, "DSP1D"), 414*4882a593Smuzhiyun YAMAHA_DEVICE(0x5002, "DME32"), 415*4882a593Smuzhiyun YAMAHA_DEVICE(0x5003, "DM2000"), 416*4882a593Smuzhiyun YAMAHA_DEVICE(0x5004, "02R96"), 417*4882a593Smuzhiyun YAMAHA_DEVICE(0x5005, "ACU16-C"), 418*4882a593Smuzhiyun YAMAHA_DEVICE(0x5006, "NHB32-C"), 419*4882a593Smuzhiyun YAMAHA_DEVICE(0x5007, "DM1000"), 420*4882a593Smuzhiyun YAMAHA_DEVICE(0x5008, "01V96"), 421*4882a593Smuzhiyun YAMAHA_DEVICE(0x5009, "SPX2000"), 422*4882a593Smuzhiyun YAMAHA_DEVICE(0x500a, "PM5D"), 423*4882a593Smuzhiyun YAMAHA_DEVICE(0x500b, "DME64N"), 424*4882a593Smuzhiyun YAMAHA_DEVICE(0x500c, "DME24N"), 425*4882a593Smuzhiyun YAMAHA_DEVICE(0x500d, NULL), 426*4882a593Smuzhiyun YAMAHA_DEVICE(0x500e, NULL), 427*4882a593Smuzhiyun YAMAHA_DEVICE(0x500f, NULL), 428*4882a593Smuzhiyun YAMAHA_DEVICE(0x7000, "DTX"), 429*4882a593Smuzhiyun YAMAHA_DEVICE(0x7010, "UB99"), 430*4882a593Smuzhiyun #undef YAMAHA_DEVICE 431*4882a593Smuzhiyun #undef YAMAHA_INTERFACE 432*4882a593Smuzhiyun /* this catches most recent vendor-specific Yamaha devices */ 433*4882a593Smuzhiyun { 434*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 435*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_INT_CLASS, 436*4882a593Smuzhiyun .idVendor = 0x0499, 437*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_VENDOR_SPEC, 438*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 439*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 440*4882a593Smuzhiyun .type = QUIRK_AUTODETECT 441*4882a593Smuzhiyun } 442*4882a593Smuzhiyun }, 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun /* 445*4882a593Smuzhiyun * Roland/RolandED/Edirol/BOSS devices 446*4882a593Smuzhiyun */ 447*4882a593Smuzhiyun { 448*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0000), 449*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 450*4882a593Smuzhiyun .vendor_name = "Roland", 451*4882a593Smuzhiyun .product_name = "UA-100", 452*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 453*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 454*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 455*4882a593Smuzhiyun { 456*4882a593Smuzhiyun .ifnum = 0, 457*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 458*4882a593Smuzhiyun .data = & (const struct audioformat) { 459*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 460*4882a593Smuzhiyun .channels = 4, 461*4882a593Smuzhiyun .iface = 0, 462*4882a593Smuzhiyun .altsetting = 1, 463*4882a593Smuzhiyun .altset_idx = 1, 464*4882a593Smuzhiyun .attributes = 0, 465*4882a593Smuzhiyun .endpoint = 0x01, 466*4882a593Smuzhiyun .ep_attr = 0x09, 467*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 468*4882a593Smuzhiyun .rate_min = 44100, 469*4882a593Smuzhiyun .rate_max = 44100, 470*4882a593Smuzhiyun } 471*4882a593Smuzhiyun }, 472*4882a593Smuzhiyun { 473*4882a593Smuzhiyun .ifnum = 1, 474*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 475*4882a593Smuzhiyun .data = & (const struct audioformat) { 476*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 477*4882a593Smuzhiyun .channels = 2, 478*4882a593Smuzhiyun .iface = 1, 479*4882a593Smuzhiyun .altsetting = 1, 480*4882a593Smuzhiyun .altset_idx = 1, 481*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_FILL_MAX, 482*4882a593Smuzhiyun .endpoint = 0x81, 483*4882a593Smuzhiyun .ep_attr = 0x05, 484*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 485*4882a593Smuzhiyun .rate_min = 44100, 486*4882a593Smuzhiyun .rate_max = 44100, 487*4882a593Smuzhiyun } 488*4882a593Smuzhiyun }, 489*4882a593Smuzhiyun { 490*4882a593Smuzhiyun .ifnum = 2, 491*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 492*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 493*4882a593Smuzhiyun .out_cables = 0x0007, 494*4882a593Smuzhiyun .in_cables = 0x0007 495*4882a593Smuzhiyun } 496*4882a593Smuzhiyun }, 497*4882a593Smuzhiyun { 498*4882a593Smuzhiyun .ifnum = -1 499*4882a593Smuzhiyun } 500*4882a593Smuzhiyun } 501*4882a593Smuzhiyun } 502*4882a593Smuzhiyun }, 503*4882a593Smuzhiyun { 504*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0002), 505*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 506*4882a593Smuzhiyun .vendor_name = "EDIROL", 507*4882a593Smuzhiyun .product_name = "UM-4", 508*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 509*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 510*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 511*4882a593Smuzhiyun { 512*4882a593Smuzhiyun .ifnum = 0, 513*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 514*4882a593Smuzhiyun }, 515*4882a593Smuzhiyun { 516*4882a593Smuzhiyun .ifnum = 1, 517*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 518*4882a593Smuzhiyun }, 519*4882a593Smuzhiyun { 520*4882a593Smuzhiyun .ifnum = 2, 521*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 522*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 523*4882a593Smuzhiyun .out_cables = 0x000f, 524*4882a593Smuzhiyun .in_cables = 0x000f 525*4882a593Smuzhiyun } 526*4882a593Smuzhiyun }, 527*4882a593Smuzhiyun { 528*4882a593Smuzhiyun .ifnum = -1 529*4882a593Smuzhiyun } 530*4882a593Smuzhiyun } 531*4882a593Smuzhiyun } 532*4882a593Smuzhiyun }, 533*4882a593Smuzhiyun { 534*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0003), 535*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 536*4882a593Smuzhiyun .vendor_name = "Roland", 537*4882a593Smuzhiyun .product_name = "SC-8850", 538*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 539*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 540*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 541*4882a593Smuzhiyun { 542*4882a593Smuzhiyun .ifnum = 0, 543*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 544*4882a593Smuzhiyun }, 545*4882a593Smuzhiyun { 546*4882a593Smuzhiyun .ifnum = 1, 547*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 548*4882a593Smuzhiyun }, 549*4882a593Smuzhiyun { 550*4882a593Smuzhiyun .ifnum = 2, 551*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 552*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 553*4882a593Smuzhiyun .out_cables = 0x003f, 554*4882a593Smuzhiyun .in_cables = 0x003f 555*4882a593Smuzhiyun } 556*4882a593Smuzhiyun }, 557*4882a593Smuzhiyun { 558*4882a593Smuzhiyun .ifnum = -1 559*4882a593Smuzhiyun } 560*4882a593Smuzhiyun } 561*4882a593Smuzhiyun } 562*4882a593Smuzhiyun }, 563*4882a593Smuzhiyun { 564*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0004), 565*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 566*4882a593Smuzhiyun .vendor_name = "Roland", 567*4882a593Smuzhiyun .product_name = "U-8", 568*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 569*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 570*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 571*4882a593Smuzhiyun { 572*4882a593Smuzhiyun .ifnum = 0, 573*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 574*4882a593Smuzhiyun }, 575*4882a593Smuzhiyun { 576*4882a593Smuzhiyun .ifnum = 1, 577*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 578*4882a593Smuzhiyun }, 579*4882a593Smuzhiyun { 580*4882a593Smuzhiyun .ifnum = 2, 581*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 582*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 583*4882a593Smuzhiyun .out_cables = 0x0005, 584*4882a593Smuzhiyun .in_cables = 0x0005 585*4882a593Smuzhiyun } 586*4882a593Smuzhiyun }, 587*4882a593Smuzhiyun { 588*4882a593Smuzhiyun .ifnum = -1 589*4882a593Smuzhiyun } 590*4882a593Smuzhiyun } 591*4882a593Smuzhiyun } 592*4882a593Smuzhiyun }, 593*4882a593Smuzhiyun { 594*4882a593Smuzhiyun /* Has ID 0x0099 when not in "Advanced Driver" mode. 595*4882a593Smuzhiyun * The UM-2EX has only one input, but we cannot detect this. */ 596*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0005), 597*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 598*4882a593Smuzhiyun .vendor_name = "EDIROL", 599*4882a593Smuzhiyun .product_name = "UM-2", 600*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 601*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 602*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 603*4882a593Smuzhiyun { 604*4882a593Smuzhiyun .ifnum = 0, 605*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 606*4882a593Smuzhiyun }, 607*4882a593Smuzhiyun { 608*4882a593Smuzhiyun .ifnum = 1, 609*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 610*4882a593Smuzhiyun }, 611*4882a593Smuzhiyun { 612*4882a593Smuzhiyun .ifnum = 2, 613*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 614*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 615*4882a593Smuzhiyun .out_cables = 0x0003, 616*4882a593Smuzhiyun .in_cables = 0x0003 617*4882a593Smuzhiyun } 618*4882a593Smuzhiyun }, 619*4882a593Smuzhiyun { 620*4882a593Smuzhiyun .ifnum = -1 621*4882a593Smuzhiyun } 622*4882a593Smuzhiyun } 623*4882a593Smuzhiyun } 624*4882a593Smuzhiyun }, 625*4882a593Smuzhiyun { 626*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0007), 627*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 628*4882a593Smuzhiyun .vendor_name = "Roland", 629*4882a593Smuzhiyun .product_name = "SC-8820", 630*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 631*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 632*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 633*4882a593Smuzhiyun { 634*4882a593Smuzhiyun .ifnum = 0, 635*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 636*4882a593Smuzhiyun }, 637*4882a593Smuzhiyun { 638*4882a593Smuzhiyun .ifnum = 1, 639*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 640*4882a593Smuzhiyun }, 641*4882a593Smuzhiyun { 642*4882a593Smuzhiyun .ifnum = 2, 643*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 644*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 645*4882a593Smuzhiyun .out_cables = 0x0013, 646*4882a593Smuzhiyun .in_cables = 0x0013 647*4882a593Smuzhiyun } 648*4882a593Smuzhiyun }, 649*4882a593Smuzhiyun { 650*4882a593Smuzhiyun .ifnum = -1 651*4882a593Smuzhiyun } 652*4882a593Smuzhiyun } 653*4882a593Smuzhiyun } 654*4882a593Smuzhiyun }, 655*4882a593Smuzhiyun { 656*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0008), 657*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 658*4882a593Smuzhiyun .vendor_name = "Roland", 659*4882a593Smuzhiyun .product_name = "PC-300", 660*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 661*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 662*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 663*4882a593Smuzhiyun { 664*4882a593Smuzhiyun .ifnum = 0, 665*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 666*4882a593Smuzhiyun }, 667*4882a593Smuzhiyun { 668*4882a593Smuzhiyun .ifnum = 1, 669*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 670*4882a593Smuzhiyun }, 671*4882a593Smuzhiyun { 672*4882a593Smuzhiyun .ifnum = 2, 673*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 674*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 675*4882a593Smuzhiyun .out_cables = 0x0001, 676*4882a593Smuzhiyun .in_cables = 0x0001 677*4882a593Smuzhiyun } 678*4882a593Smuzhiyun }, 679*4882a593Smuzhiyun { 680*4882a593Smuzhiyun .ifnum = -1 681*4882a593Smuzhiyun } 682*4882a593Smuzhiyun } 683*4882a593Smuzhiyun } 684*4882a593Smuzhiyun }, 685*4882a593Smuzhiyun { 686*4882a593Smuzhiyun /* has ID 0x009d when not in "Advanced Driver" mode */ 687*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0009), 688*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 689*4882a593Smuzhiyun .vendor_name = "EDIROL", 690*4882a593Smuzhiyun .product_name = "UM-1", 691*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 692*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 693*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 694*4882a593Smuzhiyun { 695*4882a593Smuzhiyun .ifnum = 0, 696*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 697*4882a593Smuzhiyun }, 698*4882a593Smuzhiyun { 699*4882a593Smuzhiyun .ifnum = 1, 700*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 701*4882a593Smuzhiyun }, 702*4882a593Smuzhiyun { 703*4882a593Smuzhiyun .ifnum = 2, 704*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 705*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 706*4882a593Smuzhiyun .out_cables = 0x0001, 707*4882a593Smuzhiyun .in_cables = 0x0001 708*4882a593Smuzhiyun } 709*4882a593Smuzhiyun }, 710*4882a593Smuzhiyun { 711*4882a593Smuzhiyun .ifnum = -1 712*4882a593Smuzhiyun } 713*4882a593Smuzhiyun } 714*4882a593Smuzhiyun } 715*4882a593Smuzhiyun }, 716*4882a593Smuzhiyun { 717*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x000b), 718*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 719*4882a593Smuzhiyun .vendor_name = "Roland", 720*4882a593Smuzhiyun .product_name = "SK-500", 721*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 722*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 723*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 724*4882a593Smuzhiyun { 725*4882a593Smuzhiyun .ifnum = 0, 726*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 727*4882a593Smuzhiyun }, 728*4882a593Smuzhiyun { 729*4882a593Smuzhiyun .ifnum = 1, 730*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 731*4882a593Smuzhiyun }, 732*4882a593Smuzhiyun { 733*4882a593Smuzhiyun .ifnum = 2, 734*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 735*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 736*4882a593Smuzhiyun .out_cables = 0x0013, 737*4882a593Smuzhiyun .in_cables = 0x0013 738*4882a593Smuzhiyun } 739*4882a593Smuzhiyun }, 740*4882a593Smuzhiyun { 741*4882a593Smuzhiyun .ifnum = -1 742*4882a593Smuzhiyun } 743*4882a593Smuzhiyun } 744*4882a593Smuzhiyun } 745*4882a593Smuzhiyun }, 746*4882a593Smuzhiyun { 747*4882a593Smuzhiyun /* thanks to Emiliano Grilli <emillo@libero.it> 748*4882a593Smuzhiyun * for helping researching this data */ 749*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x000c), 750*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 751*4882a593Smuzhiyun .vendor_name = "Roland", 752*4882a593Smuzhiyun .product_name = "SC-D70", 753*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 754*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 755*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 756*4882a593Smuzhiyun { 757*4882a593Smuzhiyun .ifnum = 0, 758*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 759*4882a593Smuzhiyun }, 760*4882a593Smuzhiyun { 761*4882a593Smuzhiyun .ifnum = 1, 762*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 763*4882a593Smuzhiyun }, 764*4882a593Smuzhiyun { 765*4882a593Smuzhiyun .ifnum = 2, 766*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 767*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 768*4882a593Smuzhiyun .out_cables = 0x0007, 769*4882a593Smuzhiyun .in_cables = 0x0007 770*4882a593Smuzhiyun } 771*4882a593Smuzhiyun }, 772*4882a593Smuzhiyun { 773*4882a593Smuzhiyun .ifnum = -1 774*4882a593Smuzhiyun } 775*4882a593Smuzhiyun } 776*4882a593Smuzhiyun } 777*4882a593Smuzhiyun }, 778*4882a593Smuzhiyun { /* 779*4882a593Smuzhiyun * This quirk is for the "Advanced Driver" mode of the Edirol UA-5. 780*4882a593Smuzhiyun * If the advanced mode switch at the back of the unit is off, the 781*4882a593Smuzhiyun * UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks), 782*4882a593Smuzhiyun * but offers only 16-bit PCM. 783*4882a593Smuzhiyun * In advanced mode, the UA-5 will output S24_3LE samples (two 784*4882a593Smuzhiyun * channels) at the rate indicated on the front switch, including 785*4882a593Smuzhiyun * the 96kHz sample rate. 786*4882a593Smuzhiyun */ 787*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0010), 788*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 789*4882a593Smuzhiyun .vendor_name = "EDIROL", 790*4882a593Smuzhiyun .product_name = "UA-5", 791*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 792*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 793*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 794*4882a593Smuzhiyun { 795*4882a593Smuzhiyun .ifnum = 1, 796*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 797*4882a593Smuzhiyun }, 798*4882a593Smuzhiyun { 799*4882a593Smuzhiyun .ifnum = 2, 800*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 801*4882a593Smuzhiyun }, 802*4882a593Smuzhiyun { 803*4882a593Smuzhiyun .ifnum = -1 804*4882a593Smuzhiyun } 805*4882a593Smuzhiyun } 806*4882a593Smuzhiyun } 807*4882a593Smuzhiyun }, 808*4882a593Smuzhiyun { 809*4882a593Smuzhiyun /* has ID 0x0013 when not in "Advanced Driver" mode */ 810*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0012), 811*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 812*4882a593Smuzhiyun .vendor_name = "Roland", 813*4882a593Smuzhiyun .product_name = "XV-5050", 814*4882a593Smuzhiyun .ifnum = 0, 815*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 816*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 817*4882a593Smuzhiyun .out_cables = 0x0001, 818*4882a593Smuzhiyun .in_cables = 0x0001 819*4882a593Smuzhiyun } 820*4882a593Smuzhiyun } 821*4882a593Smuzhiyun }, 822*4882a593Smuzhiyun { 823*4882a593Smuzhiyun /* has ID 0x0015 when not in "Advanced Driver" mode */ 824*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0014), 825*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 826*4882a593Smuzhiyun .vendor_name = "EDIROL", 827*4882a593Smuzhiyun .product_name = "UM-880", 828*4882a593Smuzhiyun .ifnum = 0, 829*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 830*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 831*4882a593Smuzhiyun .out_cables = 0x01ff, 832*4882a593Smuzhiyun .in_cables = 0x01ff 833*4882a593Smuzhiyun } 834*4882a593Smuzhiyun } 835*4882a593Smuzhiyun }, 836*4882a593Smuzhiyun { 837*4882a593Smuzhiyun /* has ID 0x0017 when not in "Advanced Driver" mode */ 838*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0016), 839*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 840*4882a593Smuzhiyun .vendor_name = "EDIROL", 841*4882a593Smuzhiyun .product_name = "SD-90", 842*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 843*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 844*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 845*4882a593Smuzhiyun { 846*4882a593Smuzhiyun .ifnum = 0, 847*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 848*4882a593Smuzhiyun }, 849*4882a593Smuzhiyun { 850*4882a593Smuzhiyun .ifnum = 1, 851*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 852*4882a593Smuzhiyun }, 853*4882a593Smuzhiyun { 854*4882a593Smuzhiyun .ifnum = 2, 855*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 856*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 857*4882a593Smuzhiyun .out_cables = 0x000f, 858*4882a593Smuzhiyun .in_cables = 0x000f 859*4882a593Smuzhiyun } 860*4882a593Smuzhiyun }, 861*4882a593Smuzhiyun { 862*4882a593Smuzhiyun .ifnum = -1 863*4882a593Smuzhiyun } 864*4882a593Smuzhiyun } 865*4882a593Smuzhiyun } 866*4882a593Smuzhiyun }, 867*4882a593Smuzhiyun { 868*4882a593Smuzhiyun /* has ID 0x001c when not in "Advanced Driver" mode */ 869*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x001b), 870*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 871*4882a593Smuzhiyun .vendor_name = "Roland", 872*4882a593Smuzhiyun .product_name = "MMP-2", 873*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 874*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 875*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 876*4882a593Smuzhiyun { 877*4882a593Smuzhiyun .ifnum = 0, 878*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 879*4882a593Smuzhiyun }, 880*4882a593Smuzhiyun { 881*4882a593Smuzhiyun .ifnum = 1, 882*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 883*4882a593Smuzhiyun }, 884*4882a593Smuzhiyun { 885*4882a593Smuzhiyun .ifnum = 2, 886*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 887*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 888*4882a593Smuzhiyun .out_cables = 0x0001, 889*4882a593Smuzhiyun .in_cables = 0x0001 890*4882a593Smuzhiyun } 891*4882a593Smuzhiyun }, 892*4882a593Smuzhiyun { 893*4882a593Smuzhiyun .ifnum = -1 894*4882a593Smuzhiyun } 895*4882a593Smuzhiyun } 896*4882a593Smuzhiyun } 897*4882a593Smuzhiyun }, 898*4882a593Smuzhiyun { 899*4882a593Smuzhiyun /* has ID 0x001e when not in "Advanced Driver" mode */ 900*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x001d), 901*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 902*4882a593Smuzhiyun .vendor_name = "Roland", 903*4882a593Smuzhiyun .product_name = "V-SYNTH", 904*4882a593Smuzhiyun .ifnum = 0, 905*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 906*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 907*4882a593Smuzhiyun .out_cables = 0x0001, 908*4882a593Smuzhiyun .in_cables = 0x0001 909*4882a593Smuzhiyun } 910*4882a593Smuzhiyun } 911*4882a593Smuzhiyun }, 912*4882a593Smuzhiyun { 913*4882a593Smuzhiyun /* has ID 0x0024 when not in "Advanced Driver" mode */ 914*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0023), 915*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 916*4882a593Smuzhiyun .vendor_name = "EDIROL", 917*4882a593Smuzhiyun .product_name = "UM-550", 918*4882a593Smuzhiyun .ifnum = 0, 919*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 920*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 921*4882a593Smuzhiyun .out_cables = 0x003f, 922*4882a593Smuzhiyun .in_cables = 0x003f 923*4882a593Smuzhiyun } 924*4882a593Smuzhiyun } 925*4882a593Smuzhiyun }, 926*4882a593Smuzhiyun { 927*4882a593Smuzhiyun /* 928*4882a593Smuzhiyun * This quirk is for the "Advanced Driver" mode. If off, the UA-20 929*4882a593Smuzhiyun * has ID 0x0026 and is standard compliant, but has only 16-bit PCM 930*4882a593Smuzhiyun * and no MIDI. 931*4882a593Smuzhiyun */ 932*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0025), 933*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 934*4882a593Smuzhiyun .vendor_name = "EDIROL", 935*4882a593Smuzhiyun .product_name = "UA-20", 936*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 937*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 938*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 939*4882a593Smuzhiyun { 940*4882a593Smuzhiyun .ifnum = 0, 941*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 942*4882a593Smuzhiyun }, 943*4882a593Smuzhiyun { 944*4882a593Smuzhiyun .ifnum = 1, 945*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 946*4882a593Smuzhiyun .data = & (const struct audioformat) { 947*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 948*4882a593Smuzhiyun .channels = 2, 949*4882a593Smuzhiyun .iface = 1, 950*4882a593Smuzhiyun .altsetting = 1, 951*4882a593Smuzhiyun .altset_idx = 1, 952*4882a593Smuzhiyun .attributes = 0, 953*4882a593Smuzhiyun .endpoint = 0x01, 954*4882a593Smuzhiyun .ep_attr = 0x01, 955*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 956*4882a593Smuzhiyun .rate_min = 44100, 957*4882a593Smuzhiyun .rate_max = 44100, 958*4882a593Smuzhiyun } 959*4882a593Smuzhiyun }, 960*4882a593Smuzhiyun { 961*4882a593Smuzhiyun .ifnum = 2, 962*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 963*4882a593Smuzhiyun .data = & (const struct audioformat) { 964*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 965*4882a593Smuzhiyun .channels = 2, 966*4882a593Smuzhiyun .iface = 2, 967*4882a593Smuzhiyun .altsetting = 1, 968*4882a593Smuzhiyun .altset_idx = 1, 969*4882a593Smuzhiyun .attributes = 0, 970*4882a593Smuzhiyun .endpoint = 0x82, 971*4882a593Smuzhiyun .ep_attr = 0x01, 972*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 973*4882a593Smuzhiyun .rate_min = 44100, 974*4882a593Smuzhiyun .rate_max = 44100, 975*4882a593Smuzhiyun } 976*4882a593Smuzhiyun }, 977*4882a593Smuzhiyun { 978*4882a593Smuzhiyun .ifnum = 3, 979*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 980*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 981*4882a593Smuzhiyun .out_cables = 0x0001, 982*4882a593Smuzhiyun .in_cables = 0x0001 983*4882a593Smuzhiyun } 984*4882a593Smuzhiyun }, 985*4882a593Smuzhiyun { 986*4882a593Smuzhiyun .ifnum = -1 987*4882a593Smuzhiyun } 988*4882a593Smuzhiyun } 989*4882a593Smuzhiyun } 990*4882a593Smuzhiyun }, 991*4882a593Smuzhiyun { 992*4882a593Smuzhiyun /* has ID 0x0028 when not in "Advanced Driver" mode */ 993*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0027), 994*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 995*4882a593Smuzhiyun .vendor_name = "EDIROL", 996*4882a593Smuzhiyun .product_name = "SD-20", 997*4882a593Smuzhiyun .ifnum = 0, 998*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 999*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1000*4882a593Smuzhiyun .out_cables = 0x0003, 1001*4882a593Smuzhiyun .in_cables = 0x0007 1002*4882a593Smuzhiyun } 1003*4882a593Smuzhiyun } 1004*4882a593Smuzhiyun }, 1005*4882a593Smuzhiyun { 1006*4882a593Smuzhiyun /* has ID 0x002a when not in "Advanced Driver" mode */ 1007*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0029), 1008*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1009*4882a593Smuzhiyun .vendor_name = "EDIROL", 1010*4882a593Smuzhiyun .product_name = "SD-80", 1011*4882a593Smuzhiyun .ifnum = 0, 1012*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1013*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1014*4882a593Smuzhiyun .out_cables = 0x000f, 1015*4882a593Smuzhiyun .in_cables = 0x000f 1016*4882a593Smuzhiyun } 1017*4882a593Smuzhiyun } 1018*4882a593Smuzhiyun }, 1019*4882a593Smuzhiyun { /* 1020*4882a593Smuzhiyun * This quirk is for the "Advanced" modes of the Edirol UA-700. 1021*4882a593Smuzhiyun * If the sample format switch is not in an advanced setting, the 1022*4882a593Smuzhiyun * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks), 1023*4882a593Smuzhiyun * but offers only 16-bit PCM and no MIDI. 1024*4882a593Smuzhiyun */ 1025*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b), 1026*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1027*4882a593Smuzhiyun .vendor_name = "EDIROL", 1028*4882a593Smuzhiyun .product_name = "UA-700", 1029*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1030*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1031*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1032*4882a593Smuzhiyun { 1033*4882a593Smuzhiyun .ifnum = 1, 1034*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1035*4882a593Smuzhiyun }, 1036*4882a593Smuzhiyun { 1037*4882a593Smuzhiyun .ifnum = 2, 1038*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1039*4882a593Smuzhiyun }, 1040*4882a593Smuzhiyun { 1041*4882a593Smuzhiyun .ifnum = 3, 1042*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1043*4882a593Smuzhiyun }, 1044*4882a593Smuzhiyun { 1045*4882a593Smuzhiyun .ifnum = -1 1046*4882a593Smuzhiyun } 1047*4882a593Smuzhiyun } 1048*4882a593Smuzhiyun } 1049*4882a593Smuzhiyun }, 1050*4882a593Smuzhiyun { 1051*4882a593Smuzhiyun /* has ID 0x002e when not in "Advanced Driver" mode */ 1052*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x002d), 1053*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1054*4882a593Smuzhiyun .vendor_name = "Roland", 1055*4882a593Smuzhiyun .product_name = "XV-2020", 1056*4882a593Smuzhiyun .ifnum = 0, 1057*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1058*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1059*4882a593Smuzhiyun .out_cables = 0x0001, 1060*4882a593Smuzhiyun .in_cables = 0x0001 1061*4882a593Smuzhiyun } 1062*4882a593Smuzhiyun } 1063*4882a593Smuzhiyun }, 1064*4882a593Smuzhiyun { 1065*4882a593Smuzhiyun /* has ID 0x0030 when not in "Advanced Driver" mode */ 1066*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x002f), 1067*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1068*4882a593Smuzhiyun .vendor_name = "Roland", 1069*4882a593Smuzhiyun .product_name = "VariOS", 1070*4882a593Smuzhiyun .ifnum = 0, 1071*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1072*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1073*4882a593Smuzhiyun .out_cables = 0x0007, 1074*4882a593Smuzhiyun .in_cables = 0x0007 1075*4882a593Smuzhiyun } 1076*4882a593Smuzhiyun } 1077*4882a593Smuzhiyun }, 1078*4882a593Smuzhiyun { 1079*4882a593Smuzhiyun /* has ID 0x0034 when not in "Advanced Driver" mode */ 1080*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0033), 1081*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1082*4882a593Smuzhiyun .vendor_name = "EDIROL", 1083*4882a593Smuzhiyun .product_name = "PCR", 1084*4882a593Smuzhiyun .ifnum = 0, 1085*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1086*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1087*4882a593Smuzhiyun .out_cables = 0x0003, 1088*4882a593Smuzhiyun .in_cables = 0x0007 1089*4882a593Smuzhiyun } 1090*4882a593Smuzhiyun } 1091*4882a593Smuzhiyun }, 1092*4882a593Smuzhiyun { 1093*4882a593Smuzhiyun /* 1094*4882a593Smuzhiyun * Has ID 0x0038 when not in "Advanced Driver" mode; 1095*4882a593Smuzhiyun * later revisions use IDs 0x0054 and 0x00a2. 1096*4882a593Smuzhiyun */ 1097*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0037), 1098*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1099*4882a593Smuzhiyun .vendor_name = "Roland", 1100*4882a593Smuzhiyun .product_name = "Digital Piano", 1101*4882a593Smuzhiyun .ifnum = 0, 1102*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1103*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1104*4882a593Smuzhiyun .out_cables = 0x0001, 1105*4882a593Smuzhiyun .in_cables = 0x0001 1106*4882a593Smuzhiyun } 1107*4882a593Smuzhiyun } 1108*4882a593Smuzhiyun }, 1109*4882a593Smuzhiyun { 1110*4882a593Smuzhiyun /* 1111*4882a593Smuzhiyun * This quirk is for the "Advanced Driver" mode. If off, the GS-10 1112*4882a593Smuzhiyun * has ID 0x003c and is standard compliant, but has only 16-bit PCM 1113*4882a593Smuzhiyun * and no MIDI. 1114*4882a593Smuzhiyun */ 1115*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b), 1116*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1117*4882a593Smuzhiyun .vendor_name = "BOSS", 1118*4882a593Smuzhiyun .product_name = "GS-10", 1119*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1120*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1121*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 1122*4882a593Smuzhiyun { 1123*4882a593Smuzhiyun .ifnum = 1, 1124*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1125*4882a593Smuzhiyun }, 1126*4882a593Smuzhiyun { 1127*4882a593Smuzhiyun .ifnum = 2, 1128*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1129*4882a593Smuzhiyun }, 1130*4882a593Smuzhiyun { 1131*4882a593Smuzhiyun .ifnum = 3, 1132*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 1133*4882a593Smuzhiyun }, 1134*4882a593Smuzhiyun { 1135*4882a593Smuzhiyun .ifnum = -1 1136*4882a593Smuzhiyun } 1137*4882a593Smuzhiyun } 1138*4882a593Smuzhiyun } 1139*4882a593Smuzhiyun }, 1140*4882a593Smuzhiyun { 1141*4882a593Smuzhiyun /* has ID 0x0041 when not in "Advanced Driver" mode */ 1142*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0040), 1143*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1144*4882a593Smuzhiyun .vendor_name = "Roland", 1145*4882a593Smuzhiyun .product_name = "GI-20", 1146*4882a593Smuzhiyun .ifnum = 0, 1147*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1148*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1149*4882a593Smuzhiyun .out_cables = 0x0001, 1150*4882a593Smuzhiyun .in_cables = 0x0001 1151*4882a593Smuzhiyun } 1152*4882a593Smuzhiyun } 1153*4882a593Smuzhiyun }, 1154*4882a593Smuzhiyun { 1155*4882a593Smuzhiyun /* has ID 0x0043 when not in "Advanced Driver" mode */ 1156*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0042), 1157*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1158*4882a593Smuzhiyun .vendor_name = "Roland", 1159*4882a593Smuzhiyun .product_name = "RS-70", 1160*4882a593Smuzhiyun .ifnum = 0, 1161*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1162*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1163*4882a593Smuzhiyun .out_cables = 0x0001, 1164*4882a593Smuzhiyun .in_cables = 0x0001 1165*4882a593Smuzhiyun } 1166*4882a593Smuzhiyun } 1167*4882a593Smuzhiyun }, 1168*4882a593Smuzhiyun { 1169*4882a593Smuzhiyun /* has ID 0x0049 when not in "Advanced Driver" mode */ 1170*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0047), 1171*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1172*4882a593Smuzhiyun /* .vendor_name = "EDIROL", */ 1173*4882a593Smuzhiyun /* .product_name = "UR-80", */ 1174*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1175*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1176*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1177*4882a593Smuzhiyun /* in the 96 kHz modes, only interface 1 is there */ 1178*4882a593Smuzhiyun { 1179*4882a593Smuzhiyun .ifnum = 1, 1180*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1181*4882a593Smuzhiyun }, 1182*4882a593Smuzhiyun { 1183*4882a593Smuzhiyun .ifnum = 2, 1184*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1185*4882a593Smuzhiyun }, 1186*4882a593Smuzhiyun { 1187*4882a593Smuzhiyun .ifnum = -1 1188*4882a593Smuzhiyun } 1189*4882a593Smuzhiyun } 1190*4882a593Smuzhiyun } 1191*4882a593Smuzhiyun }, 1192*4882a593Smuzhiyun { 1193*4882a593Smuzhiyun /* has ID 0x004a when not in "Advanced Driver" mode */ 1194*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0048), 1195*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1196*4882a593Smuzhiyun /* .vendor_name = "EDIROL", */ 1197*4882a593Smuzhiyun /* .product_name = "UR-80", */ 1198*4882a593Smuzhiyun .ifnum = 0, 1199*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1200*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1201*4882a593Smuzhiyun .out_cables = 0x0003, 1202*4882a593Smuzhiyun .in_cables = 0x0007 1203*4882a593Smuzhiyun } 1204*4882a593Smuzhiyun } 1205*4882a593Smuzhiyun }, 1206*4882a593Smuzhiyun { 1207*4882a593Smuzhiyun /* has ID 0x004e when not in "Advanced Driver" mode */ 1208*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x004c), 1209*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1210*4882a593Smuzhiyun .vendor_name = "EDIROL", 1211*4882a593Smuzhiyun .product_name = "PCR-A", 1212*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1213*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1214*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1215*4882a593Smuzhiyun { 1216*4882a593Smuzhiyun .ifnum = 1, 1217*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1218*4882a593Smuzhiyun }, 1219*4882a593Smuzhiyun { 1220*4882a593Smuzhiyun .ifnum = 2, 1221*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1222*4882a593Smuzhiyun }, 1223*4882a593Smuzhiyun { 1224*4882a593Smuzhiyun .ifnum = -1 1225*4882a593Smuzhiyun } 1226*4882a593Smuzhiyun } 1227*4882a593Smuzhiyun } 1228*4882a593Smuzhiyun }, 1229*4882a593Smuzhiyun { 1230*4882a593Smuzhiyun /* has ID 0x004f when not in "Advanced Driver" mode */ 1231*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x004d), 1232*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1233*4882a593Smuzhiyun .vendor_name = "EDIROL", 1234*4882a593Smuzhiyun .product_name = "PCR-A", 1235*4882a593Smuzhiyun .ifnum = 0, 1236*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1237*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1238*4882a593Smuzhiyun .out_cables = 0x0003, 1239*4882a593Smuzhiyun .in_cables = 0x0007 1240*4882a593Smuzhiyun } 1241*4882a593Smuzhiyun } 1242*4882a593Smuzhiyun }, 1243*4882a593Smuzhiyun { 1244*4882a593Smuzhiyun /* 1245*4882a593Smuzhiyun * This quirk is for the "Advanced Driver" mode. If off, the UA-3FX 1246*4882a593Smuzhiyun * is standard compliant, but has only 16-bit PCM. 1247*4882a593Smuzhiyun */ 1248*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0050), 1249*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1250*4882a593Smuzhiyun .vendor_name = "EDIROL", 1251*4882a593Smuzhiyun .product_name = "UA-3FX", 1252*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1253*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1254*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1255*4882a593Smuzhiyun { 1256*4882a593Smuzhiyun .ifnum = 1, 1257*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1258*4882a593Smuzhiyun }, 1259*4882a593Smuzhiyun { 1260*4882a593Smuzhiyun .ifnum = 2, 1261*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1262*4882a593Smuzhiyun }, 1263*4882a593Smuzhiyun { 1264*4882a593Smuzhiyun .ifnum = -1 1265*4882a593Smuzhiyun } 1266*4882a593Smuzhiyun } 1267*4882a593Smuzhiyun } 1268*4882a593Smuzhiyun }, 1269*4882a593Smuzhiyun { 1270*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0052), 1271*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1272*4882a593Smuzhiyun .vendor_name = "EDIROL", 1273*4882a593Smuzhiyun .product_name = "UM-1SX", 1274*4882a593Smuzhiyun .ifnum = 0, 1275*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 1276*4882a593Smuzhiyun } 1277*4882a593Smuzhiyun }, 1278*4882a593Smuzhiyun { 1279*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0060), 1280*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1281*4882a593Smuzhiyun .vendor_name = "Roland", 1282*4882a593Smuzhiyun .product_name = "EXR Series", 1283*4882a593Smuzhiyun .ifnum = 0, 1284*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 1285*4882a593Smuzhiyun } 1286*4882a593Smuzhiyun }, 1287*4882a593Smuzhiyun { 1288*4882a593Smuzhiyun /* has ID 0x0066 when not in "Advanced Driver" mode */ 1289*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0064), 1290*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1291*4882a593Smuzhiyun /* .vendor_name = "EDIROL", */ 1292*4882a593Smuzhiyun /* .product_name = "PCR-1", */ 1293*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1294*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1295*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1296*4882a593Smuzhiyun { 1297*4882a593Smuzhiyun .ifnum = 1, 1298*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1299*4882a593Smuzhiyun }, 1300*4882a593Smuzhiyun { 1301*4882a593Smuzhiyun .ifnum = 2, 1302*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1303*4882a593Smuzhiyun }, 1304*4882a593Smuzhiyun { 1305*4882a593Smuzhiyun .ifnum = -1 1306*4882a593Smuzhiyun } 1307*4882a593Smuzhiyun } 1308*4882a593Smuzhiyun } 1309*4882a593Smuzhiyun }, 1310*4882a593Smuzhiyun { 1311*4882a593Smuzhiyun /* has ID 0x0067 when not in "Advanced Driver" mode */ 1312*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0065), 1313*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1314*4882a593Smuzhiyun /* .vendor_name = "EDIROL", */ 1315*4882a593Smuzhiyun /* .product_name = "PCR-1", */ 1316*4882a593Smuzhiyun .ifnum = 0, 1317*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1318*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1319*4882a593Smuzhiyun .out_cables = 0x0001, 1320*4882a593Smuzhiyun .in_cables = 0x0003 1321*4882a593Smuzhiyun } 1322*4882a593Smuzhiyun } 1323*4882a593Smuzhiyun }, 1324*4882a593Smuzhiyun { 1325*4882a593Smuzhiyun /* has ID 0x006e when not in "Advanced Driver" mode */ 1326*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x006d), 1327*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1328*4882a593Smuzhiyun .vendor_name = "Roland", 1329*4882a593Smuzhiyun .product_name = "FANTOM-X", 1330*4882a593Smuzhiyun .ifnum = 0, 1331*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1332*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1333*4882a593Smuzhiyun .out_cables = 0x0001, 1334*4882a593Smuzhiyun .in_cables = 0x0001 1335*4882a593Smuzhiyun } 1336*4882a593Smuzhiyun } 1337*4882a593Smuzhiyun }, 1338*4882a593Smuzhiyun { /* 1339*4882a593Smuzhiyun * This quirk is for the "Advanced" modes of the Edirol UA-25. 1340*4882a593Smuzhiyun * If the switch is not in an advanced setting, the UA-25 has 1341*4882a593Smuzhiyun * ID 0x0582/0x0073 and is standard compliant (no quirks), but 1342*4882a593Smuzhiyun * offers only 16-bit PCM at 44.1 kHz and no MIDI. 1343*4882a593Smuzhiyun */ 1344*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074), 1345*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1346*4882a593Smuzhiyun .vendor_name = "EDIROL", 1347*4882a593Smuzhiyun .product_name = "UA-25", 1348*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1349*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1350*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1351*4882a593Smuzhiyun { 1352*4882a593Smuzhiyun .ifnum = 0, 1353*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1354*4882a593Smuzhiyun }, 1355*4882a593Smuzhiyun { 1356*4882a593Smuzhiyun .ifnum = 1, 1357*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1358*4882a593Smuzhiyun }, 1359*4882a593Smuzhiyun { 1360*4882a593Smuzhiyun .ifnum = 2, 1361*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1362*4882a593Smuzhiyun }, 1363*4882a593Smuzhiyun { 1364*4882a593Smuzhiyun .ifnum = -1 1365*4882a593Smuzhiyun } 1366*4882a593Smuzhiyun } 1367*4882a593Smuzhiyun } 1368*4882a593Smuzhiyun }, 1369*4882a593Smuzhiyun { 1370*4882a593Smuzhiyun /* has ID 0x0076 when not in "Advanced Driver" mode */ 1371*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0075), 1372*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1373*4882a593Smuzhiyun .vendor_name = "BOSS", 1374*4882a593Smuzhiyun .product_name = "DR-880", 1375*4882a593Smuzhiyun .ifnum = 0, 1376*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1377*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1378*4882a593Smuzhiyun .out_cables = 0x0001, 1379*4882a593Smuzhiyun .in_cables = 0x0001 1380*4882a593Smuzhiyun } 1381*4882a593Smuzhiyun } 1382*4882a593Smuzhiyun }, 1383*4882a593Smuzhiyun { 1384*4882a593Smuzhiyun /* has ID 0x007b when not in "Advanced Driver" mode */ 1385*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0582, 0x007a), 1386*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1387*4882a593Smuzhiyun .vendor_name = "Roland", 1388*4882a593Smuzhiyun /* "RD" or "RD-700SX"? */ 1389*4882a593Smuzhiyun .ifnum = 0, 1390*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1391*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1392*4882a593Smuzhiyun .out_cables = 0x0003, 1393*4882a593Smuzhiyun .in_cables = 0x0003 1394*4882a593Smuzhiyun } 1395*4882a593Smuzhiyun } 1396*4882a593Smuzhiyun }, 1397*4882a593Smuzhiyun { 1398*4882a593Smuzhiyun /* has ID 0x0081 when not in "Advanced Driver" mode */ 1399*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0080), 1400*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1401*4882a593Smuzhiyun .vendor_name = "Roland", 1402*4882a593Smuzhiyun .product_name = "G-70", 1403*4882a593Smuzhiyun .ifnum = 0, 1404*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1405*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1406*4882a593Smuzhiyun .out_cables = 0x0001, 1407*4882a593Smuzhiyun .in_cables = 0x0001 1408*4882a593Smuzhiyun } 1409*4882a593Smuzhiyun } 1410*4882a593Smuzhiyun }, 1411*4882a593Smuzhiyun { 1412*4882a593Smuzhiyun /* has ID 0x008c when not in "Advanced Driver" mode */ 1413*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x008b), 1414*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1415*4882a593Smuzhiyun .vendor_name = "EDIROL", 1416*4882a593Smuzhiyun .product_name = "PC-50", 1417*4882a593Smuzhiyun .ifnum = 0, 1418*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1419*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1420*4882a593Smuzhiyun .out_cables = 0x0001, 1421*4882a593Smuzhiyun .in_cables = 0x0001 1422*4882a593Smuzhiyun } 1423*4882a593Smuzhiyun } 1424*4882a593Smuzhiyun }, 1425*4882a593Smuzhiyun { 1426*4882a593Smuzhiyun /* 1427*4882a593Smuzhiyun * This quirk is for the "Advanced Driver" mode. If off, the UA-4FX 1428*4882a593Smuzhiyun * is standard compliant, but has only 16-bit PCM and no MIDI. 1429*4882a593Smuzhiyun */ 1430*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x00a3), 1431*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1432*4882a593Smuzhiyun .vendor_name = "EDIROL", 1433*4882a593Smuzhiyun .product_name = "UA-4FX", 1434*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1435*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1436*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1437*4882a593Smuzhiyun { 1438*4882a593Smuzhiyun .ifnum = 0, 1439*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1440*4882a593Smuzhiyun }, 1441*4882a593Smuzhiyun { 1442*4882a593Smuzhiyun .ifnum = 1, 1443*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1444*4882a593Smuzhiyun }, 1445*4882a593Smuzhiyun { 1446*4882a593Smuzhiyun .ifnum = 2, 1447*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1448*4882a593Smuzhiyun }, 1449*4882a593Smuzhiyun { 1450*4882a593Smuzhiyun .ifnum = -1 1451*4882a593Smuzhiyun } 1452*4882a593Smuzhiyun } 1453*4882a593Smuzhiyun } 1454*4882a593Smuzhiyun }, 1455*4882a593Smuzhiyun { 1456*4882a593Smuzhiyun /* Edirol M-16DX */ 1457*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x00c4), 1458*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1459*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1460*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1461*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1462*4882a593Smuzhiyun { 1463*4882a593Smuzhiyun .ifnum = 0, 1464*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1465*4882a593Smuzhiyun }, 1466*4882a593Smuzhiyun { 1467*4882a593Smuzhiyun .ifnum = 1, 1468*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1469*4882a593Smuzhiyun }, 1470*4882a593Smuzhiyun { 1471*4882a593Smuzhiyun .ifnum = 2, 1472*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1473*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1474*4882a593Smuzhiyun .out_cables = 0x0001, 1475*4882a593Smuzhiyun .in_cables = 0x0001 1476*4882a593Smuzhiyun } 1477*4882a593Smuzhiyun }, 1478*4882a593Smuzhiyun { 1479*4882a593Smuzhiyun .ifnum = -1 1480*4882a593Smuzhiyun } 1481*4882a593Smuzhiyun } 1482*4882a593Smuzhiyun } 1483*4882a593Smuzhiyun }, 1484*4882a593Smuzhiyun { 1485*4882a593Smuzhiyun /* Advanced modes of the Edirol UA-25EX. 1486*4882a593Smuzhiyun * For the standard mode, UA-25EX has ID 0582:00e7, which 1487*4882a593Smuzhiyun * offers only 16-bit PCM at 44.1 kHz and no MIDI. 1488*4882a593Smuzhiyun */ 1489*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6), 1490*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1491*4882a593Smuzhiyun .vendor_name = "EDIROL", 1492*4882a593Smuzhiyun .product_name = "UA-25EX", 1493*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1494*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1495*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1496*4882a593Smuzhiyun { 1497*4882a593Smuzhiyun .ifnum = 0, 1498*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1499*4882a593Smuzhiyun }, 1500*4882a593Smuzhiyun { 1501*4882a593Smuzhiyun .ifnum = 1, 1502*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1503*4882a593Smuzhiyun }, 1504*4882a593Smuzhiyun { 1505*4882a593Smuzhiyun .ifnum = 2, 1506*4882a593Smuzhiyun .type = QUIRK_AUDIO_EDIROL_UAXX 1507*4882a593Smuzhiyun }, 1508*4882a593Smuzhiyun { 1509*4882a593Smuzhiyun .ifnum = -1 1510*4882a593Smuzhiyun } 1511*4882a593Smuzhiyun } 1512*4882a593Smuzhiyun } 1513*4882a593Smuzhiyun }, 1514*4882a593Smuzhiyun { 1515*4882a593Smuzhiyun /* Edirol UM-3G */ 1516*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), 1517*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1518*4882a593Smuzhiyun .ifnum = 0, 1519*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1520*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1521*4882a593Smuzhiyun .out_cables = 0x0007, 1522*4882a593Smuzhiyun .in_cables = 0x0007 1523*4882a593Smuzhiyun } 1524*4882a593Smuzhiyun } 1525*4882a593Smuzhiyun }, 1526*4882a593Smuzhiyun { 1527*4882a593Smuzhiyun /* BOSS ME-25 */ 1528*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0113), 1529*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1530*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1531*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1532*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1533*4882a593Smuzhiyun { 1534*4882a593Smuzhiyun .ifnum = 0, 1535*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1536*4882a593Smuzhiyun }, 1537*4882a593Smuzhiyun { 1538*4882a593Smuzhiyun .ifnum = 1, 1539*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1540*4882a593Smuzhiyun }, 1541*4882a593Smuzhiyun { 1542*4882a593Smuzhiyun .ifnum = 2, 1543*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1544*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1545*4882a593Smuzhiyun .out_cables = 0x0001, 1546*4882a593Smuzhiyun .in_cables = 0x0001 1547*4882a593Smuzhiyun } 1548*4882a593Smuzhiyun }, 1549*4882a593Smuzhiyun { 1550*4882a593Smuzhiyun .ifnum = -1 1551*4882a593Smuzhiyun } 1552*4882a593Smuzhiyun } 1553*4882a593Smuzhiyun } 1554*4882a593Smuzhiyun }, 1555*4882a593Smuzhiyun { 1556*4882a593Smuzhiyun /* only 44.1 kHz works at the moment */ 1557*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0120), 1558*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1559*4882a593Smuzhiyun /* .vendor_name = "Roland", */ 1560*4882a593Smuzhiyun /* .product_name = "OCTO-CAPTURE", */ 1561*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1562*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1563*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1564*4882a593Smuzhiyun { 1565*4882a593Smuzhiyun .ifnum = 0, 1566*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 1567*4882a593Smuzhiyun .data = & (const struct audioformat) { 1568*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S32_LE, 1569*4882a593Smuzhiyun .channels = 10, 1570*4882a593Smuzhiyun .iface = 0, 1571*4882a593Smuzhiyun .altsetting = 1, 1572*4882a593Smuzhiyun .altset_idx = 1, 1573*4882a593Smuzhiyun .endpoint = 0x05, 1574*4882a593Smuzhiyun .ep_attr = 0x05, 1575*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 1576*4882a593Smuzhiyun .rate_min = 44100, 1577*4882a593Smuzhiyun .rate_max = 44100, 1578*4882a593Smuzhiyun .nr_rates = 1, 1579*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 1580*4882a593Smuzhiyun } 1581*4882a593Smuzhiyun }, 1582*4882a593Smuzhiyun { 1583*4882a593Smuzhiyun .ifnum = 1, 1584*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 1585*4882a593Smuzhiyun .data = & (const struct audioformat) { 1586*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S32_LE, 1587*4882a593Smuzhiyun .channels = 12, 1588*4882a593Smuzhiyun .iface = 1, 1589*4882a593Smuzhiyun .altsetting = 1, 1590*4882a593Smuzhiyun .altset_idx = 1, 1591*4882a593Smuzhiyun .endpoint = 0x85, 1592*4882a593Smuzhiyun .ep_attr = 0x25, 1593*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 1594*4882a593Smuzhiyun .rate_min = 44100, 1595*4882a593Smuzhiyun .rate_max = 44100, 1596*4882a593Smuzhiyun .nr_rates = 1, 1597*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 1598*4882a593Smuzhiyun } 1599*4882a593Smuzhiyun }, 1600*4882a593Smuzhiyun { 1601*4882a593Smuzhiyun .ifnum = 2, 1602*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1603*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1604*4882a593Smuzhiyun .out_cables = 0x0001, 1605*4882a593Smuzhiyun .in_cables = 0x0001 1606*4882a593Smuzhiyun } 1607*4882a593Smuzhiyun }, 1608*4882a593Smuzhiyun { 1609*4882a593Smuzhiyun .ifnum = 3, 1610*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1611*4882a593Smuzhiyun }, 1612*4882a593Smuzhiyun { 1613*4882a593Smuzhiyun .ifnum = 4, 1614*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1615*4882a593Smuzhiyun }, 1616*4882a593Smuzhiyun { 1617*4882a593Smuzhiyun .ifnum = -1 1618*4882a593Smuzhiyun } 1619*4882a593Smuzhiyun } 1620*4882a593Smuzhiyun } 1621*4882a593Smuzhiyun }, 1622*4882a593Smuzhiyun { 1623*4882a593Smuzhiyun /* only 44.1 kHz works at the moment */ 1624*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x012f), 1625*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1626*4882a593Smuzhiyun /* .vendor_name = "Roland", */ 1627*4882a593Smuzhiyun /* .product_name = "QUAD-CAPTURE", */ 1628*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1629*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1630*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1631*4882a593Smuzhiyun { 1632*4882a593Smuzhiyun .ifnum = 0, 1633*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 1634*4882a593Smuzhiyun .data = & (const struct audioformat) { 1635*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S32_LE, 1636*4882a593Smuzhiyun .channels = 4, 1637*4882a593Smuzhiyun .iface = 0, 1638*4882a593Smuzhiyun .altsetting = 1, 1639*4882a593Smuzhiyun .altset_idx = 1, 1640*4882a593Smuzhiyun .endpoint = 0x05, 1641*4882a593Smuzhiyun .ep_attr = 0x05, 1642*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 1643*4882a593Smuzhiyun .rate_min = 44100, 1644*4882a593Smuzhiyun .rate_max = 44100, 1645*4882a593Smuzhiyun .nr_rates = 1, 1646*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 1647*4882a593Smuzhiyun } 1648*4882a593Smuzhiyun }, 1649*4882a593Smuzhiyun { 1650*4882a593Smuzhiyun .ifnum = 1, 1651*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 1652*4882a593Smuzhiyun .data = & (const struct audioformat) { 1653*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S32_LE, 1654*4882a593Smuzhiyun .channels = 6, 1655*4882a593Smuzhiyun .iface = 1, 1656*4882a593Smuzhiyun .altsetting = 1, 1657*4882a593Smuzhiyun .altset_idx = 1, 1658*4882a593Smuzhiyun .endpoint = 0x85, 1659*4882a593Smuzhiyun .ep_attr = 0x25, 1660*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 1661*4882a593Smuzhiyun .rate_min = 44100, 1662*4882a593Smuzhiyun .rate_max = 44100, 1663*4882a593Smuzhiyun .nr_rates = 1, 1664*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 1665*4882a593Smuzhiyun } 1666*4882a593Smuzhiyun }, 1667*4882a593Smuzhiyun { 1668*4882a593Smuzhiyun .ifnum = 2, 1669*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1670*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1671*4882a593Smuzhiyun .out_cables = 0x0001, 1672*4882a593Smuzhiyun .in_cables = 0x0001 1673*4882a593Smuzhiyun } 1674*4882a593Smuzhiyun }, 1675*4882a593Smuzhiyun { 1676*4882a593Smuzhiyun .ifnum = 3, 1677*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1678*4882a593Smuzhiyun }, 1679*4882a593Smuzhiyun { 1680*4882a593Smuzhiyun .ifnum = 4, 1681*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1682*4882a593Smuzhiyun }, 1683*4882a593Smuzhiyun { 1684*4882a593Smuzhiyun .ifnum = -1 1685*4882a593Smuzhiyun } 1686*4882a593Smuzhiyun } 1687*4882a593Smuzhiyun } 1688*4882a593Smuzhiyun }, 1689*4882a593Smuzhiyun { 1690*4882a593Smuzhiyun USB_DEVICE(0x0582, 0x0159), 1691*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1692*4882a593Smuzhiyun /* .vendor_name = "Roland", */ 1693*4882a593Smuzhiyun /* .product_name = "UA-22", */ 1694*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1695*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1696*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 1697*4882a593Smuzhiyun { 1698*4882a593Smuzhiyun .ifnum = 0, 1699*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1700*4882a593Smuzhiyun }, 1701*4882a593Smuzhiyun { 1702*4882a593Smuzhiyun .ifnum = 1, 1703*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1704*4882a593Smuzhiyun }, 1705*4882a593Smuzhiyun { 1706*4882a593Smuzhiyun .ifnum = 2, 1707*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1708*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1709*4882a593Smuzhiyun .out_cables = 0x0001, 1710*4882a593Smuzhiyun .in_cables = 0x0001 1711*4882a593Smuzhiyun } 1712*4882a593Smuzhiyun }, 1713*4882a593Smuzhiyun { 1714*4882a593Smuzhiyun .ifnum = -1 1715*4882a593Smuzhiyun } 1716*4882a593Smuzhiyun } 1717*4882a593Smuzhiyun } 1718*4882a593Smuzhiyun }, 1719*4882a593Smuzhiyun /* this catches most recent vendor-specific Roland devices */ 1720*4882a593Smuzhiyun { 1721*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 1722*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_INT_CLASS, 1723*4882a593Smuzhiyun .idVendor = 0x0582, 1724*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_VENDOR_SPEC, 1725*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 1726*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1727*4882a593Smuzhiyun .type = QUIRK_AUTODETECT 1728*4882a593Smuzhiyun } 1729*4882a593Smuzhiyun }, 1730*4882a593Smuzhiyun 1731*4882a593Smuzhiyun /* Guillemot devices */ 1732*4882a593Smuzhiyun { 1733*4882a593Smuzhiyun /* 1734*4882a593Smuzhiyun * This is for the "Windows Edition" where the external MIDI ports are 1735*4882a593Smuzhiyun * the only MIDI ports; the control data is reported through HID 1736*4882a593Smuzhiyun * interfaces. The "Macintosh Edition" has ID 0xd002 and uses standard 1737*4882a593Smuzhiyun * compliant USB MIDI ports for external MIDI and controls. 1738*4882a593Smuzhiyun */ 1739*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x06f8, 0xb000), 1740*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1741*4882a593Smuzhiyun .vendor_name = "Hercules", 1742*4882a593Smuzhiyun .product_name = "DJ Console (WE)", 1743*4882a593Smuzhiyun .ifnum = 4, 1744*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 1745*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1746*4882a593Smuzhiyun .out_cables = 0x0001, 1747*4882a593Smuzhiyun .in_cables = 0x0001 1748*4882a593Smuzhiyun } 1749*4882a593Smuzhiyun } 1750*4882a593Smuzhiyun }, 1751*4882a593Smuzhiyun 1752*4882a593Smuzhiyun /* Midiman/M-Audio devices */ 1753*4882a593Smuzhiyun { 1754*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002), 1755*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1756*4882a593Smuzhiyun .vendor_name = "M-Audio", 1757*4882a593Smuzhiyun .product_name = "MidiSport 2x2", 1758*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1759*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1760*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1761*4882a593Smuzhiyun .out_cables = 0x0003, 1762*4882a593Smuzhiyun .in_cables = 0x0003 1763*4882a593Smuzhiyun } 1764*4882a593Smuzhiyun } 1765*4882a593Smuzhiyun }, 1766*4882a593Smuzhiyun { 1767*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011), 1768*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1769*4882a593Smuzhiyun .vendor_name = "M-Audio", 1770*4882a593Smuzhiyun .product_name = "MidiSport 1x1", 1771*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1772*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1773*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1774*4882a593Smuzhiyun .out_cables = 0x0001, 1775*4882a593Smuzhiyun .in_cables = 0x0001 1776*4882a593Smuzhiyun } 1777*4882a593Smuzhiyun } 1778*4882a593Smuzhiyun }, 1779*4882a593Smuzhiyun { 1780*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015), 1781*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1782*4882a593Smuzhiyun .vendor_name = "M-Audio", 1783*4882a593Smuzhiyun .product_name = "Keystation", 1784*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1785*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1786*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1787*4882a593Smuzhiyun .out_cables = 0x0001, 1788*4882a593Smuzhiyun .in_cables = 0x0001 1789*4882a593Smuzhiyun } 1790*4882a593Smuzhiyun } 1791*4882a593Smuzhiyun }, 1792*4882a593Smuzhiyun { 1793*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021), 1794*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1795*4882a593Smuzhiyun .vendor_name = "M-Audio", 1796*4882a593Smuzhiyun .product_name = "MidiSport 4x4", 1797*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1798*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1799*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1800*4882a593Smuzhiyun .out_cables = 0x000f, 1801*4882a593Smuzhiyun .in_cables = 0x000f 1802*4882a593Smuzhiyun } 1803*4882a593Smuzhiyun } 1804*4882a593Smuzhiyun }, 1805*4882a593Smuzhiyun { 1806*4882a593Smuzhiyun /* 1807*4882a593Smuzhiyun * For hardware revision 1.05; in the later revisions (1.10 and 1808*4882a593Smuzhiyun * 1.21), 0x1031 is the ID for the device without firmware. 1809*4882a593Smuzhiyun * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de> 1810*4882a593Smuzhiyun */ 1811*4882a593Smuzhiyun USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109), 1812*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1813*4882a593Smuzhiyun .vendor_name = "M-Audio", 1814*4882a593Smuzhiyun .product_name = "MidiSport 8x8", 1815*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1816*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1817*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1818*4882a593Smuzhiyun .out_cables = 0x01ff, 1819*4882a593Smuzhiyun .in_cables = 0x01ff 1820*4882a593Smuzhiyun } 1821*4882a593Smuzhiyun } 1822*4882a593Smuzhiyun }, 1823*4882a593Smuzhiyun { 1824*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033), 1825*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1826*4882a593Smuzhiyun .vendor_name = "M-Audio", 1827*4882a593Smuzhiyun .product_name = "MidiSport 8x8", 1828*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1829*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1830*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1831*4882a593Smuzhiyun .out_cables = 0x01ff, 1832*4882a593Smuzhiyun .in_cables = 0x01ff 1833*4882a593Smuzhiyun } 1834*4882a593Smuzhiyun } 1835*4882a593Smuzhiyun }, 1836*4882a593Smuzhiyun { 1837*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041), 1838*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1839*4882a593Smuzhiyun .vendor_name = "M-Audio", 1840*4882a593Smuzhiyun .product_name = "MidiSport 2x4", 1841*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1842*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1843*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1844*4882a593Smuzhiyun .out_cables = 0x000f, 1845*4882a593Smuzhiyun .in_cables = 0x0003 1846*4882a593Smuzhiyun } 1847*4882a593Smuzhiyun } 1848*4882a593Smuzhiyun }, 1849*4882a593Smuzhiyun { 1850*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001), 1851*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1852*4882a593Smuzhiyun .vendor_name = "M-Audio", 1853*4882a593Smuzhiyun .product_name = "Quattro", 1854*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1855*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1856*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 1857*4882a593Smuzhiyun /* 1858*4882a593Smuzhiyun * Interfaces 0-2 are "Windows-compatible", 16-bit only, 1859*4882a593Smuzhiyun * and share endpoints with the other interfaces. 1860*4882a593Smuzhiyun * Ignore them. The other interfaces can do 24 bits, 1861*4882a593Smuzhiyun * but captured samples are big-endian (see usbaudio.c). 1862*4882a593Smuzhiyun */ 1863*4882a593Smuzhiyun { 1864*4882a593Smuzhiyun .ifnum = 0, 1865*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1866*4882a593Smuzhiyun }, 1867*4882a593Smuzhiyun { 1868*4882a593Smuzhiyun .ifnum = 1, 1869*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1870*4882a593Smuzhiyun }, 1871*4882a593Smuzhiyun { 1872*4882a593Smuzhiyun .ifnum = 2, 1873*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1874*4882a593Smuzhiyun }, 1875*4882a593Smuzhiyun { 1876*4882a593Smuzhiyun .ifnum = 3, 1877*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1878*4882a593Smuzhiyun }, 1879*4882a593Smuzhiyun { 1880*4882a593Smuzhiyun .ifnum = 4, 1881*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1882*4882a593Smuzhiyun }, 1883*4882a593Smuzhiyun { 1884*4882a593Smuzhiyun .ifnum = 5, 1885*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1886*4882a593Smuzhiyun }, 1887*4882a593Smuzhiyun { 1888*4882a593Smuzhiyun .ifnum = 6, 1889*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1890*4882a593Smuzhiyun }, 1891*4882a593Smuzhiyun { 1892*4882a593Smuzhiyun .ifnum = 7, 1893*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1894*4882a593Smuzhiyun }, 1895*4882a593Smuzhiyun { 1896*4882a593Smuzhiyun .ifnum = 8, 1897*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1898*4882a593Smuzhiyun }, 1899*4882a593Smuzhiyun { 1900*4882a593Smuzhiyun .ifnum = 9, 1901*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1902*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1903*4882a593Smuzhiyun .out_cables = 0x0001, 1904*4882a593Smuzhiyun .in_cables = 0x0001 1905*4882a593Smuzhiyun } 1906*4882a593Smuzhiyun }, 1907*4882a593Smuzhiyun { 1908*4882a593Smuzhiyun .ifnum = -1 1909*4882a593Smuzhiyun } 1910*4882a593Smuzhiyun } 1911*4882a593Smuzhiyun } 1912*4882a593Smuzhiyun }, 1913*4882a593Smuzhiyun { 1914*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003), 1915*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1916*4882a593Smuzhiyun .vendor_name = "M-Audio", 1917*4882a593Smuzhiyun .product_name = "AudioPhile", 1918*4882a593Smuzhiyun .ifnum = 6, 1919*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1920*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1921*4882a593Smuzhiyun .out_cables = 0x0001, 1922*4882a593Smuzhiyun .in_cables = 0x0001 1923*4882a593Smuzhiyun } 1924*4882a593Smuzhiyun } 1925*4882a593Smuzhiyun }, 1926*4882a593Smuzhiyun { 1927*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008), 1928*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1929*4882a593Smuzhiyun .vendor_name = "M-Audio", 1930*4882a593Smuzhiyun .product_name = "Ozone", 1931*4882a593Smuzhiyun .ifnum = 3, 1932*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1933*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1934*4882a593Smuzhiyun .out_cables = 0x0001, 1935*4882a593Smuzhiyun .in_cables = 0x0001 1936*4882a593Smuzhiyun } 1937*4882a593Smuzhiyun } 1938*4882a593Smuzhiyun }, 1939*4882a593Smuzhiyun { 1940*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d), 1941*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 1942*4882a593Smuzhiyun .vendor_name = "M-Audio", 1943*4882a593Smuzhiyun .product_name = "OmniStudio", 1944*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 1945*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 1946*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 1947*4882a593Smuzhiyun { 1948*4882a593Smuzhiyun .ifnum = 0, 1949*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1950*4882a593Smuzhiyun }, 1951*4882a593Smuzhiyun { 1952*4882a593Smuzhiyun .ifnum = 1, 1953*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1954*4882a593Smuzhiyun }, 1955*4882a593Smuzhiyun { 1956*4882a593Smuzhiyun .ifnum = 2, 1957*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1958*4882a593Smuzhiyun }, 1959*4882a593Smuzhiyun { 1960*4882a593Smuzhiyun .ifnum = 3, 1961*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1962*4882a593Smuzhiyun }, 1963*4882a593Smuzhiyun { 1964*4882a593Smuzhiyun .ifnum = 4, 1965*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1966*4882a593Smuzhiyun }, 1967*4882a593Smuzhiyun { 1968*4882a593Smuzhiyun .ifnum = 5, 1969*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1970*4882a593Smuzhiyun }, 1971*4882a593Smuzhiyun { 1972*4882a593Smuzhiyun .ifnum = 6, 1973*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 1974*4882a593Smuzhiyun }, 1975*4882a593Smuzhiyun { 1976*4882a593Smuzhiyun .ifnum = 7, 1977*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1978*4882a593Smuzhiyun }, 1979*4882a593Smuzhiyun { 1980*4882a593Smuzhiyun .ifnum = 8, 1981*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 1982*4882a593Smuzhiyun }, 1983*4882a593Smuzhiyun { 1984*4882a593Smuzhiyun .ifnum = 9, 1985*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 1986*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 1987*4882a593Smuzhiyun .out_cables = 0x0001, 1988*4882a593Smuzhiyun .in_cables = 0x0001 1989*4882a593Smuzhiyun } 1990*4882a593Smuzhiyun }, 1991*4882a593Smuzhiyun { 1992*4882a593Smuzhiyun .ifnum = -1 1993*4882a593Smuzhiyun } 1994*4882a593Smuzhiyun } 1995*4882a593Smuzhiyun } 1996*4882a593Smuzhiyun }, 1997*4882a593Smuzhiyun { 1998*4882a593Smuzhiyun USB_DEVICE(0x0763, 0x2019), 1999*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2000*4882a593Smuzhiyun /* .vendor_name = "M-Audio", */ 2001*4882a593Smuzhiyun /* .product_name = "Ozone Academic", */ 2002*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2003*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2004*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2005*4882a593Smuzhiyun { 2006*4882a593Smuzhiyun .ifnum = 0, 2007*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2008*4882a593Smuzhiyun }, 2009*4882a593Smuzhiyun { 2010*4882a593Smuzhiyun .ifnum = 1, 2011*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2012*4882a593Smuzhiyun }, 2013*4882a593Smuzhiyun { 2014*4882a593Smuzhiyun .ifnum = 2, 2015*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2016*4882a593Smuzhiyun }, 2017*4882a593Smuzhiyun { 2018*4882a593Smuzhiyun .ifnum = 3, 2019*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 2020*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 2021*4882a593Smuzhiyun .out_cables = 0x0001, 2022*4882a593Smuzhiyun .in_cables = 0x0001 2023*4882a593Smuzhiyun } 2024*4882a593Smuzhiyun }, 2025*4882a593Smuzhiyun { 2026*4882a593Smuzhiyun .ifnum = -1 2027*4882a593Smuzhiyun } 2028*4882a593Smuzhiyun } 2029*4882a593Smuzhiyun } 2030*4882a593Smuzhiyun }, 2031*4882a593Smuzhiyun { 2032*4882a593Smuzhiyun /* M-Audio Micro */ 2033*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x201a), 2034*4882a593Smuzhiyun }, 2035*4882a593Smuzhiyun { 2036*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2030), 2037*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2038*4882a593Smuzhiyun /* .vendor_name = "M-Audio", */ 2039*4882a593Smuzhiyun /* .product_name = "Fast Track C400", */ 2040*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2041*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2042*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 2043*4882a593Smuzhiyun { 2044*4882a593Smuzhiyun .ifnum = 1, 2045*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 2046*4882a593Smuzhiyun }, 2047*4882a593Smuzhiyun /* Playback */ 2048*4882a593Smuzhiyun { 2049*4882a593Smuzhiyun .ifnum = 2, 2050*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2051*4882a593Smuzhiyun .data = &(const struct audioformat) { 2052*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2053*4882a593Smuzhiyun .channels = 6, 2054*4882a593Smuzhiyun .iface = 2, 2055*4882a593Smuzhiyun .altsetting = 1, 2056*4882a593Smuzhiyun .altset_idx = 1, 2057*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2058*4882a593Smuzhiyun .endpoint = 0x01, 2059*4882a593Smuzhiyun .ep_attr = 0x09, 2060*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2061*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2062*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2063*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2064*4882a593Smuzhiyun .rate_min = 44100, 2065*4882a593Smuzhiyun .rate_max = 96000, 2066*4882a593Smuzhiyun .nr_rates = 4, 2067*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2068*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2069*4882a593Smuzhiyun }, 2070*4882a593Smuzhiyun .clock = 0x80, 2071*4882a593Smuzhiyun } 2072*4882a593Smuzhiyun }, 2073*4882a593Smuzhiyun /* Capture */ 2074*4882a593Smuzhiyun { 2075*4882a593Smuzhiyun .ifnum = 3, 2076*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2077*4882a593Smuzhiyun .data = &(const struct audioformat) { 2078*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2079*4882a593Smuzhiyun .channels = 4, 2080*4882a593Smuzhiyun .iface = 3, 2081*4882a593Smuzhiyun .altsetting = 1, 2082*4882a593Smuzhiyun .altset_idx = 1, 2083*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2084*4882a593Smuzhiyun .endpoint = 0x81, 2085*4882a593Smuzhiyun .ep_attr = 0x05, 2086*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2087*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2088*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2089*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2090*4882a593Smuzhiyun .rate_min = 44100, 2091*4882a593Smuzhiyun .rate_max = 96000, 2092*4882a593Smuzhiyun .nr_rates = 4, 2093*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2094*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2095*4882a593Smuzhiyun }, 2096*4882a593Smuzhiyun .clock = 0x80, 2097*4882a593Smuzhiyun } 2098*4882a593Smuzhiyun }, 2099*4882a593Smuzhiyun /* MIDI */ 2100*4882a593Smuzhiyun { 2101*4882a593Smuzhiyun .ifnum = -1 /* Interface = 4 */ 2102*4882a593Smuzhiyun } 2103*4882a593Smuzhiyun } 2104*4882a593Smuzhiyun } 2105*4882a593Smuzhiyun }, 2106*4882a593Smuzhiyun { 2107*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2031), 2108*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2109*4882a593Smuzhiyun /* .vendor_name = "M-Audio", */ 2110*4882a593Smuzhiyun /* .product_name = "Fast Track C600", */ 2111*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2112*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2113*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 2114*4882a593Smuzhiyun { 2115*4882a593Smuzhiyun .ifnum = 1, 2116*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 2117*4882a593Smuzhiyun }, 2118*4882a593Smuzhiyun /* Playback */ 2119*4882a593Smuzhiyun { 2120*4882a593Smuzhiyun .ifnum = 2, 2121*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2122*4882a593Smuzhiyun .data = &(const struct audioformat) { 2123*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2124*4882a593Smuzhiyun .channels = 8, 2125*4882a593Smuzhiyun .iface = 2, 2126*4882a593Smuzhiyun .altsetting = 1, 2127*4882a593Smuzhiyun .altset_idx = 1, 2128*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2129*4882a593Smuzhiyun .endpoint = 0x01, 2130*4882a593Smuzhiyun .ep_attr = 0x09, 2131*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2132*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2133*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2134*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2135*4882a593Smuzhiyun .rate_min = 44100, 2136*4882a593Smuzhiyun .rate_max = 96000, 2137*4882a593Smuzhiyun .nr_rates = 4, 2138*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2139*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2140*4882a593Smuzhiyun }, 2141*4882a593Smuzhiyun .clock = 0x80, 2142*4882a593Smuzhiyun } 2143*4882a593Smuzhiyun }, 2144*4882a593Smuzhiyun /* Capture */ 2145*4882a593Smuzhiyun { 2146*4882a593Smuzhiyun .ifnum = 3, 2147*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2148*4882a593Smuzhiyun .data = &(const struct audioformat) { 2149*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2150*4882a593Smuzhiyun .channels = 6, 2151*4882a593Smuzhiyun .iface = 3, 2152*4882a593Smuzhiyun .altsetting = 1, 2153*4882a593Smuzhiyun .altset_idx = 1, 2154*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2155*4882a593Smuzhiyun .endpoint = 0x81, 2156*4882a593Smuzhiyun .ep_attr = 0x05, 2157*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2158*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2159*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2160*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2161*4882a593Smuzhiyun .rate_min = 44100, 2162*4882a593Smuzhiyun .rate_max = 96000, 2163*4882a593Smuzhiyun .nr_rates = 4, 2164*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2165*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2166*4882a593Smuzhiyun }, 2167*4882a593Smuzhiyun .clock = 0x80, 2168*4882a593Smuzhiyun } 2169*4882a593Smuzhiyun }, 2170*4882a593Smuzhiyun /* MIDI */ 2171*4882a593Smuzhiyun { 2172*4882a593Smuzhiyun .ifnum = -1 /* Interface = 4 */ 2173*4882a593Smuzhiyun } 2174*4882a593Smuzhiyun } 2175*4882a593Smuzhiyun } 2176*4882a593Smuzhiyun }, 2177*4882a593Smuzhiyun { 2178*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2080), 2179*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2180*4882a593Smuzhiyun /* .vendor_name = "M-Audio", */ 2181*4882a593Smuzhiyun /* .product_name = "Fast Track Ultra", */ 2182*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2183*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2184*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2185*4882a593Smuzhiyun { 2186*4882a593Smuzhiyun .ifnum = 0, 2187*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 2188*4882a593Smuzhiyun }, 2189*4882a593Smuzhiyun { 2190*4882a593Smuzhiyun .ifnum = 1, 2191*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2192*4882a593Smuzhiyun .data = & (const struct audioformat) { 2193*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2194*4882a593Smuzhiyun .channels = 8, 2195*4882a593Smuzhiyun .iface = 1, 2196*4882a593Smuzhiyun .altsetting = 1, 2197*4882a593Smuzhiyun .altset_idx = 1, 2198*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2199*4882a593Smuzhiyun .endpoint = 0x01, 2200*4882a593Smuzhiyun .ep_attr = 0x09, 2201*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2202*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2203*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2204*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2205*4882a593Smuzhiyun .rate_min = 44100, 2206*4882a593Smuzhiyun .rate_max = 96000, 2207*4882a593Smuzhiyun .nr_rates = 4, 2208*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2209*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2210*4882a593Smuzhiyun } 2211*4882a593Smuzhiyun } 2212*4882a593Smuzhiyun }, 2213*4882a593Smuzhiyun { 2214*4882a593Smuzhiyun .ifnum = 2, 2215*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2216*4882a593Smuzhiyun .data = & (const struct audioformat) { 2217*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2218*4882a593Smuzhiyun .channels = 8, 2219*4882a593Smuzhiyun .iface = 2, 2220*4882a593Smuzhiyun .altsetting = 1, 2221*4882a593Smuzhiyun .altset_idx = 1, 2222*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2223*4882a593Smuzhiyun .endpoint = 0x81, 2224*4882a593Smuzhiyun .ep_attr = 0x05, 2225*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2226*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2227*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2228*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2229*4882a593Smuzhiyun .rate_min = 44100, 2230*4882a593Smuzhiyun .rate_max = 96000, 2231*4882a593Smuzhiyun .nr_rates = 4, 2232*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2233*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2234*4882a593Smuzhiyun } 2235*4882a593Smuzhiyun } 2236*4882a593Smuzhiyun }, 2237*4882a593Smuzhiyun /* interface 3 (MIDI) is standard compliant */ 2238*4882a593Smuzhiyun { 2239*4882a593Smuzhiyun .ifnum = -1 2240*4882a593Smuzhiyun } 2241*4882a593Smuzhiyun } 2242*4882a593Smuzhiyun } 2243*4882a593Smuzhiyun }, 2244*4882a593Smuzhiyun { 2245*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0763, 0x2081), 2246*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2247*4882a593Smuzhiyun /* .vendor_name = "M-Audio", */ 2248*4882a593Smuzhiyun /* .product_name = "Fast Track Ultra 8R", */ 2249*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2250*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2251*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2252*4882a593Smuzhiyun { 2253*4882a593Smuzhiyun .ifnum = 0, 2254*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 2255*4882a593Smuzhiyun }, 2256*4882a593Smuzhiyun { 2257*4882a593Smuzhiyun .ifnum = 1, 2258*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2259*4882a593Smuzhiyun .data = & (const struct audioformat) { 2260*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2261*4882a593Smuzhiyun .channels = 8, 2262*4882a593Smuzhiyun .iface = 1, 2263*4882a593Smuzhiyun .altsetting = 1, 2264*4882a593Smuzhiyun .altset_idx = 1, 2265*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2266*4882a593Smuzhiyun .endpoint = 0x01, 2267*4882a593Smuzhiyun .ep_attr = 0x09, 2268*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2269*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2270*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2271*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2272*4882a593Smuzhiyun .rate_min = 44100, 2273*4882a593Smuzhiyun .rate_max = 96000, 2274*4882a593Smuzhiyun .nr_rates = 4, 2275*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2276*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2277*4882a593Smuzhiyun } 2278*4882a593Smuzhiyun } 2279*4882a593Smuzhiyun }, 2280*4882a593Smuzhiyun { 2281*4882a593Smuzhiyun .ifnum = 2, 2282*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2283*4882a593Smuzhiyun .data = & (const struct audioformat) { 2284*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2285*4882a593Smuzhiyun .channels = 8, 2286*4882a593Smuzhiyun .iface = 2, 2287*4882a593Smuzhiyun .altsetting = 1, 2288*4882a593Smuzhiyun .altset_idx = 1, 2289*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2290*4882a593Smuzhiyun .endpoint = 0x81, 2291*4882a593Smuzhiyun .ep_attr = 0x05, 2292*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2293*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 2294*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 2295*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 2296*4882a593Smuzhiyun .rate_min = 44100, 2297*4882a593Smuzhiyun .rate_max = 96000, 2298*4882a593Smuzhiyun .nr_rates = 4, 2299*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2300*4882a593Smuzhiyun 44100, 48000, 88200, 96000 2301*4882a593Smuzhiyun } 2302*4882a593Smuzhiyun } 2303*4882a593Smuzhiyun }, 2304*4882a593Smuzhiyun /* interface 3 (MIDI) is standard compliant */ 2305*4882a593Smuzhiyun { 2306*4882a593Smuzhiyun .ifnum = -1 2307*4882a593Smuzhiyun } 2308*4882a593Smuzhiyun } 2309*4882a593Smuzhiyun } 2310*4882a593Smuzhiyun }, 2311*4882a593Smuzhiyun 2312*4882a593Smuzhiyun /* Casio devices */ 2313*4882a593Smuzhiyun { 2314*4882a593Smuzhiyun USB_DEVICE(0x07cf, 0x6801), 2315*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2316*4882a593Smuzhiyun .vendor_name = "Casio", 2317*4882a593Smuzhiyun .product_name = "PL-40R", 2318*4882a593Smuzhiyun .ifnum = 0, 2319*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 2320*4882a593Smuzhiyun } 2321*4882a593Smuzhiyun }, 2322*4882a593Smuzhiyun { 2323*4882a593Smuzhiyun /* this ID is used by several devices without a product ID */ 2324*4882a593Smuzhiyun USB_DEVICE(0x07cf, 0x6802), 2325*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2326*4882a593Smuzhiyun .vendor_name = "Casio", 2327*4882a593Smuzhiyun .product_name = "Keyboard", 2328*4882a593Smuzhiyun .ifnum = 0, 2329*4882a593Smuzhiyun .type = QUIRK_MIDI_YAMAHA 2330*4882a593Smuzhiyun } 2331*4882a593Smuzhiyun }, 2332*4882a593Smuzhiyun 2333*4882a593Smuzhiyun /* Mark of the Unicorn devices */ 2334*4882a593Smuzhiyun { 2335*4882a593Smuzhiyun /* thanks to Robert A. Lerche <ral 'at' msbit.com> */ 2336*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_VENDOR | 2337*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_PRODUCT | 2338*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_DEV_SUBCLASS, 2339*4882a593Smuzhiyun .idVendor = 0x07fd, 2340*4882a593Smuzhiyun .idProduct = 0x0001, 2341*4882a593Smuzhiyun .bDeviceSubClass = 2, 2342*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2343*4882a593Smuzhiyun .vendor_name = "MOTU", 2344*4882a593Smuzhiyun .product_name = "Fastlane", 2345*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2346*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2347*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2348*4882a593Smuzhiyun { 2349*4882a593Smuzhiyun .ifnum = 0, 2350*4882a593Smuzhiyun .type = QUIRK_MIDI_RAW_BYTES 2351*4882a593Smuzhiyun }, 2352*4882a593Smuzhiyun { 2353*4882a593Smuzhiyun .ifnum = 1, 2354*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 2355*4882a593Smuzhiyun }, 2356*4882a593Smuzhiyun { 2357*4882a593Smuzhiyun .ifnum = -1 2358*4882a593Smuzhiyun } 2359*4882a593Smuzhiyun } 2360*4882a593Smuzhiyun } 2361*4882a593Smuzhiyun }, 2362*4882a593Smuzhiyun 2363*4882a593Smuzhiyun /* Emagic devices */ 2364*4882a593Smuzhiyun { 2365*4882a593Smuzhiyun USB_DEVICE(0x086a, 0x0001), 2366*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2367*4882a593Smuzhiyun .vendor_name = "Emagic", 2368*4882a593Smuzhiyun .product_name = "Unitor8", 2369*4882a593Smuzhiyun .ifnum = 2, 2370*4882a593Smuzhiyun .type = QUIRK_MIDI_EMAGIC, 2371*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 2372*4882a593Smuzhiyun .out_cables = 0x80ff, 2373*4882a593Smuzhiyun .in_cables = 0x80ff 2374*4882a593Smuzhiyun } 2375*4882a593Smuzhiyun } 2376*4882a593Smuzhiyun }, 2377*4882a593Smuzhiyun { 2378*4882a593Smuzhiyun USB_DEVICE(0x086a, 0x0002), 2379*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2380*4882a593Smuzhiyun .vendor_name = "Emagic", 2381*4882a593Smuzhiyun /* .product_name = "AMT8", */ 2382*4882a593Smuzhiyun .ifnum = 2, 2383*4882a593Smuzhiyun .type = QUIRK_MIDI_EMAGIC, 2384*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 2385*4882a593Smuzhiyun .out_cables = 0x80ff, 2386*4882a593Smuzhiyun .in_cables = 0x80ff 2387*4882a593Smuzhiyun } 2388*4882a593Smuzhiyun } 2389*4882a593Smuzhiyun }, 2390*4882a593Smuzhiyun { 2391*4882a593Smuzhiyun USB_DEVICE(0x086a, 0x0003), 2392*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2393*4882a593Smuzhiyun .vendor_name = "Emagic", 2394*4882a593Smuzhiyun /* .product_name = "MT4", */ 2395*4882a593Smuzhiyun .ifnum = 2, 2396*4882a593Smuzhiyun .type = QUIRK_MIDI_EMAGIC, 2397*4882a593Smuzhiyun .data = & (const struct snd_usb_midi_endpoint_info) { 2398*4882a593Smuzhiyun .out_cables = 0x800f, 2399*4882a593Smuzhiyun .in_cables = 0x8003 2400*4882a593Smuzhiyun } 2401*4882a593Smuzhiyun } 2402*4882a593Smuzhiyun }, 2403*4882a593Smuzhiyun 2404*4882a593Smuzhiyun /* KORG devices */ 2405*4882a593Smuzhiyun { 2406*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0944, 0x0200), 2407*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2408*4882a593Smuzhiyun .vendor_name = "KORG, Inc.", 2409*4882a593Smuzhiyun /* .product_name = "PANDORA PX5D", */ 2410*4882a593Smuzhiyun .ifnum = 3, 2411*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE, 2412*4882a593Smuzhiyun } 2413*4882a593Smuzhiyun }, 2414*4882a593Smuzhiyun 2415*4882a593Smuzhiyun { 2416*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0944, 0x0201), 2417*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2418*4882a593Smuzhiyun .vendor_name = "KORG, Inc.", 2419*4882a593Smuzhiyun /* .product_name = "ToneLab ST", */ 2420*4882a593Smuzhiyun .ifnum = 3, 2421*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE, 2422*4882a593Smuzhiyun } 2423*4882a593Smuzhiyun }, 2424*4882a593Smuzhiyun 2425*4882a593Smuzhiyun { 2426*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0944, 0x0204), 2427*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2428*4882a593Smuzhiyun .vendor_name = "KORG, Inc.", 2429*4882a593Smuzhiyun /* .product_name = "ToneLab EX", */ 2430*4882a593Smuzhiyun .ifnum = 3, 2431*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE, 2432*4882a593Smuzhiyun } 2433*4882a593Smuzhiyun }, 2434*4882a593Smuzhiyun 2435*4882a593Smuzhiyun /* AKAI devices */ 2436*4882a593Smuzhiyun { 2437*4882a593Smuzhiyun USB_DEVICE(0x09e8, 0x0062), 2438*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2439*4882a593Smuzhiyun .vendor_name = "AKAI", 2440*4882a593Smuzhiyun .product_name = "MPD16", 2441*4882a593Smuzhiyun .ifnum = 0, 2442*4882a593Smuzhiyun .type = QUIRK_MIDI_AKAI, 2443*4882a593Smuzhiyun } 2444*4882a593Smuzhiyun }, 2445*4882a593Smuzhiyun 2446*4882a593Smuzhiyun { 2447*4882a593Smuzhiyun /* Akai MPC Element */ 2448*4882a593Smuzhiyun USB_DEVICE(0x09e8, 0x0021), 2449*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2450*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2451*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2452*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2453*4882a593Smuzhiyun { 2454*4882a593Smuzhiyun .ifnum = 0, 2455*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 2456*4882a593Smuzhiyun }, 2457*4882a593Smuzhiyun { 2458*4882a593Smuzhiyun .ifnum = 1, 2459*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 2460*4882a593Smuzhiyun }, 2461*4882a593Smuzhiyun { 2462*4882a593Smuzhiyun .ifnum = -1 2463*4882a593Smuzhiyun } 2464*4882a593Smuzhiyun } 2465*4882a593Smuzhiyun } 2466*4882a593Smuzhiyun }, 2467*4882a593Smuzhiyun 2468*4882a593Smuzhiyun /* Steinberg devices */ 2469*4882a593Smuzhiyun { 2470*4882a593Smuzhiyun /* Steinberg MI2 */ 2471*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x2040), 2472*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2473*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2474*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2475*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2476*4882a593Smuzhiyun { 2477*4882a593Smuzhiyun .ifnum = 0, 2478*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2479*4882a593Smuzhiyun }, 2480*4882a593Smuzhiyun { 2481*4882a593Smuzhiyun .ifnum = 1, 2482*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2483*4882a593Smuzhiyun }, 2484*4882a593Smuzhiyun { 2485*4882a593Smuzhiyun .ifnum = 2, 2486*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2487*4882a593Smuzhiyun }, 2488*4882a593Smuzhiyun { 2489*4882a593Smuzhiyun .ifnum = 3, 2490*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 2491*4882a593Smuzhiyun .data = &(const struct snd_usb_midi_endpoint_info) { 2492*4882a593Smuzhiyun .out_cables = 0x0001, 2493*4882a593Smuzhiyun .in_cables = 0x0001 2494*4882a593Smuzhiyun } 2495*4882a593Smuzhiyun }, 2496*4882a593Smuzhiyun { 2497*4882a593Smuzhiyun .ifnum = -1 2498*4882a593Smuzhiyun } 2499*4882a593Smuzhiyun } 2500*4882a593Smuzhiyun } 2501*4882a593Smuzhiyun }, 2502*4882a593Smuzhiyun { 2503*4882a593Smuzhiyun /* Steinberg MI4 */ 2504*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x4040), 2505*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2506*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2507*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2508*4882a593Smuzhiyun .data = & (const struct snd_usb_audio_quirk[]) { 2509*4882a593Smuzhiyun { 2510*4882a593Smuzhiyun .ifnum = 0, 2511*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2512*4882a593Smuzhiyun }, 2513*4882a593Smuzhiyun { 2514*4882a593Smuzhiyun .ifnum = 1, 2515*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2516*4882a593Smuzhiyun }, 2517*4882a593Smuzhiyun { 2518*4882a593Smuzhiyun .ifnum = 2, 2519*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 2520*4882a593Smuzhiyun }, 2521*4882a593Smuzhiyun { 2522*4882a593Smuzhiyun .ifnum = 3, 2523*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 2524*4882a593Smuzhiyun .data = &(const struct snd_usb_midi_endpoint_info) { 2525*4882a593Smuzhiyun .out_cables = 0x0001, 2526*4882a593Smuzhiyun .in_cables = 0x0001 2527*4882a593Smuzhiyun } 2528*4882a593Smuzhiyun }, 2529*4882a593Smuzhiyun { 2530*4882a593Smuzhiyun .ifnum = -1 2531*4882a593Smuzhiyun } 2532*4882a593Smuzhiyun } 2533*4882a593Smuzhiyun } 2534*4882a593Smuzhiyun }, 2535*4882a593Smuzhiyun 2536*4882a593Smuzhiyun /* TerraTec devices */ 2537*4882a593Smuzhiyun { 2538*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012), 2539*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2540*4882a593Smuzhiyun .vendor_name = "TerraTec", 2541*4882a593Smuzhiyun .product_name = "PHASE 26", 2542*4882a593Smuzhiyun .ifnum = 3, 2543*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 2544*4882a593Smuzhiyun } 2545*4882a593Smuzhiyun }, 2546*4882a593Smuzhiyun { 2547*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013), 2548*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2549*4882a593Smuzhiyun .vendor_name = "TerraTec", 2550*4882a593Smuzhiyun .product_name = "PHASE 26", 2551*4882a593Smuzhiyun .ifnum = 3, 2552*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 2553*4882a593Smuzhiyun } 2554*4882a593Smuzhiyun }, 2555*4882a593Smuzhiyun { 2556*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014), 2557*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2558*4882a593Smuzhiyun .vendor_name = "TerraTec", 2559*4882a593Smuzhiyun .product_name = "PHASE 26", 2560*4882a593Smuzhiyun .ifnum = 3, 2561*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 2562*4882a593Smuzhiyun } 2563*4882a593Smuzhiyun }, 2564*4882a593Smuzhiyun { 2565*4882a593Smuzhiyun USB_DEVICE(0x0ccd, 0x0035), 2566*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2567*4882a593Smuzhiyun .vendor_name = "Miditech", 2568*4882a593Smuzhiyun .product_name = "Play'n Roll", 2569*4882a593Smuzhiyun .ifnum = 0, 2570*4882a593Smuzhiyun .type = QUIRK_MIDI_CME 2571*4882a593Smuzhiyun } 2572*4882a593Smuzhiyun }, 2573*4882a593Smuzhiyun 2574*4882a593Smuzhiyun /* Novation EMS devices */ 2575*4882a593Smuzhiyun { 2576*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001), 2577*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2578*4882a593Smuzhiyun .vendor_name = "Novation", 2579*4882a593Smuzhiyun .product_name = "ReMOTE Audio/XStation", 2580*4882a593Smuzhiyun .ifnum = 4, 2581*4882a593Smuzhiyun .type = QUIRK_MIDI_NOVATION 2582*4882a593Smuzhiyun } 2583*4882a593Smuzhiyun }, 2584*4882a593Smuzhiyun { 2585*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002), 2586*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2587*4882a593Smuzhiyun .vendor_name = "Novation", 2588*4882a593Smuzhiyun .product_name = "Speedio", 2589*4882a593Smuzhiyun .ifnum = 3, 2590*4882a593Smuzhiyun .type = QUIRK_MIDI_NOVATION 2591*4882a593Smuzhiyun } 2592*4882a593Smuzhiyun }, 2593*4882a593Smuzhiyun { 2594*4882a593Smuzhiyun USB_DEVICE(0x1235, 0x000a), 2595*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2596*4882a593Smuzhiyun /* .vendor_name = "Novation", */ 2597*4882a593Smuzhiyun /* .product_name = "Nocturn", */ 2598*4882a593Smuzhiyun .ifnum = 0, 2599*4882a593Smuzhiyun .type = QUIRK_MIDI_RAW_BYTES 2600*4882a593Smuzhiyun } 2601*4882a593Smuzhiyun }, 2602*4882a593Smuzhiyun { 2603*4882a593Smuzhiyun USB_DEVICE(0x1235, 0x000e), 2604*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2605*4882a593Smuzhiyun /* .vendor_name = "Novation", */ 2606*4882a593Smuzhiyun /* .product_name = "Launchpad", */ 2607*4882a593Smuzhiyun .ifnum = 0, 2608*4882a593Smuzhiyun .type = QUIRK_MIDI_RAW_BYTES 2609*4882a593Smuzhiyun } 2610*4882a593Smuzhiyun }, 2611*4882a593Smuzhiyun { 2612*4882a593Smuzhiyun USB_DEVICE(0x1235, 0x0010), 2613*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2614*4882a593Smuzhiyun .vendor_name = "Focusrite", 2615*4882a593Smuzhiyun .product_name = "Saffire 6 USB", 2616*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2617*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2618*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 2619*4882a593Smuzhiyun { 2620*4882a593Smuzhiyun .ifnum = 0, 2621*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 2622*4882a593Smuzhiyun }, 2623*4882a593Smuzhiyun { 2624*4882a593Smuzhiyun .ifnum = 0, 2625*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2626*4882a593Smuzhiyun .data = &(const struct audioformat) { 2627*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2628*4882a593Smuzhiyun .channels = 4, 2629*4882a593Smuzhiyun .iface = 0, 2630*4882a593Smuzhiyun .altsetting = 1, 2631*4882a593Smuzhiyun .altset_idx = 1, 2632*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2633*4882a593Smuzhiyun .endpoint = 0x01, 2634*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 2635*4882a593Smuzhiyun .datainterval = 1, 2636*4882a593Smuzhiyun .maxpacksize = 0x024c, 2637*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2638*4882a593Smuzhiyun SNDRV_PCM_RATE_48000, 2639*4882a593Smuzhiyun .rate_min = 44100, 2640*4882a593Smuzhiyun .rate_max = 48000, 2641*4882a593Smuzhiyun .nr_rates = 2, 2642*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2643*4882a593Smuzhiyun 44100, 48000 2644*4882a593Smuzhiyun } 2645*4882a593Smuzhiyun } 2646*4882a593Smuzhiyun }, 2647*4882a593Smuzhiyun { 2648*4882a593Smuzhiyun .ifnum = 0, 2649*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2650*4882a593Smuzhiyun .data = &(const struct audioformat) { 2651*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2652*4882a593Smuzhiyun .channels = 2, 2653*4882a593Smuzhiyun .iface = 0, 2654*4882a593Smuzhiyun .altsetting = 1, 2655*4882a593Smuzhiyun .altset_idx = 1, 2656*4882a593Smuzhiyun .attributes = 0, 2657*4882a593Smuzhiyun .endpoint = 0x82, 2658*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 2659*4882a593Smuzhiyun .datainterval = 1, 2660*4882a593Smuzhiyun .maxpacksize = 0x0126, 2661*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2662*4882a593Smuzhiyun SNDRV_PCM_RATE_48000, 2663*4882a593Smuzhiyun .rate_min = 44100, 2664*4882a593Smuzhiyun .rate_max = 48000, 2665*4882a593Smuzhiyun .nr_rates = 2, 2666*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2667*4882a593Smuzhiyun 44100, 48000 2668*4882a593Smuzhiyun } 2669*4882a593Smuzhiyun } 2670*4882a593Smuzhiyun }, 2671*4882a593Smuzhiyun { 2672*4882a593Smuzhiyun .ifnum = 1, 2673*4882a593Smuzhiyun .type = QUIRK_MIDI_RAW_BYTES 2674*4882a593Smuzhiyun }, 2675*4882a593Smuzhiyun { 2676*4882a593Smuzhiyun .ifnum = -1 2677*4882a593Smuzhiyun } 2678*4882a593Smuzhiyun } 2679*4882a593Smuzhiyun } 2680*4882a593Smuzhiyun }, 2681*4882a593Smuzhiyun { 2682*4882a593Smuzhiyun USB_DEVICE(0x1235, 0x0018), 2683*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2684*4882a593Smuzhiyun .vendor_name = "Novation", 2685*4882a593Smuzhiyun .product_name = "Twitch", 2686*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2687*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2688*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 2689*4882a593Smuzhiyun { 2690*4882a593Smuzhiyun .ifnum = 0, 2691*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2692*4882a593Smuzhiyun .data = & (const struct audioformat) { 2693*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 2694*4882a593Smuzhiyun .channels = 4, 2695*4882a593Smuzhiyun .iface = 0, 2696*4882a593Smuzhiyun .altsetting = 1, 2697*4882a593Smuzhiyun .altset_idx = 1, 2698*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2699*4882a593Smuzhiyun .endpoint = 0x01, 2700*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 2701*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 2702*4882a593Smuzhiyun SNDRV_PCM_RATE_48000, 2703*4882a593Smuzhiyun .rate_min = 44100, 2704*4882a593Smuzhiyun .rate_max = 48000, 2705*4882a593Smuzhiyun .nr_rates = 2, 2706*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2707*4882a593Smuzhiyun 44100, 48000 2708*4882a593Smuzhiyun } 2709*4882a593Smuzhiyun } 2710*4882a593Smuzhiyun }, 2711*4882a593Smuzhiyun { 2712*4882a593Smuzhiyun .ifnum = 1, 2713*4882a593Smuzhiyun .type = QUIRK_MIDI_RAW_BYTES 2714*4882a593Smuzhiyun }, 2715*4882a593Smuzhiyun { 2716*4882a593Smuzhiyun .ifnum = -1 2717*4882a593Smuzhiyun } 2718*4882a593Smuzhiyun } 2719*4882a593Smuzhiyun } 2720*4882a593Smuzhiyun }, 2721*4882a593Smuzhiyun { 2722*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661), 2723*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2724*4882a593Smuzhiyun .vendor_name = "Novation", 2725*4882a593Smuzhiyun .product_name = "ReMOTE25", 2726*4882a593Smuzhiyun .ifnum = 0, 2727*4882a593Smuzhiyun .type = QUIRK_MIDI_NOVATION 2728*4882a593Smuzhiyun } 2729*4882a593Smuzhiyun }, 2730*4882a593Smuzhiyun 2731*4882a593Smuzhiyun /* Access Music devices */ 2732*4882a593Smuzhiyun { 2733*4882a593Smuzhiyun /* VirusTI Desktop */ 2734*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x133e, 0x0815), 2735*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2736*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2737*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2738*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 2739*4882a593Smuzhiyun { 2740*4882a593Smuzhiyun .ifnum = 3, 2741*4882a593Smuzhiyun .type = QUIRK_MIDI_FIXED_ENDPOINT, 2742*4882a593Smuzhiyun .data = &(const struct snd_usb_midi_endpoint_info) { 2743*4882a593Smuzhiyun .out_cables = 0x0003, 2744*4882a593Smuzhiyun .in_cables = 0x0003 2745*4882a593Smuzhiyun } 2746*4882a593Smuzhiyun }, 2747*4882a593Smuzhiyun { 2748*4882a593Smuzhiyun .ifnum = 4, 2749*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 2750*4882a593Smuzhiyun }, 2751*4882a593Smuzhiyun { 2752*4882a593Smuzhiyun .ifnum = -1 2753*4882a593Smuzhiyun } 2754*4882a593Smuzhiyun } 2755*4882a593Smuzhiyun } 2756*4882a593Smuzhiyun }, 2757*4882a593Smuzhiyun 2758*4882a593Smuzhiyun /* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */ 2759*4882a593Smuzhiyun { 2760*4882a593Smuzhiyun USB_DEVICE(0x17aa, 0x1046), 2761*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2762*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2763*4882a593Smuzhiyun .type = QUIRK_SETUP_DISABLE_AUTOSUSPEND 2764*4882a593Smuzhiyun } 2765*4882a593Smuzhiyun }, 2766*4882a593Smuzhiyun /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ 2767*4882a593Smuzhiyun { 2768*4882a593Smuzhiyun USB_DEVICE(0x17aa, 0x104d), 2769*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2770*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2771*4882a593Smuzhiyun .type = QUIRK_SETUP_DISABLE_AUTOSUSPEND 2772*4882a593Smuzhiyun } 2773*4882a593Smuzhiyun }, 2774*4882a593Smuzhiyun 2775*4882a593Smuzhiyun /* Native Instruments MK2 series */ 2776*4882a593Smuzhiyun { 2777*4882a593Smuzhiyun /* Komplete Audio 6 */ 2778*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_DEVICE, 2779*4882a593Smuzhiyun .idVendor = 0x17cc, 2780*4882a593Smuzhiyun .idProduct = 0x1000, 2781*4882a593Smuzhiyun }, 2782*4882a593Smuzhiyun { 2783*4882a593Smuzhiyun /* Traktor Audio 6 */ 2784*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_DEVICE, 2785*4882a593Smuzhiyun .idVendor = 0x17cc, 2786*4882a593Smuzhiyun .idProduct = 0x1010, 2787*4882a593Smuzhiyun }, 2788*4882a593Smuzhiyun { 2789*4882a593Smuzhiyun /* Traktor Audio 10 */ 2790*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_DEVICE, 2791*4882a593Smuzhiyun .idVendor = 0x17cc, 2792*4882a593Smuzhiyun .idProduct = 0x1020, 2793*4882a593Smuzhiyun }, 2794*4882a593Smuzhiyun 2795*4882a593Smuzhiyun /* QinHeng devices */ 2796*4882a593Smuzhiyun { 2797*4882a593Smuzhiyun USB_DEVICE(0x1a86, 0x752d), 2798*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2799*4882a593Smuzhiyun .vendor_name = "QinHeng", 2800*4882a593Smuzhiyun .product_name = "CH345", 2801*4882a593Smuzhiyun .ifnum = 1, 2802*4882a593Smuzhiyun .type = QUIRK_MIDI_CH345 2803*4882a593Smuzhiyun } 2804*4882a593Smuzhiyun }, 2805*4882a593Smuzhiyun 2806*4882a593Smuzhiyun /* KeithMcMillen Stringport */ 2807*4882a593Smuzhiyun { USB_DEVICE(0x1f38, 0x0001) }, /* FIXME: should be more restrictive matching */ 2808*4882a593Smuzhiyun 2809*4882a593Smuzhiyun /* Miditech devices */ 2810*4882a593Smuzhiyun { 2811*4882a593Smuzhiyun USB_DEVICE(0x4752, 0x0011), 2812*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2813*4882a593Smuzhiyun .vendor_name = "Miditech", 2814*4882a593Smuzhiyun .product_name = "Midistart-2", 2815*4882a593Smuzhiyun .ifnum = 0, 2816*4882a593Smuzhiyun .type = QUIRK_MIDI_CME 2817*4882a593Smuzhiyun } 2818*4882a593Smuzhiyun }, 2819*4882a593Smuzhiyun 2820*4882a593Smuzhiyun /* Central Music devices */ 2821*4882a593Smuzhiyun { 2822*4882a593Smuzhiyun /* this ID used by both Miditech MidiStudio-2 and CME UF-x */ 2823*4882a593Smuzhiyun USB_DEVICE(0x7104, 0x2202), 2824*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 2825*4882a593Smuzhiyun .ifnum = 0, 2826*4882a593Smuzhiyun .type = QUIRK_MIDI_CME 2827*4882a593Smuzhiyun } 2828*4882a593Smuzhiyun }, 2829*4882a593Smuzhiyun 2830*4882a593Smuzhiyun /* 2831*4882a593Smuzhiyun * Auvitek au0828 devices with audio interface. 2832*4882a593Smuzhiyun * This should be kept in sync with drivers/media/usb/au0828/au0828-cards.c 2833*4882a593Smuzhiyun * Please notice that some drivers are DVB only, and don't need to be 2834*4882a593Smuzhiyun * here. That's the case, for example, of DVICO_FUSIONHDTV7. 2835*4882a593Smuzhiyun */ 2836*4882a593Smuzhiyun 2837*4882a593Smuzhiyun #define AU0828_DEVICE(vid, pid, vname, pname) { \ 2838*4882a593Smuzhiyun USB_AUDIO_DEVICE(vid, pid), \ 2839*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { \ 2840*4882a593Smuzhiyun .vendor_name = vname, \ 2841*4882a593Smuzhiyun .product_name = pname, \ 2842*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, \ 2843*4882a593Smuzhiyun .type = QUIRK_AUDIO_ALIGN_TRANSFER, \ 2844*4882a593Smuzhiyun .shares_media_device = 1, \ 2845*4882a593Smuzhiyun } \ 2846*4882a593Smuzhiyun } 2847*4882a593Smuzhiyun 2848*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7200, "Hauppauge", "HVR-950Q"), 2849*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7240, "Hauppauge", "HVR-850"), 2850*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7210, "Hauppauge", "HVR-950Q"), 2851*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7217, "Hauppauge", "HVR-950Q"), 2852*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x721b, "Hauppauge", "HVR-950Q"), 2853*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x721e, "Hauppauge", "HVR-950Q"), 2854*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x721f, "Hauppauge", "HVR-950Q"), 2855*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7280, "Hauppauge", "HVR-950Q"), 2856*4882a593Smuzhiyun AU0828_DEVICE(0x0fd9, 0x0008, "Hauppauge", "HVR-950Q"), 2857*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7201, "Hauppauge", "HVR-950Q-MXL"), 2858*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7211, "Hauppauge", "HVR-950Q-MXL"), 2859*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7281, "Hauppauge", "HVR-950Q-MXL"), 2860*4882a593Smuzhiyun AU0828_DEVICE(0x05e1, 0x0480, "Hauppauge", "Woodbury"), 2861*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x8200, "Hauppauge", "Woodbury"), 2862*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7260, "Hauppauge", "HVR-950Q"), 2863*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7213, "Hauppauge", "HVR-950Q"), 2864*4882a593Smuzhiyun AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), 2865*4882a593Smuzhiyun 2866*4882a593Smuzhiyun /* Syntek STK1160 */ 2867*4882a593Smuzhiyun { 2868*4882a593Smuzhiyun USB_AUDIO_DEVICE(0x05e1, 0x0408), 2869*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2870*4882a593Smuzhiyun .vendor_name = "Syntek", 2871*4882a593Smuzhiyun .product_name = "STK1160", 2872*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2873*4882a593Smuzhiyun .type = QUIRK_AUDIO_ALIGN_TRANSFER 2874*4882a593Smuzhiyun } 2875*4882a593Smuzhiyun }, 2876*4882a593Smuzhiyun 2877*4882a593Smuzhiyun /* Digidesign Mbox */ 2878*4882a593Smuzhiyun { 2879*4882a593Smuzhiyun /* Thanks to Clemens Ladisch <clemens@ladisch.de> */ 2880*4882a593Smuzhiyun USB_DEVICE(0x0dba, 0x1000), 2881*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2882*4882a593Smuzhiyun .vendor_name = "Digidesign", 2883*4882a593Smuzhiyun .product_name = "MBox", 2884*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2885*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2886*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]){ 2887*4882a593Smuzhiyun { 2888*4882a593Smuzhiyun .ifnum = 0, 2889*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 2890*4882a593Smuzhiyun }, 2891*4882a593Smuzhiyun { 2892*4882a593Smuzhiyun .ifnum = 1, 2893*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2894*4882a593Smuzhiyun .data = &(const struct audioformat) { 2895*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3BE, 2896*4882a593Smuzhiyun .channels = 2, 2897*4882a593Smuzhiyun .iface = 1, 2898*4882a593Smuzhiyun .altsetting = 1, 2899*4882a593Smuzhiyun .altset_idx = 1, 2900*4882a593Smuzhiyun .attributes = 0x4, 2901*4882a593Smuzhiyun .endpoint = 0x02, 2902*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC | 2903*4882a593Smuzhiyun USB_ENDPOINT_SYNC_SYNC, 2904*4882a593Smuzhiyun .maxpacksize = 0x130, 2905*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 2906*4882a593Smuzhiyun .rate_min = 48000, 2907*4882a593Smuzhiyun .rate_max = 48000, 2908*4882a593Smuzhiyun .nr_rates = 1, 2909*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2910*4882a593Smuzhiyun 48000 2911*4882a593Smuzhiyun } 2912*4882a593Smuzhiyun } 2913*4882a593Smuzhiyun }, 2914*4882a593Smuzhiyun { 2915*4882a593Smuzhiyun .ifnum = 1, 2916*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2917*4882a593Smuzhiyun .data = &(const struct audioformat) { 2918*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3BE, 2919*4882a593Smuzhiyun .channels = 2, 2920*4882a593Smuzhiyun .iface = 1, 2921*4882a593Smuzhiyun .altsetting = 1, 2922*4882a593Smuzhiyun .altset_idx = 1, 2923*4882a593Smuzhiyun .attributes = 0x4, 2924*4882a593Smuzhiyun .endpoint = 0x81, 2925*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC | 2926*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 2927*4882a593Smuzhiyun .maxpacksize = 0x130, 2928*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 2929*4882a593Smuzhiyun .rate_min = 48000, 2930*4882a593Smuzhiyun .rate_max = 48000, 2931*4882a593Smuzhiyun .nr_rates = 1, 2932*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2933*4882a593Smuzhiyun 48000 2934*4882a593Smuzhiyun } 2935*4882a593Smuzhiyun } 2936*4882a593Smuzhiyun }, 2937*4882a593Smuzhiyun { 2938*4882a593Smuzhiyun .ifnum = -1 2939*4882a593Smuzhiyun } 2940*4882a593Smuzhiyun } 2941*4882a593Smuzhiyun } 2942*4882a593Smuzhiyun }, 2943*4882a593Smuzhiyun 2944*4882a593Smuzhiyun /* DIGIDESIGN MBOX 2 */ 2945*4882a593Smuzhiyun { 2946*4882a593Smuzhiyun USB_DEVICE(0x0dba, 0x3000), 2947*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 2948*4882a593Smuzhiyun .vendor_name = "Digidesign", 2949*4882a593Smuzhiyun .product_name = "Mbox 2", 2950*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 2951*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 2952*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 2953*4882a593Smuzhiyun { 2954*4882a593Smuzhiyun .ifnum = 0, 2955*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 2956*4882a593Smuzhiyun }, 2957*4882a593Smuzhiyun { 2958*4882a593Smuzhiyun .ifnum = 1, 2959*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 2960*4882a593Smuzhiyun }, 2961*4882a593Smuzhiyun { 2962*4882a593Smuzhiyun .ifnum = 2, 2963*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2964*4882a593Smuzhiyun .data = &(const struct audioformat) { 2965*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3BE, 2966*4882a593Smuzhiyun .channels = 2, 2967*4882a593Smuzhiyun .iface = 2, 2968*4882a593Smuzhiyun .altsetting = 2, 2969*4882a593Smuzhiyun .altset_idx = 1, 2970*4882a593Smuzhiyun .attributes = 0x00, 2971*4882a593Smuzhiyun .endpoint = 0x03, 2972*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_SYNC_ASYNC, 2973*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 2974*4882a593Smuzhiyun .rate_min = 48000, 2975*4882a593Smuzhiyun .rate_max = 48000, 2976*4882a593Smuzhiyun .nr_rates = 1, 2977*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 2978*4882a593Smuzhiyun 48000 2979*4882a593Smuzhiyun } 2980*4882a593Smuzhiyun } 2981*4882a593Smuzhiyun }, 2982*4882a593Smuzhiyun { 2983*4882a593Smuzhiyun .ifnum = 3, 2984*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 2985*4882a593Smuzhiyun }, 2986*4882a593Smuzhiyun { 2987*4882a593Smuzhiyun .ifnum = 4, 2988*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 2989*4882a593Smuzhiyun .data = &(const struct audioformat) { 2990*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3BE, 2991*4882a593Smuzhiyun .channels = 2, 2992*4882a593Smuzhiyun .iface = 4, 2993*4882a593Smuzhiyun .altsetting = 2, 2994*4882a593Smuzhiyun .altset_idx = 1, 2995*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 2996*4882a593Smuzhiyun .endpoint = 0x85, 2997*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_SYNC_SYNC, 2998*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 2999*4882a593Smuzhiyun .rate_min = 48000, 3000*4882a593Smuzhiyun .rate_max = 48000, 3001*4882a593Smuzhiyun .nr_rates = 1, 3002*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3003*4882a593Smuzhiyun 48000 3004*4882a593Smuzhiyun } 3005*4882a593Smuzhiyun } 3006*4882a593Smuzhiyun }, 3007*4882a593Smuzhiyun { 3008*4882a593Smuzhiyun .ifnum = 5, 3009*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 3010*4882a593Smuzhiyun }, 3011*4882a593Smuzhiyun { 3012*4882a593Smuzhiyun .ifnum = 6, 3013*4882a593Smuzhiyun .type = QUIRK_MIDI_MIDIMAN, 3014*4882a593Smuzhiyun .data = &(const struct snd_usb_midi_endpoint_info) { 3015*4882a593Smuzhiyun .out_ep = 0x02, 3016*4882a593Smuzhiyun .out_cables = 0x0001, 3017*4882a593Smuzhiyun .in_ep = 0x81, 3018*4882a593Smuzhiyun .in_interval = 0x01, 3019*4882a593Smuzhiyun .in_cables = 0x0001 3020*4882a593Smuzhiyun } 3021*4882a593Smuzhiyun }, 3022*4882a593Smuzhiyun { 3023*4882a593Smuzhiyun .ifnum = -1 3024*4882a593Smuzhiyun } 3025*4882a593Smuzhiyun } 3026*4882a593Smuzhiyun } 3027*4882a593Smuzhiyun }, 3028*4882a593Smuzhiyun { 3029*4882a593Smuzhiyun /* Tascam US122 MKII - playback-only support */ 3030*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x0644, 0x8021), 3031*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3032*4882a593Smuzhiyun .vendor_name = "TASCAM", 3033*4882a593Smuzhiyun .product_name = "US122 MKII", 3034*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3035*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3036*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3037*4882a593Smuzhiyun { 3038*4882a593Smuzhiyun .ifnum = 0, 3039*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE 3040*4882a593Smuzhiyun }, 3041*4882a593Smuzhiyun { 3042*4882a593Smuzhiyun .ifnum = 1, 3043*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3044*4882a593Smuzhiyun .data = &(const struct audioformat) { 3045*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3046*4882a593Smuzhiyun .channels = 2, 3047*4882a593Smuzhiyun .iface = 1, 3048*4882a593Smuzhiyun .altsetting = 1, 3049*4882a593Smuzhiyun .altset_idx = 1, 3050*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 3051*4882a593Smuzhiyun .endpoint = 0x02, 3052*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 3053*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 3054*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 | 3055*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 | 3056*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 3057*4882a593Smuzhiyun .rate_min = 44100, 3058*4882a593Smuzhiyun .rate_max = 96000, 3059*4882a593Smuzhiyun .nr_rates = 4, 3060*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3061*4882a593Smuzhiyun 44100, 48000, 88200, 96000 3062*4882a593Smuzhiyun } 3063*4882a593Smuzhiyun } 3064*4882a593Smuzhiyun }, 3065*4882a593Smuzhiyun { 3066*4882a593Smuzhiyun .ifnum = -1 3067*4882a593Smuzhiyun } 3068*4882a593Smuzhiyun } 3069*4882a593Smuzhiyun } 3070*4882a593Smuzhiyun }, 3071*4882a593Smuzhiyun 3072*4882a593Smuzhiyun /* Microsoft XboxLive Headset/Xbox Communicator */ 3073*4882a593Smuzhiyun { 3074*4882a593Smuzhiyun USB_DEVICE(0x045e, 0x0283), 3075*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_PER_INTERFACE, 3076*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3077*4882a593Smuzhiyun .vendor_name = "Microsoft", 3078*4882a593Smuzhiyun .product_name = "XboxLive Headset/Xbox Communicator", 3079*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3080*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3081*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 3082*4882a593Smuzhiyun { 3083*4882a593Smuzhiyun /* playback */ 3084*4882a593Smuzhiyun .ifnum = 0, 3085*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3086*4882a593Smuzhiyun .data = &(const struct audioformat) { 3087*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 3088*4882a593Smuzhiyun .channels = 1, 3089*4882a593Smuzhiyun .iface = 0, 3090*4882a593Smuzhiyun .altsetting = 0, 3091*4882a593Smuzhiyun .altset_idx = 0, 3092*4882a593Smuzhiyun .attributes = 0, 3093*4882a593Smuzhiyun .endpoint = 0x04, 3094*4882a593Smuzhiyun .ep_attr = 0x05, 3095*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 3096*4882a593Smuzhiyun .rate_min = 22050, 3097*4882a593Smuzhiyun .rate_max = 22050 3098*4882a593Smuzhiyun } 3099*4882a593Smuzhiyun }, 3100*4882a593Smuzhiyun { 3101*4882a593Smuzhiyun /* capture */ 3102*4882a593Smuzhiyun .ifnum = 1, 3103*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3104*4882a593Smuzhiyun .data = &(const struct audioformat) { 3105*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 3106*4882a593Smuzhiyun .channels = 1, 3107*4882a593Smuzhiyun .iface = 1, 3108*4882a593Smuzhiyun .altsetting = 0, 3109*4882a593Smuzhiyun .altset_idx = 0, 3110*4882a593Smuzhiyun .attributes = 0, 3111*4882a593Smuzhiyun .endpoint = 0x85, 3112*4882a593Smuzhiyun .ep_attr = 0x05, 3113*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 3114*4882a593Smuzhiyun .rate_min = 16000, 3115*4882a593Smuzhiyun .rate_max = 16000 3116*4882a593Smuzhiyun } 3117*4882a593Smuzhiyun }, 3118*4882a593Smuzhiyun { 3119*4882a593Smuzhiyun .ifnum = -1 3120*4882a593Smuzhiyun } 3121*4882a593Smuzhiyun } 3122*4882a593Smuzhiyun } 3123*4882a593Smuzhiyun }, 3124*4882a593Smuzhiyun 3125*4882a593Smuzhiyun /* Reloop Play */ 3126*4882a593Smuzhiyun { 3127*4882a593Smuzhiyun USB_DEVICE(0x200c, 0x100b), 3128*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_PER_INTERFACE, 3129*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3130*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3131*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3132*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 3133*4882a593Smuzhiyun { 3134*4882a593Smuzhiyun .ifnum = 0, 3135*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 3136*4882a593Smuzhiyun }, 3137*4882a593Smuzhiyun { 3138*4882a593Smuzhiyun .ifnum = 1, 3139*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3140*4882a593Smuzhiyun .data = &(const struct audioformat) { 3141*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3142*4882a593Smuzhiyun .channels = 4, 3143*4882a593Smuzhiyun .iface = 1, 3144*4882a593Smuzhiyun .altsetting = 1, 3145*4882a593Smuzhiyun .altset_idx = 1, 3146*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 3147*4882a593Smuzhiyun .endpoint = 0x01, 3148*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_SYNC_ADAPTIVE, 3149*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100 | 3150*4882a593Smuzhiyun SNDRV_PCM_RATE_48000, 3151*4882a593Smuzhiyun .rate_min = 44100, 3152*4882a593Smuzhiyun .rate_max = 48000, 3153*4882a593Smuzhiyun .nr_rates = 2, 3154*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3155*4882a593Smuzhiyun 44100, 48000 3156*4882a593Smuzhiyun } 3157*4882a593Smuzhiyun } 3158*4882a593Smuzhiyun }, 3159*4882a593Smuzhiyun { 3160*4882a593Smuzhiyun .ifnum = -1 3161*4882a593Smuzhiyun } 3162*4882a593Smuzhiyun } 3163*4882a593Smuzhiyun } 3164*4882a593Smuzhiyun }, 3165*4882a593Smuzhiyun 3166*4882a593Smuzhiyun { 3167*4882a593Smuzhiyun /* 3168*4882a593Smuzhiyun * ZOOM R16/24 in audio interface mode. 3169*4882a593Smuzhiyun * Playback requires an extra four byte LE length indicator 3170*4882a593Smuzhiyun * at the start of each isochronous packet. This quirk is 3171*4882a593Smuzhiyun * enabled in create_standard_audio_quirk(). 3172*4882a593Smuzhiyun */ 3173*4882a593Smuzhiyun USB_DEVICE(0x1686, 0x00dd), 3174*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 3175*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3176*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3177*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3178*4882a593Smuzhiyun { 3179*4882a593Smuzhiyun /* Playback */ 3180*4882a593Smuzhiyun .ifnum = 1, 3181*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE, 3182*4882a593Smuzhiyun }, 3183*4882a593Smuzhiyun { 3184*4882a593Smuzhiyun /* Capture */ 3185*4882a593Smuzhiyun .ifnum = 2, 3186*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE, 3187*4882a593Smuzhiyun }, 3188*4882a593Smuzhiyun { 3189*4882a593Smuzhiyun /* Midi */ 3190*4882a593Smuzhiyun .ifnum = 3, 3191*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 3192*4882a593Smuzhiyun }, 3193*4882a593Smuzhiyun { 3194*4882a593Smuzhiyun .ifnum = -1 3195*4882a593Smuzhiyun }, 3196*4882a593Smuzhiyun } 3197*4882a593Smuzhiyun } 3198*4882a593Smuzhiyun }, 3199*4882a593Smuzhiyun 3200*4882a593Smuzhiyun { 3201*4882a593Smuzhiyun /* 3202*4882a593Smuzhiyun * Some USB MIDI devices don't have an audio control interface, 3203*4882a593Smuzhiyun * so we have to grab MIDI streaming interfaces here. 3204*4882a593Smuzhiyun */ 3205*4882a593Smuzhiyun .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS | 3206*4882a593Smuzhiyun USB_DEVICE_ID_MATCH_INT_SUBCLASS, 3207*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_AUDIO, 3208*4882a593Smuzhiyun .bInterfaceSubClass = USB_SUBCLASS_MIDISTREAMING, 3209*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 3210*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3211*4882a593Smuzhiyun .type = QUIRK_MIDI_STANDARD_INTERFACE 3212*4882a593Smuzhiyun } 3213*4882a593Smuzhiyun }, 3214*4882a593Smuzhiyun 3215*4882a593Smuzhiyun /* Rane SL-1 */ 3216*4882a593Smuzhiyun { 3217*4882a593Smuzhiyun USB_DEVICE(0x13e5, 0x0001), 3218*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 3219*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3220*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 3221*4882a593Smuzhiyun } 3222*4882a593Smuzhiyun }, 3223*4882a593Smuzhiyun 3224*4882a593Smuzhiyun /* disabled due to regression for other devices; 3225*4882a593Smuzhiyun * see https://bugzilla.kernel.org/show_bug.cgi?id=199905 3226*4882a593Smuzhiyun */ 3227*4882a593Smuzhiyun #if 0 3228*4882a593Smuzhiyun { 3229*4882a593Smuzhiyun /* 3230*4882a593Smuzhiyun * Nura's first gen headphones use Cambridge Silicon Radio's vendor 3231*4882a593Smuzhiyun * ID, but it looks like the product ID actually is only for Nura. 3232*4882a593Smuzhiyun * The capture interface does not work at all (even on Windows), 3233*4882a593Smuzhiyun * and only the 48 kHz sample rate works for the playback interface. 3234*4882a593Smuzhiyun */ 3235*4882a593Smuzhiyun USB_DEVICE(0x0a12, 0x1243), 3236*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3237*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3238*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3239*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3240*4882a593Smuzhiyun { 3241*4882a593Smuzhiyun .ifnum = 0, 3242*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 3243*4882a593Smuzhiyun }, 3244*4882a593Smuzhiyun /* Capture */ 3245*4882a593Smuzhiyun { 3246*4882a593Smuzhiyun .ifnum = 1, 3247*4882a593Smuzhiyun .type = QUIRK_IGNORE_INTERFACE, 3248*4882a593Smuzhiyun }, 3249*4882a593Smuzhiyun /* Playback */ 3250*4882a593Smuzhiyun { 3251*4882a593Smuzhiyun .ifnum = 2, 3252*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3253*4882a593Smuzhiyun .data = &(const struct audioformat) { 3254*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 3255*4882a593Smuzhiyun .channels = 2, 3256*4882a593Smuzhiyun .iface = 2, 3257*4882a593Smuzhiyun .altsetting = 1, 3258*4882a593Smuzhiyun .altset_idx = 1, 3259*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_FILL_MAX | 3260*4882a593Smuzhiyun UAC_EP_CS_ATTR_SAMPLE_RATE, 3261*4882a593Smuzhiyun .endpoint = 0x03, 3262*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 3263*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 3264*4882a593Smuzhiyun .rate_min = 48000, 3265*4882a593Smuzhiyun .rate_max = 48000, 3266*4882a593Smuzhiyun .nr_rates = 1, 3267*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3268*4882a593Smuzhiyun 48000 3269*4882a593Smuzhiyun } 3270*4882a593Smuzhiyun } 3271*4882a593Smuzhiyun }, 3272*4882a593Smuzhiyun { 3273*4882a593Smuzhiyun .ifnum = -1 3274*4882a593Smuzhiyun }, 3275*4882a593Smuzhiyun } 3276*4882a593Smuzhiyun } 3277*4882a593Smuzhiyun }, 3278*4882a593Smuzhiyun #endif /* disabled */ 3279*4882a593Smuzhiyun 3280*4882a593Smuzhiyun { 3281*4882a593Smuzhiyun /* 3282*4882a593Smuzhiyun * Bower's & Wilkins PX headphones only support the 48 kHz sample rate 3283*4882a593Smuzhiyun * even though it advertises more. The capture interface doesn't work 3284*4882a593Smuzhiyun * even on windows. 3285*4882a593Smuzhiyun */ 3286*4882a593Smuzhiyun USB_DEVICE(0x19b5, 0x0021), 3287*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3288*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3289*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3290*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3291*4882a593Smuzhiyun { 3292*4882a593Smuzhiyun .ifnum = 0, 3293*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 3294*4882a593Smuzhiyun }, 3295*4882a593Smuzhiyun /* Playback */ 3296*4882a593Smuzhiyun { 3297*4882a593Smuzhiyun .ifnum = 1, 3298*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3299*4882a593Smuzhiyun .data = &(const struct audioformat) { 3300*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 3301*4882a593Smuzhiyun .channels = 2, 3302*4882a593Smuzhiyun .iface = 1, 3303*4882a593Smuzhiyun .altsetting = 1, 3304*4882a593Smuzhiyun .altset_idx = 1, 3305*4882a593Smuzhiyun .attributes = UAC_EP_CS_ATTR_FILL_MAX | 3306*4882a593Smuzhiyun UAC_EP_CS_ATTR_SAMPLE_RATE, 3307*4882a593Smuzhiyun .endpoint = 0x03, 3308*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC, 3309*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 3310*4882a593Smuzhiyun .rate_min = 48000, 3311*4882a593Smuzhiyun .rate_max = 48000, 3312*4882a593Smuzhiyun .nr_rates = 1, 3313*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3314*4882a593Smuzhiyun 48000 3315*4882a593Smuzhiyun } 3316*4882a593Smuzhiyun } 3317*4882a593Smuzhiyun }, 3318*4882a593Smuzhiyun { 3319*4882a593Smuzhiyun .ifnum = -1 3320*4882a593Smuzhiyun }, 3321*4882a593Smuzhiyun } 3322*4882a593Smuzhiyun } 3323*4882a593Smuzhiyun }, 3324*4882a593Smuzhiyun /* Dell WD19 Dock */ 3325*4882a593Smuzhiyun { 3326*4882a593Smuzhiyun USB_DEVICE(0x0bda, 0x402e), 3327*4882a593Smuzhiyun .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 3328*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3329*4882a593Smuzhiyun .type = QUIRK_SETUP_FMT_AFTER_RESUME 3330*4882a593Smuzhiyun } 3331*4882a593Smuzhiyun }, 3332*4882a593Smuzhiyun /* MOTU Microbook II */ 3333*4882a593Smuzhiyun { 3334*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x07fd, 0x0004), 3335*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3336*4882a593Smuzhiyun .vendor_name = "MOTU", 3337*4882a593Smuzhiyun .product_name = "MicroBookII", 3338*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3339*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3340*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3341*4882a593Smuzhiyun { 3342*4882a593Smuzhiyun .ifnum = 0, 3343*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 3344*4882a593Smuzhiyun }, 3345*4882a593Smuzhiyun { 3346*4882a593Smuzhiyun .ifnum = 0, 3347*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3348*4882a593Smuzhiyun .data = &(const struct audioformat) { 3349*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3BE, 3350*4882a593Smuzhiyun .channels = 6, 3351*4882a593Smuzhiyun .iface = 0, 3352*4882a593Smuzhiyun .altsetting = 1, 3353*4882a593Smuzhiyun .altset_idx = 1, 3354*4882a593Smuzhiyun .attributes = 0, 3355*4882a593Smuzhiyun .endpoint = 0x84, 3356*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_96000, 3357*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC | 3358*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3359*4882a593Smuzhiyun .rate_min = 96000, 3360*4882a593Smuzhiyun .rate_max = 96000, 3361*4882a593Smuzhiyun .nr_rates = 1, 3362*4882a593Smuzhiyun .maxpacksize = 0x00d8, 3363*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3364*4882a593Smuzhiyun 96000 3365*4882a593Smuzhiyun } 3366*4882a593Smuzhiyun } 3367*4882a593Smuzhiyun }, 3368*4882a593Smuzhiyun { 3369*4882a593Smuzhiyun .ifnum = 0, 3370*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3371*4882a593Smuzhiyun .data = &(const struct audioformat) { 3372*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3BE, 3373*4882a593Smuzhiyun .channels = 8, 3374*4882a593Smuzhiyun .iface = 0, 3375*4882a593Smuzhiyun .altsetting = 1, 3376*4882a593Smuzhiyun .altset_idx = 1, 3377*4882a593Smuzhiyun .attributes = 0, 3378*4882a593Smuzhiyun .endpoint = 0x03, 3379*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_96000, 3380*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC | 3381*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3382*4882a593Smuzhiyun .rate_min = 96000, 3383*4882a593Smuzhiyun .rate_max = 96000, 3384*4882a593Smuzhiyun .nr_rates = 1, 3385*4882a593Smuzhiyun .maxpacksize = 0x0120, 3386*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3387*4882a593Smuzhiyun 96000 3388*4882a593Smuzhiyun } 3389*4882a593Smuzhiyun } 3390*4882a593Smuzhiyun }, 3391*4882a593Smuzhiyun { 3392*4882a593Smuzhiyun .ifnum = -1 3393*4882a593Smuzhiyun } 3394*4882a593Smuzhiyun } 3395*4882a593Smuzhiyun } 3396*4882a593Smuzhiyun }, 3397*4882a593Smuzhiyun { 3398*4882a593Smuzhiyun /* 3399*4882a593Smuzhiyun * PIONEER DJ DDJ-SX3 3400*4882a593Smuzhiyun * PCM is 12 channels out, 10 channels in @ 44.1 fixed 3401*4882a593Smuzhiyun * interface 0, vendor class alt setting 1 for endpoints 5 and 0x86 3402*4882a593Smuzhiyun * The feedback for the output is the input. 3403*4882a593Smuzhiyun */ 3404*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0023), 3405*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3406*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3407*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3408*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3409*4882a593Smuzhiyun { 3410*4882a593Smuzhiyun .ifnum = 0, 3411*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3412*4882a593Smuzhiyun .data = &(const struct audioformat) { 3413*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S32_LE, 3414*4882a593Smuzhiyun .channels = 12, 3415*4882a593Smuzhiyun .iface = 0, 3416*4882a593Smuzhiyun .altsetting = 1, 3417*4882a593Smuzhiyun .altset_idx = 1, 3418*4882a593Smuzhiyun .endpoint = 0x05, 3419*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3420*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3421*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 3422*4882a593Smuzhiyun .rate_min = 44100, 3423*4882a593Smuzhiyun .rate_max = 44100, 3424*4882a593Smuzhiyun .nr_rates = 1, 3425*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 3426*4882a593Smuzhiyun } 3427*4882a593Smuzhiyun }, 3428*4882a593Smuzhiyun { 3429*4882a593Smuzhiyun .ifnum = 0, 3430*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3431*4882a593Smuzhiyun .data = &(const struct audioformat) { 3432*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S32_LE, 3433*4882a593Smuzhiyun .channels = 10, 3434*4882a593Smuzhiyun .iface = 0, 3435*4882a593Smuzhiyun .altsetting = 1, 3436*4882a593Smuzhiyun .altset_idx = 1, 3437*4882a593Smuzhiyun .endpoint = 0x86, 3438*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3439*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC| 3440*4882a593Smuzhiyun USB_ENDPOINT_USAGE_IMPLICIT_FB, 3441*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 3442*4882a593Smuzhiyun .rate_min = 44100, 3443*4882a593Smuzhiyun .rate_max = 44100, 3444*4882a593Smuzhiyun .nr_rates = 1, 3445*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 3446*4882a593Smuzhiyun } 3447*4882a593Smuzhiyun }, 3448*4882a593Smuzhiyun { 3449*4882a593Smuzhiyun .ifnum = -1 3450*4882a593Smuzhiyun } 3451*4882a593Smuzhiyun } 3452*4882a593Smuzhiyun } 3453*4882a593Smuzhiyun }, 3454*4882a593Smuzhiyun { 3455*4882a593Smuzhiyun /* 3456*4882a593Smuzhiyun * Pioneer DJ DJM-250MK2 3457*4882a593Smuzhiyun * PCM is 8 channels out @ 48 fixed (endpoint 0x01) 3458*4882a593Smuzhiyun * and 8 channels in @ 48 fixed (endpoint 0x82). 3459*4882a593Smuzhiyun * 3460*4882a593Smuzhiyun * Both playback and recording is working, even simultaneously. 3461*4882a593Smuzhiyun * 3462*4882a593Smuzhiyun * Playback channels could be mapped to: 3463*4882a593Smuzhiyun * - CH1 3464*4882a593Smuzhiyun * - CH2 3465*4882a593Smuzhiyun * - AUX 3466*4882a593Smuzhiyun * 3467*4882a593Smuzhiyun * Recording channels could be mapped to: 3468*4882a593Smuzhiyun * - Post CH1 Fader 3469*4882a593Smuzhiyun * - Post CH2 Fader 3470*4882a593Smuzhiyun * - Cross Fader A 3471*4882a593Smuzhiyun * - Cross Fader B 3472*4882a593Smuzhiyun * - MIC 3473*4882a593Smuzhiyun * - AUX 3474*4882a593Smuzhiyun * - REC OUT 3475*4882a593Smuzhiyun * 3476*4882a593Smuzhiyun * There is remaining problem with recording directly from PHONO/LINE. 3477*4882a593Smuzhiyun * If we map a channel to: 3478*4882a593Smuzhiyun * - CH1 Control Tone PHONO 3479*4882a593Smuzhiyun * - CH1 Control Tone LINE 3480*4882a593Smuzhiyun * - CH2 Control Tone PHONO 3481*4882a593Smuzhiyun * - CH2 Control Tone LINE 3482*4882a593Smuzhiyun * it is silent. 3483*4882a593Smuzhiyun * There is no signal even on other operating systems with official drivers. 3484*4882a593Smuzhiyun * The signal appears only when a supported application is started. 3485*4882a593Smuzhiyun * This needs to be investigated yet... 3486*4882a593Smuzhiyun * (there is quite a lot communication on the USB in both directions) 3487*4882a593Smuzhiyun * 3488*4882a593Smuzhiyun * In current version this mixer could be used for playback 3489*4882a593Smuzhiyun * and for recording from vinyls (through Post CH* Fader) 3490*4882a593Smuzhiyun * but not for DVS (Digital Vinyl Systems) like in Mixxx. 3491*4882a593Smuzhiyun */ 3492*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0017), 3493*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3494*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3495*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3496*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3497*4882a593Smuzhiyun { 3498*4882a593Smuzhiyun .ifnum = 0, 3499*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3500*4882a593Smuzhiyun .data = &(const struct audioformat) { 3501*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3502*4882a593Smuzhiyun .channels = 8, // outputs 3503*4882a593Smuzhiyun .iface = 0, 3504*4882a593Smuzhiyun .altsetting = 1, 3505*4882a593Smuzhiyun .altset_idx = 1, 3506*4882a593Smuzhiyun .endpoint = 0x01, 3507*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3508*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3509*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 3510*4882a593Smuzhiyun .rate_min = 48000, 3511*4882a593Smuzhiyun .rate_max = 48000, 3512*4882a593Smuzhiyun .nr_rates = 1, 3513*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 48000 } 3514*4882a593Smuzhiyun } 3515*4882a593Smuzhiyun }, 3516*4882a593Smuzhiyun { 3517*4882a593Smuzhiyun .ifnum = 0, 3518*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3519*4882a593Smuzhiyun .data = &(const struct audioformat) { 3520*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3521*4882a593Smuzhiyun .channels = 8, // inputs 3522*4882a593Smuzhiyun .iface = 0, 3523*4882a593Smuzhiyun .altsetting = 1, 3524*4882a593Smuzhiyun .altset_idx = 1, 3525*4882a593Smuzhiyun .endpoint = 0x82, 3526*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3527*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC| 3528*4882a593Smuzhiyun USB_ENDPOINT_USAGE_IMPLICIT_FB, 3529*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_48000, 3530*4882a593Smuzhiyun .rate_min = 48000, 3531*4882a593Smuzhiyun .rate_max = 48000, 3532*4882a593Smuzhiyun .nr_rates = 1, 3533*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 48000 } 3534*4882a593Smuzhiyun } 3535*4882a593Smuzhiyun }, 3536*4882a593Smuzhiyun { 3537*4882a593Smuzhiyun .ifnum = -1 3538*4882a593Smuzhiyun } 3539*4882a593Smuzhiyun } 3540*4882a593Smuzhiyun } 3541*4882a593Smuzhiyun }, 3542*4882a593Smuzhiyun { 3543*4882a593Smuzhiyun /* 3544*4882a593Smuzhiyun * PIONEER DJ DDJ-RB 3545*4882a593Smuzhiyun * PCM is 4 channels out, 2 dummy channels in @ 44.1 fixed 3546*4882a593Smuzhiyun * The feedback for the output is the dummy input. 3547*4882a593Smuzhiyun */ 3548*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x2b73, 0x000e), 3549*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3550*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3551*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3552*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3553*4882a593Smuzhiyun { 3554*4882a593Smuzhiyun .ifnum = 0, 3555*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3556*4882a593Smuzhiyun .data = &(const struct audioformat) { 3557*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3558*4882a593Smuzhiyun .channels = 4, 3559*4882a593Smuzhiyun .iface = 0, 3560*4882a593Smuzhiyun .altsetting = 1, 3561*4882a593Smuzhiyun .altset_idx = 1, 3562*4882a593Smuzhiyun .endpoint = 0x01, 3563*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3564*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3565*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 3566*4882a593Smuzhiyun .rate_min = 44100, 3567*4882a593Smuzhiyun .rate_max = 44100, 3568*4882a593Smuzhiyun .nr_rates = 1, 3569*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 3570*4882a593Smuzhiyun } 3571*4882a593Smuzhiyun }, 3572*4882a593Smuzhiyun { 3573*4882a593Smuzhiyun .ifnum = 0, 3574*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3575*4882a593Smuzhiyun .data = &(const struct audioformat) { 3576*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3577*4882a593Smuzhiyun .channels = 2, 3578*4882a593Smuzhiyun .iface = 0, 3579*4882a593Smuzhiyun .altsetting = 1, 3580*4882a593Smuzhiyun .altset_idx = 1, 3581*4882a593Smuzhiyun .endpoint = 0x82, 3582*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3583*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC| 3584*4882a593Smuzhiyun USB_ENDPOINT_USAGE_IMPLICIT_FB, 3585*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100, 3586*4882a593Smuzhiyun .rate_min = 44100, 3587*4882a593Smuzhiyun .rate_max = 44100, 3588*4882a593Smuzhiyun .nr_rates = 1, 3589*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 44100 } 3590*4882a593Smuzhiyun } 3591*4882a593Smuzhiyun }, 3592*4882a593Smuzhiyun { 3593*4882a593Smuzhiyun .ifnum = -1 3594*4882a593Smuzhiyun } 3595*4882a593Smuzhiyun } 3596*4882a593Smuzhiyun } 3597*4882a593Smuzhiyun }, 3598*4882a593Smuzhiyun 3599*4882a593Smuzhiyun { 3600*4882a593Smuzhiyun /* 3601*4882a593Smuzhiyun * Pioneer DJ DJM-900NXS2 3602*4882a593Smuzhiyun * 10 channels playback & 12 channels capture @ 44.1/48/96kHz S24LE 3603*4882a593Smuzhiyun */ 3604*4882a593Smuzhiyun USB_DEVICE_VENDOR_SPEC(0x2b73, 0x000a), 3605*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3606*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3607*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3608*4882a593Smuzhiyun .data = (const struct snd_usb_audio_quirk[]) { 3609*4882a593Smuzhiyun { 3610*4882a593Smuzhiyun .ifnum = 0, 3611*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3612*4882a593Smuzhiyun .data = &(const struct audioformat) { 3613*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3614*4882a593Smuzhiyun .channels = 10, 3615*4882a593Smuzhiyun .iface = 0, 3616*4882a593Smuzhiyun .altsetting = 1, 3617*4882a593Smuzhiyun .altset_idx = 1, 3618*4882a593Smuzhiyun .endpoint = 0x01, 3619*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3620*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3621*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100| 3622*4882a593Smuzhiyun SNDRV_PCM_RATE_48000| 3623*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 3624*4882a593Smuzhiyun .rate_min = 44100, 3625*4882a593Smuzhiyun .rate_max = 96000, 3626*4882a593Smuzhiyun .nr_rates = 3, 3627*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3628*4882a593Smuzhiyun 44100, 48000, 96000 3629*4882a593Smuzhiyun } 3630*4882a593Smuzhiyun } 3631*4882a593Smuzhiyun }, 3632*4882a593Smuzhiyun { 3633*4882a593Smuzhiyun .ifnum = 0, 3634*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3635*4882a593Smuzhiyun .data = &(const struct audioformat) { 3636*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3637*4882a593Smuzhiyun .channels = 12, 3638*4882a593Smuzhiyun .iface = 0, 3639*4882a593Smuzhiyun .altsetting = 1, 3640*4882a593Smuzhiyun .altset_idx = 1, 3641*4882a593Smuzhiyun .endpoint = 0x82, 3642*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC| 3643*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC| 3644*4882a593Smuzhiyun USB_ENDPOINT_USAGE_IMPLICIT_FB, 3645*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_44100| 3646*4882a593Smuzhiyun SNDRV_PCM_RATE_48000| 3647*4882a593Smuzhiyun SNDRV_PCM_RATE_96000, 3648*4882a593Smuzhiyun .rate_min = 44100, 3649*4882a593Smuzhiyun .rate_max = 96000, 3650*4882a593Smuzhiyun .nr_rates = 3, 3651*4882a593Smuzhiyun .rate_table = (unsigned int[]) { 3652*4882a593Smuzhiyun 44100, 48000, 96000 3653*4882a593Smuzhiyun } 3654*4882a593Smuzhiyun } 3655*4882a593Smuzhiyun }, 3656*4882a593Smuzhiyun { 3657*4882a593Smuzhiyun .ifnum = -1 3658*4882a593Smuzhiyun } 3659*4882a593Smuzhiyun } 3660*4882a593Smuzhiyun } 3661*4882a593Smuzhiyun }, 3662*4882a593Smuzhiyun 3663*4882a593Smuzhiyun /* 3664*4882a593Smuzhiyun * MacroSilicon MS2100/MS2106 based AV capture cards 3665*4882a593Smuzhiyun * 3666*4882a593Smuzhiyun * These claim 96kHz 1ch in the descriptors, but are actually 48kHz 2ch. 3667*4882a593Smuzhiyun * They also need QUIRK_AUDIO_ALIGN_TRANSFER, which makes one wonder if 3668*4882a593Smuzhiyun * they pretend to be 96kHz mono as a workaround for stereo being broken 3669*4882a593Smuzhiyun * by that... 3670*4882a593Smuzhiyun * 3671*4882a593Smuzhiyun * They also have an issue with initial stream alignment that causes the 3672*4882a593Smuzhiyun * channels to be swapped and out of phase, which is dealt with in quirks.c. 3673*4882a593Smuzhiyun */ 3674*4882a593Smuzhiyun { 3675*4882a593Smuzhiyun USB_AUDIO_DEVICE(0x534d, 0x0021), 3676*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3677*4882a593Smuzhiyun .vendor_name = "MacroSilicon", 3678*4882a593Smuzhiyun .product_name = "MS210x", 3679*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3680*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3681*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 3682*4882a593Smuzhiyun { 3683*4882a593Smuzhiyun .ifnum = 2, 3684*4882a593Smuzhiyun .type = QUIRK_AUDIO_ALIGN_TRANSFER, 3685*4882a593Smuzhiyun }, 3686*4882a593Smuzhiyun { 3687*4882a593Smuzhiyun .ifnum = 2, 3688*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 3689*4882a593Smuzhiyun }, 3690*4882a593Smuzhiyun { 3691*4882a593Smuzhiyun .ifnum = 3, 3692*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3693*4882a593Smuzhiyun .data = &(const struct audioformat) { 3694*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 3695*4882a593Smuzhiyun .channels = 2, 3696*4882a593Smuzhiyun .iface = 3, 3697*4882a593Smuzhiyun .altsetting = 1, 3698*4882a593Smuzhiyun .altset_idx = 1, 3699*4882a593Smuzhiyun .attributes = 0, 3700*4882a593Smuzhiyun .endpoint = 0x82, 3701*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC | 3702*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3703*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 3704*4882a593Smuzhiyun .rate_min = 48000, 3705*4882a593Smuzhiyun .rate_max = 48000, 3706*4882a593Smuzhiyun } 3707*4882a593Smuzhiyun }, 3708*4882a593Smuzhiyun { 3709*4882a593Smuzhiyun .ifnum = -1 3710*4882a593Smuzhiyun } 3711*4882a593Smuzhiyun } 3712*4882a593Smuzhiyun } 3713*4882a593Smuzhiyun }, 3714*4882a593Smuzhiyun 3715*4882a593Smuzhiyun /* 3716*4882a593Smuzhiyun * MacroSilicon MS2109 based HDMI capture cards 3717*4882a593Smuzhiyun * 3718*4882a593Smuzhiyun * These claim 96kHz 1ch in the descriptors, but are actually 48kHz 2ch. 3719*4882a593Smuzhiyun * They also need QUIRK_AUDIO_ALIGN_TRANSFER, which makes one wonder if 3720*4882a593Smuzhiyun * they pretend to be 96kHz mono as a workaround for stereo being broken 3721*4882a593Smuzhiyun * by that... 3722*4882a593Smuzhiyun * 3723*4882a593Smuzhiyun * They also have an issue with initial stream alignment that causes the 3724*4882a593Smuzhiyun * channels to be swapped and out of phase, which is dealt with in quirks.c. 3725*4882a593Smuzhiyun */ 3726*4882a593Smuzhiyun { 3727*4882a593Smuzhiyun USB_AUDIO_DEVICE(0x534d, 0x2109), 3728*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3729*4882a593Smuzhiyun .vendor_name = "MacroSilicon", 3730*4882a593Smuzhiyun .product_name = "MS2109", 3731*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3732*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3733*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 3734*4882a593Smuzhiyun { 3735*4882a593Smuzhiyun .ifnum = 2, 3736*4882a593Smuzhiyun .type = QUIRK_AUDIO_ALIGN_TRANSFER, 3737*4882a593Smuzhiyun }, 3738*4882a593Smuzhiyun { 3739*4882a593Smuzhiyun .ifnum = 2, 3740*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_MIXER, 3741*4882a593Smuzhiyun }, 3742*4882a593Smuzhiyun { 3743*4882a593Smuzhiyun .ifnum = 3, 3744*4882a593Smuzhiyun .type = QUIRK_AUDIO_FIXED_ENDPOINT, 3745*4882a593Smuzhiyun .data = &(const struct audioformat) { 3746*4882a593Smuzhiyun .formats = SNDRV_PCM_FMTBIT_S16_LE, 3747*4882a593Smuzhiyun .channels = 2, 3748*4882a593Smuzhiyun .iface = 3, 3749*4882a593Smuzhiyun .altsetting = 1, 3750*4882a593Smuzhiyun .altset_idx = 1, 3751*4882a593Smuzhiyun .attributes = 0, 3752*4882a593Smuzhiyun .endpoint = 0x82, 3753*4882a593Smuzhiyun .ep_attr = USB_ENDPOINT_XFER_ISOC | 3754*4882a593Smuzhiyun USB_ENDPOINT_SYNC_ASYNC, 3755*4882a593Smuzhiyun .rates = SNDRV_PCM_RATE_CONTINUOUS, 3756*4882a593Smuzhiyun .rate_min = 48000, 3757*4882a593Smuzhiyun .rate_max = 48000, 3758*4882a593Smuzhiyun } 3759*4882a593Smuzhiyun }, 3760*4882a593Smuzhiyun { 3761*4882a593Smuzhiyun .ifnum = -1 3762*4882a593Smuzhiyun } 3763*4882a593Smuzhiyun } 3764*4882a593Smuzhiyun } 3765*4882a593Smuzhiyun }, 3766*4882a593Smuzhiyun { 3767*4882a593Smuzhiyun /* 3768*4882a593Smuzhiyun * Sennheiser GSP670 3769*4882a593Smuzhiyun * Change order of interfaces loaded 3770*4882a593Smuzhiyun */ 3771*4882a593Smuzhiyun USB_DEVICE(0x1395, 0x0300), 3772*4882a593Smuzhiyun .bInterfaceClass = USB_CLASS_PER_INTERFACE, 3773*4882a593Smuzhiyun .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 3774*4882a593Smuzhiyun .ifnum = QUIRK_ANY_INTERFACE, 3775*4882a593Smuzhiyun .type = QUIRK_COMPOSITE, 3776*4882a593Smuzhiyun .data = &(const struct snd_usb_audio_quirk[]) { 3777*4882a593Smuzhiyun // Communication 3778*4882a593Smuzhiyun { 3779*4882a593Smuzhiyun .ifnum = 3, 3780*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 3781*4882a593Smuzhiyun }, 3782*4882a593Smuzhiyun // Recording 3783*4882a593Smuzhiyun { 3784*4882a593Smuzhiyun .ifnum = 4, 3785*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 3786*4882a593Smuzhiyun }, 3787*4882a593Smuzhiyun // Main 3788*4882a593Smuzhiyun { 3789*4882a593Smuzhiyun .ifnum = 1, 3790*4882a593Smuzhiyun .type = QUIRK_AUDIO_STANDARD_INTERFACE 3791*4882a593Smuzhiyun }, 3792*4882a593Smuzhiyun { 3793*4882a593Smuzhiyun .ifnum = -1 3794*4882a593Smuzhiyun } 3795*4882a593Smuzhiyun } 3796*4882a593Smuzhiyun } 3797*4882a593Smuzhiyun }, 3798*4882a593Smuzhiyun 3799*4882a593Smuzhiyun #undef USB_DEVICE_VENDOR_SPEC 3800*4882a593Smuzhiyun #undef USB_AUDIO_DEVICE 3801