Newer
Older
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* ALSA USB Audio Driver
*
* Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>,
* Clemens Ladisch <clemens@ladisch.de>
*/
/*
* The contents of this file are part of the driver's id_table.
*
* In a perfect world, this file would be empty.
*/
/*
* Use this for devices where other interfaces are standard compliant,
* to prevent the quirk being applied to those interfaces. (To work with
* hotplugging, bDeviceClass must be set to USB_CLASS_PER_INTERFACE.)
*/
#define USB_DEVICE_VENDOR_SPEC(vend, prod) \
.match_flags = USB_DEVICE_ID_MATCH_VENDOR | \
USB_DEVICE_ID_MATCH_PRODUCT | \
USB_DEVICE_ID_MATCH_INT_CLASS, \
.idVendor = vend, \
.idProduct = prod, \
.bInterfaceClass = USB_CLASS_VENDOR_SPEC
/* A standard entry matching with vid/pid and the audio class/subclass */
#define USB_AUDIO_DEVICE(vend, prod) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
USB_DEVICE_ID_MATCH_INT_CLASS | \
USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
.idVendor = vend, \
.idProduct = prod, \
.bInterfaceClass = USB_CLASS_AUDIO, \
.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* Quirk .driver_info, followed by the definition of the quirk entry;
* put like QUIRK_DRIVER_INFO { ... } in each entry of the quirk table
*/
#define QUIRK_DRIVER_INFO \
.driver_info = (unsigned long)&(const struct snd_usb_audio_quirk)
/*
* Macros for quirk data entries
*/
/* Quirk data entry for ignoring the interface */
#define QUIRK_DATA_IGNORE(_ifno) \
.ifnum = (_ifno), .type = QUIRK_IGNORE_INTERFACE
/* Quirk data entry for a standard audio interface */
#define QUIRK_DATA_STANDARD_AUDIO(_ifno) \
.ifnum = (_ifno), .type = QUIRK_AUDIO_STANDARD_INTERFACE
/* Quirk data entry for a standard MIDI interface */
#define QUIRK_DATA_STANDARD_MIDI(_ifno) \
.ifnum = (_ifno), .type = QUIRK_MIDI_STANDARD_INTERFACE
/* Quirk data entry for a standard mixer interface */
#define QUIRK_DATA_STANDARD_MIXER(_ifno) \
.ifnum = (_ifno), .type = QUIRK_AUDIO_STANDARD_MIXER
/* Quirk data entry for Yamaha MIDI */
#define QUIRK_DATA_MIDI_YAMAHA(_ifno) \
.ifnum = (_ifno), .type = QUIRK_MIDI_YAMAHA
/* Quirk data entry for Edirol UAxx */
#define QUIRK_DATA_EDIROL_UAXX(_ifno) \
.ifnum = (_ifno), .type = QUIRK_AUDIO_EDIROL_UAXX
/* Quirk data entry for raw bytes interface */
#define QUIRK_DATA_RAW_BYTES(_ifno) \
.ifnum = (_ifno), .type = QUIRK_MIDI_RAW_BYTES
/* Quirk composite array terminator */
#define QUIRK_COMPOSITE_END { .ifnum = -1 }
/* Quirk data entry for composite quirks;
* followed by the quirk array that is terminated with QUIRK_COMPOSITE_END
* e.g. QUIRK_DATA_COMPOSITE { { quirk1 }, { quirk2 },..., QUIRK_COMPOSITE_END }
*/
#define QUIRK_DATA_COMPOSITE \
.ifnum = QUIRK_ANY_INTERFACE, \
.type = QUIRK_COMPOSITE, \
.data = &(const struct snd_usb_audio_quirk[])
/* Quirk data entry for a fixed audio endpoint;
* followed by audioformat definition
* e.g. QUIRK_DATA_AUDIOFORMAT(n) { .formats = xxx, ... }
*/
#define QUIRK_DATA_AUDIOFORMAT(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_AUDIO_FIXED_ENDPOINT, \
.data = &(const struct audioformat)
/* Quirk data entry for a fixed MIDI endpoint;
* followed by snd_usb_midi_endpoint_info definition
* e.g. QUIRK_DATA_MIDI_FIXED_ENDPOINT(n) { .out_cables = x, .in_cables = y }
*/
#define QUIRK_DATA_MIDI_FIXED_ENDPOINT(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_MIDI_FIXED_ENDPOINT, \
.data = &(const struct snd_usb_midi_endpoint_info)
/* Quirk data entry for a MIDIMAN MIDI endpoint */
#define QUIRK_DATA_MIDI_MIDIMAN(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_MIDI_MIDIMAN, \
.data = &(const struct snd_usb_midi_endpoint_info)
/* Quirk data entry for a EMAGIC MIDI endpoint */
#define QUIRK_DATA_MIDI_EMAGIC(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_MIDI_EMAGIC, \
.data = &(const struct snd_usb_midi_endpoint_info)
/*
* Here we go... the quirk table definition begins:
*/
/* FTDI devices */
{
USB_DEVICE(0x0403, 0xb8d8),
QUIRK_DRIVER_INFO {
/* .vendor_name = "STARR LABS", */
/* .product_name = "Starr Labs MIDI USB device", */
.ifnum = 0,
.type = QUIRK_MIDI_FTDI
}
},
{
/* Creative BT-D1 */
USB_DEVICE(0x041e, 0x0005),
QUIRK_DRIVER_INFO {
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.channels = 2,
.iface = 1,
.altsetting = 1,
.altset_idx = 1,
.endpoint = 0x03,
.ep_attr = USB_ENDPOINT_XFER_ISOC,
.attributes = 0,
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 48000,
.rate_max = 48000,
}
}
},
/* E-Mu 0202 USB */
{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f02) },
/* E-Mu 0404 USB */
{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f04) },
/* E-Mu Tracker Pre */
{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f0a) },
/* E-Mu 0204 USB */
{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f19) },
/* Ktmicro Usb_audio device */
{ USB_DEVICE_VENDOR_SPEC(0x31b2, 0x0011) },
/*
* Creative Technology, Ltd Live! Cam Sync HD [VF0770]
* The device advertises 8 formats, but only a rate of 48kHz is honored by the
* hardware and 24 bits give chopped audio, so only report the one working
* combination.
*/
{
USB_AUDIO_DEVICE(0x041e, 0x4095),
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_MIXER(2) },
QUIRK_DATA_AUDIOFORMAT(3) {
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.channels = 2,
.fmt_bits = 16,
.iface = 3,
.altsetting = 4,
.altset_idx = 4,
.endpoint = 0x82,
.ep_attr = 0x05,
.rates = SNDRV_PCM_RATE_48000,
.rate_min = 48000,
.rate_max = 48000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 48000 },
},
},
QUIRK_COMPOSITE_END
/*
* HP Wireless Audio
* When not ignored, causes instability issues for some users, forcing them to
*/
{
USB_DEVICE(0x0424, 0xb832),
QUIRK_DRIVER_INFO {
.vendor_name = "Standard Microsystems Corp.",
.product_name = "HP Wireless Audio",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
{ QUIRK_DATA_IGNORE(2) },
/* HID Device, .ifnum = 3 */
QUIRK_COMPOSITE_END
/*
* Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
* class matches do not take effect without an explicit ID match.
*/
{ USB_AUDIO_DEVICE(0x046d, 0x0850) },
{ USB_AUDIO_DEVICE(0x046d, 0x08ae) },
{ USB_AUDIO_DEVICE(0x046d, 0x08c6) },
{ USB_AUDIO_DEVICE(0x046d, 0x08f0) },
{ USB_AUDIO_DEVICE(0x046d, 0x08f5) },
{ USB_AUDIO_DEVICE(0x046d, 0x08f6) },
{ USB_AUDIO_DEVICE(0x046d, 0x0990) },
/*
* Yamaha devices
*/
#define YAMAHA_DEVICE(id, name) { \
USB_DEVICE(0x0499, id), \
QUIRK_DRIVER_INFO { \
.vendor_name = "Yamaha", \
.product_name = name, \
QUIRK_DATA_MIDI_YAMAHA(QUIRK_ANY_INTERFACE) \
} \
}
#define YAMAHA_INTERFACE(id, intf, name) { \
USB_DEVICE_VENDOR_SPEC(0x0499, id), \
QUIRK_DRIVER_INFO { \
.vendor_name = "Yamaha", \
.product_name = name, \
QUIRK_DATA_MIDI_YAMAHA(intf) \
} \
}
YAMAHA_DEVICE(0x1000, "UX256"),
YAMAHA_DEVICE(0x1001, "MU1000"),
YAMAHA_DEVICE(0x1002, "MU2000"),
YAMAHA_DEVICE(0x1003, "MU500"),
YAMAHA_INTERFACE(0x1004, 3, "UW500"),
YAMAHA_DEVICE(0x1005, "MOTIF6"),
YAMAHA_DEVICE(0x1006, "MOTIF7"),
YAMAHA_DEVICE(0x1007, "MOTIF8"),
YAMAHA_DEVICE(0x1008, "UX96"),
YAMAHA_DEVICE(0x1009, "UX16"),
YAMAHA_INTERFACE(0x100a, 3, "EOS BX"),
YAMAHA_DEVICE(0x100c, "UC-MX"),
YAMAHA_DEVICE(0x100d, "UC-KX"),
YAMAHA_DEVICE(0x100e, "S08"),
YAMAHA_DEVICE(0x100f, "CLP-150"),
YAMAHA_DEVICE(0x1010, "CLP-170"),
YAMAHA_DEVICE(0x1011, "P-250"),
YAMAHA_DEVICE(0x1012, "TYROS"),
YAMAHA_DEVICE(0x1013, "PF-500"),
YAMAHA_DEVICE(0x1014, "S90"),
YAMAHA_DEVICE(0x1015, "MOTIF-R"),
YAMAHA_DEVICE(0x1016, "MDP-5"),
YAMAHA_DEVICE(0x1017, "CVP-204"),
YAMAHA_DEVICE(0x1018, "CVP-206"),
YAMAHA_DEVICE(0x1019, "CVP-208"),
YAMAHA_DEVICE(0x101a, "CVP-210"),
YAMAHA_DEVICE(0x101b, "PSR-1100"),
YAMAHA_DEVICE(0x101c, "PSR-2100"),
YAMAHA_DEVICE(0x101d, "CLP-175"),
YAMAHA_DEVICE(0x101e, "PSR-K1"),
YAMAHA_DEVICE(0x101f, "EZ-J24"),
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
YAMAHA_DEVICE(0x1020, "EZ-250i"),
YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
YAMAHA_DEVICE(0x1023, "MOTIF ES 8"),
YAMAHA_DEVICE(0x1024, "CVP-301"),
YAMAHA_DEVICE(0x1025, "CVP-303"),
YAMAHA_DEVICE(0x1026, "CVP-305"),
YAMAHA_DEVICE(0x1027, "CVP-307"),
YAMAHA_DEVICE(0x1028, "CVP-309"),
YAMAHA_DEVICE(0x1029, "CVP-309GP"),
YAMAHA_DEVICE(0x102a, "PSR-1500"),
YAMAHA_DEVICE(0x102b, "PSR-3000"),
YAMAHA_DEVICE(0x102e, "ELS-01/01C"),
YAMAHA_DEVICE(0x1030, "PSR-295/293"),
YAMAHA_DEVICE(0x1031, "DGX-205/203"),
YAMAHA_DEVICE(0x1032, "DGX-305"),
YAMAHA_DEVICE(0x1033, "DGX-505"),
YAMAHA_DEVICE(0x1034, NULL),
YAMAHA_DEVICE(0x1035, NULL),
YAMAHA_DEVICE(0x1036, NULL),
YAMAHA_DEVICE(0x1037, NULL),
YAMAHA_DEVICE(0x1038, NULL),
YAMAHA_DEVICE(0x1039, NULL),
YAMAHA_DEVICE(0x103a, NULL),
YAMAHA_DEVICE(0x103b, NULL),
YAMAHA_DEVICE(0x103c, NULL),
YAMAHA_DEVICE(0x103d, NULL),
YAMAHA_DEVICE(0x103e, NULL),
YAMAHA_DEVICE(0x103f, NULL),
YAMAHA_DEVICE(0x1040, NULL),
YAMAHA_DEVICE(0x1041, NULL),
YAMAHA_DEVICE(0x1042, NULL),
YAMAHA_DEVICE(0x1043, NULL),
YAMAHA_DEVICE(0x1044, NULL),
YAMAHA_DEVICE(0x1045, NULL),
YAMAHA_INTERFACE(0x104e, 0, NULL),
YAMAHA_DEVICE(0x104f, NULL),
YAMAHA_DEVICE(0x1050, NULL),
YAMAHA_DEVICE(0x1051, NULL),
YAMAHA_DEVICE(0x1052, NULL),
YAMAHA_INTERFACE(0x1053, 0, NULL),
YAMAHA_INTERFACE(0x1054, 0, NULL),
YAMAHA_DEVICE(0x1055, NULL),
YAMAHA_DEVICE(0x1056, NULL),
YAMAHA_DEVICE(0x1057, NULL),
YAMAHA_DEVICE(0x1058, NULL),
YAMAHA_DEVICE(0x1059, NULL),
YAMAHA_DEVICE(0x105a, NULL),
YAMAHA_DEVICE(0x105b, NULL),
YAMAHA_DEVICE(0x105c, NULL),
YAMAHA_DEVICE(0x105d, NULL),
{
USB_DEVICE(0x0499, 0x1503),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Yamaha", */
/* .product_name = "MOX6/MOX8", */
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_MIDI_YAMAHA(3) },
QUIRK_COMPOSITE_END
}
}
},
{
USB_DEVICE(0x0499, 0x1507),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Yamaha", */
/* .product_name = "THR10", */
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_MIDI_YAMAHA(3) },
QUIRK_COMPOSITE_END
{
USB_DEVICE(0x0499, 0x1509),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Yamaha", */
/* .product_name = "Steinberg UR22", */
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_MIDI_YAMAHA(3) },
{ QUIRK_DATA_IGNORE(4) },
QUIRK_COMPOSITE_END
}
}
},
{
USB_DEVICE(0x0499, 0x150a),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Yamaha", */
/* .product_name = "THR5A", */
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_MIDI_YAMAHA(3) },
QUIRK_COMPOSITE_END
}
}
},
{
USB_DEVICE(0x0499, 0x150c),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Yamaha", */
/* .product_name = "THR10C", */
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_MIDI_YAMAHA(3) },
QUIRK_COMPOSITE_END
{
USB_DEVICE(0x0499, 0x1718),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Yamaha", */
/* .product_name = "P-125", */
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_MIDI_YAMAHA(3) },
QUIRK_COMPOSITE_END
}
}
},
YAMAHA_DEVICE(0x2000, "DGP-7"),
YAMAHA_DEVICE(0x2001, "DGP-5"),
YAMAHA_DEVICE(0x2002, NULL),
YAMAHA_DEVICE(0x2003, NULL),
YAMAHA_DEVICE(0x5000, "CS1D"),
YAMAHA_DEVICE(0x5001, "DSP1D"),
YAMAHA_DEVICE(0x5002, "DME32"),
YAMAHA_DEVICE(0x5003, "DM2000"),
YAMAHA_DEVICE(0x5004, "02R96"),
YAMAHA_DEVICE(0x5005, "ACU16-C"),
YAMAHA_DEVICE(0x5006, "NHB32-C"),
YAMAHA_DEVICE(0x5007, "DM1000"),
YAMAHA_DEVICE(0x5008, "01V96"),
YAMAHA_DEVICE(0x5009, "SPX2000"),
YAMAHA_DEVICE(0x500a, "PM5D"),
YAMAHA_DEVICE(0x500b, "DME64N"),
YAMAHA_DEVICE(0x500c, "DME24N"),
YAMAHA_DEVICE(0x500d, NULL),
YAMAHA_DEVICE(0x500e, NULL),
YAMAHA_DEVICE(0x500f, NULL),
YAMAHA_DEVICE(0x7000, "DTX"),
YAMAHA_DEVICE(0x7010, "UB99"),
#undef YAMAHA_DEVICE
#undef YAMAHA_INTERFACE
/* this catches most recent vendor-specific Yamaha devices */
{
.match_flags = USB_DEVICE_ID_MATCH_VENDOR |
USB_DEVICE_ID_MATCH_INT_CLASS,
.idVendor = 0x0499,
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
QUIRK_DRIVER_INFO {
.ifnum = QUIRK_ANY_INTERFACE,
.type = QUIRK_AUTODETECT
}
},
/*
* Roland/RolandED/Edirol/BOSS devices
*/
{
USB_DEVICE(0x0582, 0x0000),
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "UA-100",
QUIRK_DATA_COMPOSITE {
QUIRK_DATA_AUDIOFORMAT(0) {
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.channels = 4,
.iface = 0,
.altsetting = 1,
.altset_idx = 1,
.attributes = 0,
.endpoint = 0x01,
.ep_attr = 0x09,
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 44100,
.rate_max = 44100,
}
},
{
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.channels = 2,
.iface = 1,
.altsetting = 1,
.altset_idx = 1,
.attributes = UAC_EP_CS_ATTR_FILL_MAX,
.endpoint = 0x81,
.ep_attr = 0x05,
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 44100,
.rate_max = 44100,
}
},
{
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0007,
.in_cables = 0x0007
}
},
QUIRK_COMPOSITE_END
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x000f,
.in_cables = 0x000f
}
},
QUIRK_COMPOSITE_END
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "SC-8850",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x003f,
.in_cables = 0x003f
}
},
QUIRK_COMPOSITE_END
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0005,
.in_cables = 0x0005
}
},
QUIRK_COMPOSITE_END
/* Has ID 0x0099 when not in "Advanced Driver" mode.
* The UM-2EX has only one input, but we cannot detect this. */
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0003,
.in_cables = 0x0003
}
},
QUIRK_COMPOSITE_END
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "SC-8820",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0013,
.in_cables = 0x0013
}
},
QUIRK_COMPOSITE_END
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "PC-300",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
},
QUIRK_COMPOSITE_END
/* has ID 0x009d when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
},
QUIRK_COMPOSITE_END
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "SK-500",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0013,
.in_cables = 0x0013
}
},
QUIRK_COMPOSITE_END
}
}
},
{
/* thanks to Emiliano Grilli <emillo@libero.it>
* for helping researching this data */
USB_DEVICE(0x0582, 0x000c),
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "SC-D70",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(0) },
{ QUIRK_DATA_STANDARD_AUDIO(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0007,
.in_cables = 0x0007
}
},
QUIRK_COMPOSITE_END
}
}
},
{ /*
* This quirk is for the "Advanced Driver" mode of the Edirol UA-5.
* If the advanced mode switch at the back of the unit is off, the
* UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks),
* but offers only 16-bit PCM.
* In advanced mode, the UA-5 will output S24_3LE samples (two
* channels) at the rate indicated on the front switch, including
* the 96kHz sample rate.
*/
USB_DEVICE(0x0582, 0x0010),
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
QUIRK_COMPOSITE_END
/* has ID 0x0013 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "XV-5050",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
}
},
{
/* has ID 0x0015 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
.vendor_name = "EDIROL",
.product_name = "UM-880",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x01ff,
.in_cables = 0x01ff
}
}
},
{
/* has ID 0x0017 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(0) },
{ QUIRK_DATA_STANDARD_AUDIO(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x000f,
.in_cables = 0x000f
}
},
QUIRK_COMPOSITE_END
/* has ID 0x001c when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
{ QUIRK_DATA_IGNORE(1) },
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
},
QUIRK_COMPOSITE_END
/* has ID 0x001e when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "V-SYNTH",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
}
},
{
/* has ID 0x0024 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
.vendor_name = "EDIROL",
.product_name = "UM-550",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x003f,
.in_cables = 0x003f
}
}
},
{
/*
* This quirk is for the "Advanced Driver" mode. If off, the UA-20
* has ID 0x0026 and is standard compliant, but has only 16-bit PCM
* and no MIDI.
*/
USB_DEVICE(0x0582, 0x0025),
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_IGNORE(0) },
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 2,
.iface = 1,
.altsetting = 1,
.altset_idx = 1,
.attributes = 0,
.endpoint = 0x01,
.ep_attr = 0x01,
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 44100,
.rate_max = 44100,
}
QUIRK_DATA_AUDIOFORMAT(2) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 2,
.iface = 2,
.altsetting = 1,
.altset_idx = 1,
.attributes = 0,
.endpoint = 0x82,
.ep_attr = 0x01,
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 44100,
.rate_max = 44100,
}
QUIRK_DATA_MIDI_FIXED_ENDPOINT(3) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
QUIRK_COMPOSITE_END
/* has ID 0x0028 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0003,
.in_cables = 0x0007
}
}
},
{
/* has ID 0x002a when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x000f,
.in_cables = 0x000f
}
}
},
{ /*
* This quirk is for the "Advanced" modes of the Edirol UA-700.
* If the sample format switch is not in an advanced setting, the
* UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
* but offers only 16-bit PCM and no MIDI.
*/
USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
QUIRK_DRIVER_INFO {
.vendor_name = "EDIROL",
.product_name = "UA-700",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_EDIROL_UAXX(1) },
{ QUIRK_DATA_EDIROL_UAXX(2) },
{ QUIRK_DATA_EDIROL_UAXX(3) },
QUIRK_COMPOSITE_END
/* has ID 0x002e when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "XV-2020",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
}
},
{
/* has ID 0x0030 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "VariOS",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0007,
.in_cables = 0x0007
}
}
},
{
/* has ID 0x0034 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0003,
.in_cables = 0x0007
}
}
},
{
/*
* Has ID 0x0038 when not in "Advanced Driver" mode;
* later revisions use IDs 0x0054 and 0x00a2.
*/
QUIRK_DRIVER_INFO {
.vendor_name = "Roland",
.product_name = "Digital Piano",
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
}
},
{
/*
* This quirk is for the "Advanced Driver" mode. If off, the GS-10
* has ID 0x003c and is standard compliant, but has only 16-bit PCM
* and no MIDI.
*/
QUIRK_DRIVER_INFO {
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
{ QUIRK_DATA_STANDARD_MIDI(3) },
QUIRK_COMPOSITE_END
/* has ID 0x0041 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
}
},
{
/* has ID 0x0043 when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0001,
.in_cables = 0x0001
}
}
},
{
/* has ID 0x0049 when not in "Advanced Driver" mode */
USB_DEVICE(0x0582, 0x0047),
QUIRK_DRIVER_INFO {
/* .vendor_name = "EDIROL", */
/* .product_name = "UR-80", */
QUIRK_DATA_COMPOSITE {
/* in the 96 kHz modes, only interface 1 is there */
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
QUIRK_COMPOSITE_END
/* has ID 0x004a when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
/* .vendor_name = "EDIROL", */
/* .product_name = "UR-80", */
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0003,
.in_cables = 0x0007
}
}
},
{
/* has ID 0x004e when not in "Advanced Driver" mode */
USB_DEVICE(0x0582, 0x004c),
QUIRK_DRIVER_INFO {
.vendor_name = "EDIROL",
.product_name = "PCR-A",
QUIRK_DATA_COMPOSITE {
{ QUIRK_DATA_STANDARD_AUDIO(1) },
{ QUIRK_DATA_STANDARD_AUDIO(2) },
QUIRK_COMPOSITE_END
/* has ID 0x004f when not in "Advanced Driver" mode */
QUIRK_DRIVER_INFO {
QUIRK_DATA_MIDI_FIXED_ENDPOINT(0) {
.out_cables = 0x0003,
.in_cables = 0x0007
}
}