~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/usb/quirks.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /sound/usb/quirks.c (Architecture ppc) and /sound/usb/quirks.c (Architecture alpha)


  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*                                                  2 /*
  3  */                                                 3  */
  4                                                     4 
  5 #include <linux/init.h>                             5 #include <linux/init.h>
  6 #include <linux/slab.h>                             6 #include <linux/slab.h>
  7 #include <linux/usb.h>                              7 #include <linux/usb.h>
  8 #include <linux/usb/audio.h>                        8 #include <linux/usb/audio.h>
  9 #include <linux/usb/midi.h>                         9 #include <linux/usb/midi.h>
 10 #include <linux/bits.h>                            10 #include <linux/bits.h>
 11                                                    11 
 12 #include <sound/control.h>                         12 #include <sound/control.h>
 13 #include <sound/core.h>                            13 #include <sound/core.h>
 14 #include <sound/info.h>                            14 #include <sound/info.h>
 15 #include <sound/pcm.h>                             15 #include <sound/pcm.h>
 16                                                    16 
 17 #include "usbaudio.h"                              17 #include "usbaudio.h"
 18 #include "card.h"                                  18 #include "card.h"
 19 #include "mixer.h"                                 19 #include "mixer.h"
 20 #include "mixer_quirks.h"                          20 #include "mixer_quirks.h"
 21 #include "midi.h"                                  21 #include "midi.h"
 22 #include "midi2.h"                                 22 #include "midi2.h"
 23 #include "quirks.h"                                23 #include "quirks.h"
 24 #include "helper.h"                                24 #include "helper.h"
 25 #include "endpoint.h"                              25 #include "endpoint.h"
 26 #include "pcm.h"                                   26 #include "pcm.h"
 27 #include "clock.h"                                 27 #include "clock.h"
 28 #include "stream.h"                                28 #include "stream.h"
 29                                                    29 
 30 /*                                                 30 /*
 31  * handle the quirks for the contained interfa     31  * handle the quirks for the contained interfaces
 32  */                                                32  */
 33 static int create_composite_quirk(struct snd_u     33 static int create_composite_quirk(struct snd_usb_audio *chip,
 34                                   struct usb_i     34                                   struct usb_interface *iface,
 35                                   struct usb_d     35                                   struct usb_driver *driver,
 36                                   const struct     36                                   const struct snd_usb_audio_quirk *quirk_comp)
 37 {                                                  37 {
 38         int probed_ifnum = get_iface_desc(ifac     38         int probed_ifnum = get_iface_desc(iface->altsetting)->bInterfaceNumber;
 39         const struct snd_usb_audio_quirk *quir     39         const struct snd_usb_audio_quirk *quirk;
 40         int err;                                   40         int err;
 41                                                    41 
 42         for (quirk = quirk_comp->data; quirk->     42         for (quirk = quirk_comp->data; quirk->ifnum >= 0; ++quirk) {
 43                 iface = usb_ifnum_to_if(chip->     43                 iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
 44                 if (!iface)                        44                 if (!iface)
 45                         continue;                  45                         continue;
 46                 if (quirk->ifnum != probed_ifn     46                 if (quirk->ifnum != probed_ifnum &&
 47                     usb_interface_claimed(ifac     47                     usb_interface_claimed(iface))
 48                         continue;                  48                         continue;
 49                 err = snd_usb_create_quirk(chi     49                 err = snd_usb_create_quirk(chip, iface, driver, quirk);
 50                 if (err < 0)                       50                 if (err < 0)
 51                         return err;                51                         return err;
 52         }                                          52         }
 53                                                    53 
 54         for (quirk = quirk_comp->data; quirk->     54         for (quirk = quirk_comp->data; quirk->ifnum >= 0; ++quirk) {
 55                 iface = usb_ifnum_to_if(chip->     55                 iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
 56                 if (!iface)                        56                 if (!iface)
 57                         continue;                  57                         continue;
 58                 if (quirk->ifnum != probed_ifn     58                 if (quirk->ifnum != probed_ifnum &&
 59                     !usb_interface_claimed(ifa     59                     !usb_interface_claimed(iface)) {
 60                         err = usb_driver_claim     60                         err = usb_driver_claim_interface(driver, iface,
 61                                                    61                                                          USB_AUDIO_IFACE_UNUSED);
 62                         if (err < 0)               62                         if (err < 0)
 63                                 return err;        63                                 return err;
 64                 }                                  64                 }
 65         }                                          65         }
 66                                                    66 
 67         return 0;                                  67         return 0;
 68 }                                                  68 }
 69                                                    69 
 70 static int ignore_interface_quirk(struct snd_u     70 static int ignore_interface_quirk(struct snd_usb_audio *chip,
 71                                   struct usb_i     71                                   struct usb_interface *iface,
 72                                   struct usb_d     72                                   struct usb_driver *driver,
 73                                   const struct     73                                   const struct snd_usb_audio_quirk *quirk)
 74 {                                                  74 {
 75         return 0;                                  75         return 0;
 76 }                                                  76 }
 77                                                    77 
 78                                                    78 
 79 static int create_any_midi_quirk(struct snd_us     79 static int create_any_midi_quirk(struct snd_usb_audio *chip,
 80                                  struct usb_in     80                                  struct usb_interface *intf,
 81                                  struct usb_dr     81                                  struct usb_driver *driver,
 82                                  const struct      82                                  const struct snd_usb_audio_quirk *quirk)
 83 {                                                  83 {
 84         return snd_usb_midi_v2_create(chip, in     84         return snd_usb_midi_v2_create(chip, intf, quirk, 0);
 85 }                                                  85 }
 86                                                    86 
 87 /*                                                 87 /*
 88  * create a stream for an interface with prope     88  * create a stream for an interface with proper descriptors
 89  */                                                89  */
 90 static int create_standard_audio_quirk(struct      90 static int create_standard_audio_quirk(struct snd_usb_audio *chip,
 91                                        struct      91                                        struct usb_interface *iface,
 92                                        struct      92                                        struct usb_driver *driver,
 93                                        const s     93                                        const struct snd_usb_audio_quirk *quirk)
 94 {                                                  94 {
 95         struct usb_host_interface *alts;           95         struct usb_host_interface *alts;
 96         struct usb_interface_descriptor *altsd     96         struct usb_interface_descriptor *altsd;
 97         int err;                                   97         int err;
 98                                                    98 
 99         alts = &iface->altsetting[0];              99         alts = &iface->altsetting[0];
100         altsd = get_iface_desc(alts);             100         altsd = get_iface_desc(alts);
101         err = snd_usb_parse_audio_interface(ch    101         err = snd_usb_parse_audio_interface(chip, altsd->bInterfaceNumber);
102         if (err < 0) {                            102         if (err < 0) {
103                 usb_audio_err(chip, "cannot se    103                 usb_audio_err(chip, "cannot setup if %d: error %d\n",
104                            altsd->bInterfaceNu    104                            altsd->bInterfaceNumber, err);
105                 return err;                       105                 return err;
106         }                                         106         }
107         /* reset the current interface */         107         /* reset the current interface */
108         usb_set_interface(chip->dev, altsd->bI    108         usb_set_interface(chip->dev, altsd->bInterfaceNumber, 0);
109         return 0;                                 109         return 0;
110 }                                                 110 }
111                                                   111 
112 /* create the audio stream and the correspondi    112 /* create the audio stream and the corresponding endpoints from the fixed
113  * audioformat object; this is used for quirks    113  * audioformat object; this is used for quirks with the fixed EPs
114  */                                               114  */
115 static int add_audio_stream_from_fixed_fmt(str    115 static int add_audio_stream_from_fixed_fmt(struct snd_usb_audio *chip,
116                                            str    116                                            struct audioformat *fp)
117 {                                                 117 {
118         int stream, err;                          118         int stream, err;
119                                                   119 
120         stream = (fp->endpoint & USB_DIR_IN) ?    120         stream = (fp->endpoint & USB_DIR_IN) ?
121                 SNDRV_PCM_STREAM_CAPTURE : SND    121                 SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
122                                                   122 
123         snd_usb_audioformat_set_sync_ep(chip,     123         snd_usb_audioformat_set_sync_ep(chip, fp);
124                                                   124 
125         err = snd_usb_add_audio_stream(chip, s    125         err = snd_usb_add_audio_stream(chip, stream, fp);
126         if (err < 0)                              126         if (err < 0)
127                 return err;                       127                 return err;
128                                                   128 
129         err = snd_usb_add_endpoint(chip, fp->e    129         err = snd_usb_add_endpoint(chip, fp->endpoint,
130                                    SND_USB_END    130                                    SND_USB_ENDPOINT_TYPE_DATA);
131         if (err < 0)                              131         if (err < 0)
132                 return err;                       132                 return err;
133                                                   133 
134         if (fp->sync_ep) {                        134         if (fp->sync_ep) {
135                 err = snd_usb_add_endpoint(chi    135                 err = snd_usb_add_endpoint(chip, fp->sync_ep,
136                                            fp-    136                                            fp->implicit_fb ?
137                                            SND    137                                            SND_USB_ENDPOINT_TYPE_DATA :
138                                            SND    138                                            SND_USB_ENDPOINT_TYPE_SYNC);
139                 if (err < 0)                      139                 if (err < 0)
140                         return err;               140                         return err;
141         }                                         141         }
142                                                   142 
143         return 0;                                 143         return 0;
144 }                                                 144 }
145                                                   145 
146 /*                                                146 /*
147  * create a stream for an endpoint/altsetting     147  * create a stream for an endpoint/altsetting without proper descriptors
148  */                                               148  */
149 static int create_fixed_stream_quirk(struct sn    149 static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
150                                      struct us    150                                      struct usb_interface *iface,
151                                      struct us    151                                      struct usb_driver *driver,
152                                      const str    152                                      const struct snd_usb_audio_quirk *quirk)
153 {                                                 153 {
154         struct audioformat *fp;                   154         struct audioformat *fp;
155         struct usb_host_interface *alts;          155         struct usb_host_interface *alts;
156         struct usb_interface_descriptor *altsd    156         struct usb_interface_descriptor *altsd;
157         unsigned *rate_table = NULL;              157         unsigned *rate_table = NULL;
158         int err;                                  158         int err;
159                                                   159 
160         fp = kmemdup(quirk->data, sizeof(*fp),    160         fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL);
161         if (!fp)                                  161         if (!fp)
162                 return -ENOMEM;                   162                 return -ENOMEM;
163                                                   163 
164         INIT_LIST_HEAD(&fp->list);                164         INIT_LIST_HEAD(&fp->list);
165         if (fp->nr_rates > MAX_NR_RATES) {        165         if (fp->nr_rates > MAX_NR_RATES) {
166                 kfree(fp);                        166                 kfree(fp);
167                 return -EINVAL;                   167                 return -EINVAL;
168         }                                         168         }
169         if (fp->nr_rates > 0) {                   169         if (fp->nr_rates > 0) {
170                 rate_table = kmemdup(fp->rate_    170                 rate_table = kmemdup(fp->rate_table,
171                                      sizeof(in    171                                      sizeof(int) * fp->nr_rates, GFP_KERNEL);
172                 if (!rate_table) {                172                 if (!rate_table) {
173                         kfree(fp);                173                         kfree(fp);
174                         return -ENOMEM;           174                         return -ENOMEM;
175                 }                                 175                 }
176                 fp->rate_table = rate_table;      176                 fp->rate_table = rate_table;
177         }                                         177         }
178                                                   178 
179         if (fp->iface != get_iface_desc(&iface    179         if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
180             fp->altset_idx >= iface->num_altse    180             fp->altset_idx >= iface->num_altsetting) {
181                 err = -EINVAL;                    181                 err = -EINVAL;
182                 goto error;                       182                 goto error;
183         }                                         183         }
184         alts = &iface->altsetting[fp->altset_i    184         alts = &iface->altsetting[fp->altset_idx];
185         altsd = get_iface_desc(alts);             185         altsd = get_iface_desc(alts);
186         if (altsd->bNumEndpoints <= fp->ep_idx    186         if (altsd->bNumEndpoints <= fp->ep_idx) {
187                 err = -EINVAL;                    187                 err = -EINVAL;
188                 goto error;                       188                 goto error;
189         }                                         189         }
190                                                   190 
191         fp->protocol = altsd->bInterfaceProtoc    191         fp->protocol = altsd->bInterfaceProtocol;
192                                                   192 
193         if (fp->datainterval == 0)                193         if (fp->datainterval == 0)
194                 fp->datainterval = snd_usb_par    194                 fp->datainterval = snd_usb_parse_datainterval(chip, alts);
195         if (fp->maxpacksize == 0)                 195         if (fp->maxpacksize == 0)
196                 fp->maxpacksize = le16_to_cpu(    196                 fp->maxpacksize = le16_to_cpu(get_endpoint(alts, fp->ep_idx)->wMaxPacketSize);
197         if (!fp->fmt_type)                        197         if (!fp->fmt_type)
198                 fp->fmt_type = UAC_FORMAT_TYPE    198                 fp->fmt_type = UAC_FORMAT_TYPE_I;
199                                                   199 
200         err = add_audio_stream_from_fixed_fmt(    200         err = add_audio_stream_from_fixed_fmt(chip, fp);
201         if (err < 0)                              201         if (err < 0)
202                 goto error;                       202                 goto error;
203                                                   203 
204         usb_set_interface(chip->dev, fp->iface    204         usb_set_interface(chip->dev, fp->iface, 0);
205         snd_usb_init_pitch(chip, fp);             205         snd_usb_init_pitch(chip, fp);
206         snd_usb_init_sample_rate(chip, fp, fp-    206         snd_usb_init_sample_rate(chip, fp, fp->rate_max);
207         return 0;                                 207         return 0;
208                                                   208 
209  error:                                           209  error:
210         list_del(&fp->list); /* unlink for avo    210         list_del(&fp->list); /* unlink for avoiding double-free */
211         kfree(fp);                                211         kfree(fp);
212         kfree(rate_table);                        212         kfree(rate_table);
213         return err;                               213         return err;
214 }                                                 214 }
215                                                   215 
216 static int create_auto_pcm_quirk(struct snd_us    216 static int create_auto_pcm_quirk(struct snd_usb_audio *chip,
217                                  struct usb_in    217                                  struct usb_interface *iface,
218                                  struct usb_dr    218                                  struct usb_driver *driver)
219 {                                                 219 {
220         struct usb_host_interface *alts;          220         struct usb_host_interface *alts;
221         struct usb_interface_descriptor *altsd    221         struct usb_interface_descriptor *altsd;
222         struct usb_endpoint_descriptor *epd;      222         struct usb_endpoint_descriptor *epd;
223         struct uac1_as_header_descriptor *ashd    223         struct uac1_as_header_descriptor *ashd;
224         struct uac_format_type_i_discrete_desc    224         struct uac_format_type_i_discrete_descriptor *fmtd;
225                                                   225 
226         /*                                        226         /*
227          * Most Roland/Yamaha audio streaming     227          * Most Roland/Yamaha audio streaming interfaces have more or less
228          * standard descriptors, but older dev    228          * standard descriptors, but older devices might lack descriptors, and
229          * future ones might change, so ensure    229          * future ones might change, so ensure that we fail silently if the
230          * interface doesn't look exactly righ    230          * interface doesn't look exactly right.
231          */                                       231          */
232                                                   232 
233         /* must have a non-zero altsetting for    233         /* must have a non-zero altsetting for streaming */
234         if (iface->num_altsetting < 2)            234         if (iface->num_altsetting < 2)
235                 return -ENODEV;                   235                 return -ENODEV;
236         alts = &iface->altsetting[1];             236         alts = &iface->altsetting[1];
237         altsd = get_iface_desc(alts);             237         altsd = get_iface_desc(alts);
238                                                   238 
239         /* must have an isochronous endpoint f    239         /* must have an isochronous endpoint for streaming */
240         if (altsd->bNumEndpoints < 1)             240         if (altsd->bNumEndpoints < 1)
241                 return -ENODEV;                   241                 return -ENODEV;
242         epd = get_endpoint(alts, 0);              242         epd = get_endpoint(alts, 0);
243         if (!usb_endpoint_xfer_isoc(epd))         243         if (!usb_endpoint_xfer_isoc(epd))
244                 return -ENODEV;                   244                 return -ENODEV;
245                                                   245 
246         /* must have format descriptors */        246         /* must have format descriptors */
247         ashd = snd_usb_find_csint_desc(alts->e    247         ashd = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL,
248                                        UAC_AS_    248                                        UAC_AS_GENERAL);
249         fmtd = snd_usb_find_csint_desc(alts->e    249         fmtd = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL,
250                                        UAC_FOR    250                                        UAC_FORMAT_TYPE);
251         if (!ashd || ashd->bLength < 7 ||         251         if (!ashd || ashd->bLength < 7 ||
252             !fmtd || fmtd->bLength < 8)           252             !fmtd || fmtd->bLength < 8)
253                 return -ENODEV;                   253                 return -ENODEV;
254                                                   254 
255         return create_standard_audio_quirk(chi    255         return create_standard_audio_quirk(chip, iface, driver, NULL);
256 }                                                 256 }
257                                                   257 
258 static int create_yamaha_midi_quirk(struct snd    258 static int create_yamaha_midi_quirk(struct snd_usb_audio *chip,
259                                     struct usb    259                                     struct usb_interface *iface,
260                                     struct usb    260                                     struct usb_driver *driver,
261                                     struct usb    261                                     struct usb_host_interface *alts)
262 {                                                 262 {
263         static const struct snd_usb_audio_quir    263         static const struct snd_usb_audio_quirk yamaha_midi_quirk = {
264                 .type = QUIRK_MIDI_YAMAHA         264                 .type = QUIRK_MIDI_YAMAHA
265         };                                        265         };
266         struct usb_midi_in_jack_descriptor *in    266         struct usb_midi_in_jack_descriptor *injd;
267         struct usb_midi_out_jack_descriptor *o    267         struct usb_midi_out_jack_descriptor *outjd;
268                                                   268 
269         /* must have some valid jack descripto    269         /* must have some valid jack descriptors */
270         injd = snd_usb_find_csint_desc(alts->e    270         injd = snd_usb_find_csint_desc(alts->extra, alts->extralen,
271                                        NULL, U    271                                        NULL, USB_MS_MIDI_IN_JACK);
272         outjd = snd_usb_find_csint_desc(alts->    272         outjd = snd_usb_find_csint_desc(alts->extra, alts->extralen,
273                                         NULL,     273                                         NULL, USB_MS_MIDI_OUT_JACK);
274         if (!injd && !outjd)                      274         if (!injd && !outjd)
275                 return -ENODEV;                   275                 return -ENODEV;
276         if ((injd && !snd_usb_validate_midi_de    276         if ((injd && !snd_usb_validate_midi_desc(injd)) ||
277             (outjd && !snd_usb_validate_midi_d    277             (outjd && !snd_usb_validate_midi_desc(outjd)))
278                 return -ENODEV;                   278                 return -ENODEV;
279         if (injd && (injd->bLength < 5 ||         279         if (injd && (injd->bLength < 5 ||
280                      (injd->bJackType != USB_M    280                      (injd->bJackType != USB_MS_EMBEDDED &&
281                       injd->bJackType != USB_M    281                       injd->bJackType != USB_MS_EXTERNAL)))
282                 return -ENODEV;                   282                 return -ENODEV;
283         if (outjd && (outjd->bLength < 6 ||       283         if (outjd && (outjd->bLength < 6 ||
284                       (outjd->bJackType != USB    284                       (outjd->bJackType != USB_MS_EMBEDDED &&
285                        outjd->bJackType != USB    285                        outjd->bJackType != USB_MS_EXTERNAL)))
286                 return -ENODEV;                   286                 return -ENODEV;
287         return create_any_midi_quirk(chip, ifa    287         return create_any_midi_quirk(chip, iface, driver, &yamaha_midi_quirk);
288 }                                                 288 }
289                                                   289 
290 static int create_roland_midi_quirk(struct snd    290 static int create_roland_midi_quirk(struct snd_usb_audio *chip,
291                                     struct usb    291                                     struct usb_interface *iface,
292                                     struct usb    292                                     struct usb_driver *driver,
293                                     struct usb    293                                     struct usb_host_interface *alts)
294 {                                                 294 {
295         static const struct snd_usb_audio_quir    295         static const struct snd_usb_audio_quirk roland_midi_quirk = {
296                 .type = QUIRK_MIDI_ROLAND         296                 .type = QUIRK_MIDI_ROLAND
297         };                                        297         };
298         u8 *roland_desc = NULL;                   298         u8 *roland_desc = NULL;
299                                                   299 
300         /* might have a vendor-specific descri    300         /* might have a vendor-specific descriptor <06 24 F1 02 ...> */
301         for (;;) {                                301         for (;;) {
302                 roland_desc = snd_usb_find_csi    302                 roland_desc = snd_usb_find_csint_desc(alts->extra,
303                                                   303                                                       alts->extralen,
304                                                   304                                                       roland_desc, 0xf1);
305                 if (!roland_desc)                 305                 if (!roland_desc)
306                         return -ENODEV;           306                         return -ENODEV;
307                 if (roland_desc[0] < 6 || rola    307                 if (roland_desc[0] < 6 || roland_desc[3] != 2)
308                         continue;                 308                         continue;
309                 return create_any_midi_quirk(c    309                 return create_any_midi_quirk(chip, iface, driver,
310                                              &    310                                              &roland_midi_quirk);
311         }                                         311         }
312 }                                                 312 }
313                                                   313 
314 static int create_std_midi_quirk(struct snd_us    314 static int create_std_midi_quirk(struct snd_usb_audio *chip,
315                                  struct usb_in    315                                  struct usb_interface *iface,
316                                  struct usb_dr    316                                  struct usb_driver *driver,
317                                  struct usb_ho    317                                  struct usb_host_interface *alts)
318 {                                                 318 {
319         struct usb_ms_header_descriptor *mshd;    319         struct usb_ms_header_descriptor *mshd;
320         struct usb_ms_endpoint_descriptor *mse    320         struct usb_ms_endpoint_descriptor *msepd;
321                                                   321 
322         /* must have the MIDIStreaming interfa    322         /* must have the MIDIStreaming interface header descriptor*/
323         mshd = (struct usb_ms_header_descripto    323         mshd = (struct usb_ms_header_descriptor *)alts->extra;
324         if (alts->extralen < 7 ||                 324         if (alts->extralen < 7 ||
325             mshd->bLength < 7 ||                  325             mshd->bLength < 7 ||
326             mshd->bDescriptorType != USB_DT_CS    326             mshd->bDescriptorType != USB_DT_CS_INTERFACE ||
327             mshd->bDescriptorSubtype != USB_MS    327             mshd->bDescriptorSubtype != USB_MS_HEADER)
328                 return -ENODEV;                   328                 return -ENODEV;
329         /* must have the MIDIStreaming endpoin    329         /* must have the MIDIStreaming endpoint descriptor*/
330         msepd = (struct usb_ms_endpoint_descri    330         msepd = (struct usb_ms_endpoint_descriptor *)alts->endpoint[0].extra;
331         if (alts->endpoint[0].extralen < 4 ||     331         if (alts->endpoint[0].extralen < 4 ||
332             msepd->bLength < 4 ||                 332             msepd->bLength < 4 ||
333             msepd->bDescriptorType != USB_DT_C    333             msepd->bDescriptorType != USB_DT_CS_ENDPOINT ||
334             msepd->bDescriptorSubtype != UAC_M    334             msepd->bDescriptorSubtype != UAC_MS_GENERAL ||
335             msepd->bNumEmbMIDIJack < 1 ||         335             msepd->bNumEmbMIDIJack < 1 ||
336             msepd->bNumEmbMIDIJack > 16)          336             msepd->bNumEmbMIDIJack > 16)
337                 return -ENODEV;                   337                 return -ENODEV;
338                                                   338 
339         return create_any_midi_quirk(chip, ifa    339         return create_any_midi_quirk(chip, iface, driver, NULL);
340 }                                                 340 }
341                                                   341 
342 static int create_auto_midi_quirk(struct snd_u    342 static int create_auto_midi_quirk(struct snd_usb_audio *chip,
343                                   struct usb_i    343                                   struct usb_interface *iface,
344                                   struct usb_d    344                                   struct usb_driver *driver)
345 {                                                 345 {
346         struct usb_host_interface *alts;          346         struct usb_host_interface *alts;
347         struct usb_interface_descriptor *altsd    347         struct usb_interface_descriptor *altsd;
348         struct usb_endpoint_descriptor *epd;      348         struct usb_endpoint_descriptor *epd;
349         int err;                                  349         int err;
350                                                   350 
351         alts = &iface->altsetting[0];             351         alts = &iface->altsetting[0];
352         altsd = get_iface_desc(alts);             352         altsd = get_iface_desc(alts);
353                                                   353 
354         /* must have at least one bulk/interru    354         /* must have at least one bulk/interrupt endpoint for streaming */
355         if (altsd->bNumEndpoints < 1)             355         if (altsd->bNumEndpoints < 1)
356                 return -ENODEV;                   356                 return -ENODEV;
357         epd = get_endpoint(alts, 0);              357         epd = get_endpoint(alts, 0);
358         if (!usb_endpoint_xfer_bulk(epd) &&       358         if (!usb_endpoint_xfer_bulk(epd) &&
359             !usb_endpoint_xfer_int(epd))          359             !usb_endpoint_xfer_int(epd))
360                 return -ENODEV;                   360                 return -ENODEV;
361                                                   361 
362         switch (USB_ID_VENDOR(chip->usb_id)) {    362         switch (USB_ID_VENDOR(chip->usb_id)) {
363         case 0x0499: /* Yamaha */                 363         case 0x0499: /* Yamaha */
364                 err = create_yamaha_midi_quirk    364                 err = create_yamaha_midi_quirk(chip, iface, driver, alts);
365                 if (err != -ENODEV)               365                 if (err != -ENODEV)
366                         return err;               366                         return err;
367                 break;                            367                 break;
368         case 0x0582: /* Roland */                 368         case 0x0582: /* Roland */
369                 err = create_roland_midi_quirk    369                 err = create_roland_midi_quirk(chip, iface, driver, alts);
370                 if (err != -ENODEV)               370                 if (err != -ENODEV)
371                         return err;               371                         return err;
372                 break;                            372                 break;
373         }                                         373         }
374                                                   374 
375         return create_std_midi_quirk(chip, ifa    375         return create_std_midi_quirk(chip, iface, driver, alts);
376 }                                                 376 }
377                                                   377 
378 static int create_autodetect_quirk(struct snd_    378 static int create_autodetect_quirk(struct snd_usb_audio *chip,
379                                    struct usb_    379                                    struct usb_interface *iface,
380                                    struct usb_    380                                    struct usb_driver *driver,
381                                    const struc    381                                    const struct snd_usb_audio_quirk *quirk)
382 {                                                 382 {
383         int err;                                  383         int err;
384                                                   384 
385         err = create_auto_pcm_quirk(chip, ifac    385         err = create_auto_pcm_quirk(chip, iface, driver);
386         if (err == -ENODEV)                       386         if (err == -ENODEV)
387                 err = create_auto_midi_quirk(c    387                 err = create_auto_midi_quirk(chip, iface, driver);
388         return err;                               388         return err;
389 }                                                 389 }
390                                                   390 
391 /*                                                391 /*
392  * Create a stream for an Edirol UA-700/UA-25/    392  * Create a stream for an Edirol UA-700/UA-25/UA-4FX interface.  
393  * The only way to detect the sample rate is b    393  * The only way to detect the sample rate is by looking at wMaxPacketSize.
394  */                                               394  */
395 static int create_uaxx_quirk(struct snd_usb_au    395 static int create_uaxx_quirk(struct snd_usb_audio *chip,
396                              struct usb_interf    396                              struct usb_interface *iface,
397                              struct usb_driver    397                              struct usb_driver *driver,
398                              const struct snd_    398                              const struct snd_usb_audio_quirk *quirk)
399 {                                                 399 {
400         static const struct audioformat ua_for    400         static const struct audioformat ua_format = {
401                 .formats = SNDRV_PCM_FMTBIT_S2    401                 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
402                 .channels = 2,                    402                 .channels = 2,
403                 .fmt_type = UAC_FORMAT_TYPE_I,    403                 .fmt_type = UAC_FORMAT_TYPE_I,
404                 .altsetting = 1,                  404                 .altsetting = 1,
405                 .altset_idx = 1,                  405                 .altset_idx = 1,
406                 .rates = SNDRV_PCM_RATE_CONTIN    406                 .rates = SNDRV_PCM_RATE_CONTINUOUS,
407         };                                        407         };
408         struct usb_host_interface *alts;          408         struct usb_host_interface *alts;
409         struct usb_interface_descriptor *altsd    409         struct usb_interface_descriptor *altsd;
410         struct audioformat *fp;                   410         struct audioformat *fp;
411         int err;                                  411         int err;
412                                                   412 
413         /* both PCM and MIDI interfaces have 2    413         /* both PCM and MIDI interfaces have 2 or more altsettings */
414         if (iface->num_altsetting < 2)            414         if (iface->num_altsetting < 2)
415                 return -ENXIO;                    415                 return -ENXIO;
416         alts = &iface->altsetting[1];             416         alts = &iface->altsetting[1];
417         altsd = get_iface_desc(alts);             417         altsd = get_iface_desc(alts);
418                                                   418 
419         if (altsd->bNumEndpoints == 2) {          419         if (altsd->bNumEndpoints == 2) {
420                 static const struct snd_usb_mi    420                 static const struct snd_usb_midi_endpoint_info ua700_ep = {
421                         .out_cables = 0x0003,     421                         .out_cables = 0x0003,
422                         .in_cables  = 0x0003      422                         .in_cables  = 0x0003
423                 };                                423                 };
424                 static const struct snd_usb_au    424                 static const struct snd_usb_audio_quirk ua700_quirk = {
425                         .type = QUIRK_MIDI_FIX    425                         .type = QUIRK_MIDI_FIXED_ENDPOINT,
426                         .data = &ua700_ep         426                         .data = &ua700_ep
427                 };                                427                 };
428                 static const struct snd_usb_mi    428                 static const struct snd_usb_midi_endpoint_info uaxx_ep = {
429                         .out_cables = 0x0001,     429                         .out_cables = 0x0001,
430                         .in_cables  = 0x0001      430                         .in_cables  = 0x0001
431                 };                                431                 };
432                 static const struct snd_usb_au    432                 static const struct snd_usb_audio_quirk uaxx_quirk = {
433                         .type = QUIRK_MIDI_FIX    433                         .type = QUIRK_MIDI_FIXED_ENDPOINT,
434                         .data = &uaxx_ep          434                         .data = &uaxx_ep
435                 };                                435                 };
436                 const struct snd_usb_audio_qui    436                 const struct snd_usb_audio_quirk *quirk =
437                         chip->usb_id == USB_ID    437                         chip->usb_id == USB_ID(0x0582, 0x002b)
438                         ? &ua700_quirk : &uaxx    438                         ? &ua700_quirk : &uaxx_quirk;
439                 return __snd_usbmidi_create(ch    439                 return __snd_usbmidi_create(chip->card, iface,
440                                             &c    440                                             &chip->midi_list, quirk,
441                                             ch    441                                             chip->usb_id,
442                                             &c    442                                             &chip->num_rawmidis);
443         }                                         443         }
444                                                   444 
445         if (altsd->bNumEndpoints != 1)            445         if (altsd->bNumEndpoints != 1)
446                 return -ENXIO;                    446                 return -ENXIO;
447                                                   447 
448         fp = kmemdup(&ua_format, sizeof(*fp),     448         fp = kmemdup(&ua_format, sizeof(*fp), GFP_KERNEL);
449         if (!fp)                                  449         if (!fp)
450                 return -ENOMEM;                   450                 return -ENOMEM;
451                                                   451 
452         fp->iface = altsd->bInterfaceNumber;      452         fp->iface = altsd->bInterfaceNumber;
453         fp->endpoint = get_endpoint(alts, 0)->    453         fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
454         fp->ep_attr = get_endpoint(alts, 0)->b    454         fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
455         fp->datainterval = 0;                     455         fp->datainterval = 0;
456         fp->maxpacksize = le16_to_cpu(get_endp    456         fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
457         INIT_LIST_HEAD(&fp->list);                457         INIT_LIST_HEAD(&fp->list);
458                                                   458 
459         switch (fp->maxpacksize) {                459         switch (fp->maxpacksize) {
460         case 0x120:                               460         case 0x120:
461                 fp->rate_max = fp->rate_min =     461                 fp->rate_max = fp->rate_min = 44100;
462                 break;                            462                 break;
463         case 0x138:                               463         case 0x138:
464         case 0x140:                               464         case 0x140:
465                 fp->rate_max = fp->rate_min =     465                 fp->rate_max = fp->rate_min = 48000;
466                 break;                            466                 break;
467         case 0x258:                               467         case 0x258:
468         case 0x260:                               468         case 0x260:
469                 fp->rate_max = fp->rate_min =     469                 fp->rate_max = fp->rate_min = 96000;
470                 break;                            470                 break;
471         default:                                  471         default:
472                 usb_audio_err(chip, "unknown s    472                 usb_audio_err(chip, "unknown sample rate\n");
473                 kfree(fp);                        473                 kfree(fp);
474                 return -ENXIO;                    474                 return -ENXIO;
475         }                                         475         }
476                                                   476 
477         err = add_audio_stream_from_fixed_fmt(    477         err = add_audio_stream_from_fixed_fmt(chip, fp);
478         if (err < 0) {                            478         if (err < 0) {
479                 list_del(&fp->list); /* unlink    479                 list_del(&fp->list); /* unlink for avoiding double-free */
480                 kfree(fp);                        480                 kfree(fp);
481                 return err;                       481                 return err;
482         }                                         482         }
483         usb_set_interface(chip->dev, fp->iface    483         usb_set_interface(chip->dev, fp->iface, 0);
484         return 0;                                 484         return 0;
485 }                                                 485 }
486                                                   486 
487 /*                                                487 /*
488  * Create a standard mixer for the specified i    488  * Create a standard mixer for the specified interface.
489  */                                               489  */
490 static int create_standard_mixer_quirk(struct     490 static int create_standard_mixer_quirk(struct snd_usb_audio *chip,
491                                        struct     491                                        struct usb_interface *iface,
492                                        struct     492                                        struct usb_driver *driver,
493                                        const s    493                                        const struct snd_usb_audio_quirk *quirk)
494 {                                                 494 {
495         if (quirk->ifnum < 0)                     495         if (quirk->ifnum < 0)
496                 return 0;                         496                 return 0;
497                                                   497 
498         return snd_usb_create_mixer(chip, quir    498         return snd_usb_create_mixer(chip, quirk->ifnum);
499 }                                                 499 }
500                                                   500 
501 /*                                                501 /*
502  * audio-interface quirks                         502  * audio-interface quirks
503  *                                                503  *
504  * returns zero if no standard audio/MIDI pars    504  * returns zero if no standard audio/MIDI parsing is needed.
505  * returns a positive value if standard audio/    505  * returns a positive value if standard audio/midi interfaces are parsed
506  * after this.                                    506  * after this.
507  * returns a negative value at error.             507  * returns a negative value at error.
508  */                                               508  */
509 int snd_usb_create_quirk(struct snd_usb_audio     509 int snd_usb_create_quirk(struct snd_usb_audio *chip,
510                          struct usb_interface     510                          struct usb_interface *iface,
511                          struct usb_driver *dr    511                          struct usb_driver *driver,
512                          const struct snd_usb_    512                          const struct snd_usb_audio_quirk *quirk)
513 {                                                 513 {
514         typedef int (*quirk_func_t)(struct snd    514         typedef int (*quirk_func_t)(struct snd_usb_audio *,
515                                     struct usb    515                                     struct usb_interface *,
516                                     struct usb    516                                     struct usb_driver *,
517                                     const stru    517                                     const struct snd_usb_audio_quirk *);
518         static const quirk_func_t quirk_funcs[    518         static const quirk_func_t quirk_funcs[] = {
519                 [QUIRK_IGNORE_INTERFACE] = ign    519                 [QUIRK_IGNORE_INTERFACE] = ignore_interface_quirk,
520                 [QUIRK_COMPOSITE] = create_com    520                 [QUIRK_COMPOSITE] = create_composite_quirk,
521                 [QUIRK_AUTODETECT] = create_au    521                 [QUIRK_AUTODETECT] = create_autodetect_quirk,
522                 [QUIRK_MIDI_STANDARD_INTERFACE    522                 [QUIRK_MIDI_STANDARD_INTERFACE] = create_any_midi_quirk,
523                 [QUIRK_MIDI_FIXED_ENDPOINT] =     523                 [QUIRK_MIDI_FIXED_ENDPOINT] = create_any_midi_quirk,
524                 [QUIRK_MIDI_YAMAHA] = create_a    524                 [QUIRK_MIDI_YAMAHA] = create_any_midi_quirk,
525                 [QUIRK_MIDI_ROLAND] = create_a    525                 [QUIRK_MIDI_ROLAND] = create_any_midi_quirk,
526                 [QUIRK_MIDI_MIDIMAN] = create_    526                 [QUIRK_MIDI_MIDIMAN] = create_any_midi_quirk,
527                 [QUIRK_MIDI_NOVATION] = create    527                 [QUIRK_MIDI_NOVATION] = create_any_midi_quirk,
528                 [QUIRK_MIDI_RAW_BYTES] = creat    528                 [QUIRK_MIDI_RAW_BYTES] = create_any_midi_quirk,
529                 [QUIRK_MIDI_EMAGIC] = create_a    529                 [QUIRK_MIDI_EMAGIC] = create_any_midi_quirk,
530                 [QUIRK_MIDI_CME] = create_any_    530                 [QUIRK_MIDI_CME] = create_any_midi_quirk,
531                 [QUIRK_MIDI_AKAI] = create_any    531                 [QUIRK_MIDI_AKAI] = create_any_midi_quirk,
532                 [QUIRK_MIDI_FTDI] = create_any    532                 [QUIRK_MIDI_FTDI] = create_any_midi_quirk,
533                 [QUIRK_MIDI_CH345] = create_an    533                 [QUIRK_MIDI_CH345] = create_any_midi_quirk,
534                 [QUIRK_AUDIO_STANDARD_INTERFAC    534                 [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
535                 [QUIRK_AUDIO_FIXED_ENDPOINT] =    535                 [QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
536                 [QUIRK_AUDIO_EDIROL_UAXX] = cr    536                 [QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
537                 [QUIRK_AUDIO_STANDARD_MIXER] =    537                 [QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
538         };                                        538         };
539                                                   539 
540         if (quirk->type < QUIRK_TYPE_COUNT) {     540         if (quirk->type < QUIRK_TYPE_COUNT) {
541                 return quirk_funcs[quirk->type    541                 return quirk_funcs[quirk->type](chip, iface, driver, quirk);
542         } else {                                  542         } else {
543                 usb_audio_err(chip, "invalid q    543                 usb_audio_err(chip, "invalid quirk type %d\n", quirk->type);
544                 return -ENXIO;                    544                 return -ENXIO;
545         }                                         545         }
546 }                                                 546 }
547                                                   547 
548 /*                                                548 /*
549  * boot quirks                                    549  * boot quirks
550  */                                               550  */
551                                                   551 
552 #define EXTIGY_FIRMWARE_SIZE_OLD 794              552 #define EXTIGY_FIRMWARE_SIZE_OLD 794
553 #define EXTIGY_FIRMWARE_SIZE_NEW 483              553 #define EXTIGY_FIRMWARE_SIZE_NEW 483
554                                                   554 
555 static int snd_usb_extigy_boot_quirk(struct us    555 static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interface *intf)
556 {                                                 556 {
557         struct usb_host_config *config = dev->    557         struct usb_host_config *config = dev->actconfig;
558         int err;                                  558         int err;
559                                                   559 
560         if (le16_to_cpu(get_cfg_desc(config)->    560         if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
561             le16_to_cpu(get_cfg_desc(config)->    561             le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_NEW) {
562                 dev_dbg(&dev->dev, "sending Ex    562                 dev_dbg(&dev->dev, "sending Extigy boot sequence...\n");
563                 /* Send message to force it to    563                 /* Send message to force it to reconnect with full interface. */
564                 err = snd_usb_ctl_msg(dev, usb    564                 err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev,0),
565                                       0x10, 0x    565                                       0x10, 0x43, 0x0001, 0x000a, NULL, 0);
566                 if (err < 0)                      566                 if (err < 0)
567                         dev_dbg(&dev->dev, "er    567                         dev_dbg(&dev->dev, "error sending boot message: %d\n", err);
568                 err = usb_get_descriptor(dev,     568                 err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
569                                 &dev->descript    569                                 &dev->descriptor, sizeof(dev->descriptor));
570                 config = dev->actconfig;          570                 config = dev->actconfig;
571                 if (err < 0)                      571                 if (err < 0)
572                         dev_dbg(&dev->dev, "er    572                         dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
573                 err = usb_reset_configuration(    573                 err = usb_reset_configuration(dev);
574                 if (err < 0)                      574                 if (err < 0)
575                         dev_dbg(&dev->dev, "er    575                         dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
576                 dev_dbg(&dev->dev, "extigy_boo    576                 dev_dbg(&dev->dev, "extigy_boot: new boot length = %d\n",
577                             le16_to_cpu(get_cf    577                             le16_to_cpu(get_cfg_desc(config)->wTotalLength));
578                 return -ENODEV; /* quit this a    578                 return -ENODEV; /* quit this anyway */
579         }                                         579         }
580         return 0;                                 580         return 0;
581 }                                                 581 }
582                                                   582 
583 static int snd_usb_audigy2nx_boot_quirk(struct    583 static int snd_usb_audigy2nx_boot_quirk(struct usb_device *dev)
584 {                                                 584 {
585         u8 buf = 1;                               585         u8 buf = 1;
586                                                   586 
587         snd_usb_ctl_msg(dev, usb_rcvctrlpipe(d    587         snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), 0x2a,
588                         USB_DIR_IN | USB_TYPE_    588                         USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
589                         0, 0, &buf, 1);           589                         0, 0, &buf, 1);
590         if (buf == 0) {                           590         if (buf == 0) {
591                 snd_usb_ctl_msg(dev, usb_sndct    591                 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), 0x29,
592                                 USB_DIR_OUT |     592                                 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
593                                 1, 2000, NULL,    593                                 1, 2000, NULL, 0);
594                 return -ENODEV;                   594                 return -ENODEV;
595         }                                         595         }
596         return 0;                                 596         return 0;
597 }                                                 597 }
598                                                   598 
599 static int snd_usb_fasttrackpro_boot_quirk(str    599 static int snd_usb_fasttrackpro_boot_quirk(struct usb_device *dev)
600 {                                                 600 {
601         int err;                                  601         int err;
602                                                   602 
603         if (dev->actconfig->desc.bConfiguratio    603         if (dev->actconfig->desc.bConfigurationValue == 1) {
604                 dev_info(&dev->dev,               604                 dev_info(&dev->dev,
605                            "Fast Track Pro swi    605                            "Fast Track Pro switching to config #2\n");
606                 /* This function has to be ava    606                 /* This function has to be available by the usb core module.
607                  * if it is not avialable the     607                  * if it is not avialable the boot quirk has to be left out
608                  * and the configuration has t    608                  * and the configuration has to be set by udev or hotplug
609                  * rules                          609                  * rules
610                  */                               610                  */
611                 err = usb_driver_set_configura    611                 err = usb_driver_set_configuration(dev, 2);
612                 if (err < 0)                      612                 if (err < 0)
613                         dev_dbg(&dev->dev,        613                         dev_dbg(&dev->dev,
614                                 "error usb_dri    614                                 "error usb_driver_set_configuration: %d\n",
615                                 err);             615                                 err);
616                 /* Always return an error, so     616                 /* Always return an error, so that we stop creating a device
617                    that will just be destroyed    617                    that will just be destroyed and recreated with a new
618                    configuration */               618                    configuration */
619                 return -ENODEV;                   619                 return -ENODEV;
620         } else                                    620         } else
621                 dev_info(&dev->dev, "Fast Trac    621                 dev_info(&dev->dev, "Fast Track Pro config OK\n");
622                                                   622 
623         return 0;                                 623         return 0;
624 }                                                 624 }
625                                                   625 
626 /*                                                626 /*
627  * C-Media CM106/CM106+ have four 16-bit inter    627  * C-Media CM106/CM106+ have four 16-bit internal registers that are nicely
628  * documented in the device's data sheet.         628  * documented in the device's data sheet.
629  */                                               629  */
630 static int snd_usb_cm106_write_int_reg(struct     630 static int snd_usb_cm106_write_int_reg(struct usb_device *dev, int reg, u16 value)
631 {                                                 631 {
632         u8 buf[4];                                632         u8 buf[4];
633         buf[0] = 0x20;                            633         buf[0] = 0x20;
634         buf[1] = value & 0xff;                    634         buf[1] = value & 0xff;
635         buf[2] = (value >> 8) & 0xff;             635         buf[2] = (value >> 8) & 0xff;
636         buf[3] = reg;                             636         buf[3] = reg;
637         return snd_usb_ctl_msg(dev, usb_sndctr    637         return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_CONFIGURATION,
638                                USB_DIR_OUT | U    638                                USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT,
639                                0, 0, &buf, 4);    639                                0, 0, &buf, 4);
640 }                                                 640 }
641                                                   641 
642 static int snd_usb_cm106_boot_quirk(struct usb    642 static int snd_usb_cm106_boot_quirk(struct usb_device *dev)
643 {                                                 643 {
644         /*                                        644         /*
645          * Enable line-out driver mode, set he    645          * Enable line-out driver mode, set headphone source to front
646          * channels, enable stereo mic.           646          * channels, enable stereo mic.
647          */                                       647          */
648         return snd_usb_cm106_write_int_reg(dev    648         return snd_usb_cm106_write_int_reg(dev, 2, 0x8004);
649 }                                                 649 }
650                                                   650 
651 /*                                                651 /*
652  * CM6206 registers from the CM6206 datasheet     652  * CM6206 registers from the CM6206 datasheet rev 2.1
653  */                                               653  */
654 #define CM6206_REG0_DMA_MASTER BIT(15)            654 #define CM6206_REG0_DMA_MASTER BIT(15)
655 #define CM6206_REG0_SPDIFO_RATE_48K (2 << 12)     655 #define CM6206_REG0_SPDIFO_RATE_48K (2 << 12)
656 #define CM6206_REG0_SPDIFO_RATE_96K (7 << 12)     656 #define CM6206_REG0_SPDIFO_RATE_96K (7 << 12)
657 /* Bit 4 thru 11 is the S/PDIF category code *    657 /* Bit 4 thru 11 is the S/PDIF category code */
658 #define CM6206_REG0_SPDIFO_CAT_CODE_GENERAL (0    658 #define CM6206_REG0_SPDIFO_CAT_CODE_GENERAL (0 << 4)
659 #define CM6206_REG0_SPDIFO_EMPHASIS_CD BIT(3)     659 #define CM6206_REG0_SPDIFO_EMPHASIS_CD BIT(3)
660 #define CM6206_REG0_SPDIFO_COPYRIGHT_NA BIT(2)    660 #define CM6206_REG0_SPDIFO_COPYRIGHT_NA BIT(2)
661 #define CM6206_REG0_SPDIFO_NON_AUDIO BIT(1)       661 #define CM6206_REG0_SPDIFO_NON_AUDIO BIT(1)
662 #define CM6206_REG0_SPDIFO_PRO_FORMAT BIT(0)      662 #define CM6206_REG0_SPDIFO_PRO_FORMAT BIT(0)
663                                                   663 
664 #define CM6206_REG1_TEST_SEL_CLK BIT(14)          664 #define CM6206_REG1_TEST_SEL_CLK BIT(14)
665 #define CM6206_REG1_PLLBIN_EN BIT(13)             665 #define CM6206_REG1_PLLBIN_EN BIT(13)
666 #define CM6206_REG1_SOFT_MUTE_EN BIT(12)          666 #define CM6206_REG1_SOFT_MUTE_EN BIT(12)
667 #define CM6206_REG1_GPIO4_OUT BIT(11)             667 #define CM6206_REG1_GPIO4_OUT BIT(11)
668 #define CM6206_REG1_GPIO4_OE BIT(10)              668 #define CM6206_REG1_GPIO4_OE BIT(10)
669 #define CM6206_REG1_GPIO3_OUT BIT(9)              669 #define CM6206_REG1_GPIO3_OUT BIT(9)
670 #define CM6206_REG1_GPIO3_OE BIT(8)               670 #define CM6206_REG1_GPIO3_OE BIT(8)
671 #define CM6206_REG1_GPIO2_OUT BIT(7)              671 #define CM6206_REG1_GPIO2_OUT BIT(7)
672 #define CM6206_REG1_GPIO2_OE BIT(6)               672 #define CM6206_REG1_GPIO2_OE BIT(6)
673 #define CM6206_REG1_GPIO1_OUT BIT(5)              673 #define CM6206_REG1_GPIO1_OUT BIT(5)
674 #define CM6206_REG1_GPIO1_OE BIT(4)               674 #define CM6206_REG1_GPIO1_OE BIT(4)
675 #define CM6206_REG1_SPDIFO_INVALID BIT(3)         675 #define CM6206_REG1_SPDIFO_INVALID BIT(3)
676 #define CM6206_REG1_SPDIF_LOOP_EN BIT(2)          676 #define CM6206_REG1_SPDIF_LOOP_EN BIT(2)
677 #define CM6206_REG1_SPDIFO_DIS BIT(1)             677 #define CM6206_REG1_SPDIFO_DIS BIT(1)
678 #define CM6206_REG1_SPDIFI_MIX BIT(0)             678 #define CM6206_REG1_SPDIFI_MIX BIT(0)
679                                                   679 
680 #define CM6206_REG2_DRIVER_ON BIT(15)             680 #define CM6206_REG2_DRIVER_ON BIT(15)
681 #define CM6206_REG2_HEADP_SEL_SIDE_CHANNELS (0    681 #define CM6206_REG2_HEADP_SEL_SIDE_CHANNELS (0 << 13)
682 #define CM6206_REG2_HEADP_SEL_SURROUND_CHANNEL    682 #define CM6206_REG2_HEADP_SEL_SURROUND_CHANNELS (1 << 13)
683 #define CM6206_REG2_HEADP_SEL_CENTER_SUBW (2 <    683 #define CM6206_REG2_HEADP_SEL_CENTER_SUBW (2 << 13)
684 #define CM6206_REG2_HEADP_SEL_FRONT_CHANNELS (    684 #define CM6206_REG2_HEADP_SEL_FRONT_CHANNELS (3 << 13)
685 #define CM6206_REG2_MUTE_HEADPHONE_RIGHT BIT(1    685 #define CM6206_REG2_MUTE_HEADPHONE_RIGHT BIT(12)
686 #define CM6206_REG2_MUTE_HEADPHONE_LEFT BIT(11    686 #define CM6206_REG2_MUTE_HEADPHONE_LEFT BIT(11)
687 #define CM6206_REG2_MUTE_REAR_SURROUND_RIGHT B    687 #define CM6206_REG2_MUTE_REAR_SURROUND_RIGHT BIT(10)
688 #define CM6206_REG2_MUTE_REAR_SURROUND_LEFT BI    688 #define CM6206_REG2_MUTE_REAR_SURROUND_LEFT BIT(9)
689 #define CM6206_REG2_MUTE_SIDE_SURROUND_RIGHT B    689 #define CM6206_REG2_MUTE_SIDE_SURROUND_RIGHT BIT(8)
690 #define CM6206_REG2_MUTE_SIDE_SURROUND_LEFT BI    690 #define CM6206_REG2_MUTE_SIDE_SURROUND_LEFT BIT(7)
691 #define CM6206_REG2_MUTE_SUBWOOFER BIT(6)         691 #define CM6206_REG2_MUTE_SUBWOOFER BIT(6)
692 #define CM6206_REG2_MUTE_CENTER BIT(5)            692 #define CM6206_REG2_MUTE_CENTER BIT(5)
693 #define CM6206_REG2_MUTE_RIGHT_FRONT BIT(3)       693 #define CM6206_REG2_MUTE_RIGHT_FRONT BIT(3)
694 #define CM6206_REG2_MUTE_LEFT_FRONT BIT(3)        694 #define CM6206_REG2_MUTE_LEFT_FRONT BIT(3)
695 #define CM6206_REG2_EN_BTL BIT(2)                 695 #define CM6206_REG2_EN_BTL BIT(2)
696 #define CM6206_REG2_MCUCLKSEL_1_5_MHZ (0)         696 #define CM6206_REG2_MCUCLKSEL_1_5_MHZ (0)
697 #define CM6206_REG2_MCUCLKSEL_3_MHZ (1)           697 #define CM6206_REG2_MCUCLKSEL_3_MHZ (1)
698 #define CM6206_REG2_MCUCLKSEL_6_MHZ (2)           698 #define CM6206_REG2_MCUCLKSEL_6_MHZ (2)
699 #define CM6206_REG2_MCUCLKSEL_12_MHZ (3)          699 #define CM6206_REG2_MCUCLKSEL_12_MHZ (3)
700                                                   700 
701 /* Bit 11..13 sets the sensitivity to FLY tune    701 /* Bit 11..13 sets the sensitivity to FLY tuner volume control VP/VD signal */
702 #define CM6206_REG3_FLYSPEED_DEFAULT (2 << 11)    702 #define CM6206_REG3_FLYSPEED_DEFAULT (2 << 11)
703 #define CM6206_REG3_VRAP25EN BIT(10)              703 #define CM6206_REG3_VRAP25EN BIT(10)
704 #define CM6206_REG3_MSEL1 BIT(9)                  704 #define CM6206_REG3_MSEL1 BIT(9)
705 #define CM6206_REG3_SPDIFI_RATE_44_1K BIT(0 <<    705 #define CM6206_REG3_SPDIFI_RATE_44_1K BIT(0 << 7)
706 #define CM6206_REG3_SPDIFI_RATE_48K BIT(2 << 7    706 #define CM6206_REG3_SPDIFI_RATE_48K BIT(2 << 7)
707 #define CM6206_REG3_SPDIFI_RATE_32K BIT(3 << 7    707 #define CM6206_REG3_SPDIFI_RATE_32K BIT(3 << 7)
708 #define CM6206_REG3_PINSEL BIT(6)                 708 #define CM6206_REG3_PINSEL BIT(6)
709 #define CM6206_REG3_FOE BIT(5)                    709 #define CM6206_REG3_FOE BIT(5)
710 #define CM6206_REG3_ROE BIT(4)                    710 #define CM6206_REG3_ROE BIT(4)
711 #define CM6206_REG3_CBOE BIT(3)                   711 #define CM6206_REG3_CBOE BIT(3)
712 #define CM6206_REG3_LOSE BIT(2)                   712 #define CM6206_REG3_LOSE BIT(2)
713 #define CM6206_REG3_HPOE BIT(1)                   713 #define CM6206_REG3_HPOE BIT(1)
714 #define CM6206_REG3_SPDIFI_CANREC BIT(0)          714 #define CM6206_REG3_SPDIFI_CANREC BIT(0)
715                                                   715 
716 #define CM6206_REG5_DA_RSTN BIT(13)               716 #define CM6206_REG5_DA_RSTN BIT(13)
717 #define CM6206_REG5_AD_RSTN BIT(12)               717 #define CM6206_REG5_AD_RSTN BIT(12)
718 #define CM6206_REG5_SPDIFO_AD2SPDO BIT(12)        718 #define CM6206_REG5_SPDIFO_AD2SPDO BIT(12)
719 #define CM6206_REG5_SPDIFO_SEL_FRONT (0 << 9)     719 #define CM6206_REG5_SPDIFO_SEL_FRONT (0 << 9)
720 #define CM6206_REG5_SPDIFO_SEL_SIDE_SUR (1 <<     720 #define CM6206_REG5_SPDIFO_SEL_SIDE_SUR (1 << 9)
721 #define CM6206_REG5_SPDIFO_SEL_CEN_LFE (2 << 9    721 #define CM6206_REG5_SPDIFO_SEL_CEN_LFE (2 << 9)
722 #define CM6206_REG5_SPDIFO_SEL_REAR_SUR (3 <<     722 #define CM6206_REG5_SPDIFO_SEL_REAR_SUR (3 << 9)
723 #define CM6206_REG5_CODECM BIT(8)                 723 #define CM6206_REG5_CODECM BIT(8)
724 #define CM6206_REG5_EN_HPF BIT(7)                 724 #define CM6206_REG5_EN_HPF BIT(7)
725 #define CM6206_REG5_T_SEL_DSDA4 BIT(6)            725 #define CM6206_REG5_T_SEL_DSDA4 BIT(6)
726 #define CM6206_REG5_T_SEL_DSDA3 BIT(5)            726 #define CM6206_REG5_T_SEL_DSDA3 BIT(5)
727 #define CM6206_REG5_T_SEL_DSDA2 BIT(4)            727 #define CM6206_REG5_T_SEL_DSDA2 BIT(4)
728 #define CM6206_REG5_T_SEL_DSDA1 BIT(3)            728 #define CM6206_REG5_T_SEL_DSDA1 BIT(3)
729 #define CM6206_REG5_T_SEL_DSDAD_NORMAL 0          729 #define CM6206_REG5_T_SEL_DSDAD_NORMAL 0
730 #define CM6206_REG5_T_SEL_DSDAD_FRONT 4           730 #define CM6206_REG5_T_SEL_DSDAD_FRONT 4
731 #define CM6206_REG5_T_SEL_DSDAD_S_SURROUND 5      731 #define CM6206_REG5_T_SEL_DSDAD_S_SURROUND 5
732 #define CM6206_REG5_T_SEL_DSDAD_CEN_LFE 6         732 #define CM6206_REG5_T_SEL_DSDAD_CEN_LFE 6
733 #define CM6206_REG5_T_SEL_DSDAD_R_SURROUND 7      733 #define CM6206_REG5_T_SEL_DSDAD_R_SURROUND 7
734                                                   734 
735 static int snd_usb_cm6206_boot_quirk(struct us    735 static int snd_usb_cm6206_boot_quirk(struct usb_device *dev)
736 {                                                 736 {
737         int err  = 0, reg;                        737         int err  = 0, reg;
738         int val[] = {                             738         int val[] = {
739                 /*                                739                 /*
740                  * Values here are chosen base    740                  * Values here are chosen based on sniffing USB traffic
741                  * under Windows.                 741                  * under Windows.
742                  *                                742                  *
743                  * REG0: DAC is master, sample    743                  * REG0: DAC is master, sample rate 48kHz, no copyright
744                  */                               744                  */
745                 CM6206_REG0_SPDIFO_RATE_48K |     745                 CM6206_REG0_SPDIFO_RATE_48K |
746                 CM6206_REG0_SPDIFO_COPYRIGHT_N    746                 CM6206_REG0_SPDIFO_COPYRIGHT_NA,
747                 /*                                747                 /*
748                  * REG1: PLL binary search ena    748                  * REG1: PLL binary search enable, soft mute enable.
749                  */                               749                  */
750                 CM6206_REG1_PLLBIN_EN |           750                 CM6206_REG1_PLLBIN_EN |
751                 CM6206_REG1_SOFT_MUTE_EN,         751                 CM6206_REG1_SOFT_MUTE_EN,
752                 /*                                752                 /*
753                  * REG2: enable output drivers    753                  * REG2: enable output drivers,
754                  * select front channels to th    754                  * select front channels to the headphone output,
755                  * then mute the headphone cha    755                  * then mute the headphone channels, run the MCU
756                  * at 1.5 MHz.                    756                  * at 1.5 MHz.
757                  */                               757                  */
758                 CM6206_REG2_DRIVER_ON |           758                 CM6206_REG2_DRIVER_ON |
759                 CM6206_REG2_HEADP_SEL_FRONT_CH    759                 CM6206_REG2_HEADP_SEL_FRONT_CHANNELS |
760                 CM6206_REG2_MUTE_HEADPHONE_RIG    760                 CM6206_REG2_MUTE_HEADPHONE_RIGHT |
761                 CM6206_REG2_MUTE_HEADPHONE_LEF    761                 CM6206_REG2_MUTE_HEADPHONE_LEFT,
762                 /*                                762                 /*
763                  * REG3: default flyspeed, set    763                  * REG3: default flyspeed, set 2.5V mic bias
764                  * enable all line out ports a    764                  * enable all line out ports and enable SPDIF
765                  */                               765                  */
766                 CM6206_REG3_FLYSPEED_DEFAULT |    766                 CM6206_REG3_FLYSPEED_DEFAULT |
767                 CM6206_REG3_VRAP25EN |            767                 CM6206_REG3_VRAP25EN |
768                 CM6206_REG3_FOE |                 768                 CM6206_REG3_FOE |
769                 CM6206_REG3_ROE |                 769                 CM6206_REG3_ROE |
770                 CM6206_REG3_CBOE |                770                 CM6206_REG3_CBOE |
771                 CM6206_REG3_LOSE |                771                 CM6206_REG3_LOSE |
772                 CM6206_REG3_HPOE |                772                 CM6206_REG3_HPOE |
773                 CM6206_REG3_SPDIFI_CANREC,        773                 CM6206_REG3_SPDIFI_CANREC,
774                 /* REG4 is just a bunch of GPI    774                 /* REG4 is just a bunch of GPIO lines */
775                 0x0000,                           775                 0x0000,
776                 /* REG5: de-assert AD/DA reset    776                 /* REG5: de-assert AD/DA reset signals */
777                 CM6206_REG5_DA_RSTN |             777                 CM6206_REG5_DA_RSTN |
778                 CM6206_REG5_AD_RSTN };            778                 CM6206_REG5_AD_RSTN };
779                                                   779 
780         for (reg = 0; reg < ARRAY_SIZE(val); r    780         for (reg = 0; reg < ARRAY_SIZE(val); reg++) {
781                 err = snd_usb_cm106_write_int_    781                 err = snd_usb_cm106_write_int_reg(dev, reg, val[reg]);
782                 if (err < 0)                      782                 if (err < 0)
783                         return err;               783                         return err;
784         }                                         784         }
785                                                   785 
786         return err;                               786         return err;
787 }                                                 787 }
788                                                   788 
789 /* quirk for Plantronics GameCom 780 with CM63    789 /* quirk for Plantronics GameCom 780 with CM6302 chip */
790 static int snd_usb_gamecon780_boot_quirk(struc    790 static int snd_usb_gamecon780_boot_quirk(struct usb_device *dev)
791 {                                                 791 {
792         /* set the initial volume and don't ch    792         /* set the initial volume and don't change; other values are either
793          * too loud or silent due to firmware     793          * too loud or silent due to firmware bug (bko#65251)
794          */                                       794          */
795         u8 buf[2] = { 0x74, 0xe3 };               795         u8 buf[2] = { 0x74, 0xe3 };
796         return snd_usb_ctl_msg(dev, usb_sndctr    796         return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
797                         USB_RECIP_INTERFACE |     797                         USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
798                         UAC_FU_VOLUME << 8, 9     798                         UAC_FU_VOLUME << 8, 9 << 8, buf, 2);
799 }                                                 799 }
800                                                   800 
801 /*                                                801 /*
802  * Novation Twitch DJ controller                  802  * Novation Twitch DJ controller
803  * Focusrite Novation Saffire 6 USB audio card    803  * Focusrite Novation Saffire 6 USB audio card
804  */                                               804  */
805 static int snd_usb_novation_boot_quirk(struct     805 static int snd_usb_novation_boot_quirk(struct usb_device *dev)
806 {                                                 806 {
807         /* preemptively set up the device beca    807         /* preemptively set up the device because otherwise the
808          * raw MIDI endpoints are not active *    808          * raw MIDI endpoints are not active */
809         usb_set_interface(dev, 0, 1);             809         usb_set_interface(dev, 0, 1);
810         return 0;                                 810         return 0;
811 }                                                 811 }
812                                                   812 
813 /*                                                813 /*
814  * This call will put the synth in "USB send"     814  * This call will put the synth in "USB send" mode, i.e it will send MIDI
815  * messages through USB (this is disabled at s    815  * messages through USB (this is disabled at startup). The synth will
816  * acknowledge by sending a sysex on endpoint     816  * acknowledge by sending a sysex on endpoint 0x85 and by displaying a USB
817  * sign on its LCD. Values here are chosen bas    817  * sign on its LCD. Values here are chosen based on sniffing USB traffic
818  * under Windows.                                 818  * under Windows.
819  */                                               819  */
820 static int snd_usb_accessmusic_boot_quirk(stru    820 static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev)
821 {                                                 821 {
822         int err, actual_length;                   822         int err, actual_length;
823         /* "midi send" enable */                  823         /* "midi send" enable */
824         static const u8 seq[] = { 0x4e, 0x73,     824         static const u8 seq[] = { 0x4e, 0x73, 0x52, 0x01 };
825         void *buf;                                825         void *buf;
826                                                   826 
827         if (usb_pipe_type_check(dev, usb_sndin    827         if (usb_pipe_type_check(dev, usb_sndintpipe(dev, 0x05)))
828                 return -EINVAL;                   828                 return -EINVAL;
829         buf = kmemdup(seq, ARRAY_SIZE(seq), GF    829         buf = kmemdup(seq, ARRAY_SIZE(seq), GFP_KERNEL);
830         if (!buf)                                 830         if (!buf)
831                 return -ENOMEM;                   831                 return -ENOMEM;
832         err = usb_interrupt_msg(dev, usb_sndin    832         err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x05), buf,
833                         ARRAY_SIZE(seq), &actu    833                         ARRAY_SIZE(seq), &actual_length, 1000);
834         kfree(buf);                               834         kfree(buf);
835         if (err < 0)                              835         if (err < 0)
836                 return err;                       836                 return err;
837                                                   837 
838         return 0;                                 838         return 0;
839 }                                                 839 }
840                                                   840 
841 /*                                                841 /*
842  * Some sound cards from Native Instruments ar    842  * Some sound cards from Native Instruments are in fact compliant to the USB
843  * audio standard of version 2 and other appro    843  * audio standard of version 2 and other approved USB standards, even though
844  * they come up as vendor-specific device when    844  * they come up as vendor-specific device when first connected.
845  *                                                845  *
846  * However, they can be told to come up with a    846  * However, they can be told to come up with a new set of descriptors
847  * upon their next enumeration, and the interf    847  * upon their next enumeration, and the interfaces announced by the new
848  * descriptors will then be handled by the ker    848  * descriptors will then be handled by the kernel's class drivers. As the
849  * product ID will also change, no further che    849  * product ID will also change, no further checks are required.
850  */                                               850  */
851                                                   851 
852 static int snd_usb_nativeinstruments_boot_quir    852 static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev)
853 {                                                 853 {
854         int ret;                                  854         int ret;
855                                                   855 
856         ret = usb_control_msg(dev, usb_sndctrl    856         ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
857                                   0xaf, USB_TY    857                                   0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
858                                   1, 0, NULL,     858                                   1, 0, NULL, 0, 1000);
859                                                   859 
860         if (ret < 0)                              860         if (ret < 0)
861                 return ret;                       861                 return ret;
862                                                   862 
863         usb_reset_device(dev);                    863         usb_reset_device(dev);
864                                                   864 
865         /* return -EAGAIN, so the creation of     865         /* return -EAGAIN, so the creation of an audio interface for this
866          * temporary device is aborted. The de    866          * temporary device is aborted. The device will reconnect with a
867          * new product ID */                      867          * new product ID */
868         return -EAGAIN;                           868         return -EAGAIN;
869 }                                                 869 }
870                                                   870 
871 static void mbox2_setup_48_24_magic(struct usb    871 static void mbox2_setup_48_24_magic(struct usb_device *dev)
872 {                                                 872 {
873         u8 srate[3];                              873         u8 srate[3];
874         u8 temp[12];                              874         u8 temp[12];
875                                                   875 
876         /* Choose 48000Hz permanently */          876         /* Choose 48000Hz permanently */
877         srate[0] = 0x80;                          877         srate[0] = 0x80;
878         srate[1] = 0xbb;                          878         srate[1] = 0xbb;
879         srate[2] = 0x00;                          879         srate[2] = 0x00;
880                                                   880 
881         /* Send the magic! */                     881         /* Send the magic! */
882         snd_usb_ctl_msg(dev, usb_rcvctrlpipe(d    882         snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
883                 0x01, 0x22, 0x0100, 0x0085, &t    883                 0x01, 0x22, 0x0100, 0x0085, &temp, 0x0003);
884         snd_usb_ctl_msg(dev, usb_sndctrlpipe(d    884         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
885                 0x81, 0xa2, 0x0100, 0x0085, &s    885                 0x81, 0xa2, 0x0100, 0x0085, &srate, 0x0003);
886         snd_usb_ctl_msg(dev, usb_sndctrlpipe(d    886         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
887                 0x81, 0xa2, 0x0100, 0x0086, &s    887                 0x81, 0xa2, 0x0100, 0x0086, &srate, 0x0003);
888         snd_usb_ctl_msg(dev, usb_sndctrlpipe(d    888         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
889                 0x81, 0xa2, 0x0100, 0x0003, &s    889                 0x81, 0xa2, 0x0100, 0x0003, &srate, 0x0003);
890         return;                                   890         return;
891 }                                                 891 }
892                                                   892 
893 /* Digidesign Mbox 2 needs to load firmware on    893 /* Digidesign Mbox 2 needs to load firmware onboard
894  * and driver must wait a few seconds for init    894  * and driver must wait a few seconds for initialisation.
895  */                                               895  */
896                                                   896 
897 #define MBOX2_FIRMWARE_SIZE    646                897 #define MBOX2_FIRMWARE_SIZE    646
898 #define MBOX2_BOOT_LOADING     0x01 /* Hard co    898 #define MBOX2_BOOT_LOADING     0x01 /* Hard coded into the device */
899 #define MBOX2_BOOT_READY       0x02 /* Hard co    899 #define MBOX2_BOOT_READY       0x02 /* Hard coded into the device */
900                                                   900 
901 static int snd_usb_mbox2_boot_quirk(struct usb    901 static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
902 {                                                 902 {
903         struct usb_host_config *config = dev->    903         struct usb_host_config *config = dev->actconfig;
904         int err;                                  904         int err;
905         u8 bootresponse[0x12];                    905         u8 bootresponse[0x12];
906         int fwsize;                               906         int fwsize;
907         int count;                                907         int count;
908                                                   908 
909         fwsize = le16_to_cpu(get_cfg_desc(conf    909         fwsize = le16_to_cpu(get_cfg_desc(config)->wTotalLength);
910                                                   910 
911         if (fwsize != MBOX2_FIRMWARE_SIZE) {      911         if (fwsize != MBOX2_FIRMWARE_SIZE) {
912                 dev_err(&dev->dev, "Invalid fi    912                 dev_err(&dev->dev, "Invalid firmware size=%d.\n", fwsize);
913                 return -ENODEV;                   913                 return -ENODEV;
914         }                                         914         }
915                                                   915 
916         dev_dbg(&dev->dev, "Sending Digidesign    916         dev_dbg(&dev->dev, "Sending Digidesign Mbox 2 boot sequence...\n");
917                                                   917 
918         count = 0;                                918         count = 0;
919         bootresponse[0] = MBOX2_BOOT_LOADING;     919         bootresponse[0] = MBOX2_BOOT_LOADING;
920         while ((bootresponse[0] == MBOX2_BOOT_    920         while ((bootresponse[0] == MBOX2_BOOT_LOADING) && (count < 10)) {
921                 msleep(500); /* 0.5 second del    921                 msleep(500); /* 0.5 second delay */
922                 snd_usb_ctl_msg(dev, usb_rcvct    922                 snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
923                         /* Control magic - loa    923                         /* Control magic - load onboard firmware */
924                         0x85, 0xc0, 0x0001, 0x    924                         0x85, 0xc0, 0x0001, 0x0000, &bootresponse, 0x0012);
925                 if (bootresponse[0] == MBOX2_B    925                 if (bootresponse[0] == MBOX2_BOOT_READY)
926                         break;                    926                         break;
927                 dev_dbg(&dev->dev, "device not    927                 dev_dbg(&dev->dev, "device not ready, resending boot sequence...\n");
928                 count++;                          928                 count++;
929         }                                         929         }
930                                                   930 
931         if (bootresponse[0] != MBOX2_BOOT_READ    931         if (bootresponse[0] != MBOX2_BOOT_READY) {
932                 dev_err(&dev->dev, "Unknown bo    932                 dev_err(&dev->dev, "Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse[0]);
933                 return -ENODEV;                   933                 return -ENODEV;
934         }                                         934         }
935                                                   935 
936         dev_dbg(&dev->dev, "device initialised    936         dev_dbg(&dev->dev, "device initialised!\n");
937                                                   937 
938         err = usb_get_descriptor(dev, USB_DT_D    938         err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
939                 &dev->descriptor, sizeof(dev->    939                 &dev->descriptor, sizeof(dev->descriptor));
940         config = dev->actconfig;                  940         config = dev->actconfig;
941         if (err < 0)                              941         if (err < 0)
942                 dev_dbg(&dev->dev, "error usb_    942                 dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
943                                                   943 
944         err = usb_reset_configuration(dev);       944         err = usb_reset_configuration(dev);
945         if (err < 0)                              945         if (err < 0)
946                 dev_dbg(&dev->dev, "error usb_    946                 dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
947         dev_dbg(&dev->dev, "mbox2_boot: new bo    947         dev_dbg(&dev->dev, "mbox2_boot: new boot length = %d\n",
948                 le16_to_cpu(get_cfg_desc(confi    948                 le16_to_cpu(get_cfg_desc(config)->wTotalLength));
949                                                   949 
950         mbox2_setup_48_24_magic(dev);             950         mbox2_setup_48_24_magic(dev);
951                                                   951 
952         dev_info(&dev->dev, "Digidesign Mbox 2    952         dev_info(&dev->dev, "Digidesign Mbox 2: 24bit 48kHz");
953                                                   953 
954         return 0; /* Successful boot */           954         return 0; /* Successful boot */
955 }                                                 955 }
956                                                   956 
957 static int snd_usb_axefx3_boot_quirk(struct us    957 static int snd_usb_axefx3_boot_quirk(struct usb_device *dev)
958 {                                                 958 {
959         int err;                                  959         int err;
960                                                   960 
961         dev_dbg(&dev->dev, "Waiting for Axe-Fx    961         dev_dbg(&dev->dev, "Waiting for Axe-Fx III to boot up...\n");
962                                                   962 
963         /* If the Axe-Fx III has not fully boo    963         /* If the Axe-Fx III has not fully booted, it will timeout when trying
964          * to enable the audio streaming inter    964          * to enable the audio streaming interface. A more generous timeout is
965          * used here to detect when the Axe-Fx    965          * used here to detect when the Axe-Fx III has finished booting as the
966          * set interface message will be acked    966          * set interface message will be acked once it has
967          */                                       967          */
968         err = usb_control_msg(dev, usb_sndctrl    968         err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
969                                 USB_REQ_SET_IN    969                                 USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,
970                                 1, 1, NULL, 0,    970                                 1, 1, NULL, 0, 120000);
971         if (err < 0) {                            971         if (err < 0) {
972                 dev_err(&dev->dev,                972                 dev_err(&dev->dev,
973                         "failed waiting for Ax    973                         "failed waiting for Axe-Fx III to boot: %d\n", err);
974                 return err;                       974                 return err;
975         }                                         975         }
976                                                   976 
977         dev_dbg(&dev->dev, "Axe-Fx III is now     977         dev_dbg(&dev->dev, "Axe-Fx III is now ready\n");
978                                                   978 
979         err = usb_set_interface(dev, 1, 0);       979         err = usb_set_interface(dev, 1, 0);
980         if (err < 0)                              980         if (err < 0)
981                 dev_dbg(&dev->dev,                981                 dev_dbg(&dev->dev,
982                         "error stopping Axe-Fx    982                         "error stopping Axe-Fx III interface: %d\n", err);
983                                                   983 
984         return 0;                                 984         return 0;
985 }                                                 985 }
986                                                   986 
987 static void mbox3_setup_defaults(struct usb_de    987 static void mbox3_setup_defaults(struct usb_device *dev)
988 {                                                 988 {
989         /* The Mbox 3 is "little endian" */       989         /* The Mbox 3 is "little endian" */
990         /* max volume is: 0x0000. */              990         /* max volume is: 0x0000. */
991         /* min volume is: 0x0080 (shown in lit    991         /* min volume is: 0x0080 (shown in little endian form) */
992                                                   992 
993         u8 com_buff[2];                           993         u8 com_buff[2];
994                                                   994 
995         /* Deactivate Tuner */                    995         /* Deactivate Tuner */
996         /* on  = 0x01*/                           996         /* on  = 0x01*/
997         /* off = 0x00*/                           997         /* off = 0x00*/
998         com_buff[0] = 0x00;                       998         com_buff[0] = 0x00;
999         snd_usb_ctl_msg(dev, usb_sndctrlpipe(d    999         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1000                 0x01, 0x21, 0x0003, 0x2001, &    1000                 0x01, 0x21, 0x0003, 0x2001, &com_buff, 1);
1001                                                  1001 
1002         /* Set clock source to Internal (as o    1002         /* Set clock source to Internal (as opposed to S/PDIF) */
1003         /* Internal  = 0x01*/                    1003         /* Internal  = 0x01*/
1004         /* S/PDIF    = 0x02*/                    1004         /* S/PDIF    = 0x02*/
1005         com_buff[0] = 0x01;                      1005         com_buff[0] = 0x01;
1006         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1006         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1007                         1, 0x21, 0x0100, 0x80    1007                         1, 0x21, 0x0100, 0x8001, &com_buff, 1);
1008                                                  1008 
1009         /* Mute the hardware loopbacks to sta    1009         /* Mute the hardware loopbacks to start the device in a known state. */
1010         com_buff[0] = 0x00;                      1010         com_buff[0] = 0x00;
1011         com_buff[1] = 0x80;                      1011         com_buff[1] = 0x80;
1012         /* Analogue input 1 left channel: */     1012         /* Analogue input 1 left channel: */
1013         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1013         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1014                         1, 0x21, 0x0110, 0x40    1014                         1, 0x21, 0x0110, 0x4001, &com_buff, 2);
1015         /* Analogue input 1 right channel: */    1015         /* Analogue input 1 right channel: */
1016         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1016         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1017                         1, 0x21, 0x0111, 0x40    1017                         1, 0x21, 0x0111, 0x4001, &com_buff, 2);
1018         /* Analogue input 2 left channel: */     1018         /* Analogue input 2 left channel: */
1019         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1019         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1020                         1, 0x21, 0x0114, 0x40    1020                         1, 0x21, 0x0114, 0x4001, &com_buff, 2);
1021         /* Analogue input 2 right channel: */    1021         /* Analogue input 2 right channel: */
1022         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1022         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1023                         1, 0x21, 0x0115, 0x40    1023                         1, 0x21, 0x0115, 0x4001, &com_buff, 2);
1024         /* Analogue input 3 left channel: */     1024         /* Analogue input 3 left channel: */
1025         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1025         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1026                         1, 0x21, 0x0118, 0x40    1026                         1, 0x21, 0x0118, 0x4001, &com_buff, 2);
1027         /* Analogue input 3 right channel: */    1027         /* Analogue input 3 right channel: */
1028         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1028         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1029                         1, 0x21, 0x0119, 0x40    1029                         1, 0x21, 0x0119, 0x4001, &com_buff, 2);
1030         /* Analogue input 4 left channel: */     1030         /* Analogue input 4 left channel: */
1031         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1031         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1032                         1, 0x21, 0x011c, 0x40    1032                         1, 0x21, 0x011c, 0x4001, &com_buff, 2);
1033         /* Analogue input 4 right channel: */    1033         /* Analogue input 4 right channel: */
1034         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1034         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1035                         1, 0x21, 0x011d, 0x40    1035                         1, 0x21, 0x011d, 0x4001, &com_buff, 2);
1036                                                  1036 
1037         /* Set software sends to output */       1037         /* Set software sends to output */
1038         com_buff[0] = 0x00;                      1038         com_buff[0] = 0x00;
1039         com_buff[1] = 0x00;                      1039         com_buff[1] = 0x00;
1040         /* Analogue software return 1 left ch    1040         /* Analogue software return 1 left channel: */
1041         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1041         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1042                         1, 0x21, 0x0100, 0x40    1042                         1, 0x21, 0x0100, 0x4001, &com_buff, 2);
1043         com_buff[0] = 0x00;                      1043         com_buff[0] = 0x00;
1044         com_buff[1] = 0x80;                      1044         com_buff[1] = 0x80;
1045         /* Analogue software return 1 right c    1045         /* Analogue software return 1 right channel: */
1046         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1046         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1047                         1, 0x21, 0x0101, 0x40    1047                         1, 0x21, 0x0101, 0x4001, &com_buff, 2);
1048         com_buff[0] = 0x00;                      1048         com_buff[0] = 0x00;
1049         com_buff[1] = 0x80;                      1049         com_buff[1] = 0x80;
1050         /* Analogue software return 2 left ch    1050         /* Analogue software return 2 left channel: */
1051         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1051         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1052                         1, 0x21, 0x0104, 0x40    1052                         1, 0x21, 0x0104, 0x4001, &com_buff, 2);
1053         com_buff[0] = 0x00;                      1053         com_buff[0] = 0x00;
1054         com_buff[1] = 0x00;                      1054         com_buff[1] = 0x00;
1055         /* Analogue software return 2 right c    1055         /* Analogue software return 2 right channel: */
1056         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1056         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1057                         1, 0x21, 0x0105, 0x40    1057                         1, 0x21, 0x0105, 0x4001, &com_buff, 2);
1058                                                  1058 
1059         com_buff[0] = 0x00;                      1059         com_buff[0] = 0x00;
1060         com_buff[1] = 0x80;                      1060         com_buff[1] = 0x80;
1061         /* Analogue software return 3 left ch    1061         /* Analogue software return 3 left channel: */
1062         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1062         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1063                         1, 0x21, 0x0108, 0x40    1063                         1, 0x21, 0x0108, 0x4001, &com_buff, 2);
1064         /* Analogue software return 3 right c    1064         /* Analogue software return 3 right channel: */
1065         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1065         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1066                         1, 0x21, 0x0109, 0x40    1066                         1, 0x21, 0x0109, 0x4001, &com_buff, 2);
1067         /* Analogue software return 4 left ch    1067         /* Analogue software return 4 left channel: */
1068         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1068         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1069                         1, 0x21, 0x010c, 0x40    1069                         1, 0x21, 0x010c, 0x4001, &com_buff, 2);
1070         /* Analogue software return 4 right c    1070         /* Analogue software return 4 right channel: */
1071         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1071         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1072                         1, 0x21, 0x010d, 0x40    1072                         1, 0x21, 0x010d, 0x4001, &com_buff, 2);
1073                                                  1073 
1074         /* Return to muting sends */             1074         /* Return to muting sends */
1075         com_buff[0] = 0x00;                      1075         com_buff[0] = 0x00;
1076         com_buff[1] = 0x80;                      1076         com_buff[1] = 0x80;
1077         /* Analogue fx return left channel: *    1077         /* Analogue fx return left channel: */
1078         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1078         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1079                         1, 0x21, 0x0120, 0x40    1079                         1, 0x21, 0x0120, 0x4001, &com_buff, 2);
1080         /* Analogue fx return right channel:     1080         /* Analogue fx return right channel: */
1081         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1081         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1082                         1, 0x21, 0x0121, 0x40    1082                         1, 0x21, 0x0121, 0x4001, &com_buff, 2);
1083                                                  1083 
1084         /* Analogue software input 1 fx send:    1084         /* Analogue software input 1 fx send: */
1085         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1085         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1086                         1, 0x21, 0x0100, 0x42    1086                         1, 0x21, 0x0100, 0x4201, &com_buff, 2);
1087         /* Analogue software input 2 fx send:    1087         /* Analogue software input 2 fx send: */
1088         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1088         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1089                         1, 0x21, 0x0101, 0x42    1089                         1, 0x21, 0x0101, 0x4201, &com_buff, 2);
1090         /* Analogue software input 3 fx send:    1090         /* Analogue software input 3 fx send: */
1091         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1091         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1092                         1, 0x21, 0x0102, 0x42    1092                         1, 0x21, 0x0102, 0x4201, &com_buff, 2);
1093         /* Analogue software input 4 fx send:    1093         /* Analogue software input 4 fx send: */
1094         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1094         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1095                         1, 0x21, 0x0103, 0x42    1095                         1, 0x21, 0x0103, 0x4201, &com_buff, 2);
1096         /* Analogue input 1 fx send: */          1096         /* Analogue input 1 fx send: */
1097         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1097         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1098                         1, 0x21, 0x0104, 0x42    1098                         1, 0x21, 0x0104, 0x4201, &com_buff, 2);
1099         /* Analogue input 2 fx send: */          1099         /* Analogue input 2 fx send: */
1100         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1100         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1101                         1, 0x21, 0x0105, 0x42    1101                         1, 0x21, 0x0105, 0x4201, &com_buff, 2);
1102         /* Analogue input 3 fx send: */          1102         /* Analogue input 3 fx send: */
1103         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1103         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1104                         1, 0x21, 0x0106, 0x42    1104                         1, 0x21, 0x0106, 0x4201, &com_buff, 2);
1105         /* Analogue input 4 fx send: */          1105         /* Analogue input 4 fx send: */
1106         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1106         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1107                         1, 0x21, 0x0107, 0x42    1107                         1, 0x21, 0x0107, 0x4201, &com_buff, 2);
1108                                                  1108 
1109         /* Toggle allowing host control */       1109         /* Toggle allowing host control */
1110         /* Not needed                            1110         /* Not needed
1111         com_buff[0] = 0x02;                      1111         com_buff[0] = 0x02;
1112         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1112         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1113                         3, 0x21, 0x0000, 0x20    1113                         3, 0x21, 0x0000, 0x2001, &com_buff, 1);
1114          */                                      1114          */
1115                                                  1115 
1116         /* Do not dim fx returns */              1116         /* Do not dim fx returns */
1117         com_buff[0] = 0x00;                      1117         com_buff[0] = 0x00;
1118         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1118         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1119                         3, 0x21, 0x0002, 0x20    1119                         3, 0x21, 0x0002, 0x2001, &com_buff, 1);
1120                                                  1120 
1121         /* Do not set fx returns to mono */      1121         /* Do not set fx returns to mono */
1122         com_buff[0] = 0x00;                      1122         com_buff[0] = 0x00;
1123         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1123         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1124                         3, 0x21, 0x0001, 0x20    1124                         3, 0x21, 0x0001, 0x2001, &com_buff, 1);
1125                                                  1125 
1126         /* Mute the S/PDIF hardware loopback     1126         /* Mute the S/PDIF hardware loopback
1127          * same odd volume logic here as abov    1127          * same odd volume logic here as above
1128          */                                      1128          */
1129         com_buff[0] = 0x00;                      1129         com_buff[0] = 0x00;
1130         com_buff[1] = 0x80;                      1130         com_buff[1] = 0x80;
1131         /* S/PDIF hardware input 1 left chann    1131         /* S/PDIF hardware input 1 left channel */
1132         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1132         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1133                         1, 0x21, 0x0112, 0x40    1133                         1, 0x21, 0x0112, 0x4001, &com_buff, 2);
1134         /* S/PDIF hardware input 1 right chan    1134         /* S/PDIF hardware input 1 right channel */
1135         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1135         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1136                         1, 0x21, 0x0113, 0x40    1136                         1, 0x21, 0x0113, 0x4001, &com_buff, 2);
1137         /* S/PDIF hardware input 2 left chann    1137         /* S/PDIF hardware input 2 left channel */
1138         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1138         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1139                         1, 0x21, 0x0116, 0x40    1139                         1, 0x21, 0x0116, 0x4001, &com_buff, 2);
1140         /* S/PDIF hardware input 2 right chan    1140         /* S/PDIF hardware input 2 right channel */
1141         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1141         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1142                         1, 0x21, 0x0117, 0x40    1142                         1, 0x21, 0x0117, 0x4001, &com_buff, 2);
1143         /* S/PDIF hardware input 3 left chann    1143         /* S/PDIF hardware input 3 left channel */
1144         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1144         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1145                         1, 0x21, 0x011a, 0x40    1145                         1, 0x21, 0x011a, 0x4001, &com_buff, 2);
1146         /* S/PDIF hardware input 3 right chan    1146         /* S/PDIF hardware input 3 right channel */
1147         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1147         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1148                         1, 0x21, 0x011b, 0x40    1148                         1, 0x21, 0x011b, 0x4001, &com_buff, 2);
1149         /* S/PDIF hardware input 4 left chann    1149         /* S/PDIF hardware input 4 left channel */
1150         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1150         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1151                         1, 0x21, 0x011e, 0x40    1151                         1, 0x21, 0x011e, 0x4001, &com_buff, 2);
1152         /* S/PDIF hardware input 4 right chan    1152         /* S/PDIF hardware input 4 right channel */
1153         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1153         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1154                         1, 0x21, 0x011f, 0x40    1154                         1, 0x21, 0x011f, 0x4001, &com_buff, 2);
1155         /* S/PDIF software return 1 left chan    1155         /* S/PDIF software return 1 left channel */
1156         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1156         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1157                         1, 0x21, 0x0102, 0x40    1157                         1, 0x21, 0x0102, 0x4001, &com_buff, 2);
1158         /* S/PDIF software return 1 right cha    1158         /* S/PDIF software return 1 right channel */
1159         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1159         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1160                         1, 0x21, 0x0103, 0x40    1160                         1, 0x21, 0x0103, 0x4001, &com_buff, 2);
1161         /* S/PDIF software return 2 left chan    1161         /* S/PDIF software return 2 left channel */
1162         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1162         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1163                         1, 0x21, 0x0106, 0x40    1163                         1, 0x21, 0x0106, 0x4001, &com_buff, 2);
1164         /* S/PDIF software return 2 right cha    1164         /* S/PDIF software return 2 right channel */
1165         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1165         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1166                         1, 0x21, 0x0107, 0x40    1166                         1, 0x21, 0x0107, 0x4001, &com_buff, 2);
1167                                                  1167 
1168         com_buff[0] = 0x00;                      1168         com_buff[0] = 0x00;
1169         com_buff[1] = 0x00;                      1169         com_buff[1] = 0x00;
1170         /* S/PDIF software return 3 left chan    1170         /* S/PDIF software return 3 left channel */
1171         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1171         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1172                         1, 0x21, 0x010a, 0x40    1172                         1, 0x21, 0x010a, 0x4001, &com_buff, 2);
1173                                                  1173 
1174         com_buff[0] = 0x00;                      1174         com_buff[0] = 0x00;
1175         com_buff[1] = 0x80;                      1175         com_buff[1] = 0x80;
1176         /* S/PDIF software return 3 right cha    1176         /* S/PDIF software return 3 right channel */
1177         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1177         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1178                         1, 0x21, 0x010b, 0x40    1178                         1, 0x21, 0x010b, 0x4001, &com_buff, 2);
1179         /* S/PDIF software return 4 left chan    1179         /* S/PDIF software return 4 left channel */
1180         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1180         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1181                         1, 0x21, 0x010e, 0x40    1181                         1, 0x21, 0x010e, 0x4001, &com_buff, 2);
1182                                                  1182 
1183         com_buff[0] = 0x00;                      1183         com_buff[0] = 0x00;
1184         com_buff[1] = 0x00;                      1184         com_buff[1] = 0x00;
1185         /* S/PDIF software return 4 right cha    1185         /* S/PDIF software return 4 right channel */
1186         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1186         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1187                         1, 0x21, 0x010f, 0x40    1187                         1, 0x21, 0x010f, 0x4001, &com_buff, 2);
1188                                                  1188 
1189         com_buff[0] = 0x00;                      1189         com_buff[0] = 0x00;
1190         com_buff[1] = 0x80;                      1190         com_buff[1] = 0x80;
1191         /* S/PDIF fx returns left channel */     1191         /* S/PDIF fx returns left channel */
1192         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1192         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1193                         1, 0x21, 0x0122, 0x40    1193                         1, 0x21, 0x0122, 0x4001, &com_buff, 2);
1194         /* S/PDIF fx returns right channel */    1194         /* S/PDIF fx returns right channel */
1195         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1195         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1196                         1, 0x21, 0x0123, 0x40    1196                         1, 0x21, 0x0123, 0x4001, &com_buff, 2);
1197                                                  1197 
1198         /* Set the dropdown "Effect" to the f    1198         /* Set the dropdown "Effect" to the first option */
1199         /* Room1  = 0x00 */                      1199         /* Room1  = 0x00 */
1200         /* Room2  = 0x01 */                      1200         /* Room2  = 0x01 */
1201         /* Room3  = 0x02 */                      1201         /* Room3  = 0x02 */
1202         /* Hall 1 = 0x03 */                      1202         /* Hall 1 = 0x03 */
1203         /* Hall 2 = 0x04 */                      1203         /* Hall 2 = 0x04 */
1204         /* Plate  = 0x05 */                      1204         /* Plate  = 0x05 */
1205         /* Delay  = 0x06 */                      1205         /* Delay  = 0x06 */
1206         /* Echo   = 0x07 */                      1206         /* Echo   = 0x07 */
1207         com_buff[0] = 0x00;                      1207         com_buff[0] = 0x00;
1208         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1208         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1209                         1, 0x21, 0x0200, 0x43    1209                         1, 0x21, 0x0200, 0x4301, &com_buff, 1); /* max is 0xff */
1210         /* min is 0x00 */                        1210         /* min is 0x00 */
1211                                                  1211 
1212                                                  1212 
1213         /* Set the effect duration to 0 */       1213         /* Set the effect duration to 0 */
1214         /* max is 0xffff */                      1214         /* max is 0xffff */
1215         /* min is 0x0000 */                      1215         /* min is 0x0000 */
1216         com_buff[0] = 0x00;                      1216         com_buff[0] = 0x00;
1217         com_buff[1] = 0x00;                      1217         com_buff[1] = 0x00;
1218         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1218         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1219                         1, 0x21, 0x0400, 0x43    1219                         1, 0x21, 0x0400, 0x4301, &com_buff, 2);
1220                                                  1220 
1221         /* Set the effect volume and feedback    1221         /* Set the effect volume and feedback to 0 */
1222         /* max is 0xff */                        1222         /* max is 0xff */
1223         /* min is 0x00 */                        1223         /* min is 0x00 */
1224         com_buff[0] = 0x00;                      1224         com_buff[0] = 0x00;
1225         /* feedback: */                          1225         /* feedback: */
1226         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1226         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1227                         1, 0x21, 0x0500, 0x43    1227                         1, 0x21, 0x0500, 0x4301, &com_buff, 1);
1228         /* volume: */                            1228         /* volume: */
1229         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1229         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1230                         1, 0x21, 0x0300, 0x43    1230                         1, 0x21, 0x0300, 0x4301, &com_buff, 1);
1231                                                  1231 
1232         /* Set soft button hold duration */      1232         /* Set soft button hold duration */
1233         /* 0x03 = 250ms */                       1233         /* 0x03 = 250ms */
1234         /* 0x05 = 500ms DEFAULT */               1234         /* 0x05 = 500ms DEFAULT */
1235         /* 0x08 = 750ms */                       1235         /* 0x08 = 750ms */
1236         /* 0x0a = 1sec */                        1236         /* 0x0a = 1sec */
1237         com_buff[0] = 0x05;                      1237         com_buff[0] = 0x05;
1238         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1238         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1239                         3, 0x21, 0x0005, 0x20    1239                         3, 0x21, 0x0005, 0x2001, &com_buff, 1);
1240                                                  1240 
1241         /* Use dim LEDs for button of state *    1241         /* Use dim LEDs for button of state */
1242         com_buff[0] = 0x00;                      1242         com_buff[0] = 0x00;
1243         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1243         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1244                         3, 0x21, 0x0004, 0x20    1244                         3, 0x21, 0x0004, 0x2001, &com_buff, 1);
1245 }                                                1245 }
1246                                                  1246 
1247 #define MBOX3_DESCRIPTOR_SIZE   464              1247 #define MBOX3_DESCRIPTOR_SIZE   464
1248                                                  1248 
1249 static int snd_usb_mbox3_boot_quirk(struct us    1249 static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
1250 {                                                1250 {
1251         struct usb_host_config *config = dev-    1251         struct usb_host_config *config = dev->actconfig;
1252         int err;                                 1252         int err;
1253         int descriptor_size;                     1253         int descriptor_size;
1254                                                  1254 
1255         descriptor_size = le16_to_cpu(get_cfg    1255         descriptor_size = le16_to_cpu(get_cfg_desc(config)->wTotalLength);
1256                                                  1256 
1257         if (descriptor_size != MBOX3_DESCRIPT    1257         if (descriptor_size != MBOX3_DESCRIPTOR_SIZE) {
1258                 dev_err(&dev->dev, "MBOX3: In    1258                 dev_err(&dev->dev, "MBOX3: Invalid descriptor size=%d.\n", descriptor_size);
1259                 return -ENODEV;                  1259                 return -ENODEV;
1260         }                                        1260         }
1261                                                  1261 
1262         dev_dbg(&dev->dev, "MBOX3: device ini    1262         dev_dbg(&dev->dev, "MBOX3: device initialised!\n");
1263                                                  1263 
1264         err = usb_get_descriptor(dev, USB_DT_    1264         err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
1265                 &dev->descriptor, sizeof(dev-    1265                 &dev->descriptor, sizeof(dev->descriptor));
1266         config = dev->actconfig;                 1266         config = dev->actconfig;
1267         if (err < 0)                             1267         if (err < 0)
1268                 dev_dbg(&dev->dev, "MBOX3: er    1268                 dev_dbg(&dev->dev, "MBOX3: error usb_get_descriptor: %d\n", err);
1269                                                  1269 
1270         err = usb_reset_configuration(dev);      1270         err = usb_reset_configuration(dev);
1271         if (err < 0)                             1271         if (err < 0)
1272                 dev_dbg(&dev->dev, "MBOX3: er    1272                 dev_dbg(&dev->dev, "MBOX3: error usb_reset_configuration: %d\n", err);
1273                                                  1273 
1274         dev_dbg(&dev->dev, "MBOX3: new boot l    1274         dev_dbg(&dev->dev, "MBOX3: new boot length = %d\n",
1275                 le16_to_cpu(get_cfg_desc(conf    1275                 le16_to_cpu(get_cfg_desc(config)->wTotalLength));
1276                                                  1276 
1277         mbox3_setup_defaults(dev);               1277         mbox3_setup_defaults(dev);
1278         dev_info(&dev->dev, "MBOX3: Initializ    1278         dev_info(&dev->dev, "MBOX3: Initialized.");
1279                                                  1279 
1280         return 0; /* Successful boot */          1280         return 0; /* Successful boot */
1281 }                                                1281 }
1282                                                  1282 
1283 #define MICROBOOK_BUF_SIZE 128                   1283 #define MICROBOOK_BUF_SIZE 128
1284                                                  1284 
1285 static int snd_usb_motu_microbookii_communica    1285 static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf,
1286                                                  1286                                                 int buf_size, int *length)
1287 {                                                1287 {
1288         int err, actual_length;                  1288         int err, actual_length;
1289                                                  1289 
1290         if (usb_pipe_type_check(dev, usb_sndi    1290         if (usb_pipe_type_check(dev, usb_sndintpipe(dev, 0x01)))
1291                 return -EINVAL;                  1291                 return -EINVAL;
1292         err = usb_interrupt_msg(dev, usb_sndi    1292         err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x01), buf, *length,
1293                                 &actual_lengt    1293                                 &actual_length, 1000);
1294         if (err < 0)                             1294         if (err < 0)
1295                 return err;                      1295                 return err;
1296                                                  1296 
1297         print_hex_dump(KERN_DEBUG, "MicroBook    1297         print_hex_dump(KERN_DEBUG, "MicroBookII snd: ", DUMP_PREFIX_NONE, 16, 1,
1298                        buf, actual_length, fa    1298                        buf, actual_length, false);
1299                                                  1299 
1300         memset(buf, 0, buf_size);                1300         memset(buf, 0, buf_size);
1301                                                  1301 
1302         if (usb_pipe_type_check(dev, usb_rcvi    1302         if (usb_pipe_type_check(dev, usb_rcvintpipe(dev, 0x82)))
1303                 return -EINVAL;                  1303                 return -EINVAL;
1304         err = usb_interrupt_msg(dev, usb_rcvi    1304         err = usb_interrupt_msg(dev, usb_rcvintpipe(dev, 0x82), buf, buf_size,
1305                                 &actual_lengt    1305                                 &actual_length, 1000);
1306         if (err < 0)                             1306         if (err < 0)
1307                 return err;                      1307                 return err;
1308                                                  1308 
1309         print_hex_dump(KERN_DEBUG, "MicroBook    1309         print_hex_dump(KERN_DEBUG, "MicroBookII rcv: ", DUMP_PREFIX_NONE, 16, 1,
1310                        buf, actual_length, fa    1310                        buf, actual_length, false);
1311                                                  1311 
1312         *length = actual_length;                 1312         *length = actual_length;
1313         return 0;                                1313         return 0;
1314 }                                                1314 }
1315                                                  1315 
1316 static int snd_usb_motu_microbookii_boot_quir    1316 static int snd_usb_motu_microbookii_boot_quirk(struct usb_device *dev)
1317 {                                                1317 {
1318         int err, actual_length, poll_attempts    1318         int err, actual_length, poll_attempts = 0;
1319         static const u8 set_samplerate_seq[]     1319         static const u8 set_samplerate_seq[] = { 0x00, 0x00, 0x00, 0x00,
1320                                                  1320                                                  0x00, 0x00, 0x0b, 0x14,
1321                                                  1321                                                  0x00, 0x00, 0x00, 0x01 };
1322         static const u8 poll_ready_seq[] = {     1322         static const u8 poll_ready_seq[] = { 0x00, 0x04, 0x00, 0x00,
1323                                                  1323                                              0x00, 0x00, 0x0b, 0x18 };
1324         u8 *buf = kzalloc(MICROBOOK_BUF_SIZE,    1324         u8 *buf = kzalloc(MICROBOOK_BUF_SIZE, GFP_KERNEL);
1325                                                  1325 
1326         if (!buf)                                1326         if (!buf)
1327                 return -ENOMEM;                  1327                 return -ENOMEM;
1328                                                  1328 
1329         dev_info(&dev->dev, "Waiting for MOTU    1329         dev_info(&dev->dev, "Waiting for MOTU Microbook II to boot up...\n");
1330                                                  1330 
1331         /* First we tell the device which sam    1331         /* First we tell the device which sample rate to use. */
1332         memcpy(buf, set_samplerate_seq, sizeo    1332         memcpy(buf, set_samplerate_seq, sizeof(set_samplerate_seq));
1333         actual_length = sizeof(set_samplerate    1333         actual_length = sizeof(set_samplerate_seq);
1334         err = snd_usb_motu_microbookii_commun    1334         err = snd_usb_motu_microbookii_communicate(dev, buf, MICROBOOK_BUF_SIZE,
1335                                                  1335                                                    &actual_length);
1336                                                  1336 
1337         if (err < 0) {                           1337         if (err < 0) {
1338                 dev_err(&dev->dev,               1338                 dev_err(&dev->dev,
1339                         "failed setting the s    1339                         "failed setting the sample rate for Motu MicroBook II: %d\n",
1340                         err);                    1340                         err);
1341                 goto free_buf;                   1341                 goto free_buf;
1342         }                                        1342         }
1343                                                  1343 
1344         /* Then we poll every 100 ms until th    1344         /* Then we poll every 100 ms until the device informs of its readiness. */
1345         while (true) {                           1345         while (true) {
1346                 if (++poll_attempts > 100) {     1346                 if (++poll_attempts > 100) {
1347                         dev_err(&dev->dev,       1347                         dev_err(&dev->dev,
1348                                 "failed booti    1348                                 "failed booting Motu MicroBook II: timeout\n");
1349                         err = -ENODEV;           1349                         err = -ENODEV;
1350                         goto free_buf;           1350                         goto free_buf;
1351                 }                                1351                 }
1352                                                  1352 
1353                 memset(buf, 0, MICROBOOK_BUF_    1353                 memset(buf, 0, MICROBOOK_BUF_SIZE);
1354                 memcpy(buf, poll_ready_seq, s    1354                 memcpy(buf, poll_ready_seq, sizeof(poll_ready_seq));
1355                                                  1355 
1356                 actual_length = sizeof(poll_r    1356                 actual_length = sizeof(poll_ready_seq);
1357                 err = snd_usb_motu_microbooki    1357                 err = snd_usb_motu_microbookii_communicate(
1358                         dev, buf, MICROBOOK_B    1358                         dev, buf, MICROBOOK_BUF_SIZE, &actual_length);
1359                 if (err < 0) {                   1359                 if (err < 0) {
1360                         dev_err(&dev->dev,       1360                         dev_err(&dev->dev,
1361                                 "failed booti    1361                                 "failed booting Motu MicroBook II: communication error %d\n",
1362                                 err);            1362                                 err);
1363                         goto free_buf;           1363                         goto free_buf;
1364                 }                                1364                 }
1365                                                  1365 
1366                 /* the device signals its rea    1366                 /* the device signals its readiness through a message of the
1367                  * form                          1367                  * form
1368                  *           XX 06 00 00 00 0    1368                  *           XX 06 00 00 00 00 0b 18  00 00 00 01
1369                  * If the device is not yet r    1369                  * If the device is not yet ready to accept audio data, the
1370                  * last byte of that sequence    1370                  * last byte of that sequence is 00.
1371                  */                              1371                  */
1372                 if (actual_length == 12 && bu    1372                 if (actual_length == 12 && buf[actual_length - 1] == 1)
1373                         break;                   1373                         break;
1374                                                  1374 
1375                 msleep(100);                     1375                 msleep(100);
1376         }                                        1376         }
1377                                                  1377 
1378         dev_info(&dev->dev, "MOTU MicroBook I    1378         dev_info(&dev->dev, "MOTU MicroBook II ready\n");
1379                                                  1379 
1380 free_buf:                                        1380 free_buf:
1381         kfree(buf);                              1381         kfree(buf);
1382         return err;                              1382         return err;
1383 }                                                1383 }
1384                                                  1384 
1385 static int snd_usb_motu_m_series_boot_quirk(s    1385 static int snd_usb_motu_m_series_boot_quirk(struct usb_device *dev)
1386 {                                                1386 {
1387         msleep(4000);                            1387         msleep(4000);
1388                                                  1388 
1389         return 0;                                1389         return 0;
1390 }                                                1390 }
1391                                                  1391 
1392 static int snd_usb_rme_digiface_boot_quirk(st    1392 static int snd_usb_rme_digiface_boot_quirk(struct usb_device *dev)
1393 {                                                1393 {
1394         /* Disable mixer, internal clock, all    1394         /* Disable mixer, internal clock, all outputs ADAT, 48kHz, TMS off */
1395         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1395         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1396                         16, 0x40, 0x2410, 0x7    1396                         16, 0x40, 0x2410, 0x7fff, NULL, 0);
1397         snd_usb_ctl_msg(dev, usb_sndctrlpipe(    1397         snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1398                         18, 0x40, 0x0104, 0xf    1398                         18, 0x40, 0x0104, 0xffff, NULL, 0);
1399                                                  1399 
1400         /* Disable loopback for all inputs */    1400         /* Disable loopback for all inputs */
1401         for (int ch = 0; ch < 32; ch++)          1401         for (int ch = 0; ch < 32; ch++)
1402                 snd_usb_ctl_msg(dev, usb_sndc    1402                 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1403                                 22, 0x40, 0x4    1403                                 22, 0x40, 0x400, ch, NULL, 0);
1404                                                  1404 
1405         /* Unity gain for all outputs */         1405         /* Unity gain for all outputs */
1406         for (int ch = 0; ch < 34; ch++)          1406         for (int ch = 0; ch < 34; ch++)
1407                 snd_usb_ctl_msg(dev, usb_sndc    1407                 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1408                                 21, 0x40, 0x9    1408                                 21, 0x40, 0x9000, 0x100 + ch, NULL, 0);
1409                                                  1409 
1410         return 0;                                1410         return 0;
1411 }                                                1411 }
1412                                                  1412 
1413 /*                                               1413 /*
1414  * Setup quirks                                  1414  * Setup quirks
1415  */                                              1415  */
1416 #define MAUDIO_SET              0x01 /* parse    1416 #define MAUDIO_SET              0x01 /* parse device_setup */
1417 #define MAUDIO_SET_COMPATIBLE   0x80 /* use o    1417 #define MAUDIO_SET_COMPATIBLE   0x80 /* use only "win-compatible" interfaces */
1418 #define MAUDIO_SET_DTS          0x02 /* enabl    1418 #define MAUDIO_SET_DTS          0x02 /* enable DTS Digital Output */
1419 #define MAUDIO_SET_96K          0x04 /* 48-96    1419 #define MAUDIO_SET_96K          0x04 /* 48-96kHz rate if set, 8-48kHz otherwise */
1420 #define MAUDIO_SET_24B          0x08 /* 24bit    1420 #define MAUDIO_SET_24B          0x08 /* 24bits sample if set, 16bits otherwise */
1421 #define MAUDIO_SET_DI           0x10 /* enabl    1421 #define MAUDIO_SET_DI           0x10 /* enable Digital Input */
1422 #define MAUDIO_SET_MASK         0x1f /* bit m    1422 #define MAUDIO_SET_MASK         0x1f /* bit mask for setup value */
1423 #define MAUDIO_SET_24B_48K_DI    0x19 /* 24bi    1423 #define MAUDIO_SET_24B_48K_DI    0x19 /* 24bits+48kHz+Digital Input */
1424 #define MAUDIO_SET_24B_48K_NOTDI 0x09 /* 24bi    1424 #define MAUDIO_SET_24B_48K_NOTDI 0x09 /* 24bits+48kHz+No Digital Input */
1425 #define MAUDIO_SET_16B_48K_DI    0x11 /* 16bi    1425 #define MAUDIO_SET_16B_48K_DI    0x11 /* 16bits+48kHz+Digital Input */
1426 #define MAUDIO_SET_16B_48K_NOTDI 0x01 /* 16bi    1426 #define MAUDIO_SET_16B_48K_NOTDI 0x01 /* 16bits+48kHz+No Digital Input */
1427                                                  1427 
1428 static int quattro_skip_setting_quirk(struct     1428 static int quattro_skip_setting_quirk(struct snd_usb_audio *chip,
1429                                       int ifa    1429                                       int iface, int altno)
1430 {                                                1430 {
1431         /* Reset ALL ifaces to 0 altsetting.     1431         /* Reset ALL ifaces to 0 altsetting.
1432          * Call it for every possible altsett    1432          * Call it for every possible altsetting of every interface.
1433          */                                      1433          */
1434         usb_set_interface(chip->dev, iface, 0    1434         usb_set_interface(chip->dev, iface, 0);
1435         if (chip->setup & MAUDIO_SET) {          1435         if (chip->setup & MAUDIO_SET) {
1436                 if (chip->setup & MAUDIO_SET_    1436                 if (chip->setup & MAUDIO_SET_COMPATIBLE) {
1437                         if (iface != 1 && ifa    1437                         if (iface != 1 && iface != 2)
1438                                 return 1; /*     1438                                 return 1; /* skip all interfaces but 1 and 2 */
1439                 } else {                         1439                 } else {
1440                         unsigned int mask;       1440                         unsigned int mask;
1441                         if (iface == 1 || ifa    1441                         if (iface == 1 || iface == 2)
1442                                 return 1; /*     1442                                 return 1; /* skip interfaces 1 and 2 */
1443                         if ((chip->setup & MA    1443                         if ((chip->setup & MAUDIO_SET_96K) && altno != 1)
1444                                 return 1; /*     1444                                 return 1; /* skip this altsetting */
1445                         mask = chip->setup &     1445                         mask = chip->setup & MAUDIO_SET_MASK;
1446                         if (mask == MAUDIO_SE    1446                         if (mask == MAUDIO_SET_24B_48K_DI && altno != 2)
1447                                 return 1; /*     1447                                 return 1; /* skip this altsetting */
1448                         if (mask == MAUDIO_SE    1448                         if (mask == MAUDIO_SET_24B_48K_NOTDI && altno != 3)
1449                                 return 1; /*     1449                                 return 1; /* skip this altsetting */
1450                         if (mask == MAUDIO_SE    1450                         if (mask == MAUDIO_SET_16B_48K_NOTDI && altno != 4)
1451                                 return 1; /*     1451                                 return 1; /* skip this altsetting */
1452                 }                                1452                 }
1453         }                                        1453         }
1454         usb_audio_dbg(chip,                      1454         usb_audio_dbg(chip,
1455                     "using altsetting %d for     1455                     "using altsetting %d for interface %d config %d\n",
1456                     altno, iface, chip->setup    1456                     altno, iface, chip->setup);
1457         return 0; /* keep this altsetting */     1457         return 0; /* keep this altsetting */
1458 }                                                1458 }
1459                                                  1459 
1460 static int audiophile_skip_setting_quirk(stru    1460 static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip,
1461                                          int     1461                                          int iface,
1462                                          int     1462                                          int altno)
1463 {                                                1463 {
1464         /* Reset ALL ifaces to 0 altsetting.     1464         /* Reset ALL ifaces to 0 altsetting.
1465          * Call it for every possible altsett    1465          * Call it for every possible altsetting of every interface.
1466          */                                      1466          */
1467         usb_set_interface(chip->dev, iface, 0    1467         usb_set_interface(chip->dev, iface, 0);
1468                                                  1468 
1469         if (chip->setup & MAUDIO_SET) {          1469         if (chip->setup & MAUDIO_SET) {
1470                 unsigned int mask;               1470                 unsigned int mask;
1471                 if ((chip->setup & MAUDIO_SET    1471                 if ((chip->setup & MAUDIO_SET_DTS) && altno != 6)
1472                         return 1; /* skip thi    1472                         return 1; /* skip this altsetting */
1473                 if ((chip->setup & MAUDIO_SET    1473                 if ((chip->setup & MAUDIO_SET_96K) && altno != 1)
1474                         return 1; /* skip thi    1474                         return 1; /* skip this altsetting */
1475                 mask = chip->setup & MAUDIO_S    1475                 mask = chip->setup & MAUDIO_SET_MASK;
1476                 if (mask == MAUDIO_SET_24B_48    1476                 if (mask == MAUDIO_SET_24B_48K_DI && altno != 2)
1477                         return 1; /* skip thi    1477                         return 1; /* skip this altsetting */
1478                 if (mask == MAUDIO_SET_24B_48    1478                 if (mask == MAUDIO_SET_24B_48K_NOTDI && altno != 3)
1479                         return 1; /* skip thi    1479                         return 1; /* skip this altsetting */
1480                 if (mask == MAUDIO_SET_16B_48    1480                 if (mask == MAUDIO_SET_16B_48K_DI && altno != 4)
1481                         return 1; /* skip thi    1481                         return 1; /* skip this altsetting */
1482                 if (mask == MAUDIO_SET_16B_48    1482                 if (mask == MAUDIO_SET_16B_48K_NOTDI && altno != 5)
1483                         return 1; /* skip thi    1483                         return 1; /* skip this altsetting */
1484         }                                        1484         }
1485                                                  1485 
1486         return 0; /* keep this altsetting */     1486         return 0; /* keep this altsetting */
1487 }                                                1487 }
1488                                                  1488 
1489 static int fasttrackpro_skip_setting_quirk(st    1489 static int fasttrackpro_skip_setting_quirk(struct snd_usb_audio *chip,
1490                                            in    1490                                            int iface, int altno)
1491 {                                                1491 {
1492         /* Reset ALL ifaces to 0 altsetting.     1492         /* Reset ALL ifaces to 0 altsetting.
1493          * Call it for every possible altsett    1493          * Call it for every possible altsetting of every interface.
1494          */                                      1494          */
1495         usb_set_interface(chip->dev, iface, 0    1495         usb_set_interface(chip->dev, iface, 0);
1496                                                  1496 
1497         /* possible configuration where both     1497         /* possible configuration where both inputs and only one output is
1498          *used is not supported by the curren    1498          *used is not supported by the current setup
1499          */                                      1499          */
1500         if (chip->setup & (MAUDIO_SET | MAUDI    1500         if (chip->setup & (MAUDIO_SET | MAUDIO_SET_24B)) {
1501                 if (chip->setup & MAUDIO_SET_    1501                 if (chip->setup & MAUDIO_SET_96K) {
1502                         if (altno != 3 && alt    1502                         if (altno != 3 && altno != 6)
1503                                 return 1;        1503                                 return 1;
1504                 } else if (chip->setup & MAUD    1504                 } else if (chip->setup & MAUDIO_SET_DI) {
1505                         if (iface == 4)          1505                         if (iface == 4)
1506                                 return 1; /*     1506                                 return 1; /* no analog input */
1507                         if (altno != 2 && alt    1507                         if (altno != 2 && altno != 5)
1508                                 return 1; /*     1508                                 return 1; /* enable only altsets 2 and 5 */
1509                 } else {                         1509                 } else {
1510                         if (iface == 5)          1510                         if (iface == 5)
1511                                 return 1; /*     1511                                 return 1; /* disable digialt input */
1512                         if (altno != 2 && alt    1512                         if (altno != 2 && altno != 5)
1513                                 return 1; /*     1513                                 return 1; /* enalbe only altsets 2 and 5 */
1514                 }                                1514                 }
1515         } else {                                 1515         } else {
1516                 /* keep only 16-Bit mode */      1516                 /* keep only 16-Bit mode */
1517                 if (altno != 1)                  1517                 if (altno != 1)
1518                         return 1;                1518                         return 1;
1519         }                                        1519         }
1520                                                  1520 
1521         usb_audio_dbg(chip,                      1521         usb_audio_dbg(chip,
1522                     "using altsetting %d for     1522                     "using altsetting %d for interface %d config %d\n",
1523                     altno, iface, chip->setup    1523                     altno, iface, chip->setup);
1524         return 0; /* keep this altsetting */     1524         return 0; /* keep this altsetting */
1525 }                                                1525 }
1526                                                  1526 
1527 static int s1810c_skip_setting_quirk(struct s    1527 static int s1810c_skip_setting_quirk(struct snd_usb_audio *chip,
1528                                            in    1528                                            int iface, int altno)
1529 {                                                1529 {
1530         /*                                       1530         /*
1531          * Altno settings:                       1531          * Altno settings:
1532          *                                       1532          *
1533          * Playback (Interface 1):               1533          * Playback (Interface 1):
1534          * 1: 6 Analog + 2 S/PDIF                1534          * 1: 6 Analog + 2 S/PDIF
1535          * 2: 6 Analog + 2 S/PDIF                1535          * 2: 6 Analog + 2 S/PDIF
1536          * 3: 6 Analog                           1536          * 3: 6 Analog
1537          *                                       1537          *
1538          * Capture (Interface 2):                1538          * Capture (Interface 2):
1539          * 1: 8 Analog + 2 S/PDIF + 8 ADAT       1539          * 1: 8 Analog + 2 S/PDIF + 8 ADAT
1540          * 2: 8 Analog + 2 S/PDIF + 4 ADAT       1540          * 2: 8 Analog + 2 S/PDIF + 4 ADAT
1541          * 3: 8 Analog                           1541          * 3: 8 Analog
1542          */                                      1542          */
1543                                                  1543 
1544         /*                                       1544         /*
1545          * I'll leave 2 as the default one an    1545          * I'll leave 2 as the default one and
1546          * use device_setup to switch to the     1546          * use device_setup to switch to the
1547          * other two.                            1547          * other two.
1548          */                                      1548          */
1549         if ((chip->setup == 0 || chip->setup     1549         if ((chip->setup == 0 || chip->setup > 2) && altno != 2)
1550                 return 1;                        1550                 return 1;
1551         else if (chip->setup == 1 && altno !=    1551         else if (chip->setup == 1 && altno != 1)
1552                 return 1;                        1552                 return 1;
1553         else if (chip->setup == 2 && altno !=    1553         else if (chip->setup == 2 && altno != 3)
1554                 return 1;                        1554                 return 1;
1555                                                  1555 
1556         return 0;                                1556         return 0;
1557 }                                                1557 }
1558                                                  1558 
1559 int snd_usb_apply_interface_quirk(struct snd_    1559 int snd_usb_apply_interface_quirk(struct snd_usb_audio *chip,
1560                                   int iface,     1560                                   int iface,
1561                                   int altno)     1561                                   int altno)
1562 {                                                1562 {
1563         /* audiophile usb: skip altsets incom    1563         /* audiophile usb: skip altsets incompatible with device_setup */
1564         if (chip->usb_id == USB_ID(0x0763, 0x    1564         if (chip->usb_id == USB_ID(0x0763, 0x2003))
1565                 return audiophile_skip_settin    1565                 return audiophile_skip_setting_quirk(chip, iface, altno);
1566         /* quattro usb: skip altsets incompat    1566         /* quattro usb: skip altsets incompatible with device_setup */
1567         if (chip->usb_id == USB_ID(0x0763, 0x    1567         if (chip->usb_id == USB_ID(0x0763, 0x2001))
1568                 return quattro_skip_setting_q    1568                 return quattro_skip_setting_quirk(chip, iface, altno);
1569         /* fasttrackpro usb: skip altsets inc    1569         /* fasttrackpro usb: skip altsets incompatible with device_setup */
1570         if (chip->usb_id == USB_ID(0x0763, 0x    1570         if (chip->usb_id == USB_ID(0x0763, 0x2012))
1571                 return fasttrackpro_skip_sett    1571                 return fasttrackpro_skip_setting_quirk(chip, iface, altno);
1572         /* presonus studio 1810c: skip altset    1572         /* presonus studio 1810c: skip altsets incompatible with device_setup */
1573         if (chip->usb_id == USB_ID(0x194f, 0x    1573         if (chip->usb_id == USB_ID(0x194f, 0x010c))
1574                 return s1810c_skip_setting_qu    1574                 return s1810c_skip_setting_quirk(chip, iface, altno);
1575                                                  1575 
1576                                                  1576 
1577         return 0;                                1577         return 0;
1578 }                                                1578 }
1579                                                  1579 
1580 int snd_usb_apply_boot_quirk(struct usb_devic    1580 int snd_usb_apply_boot_quirk(struct usb_device *dev,
1581                              struct usb_inter    1581                              struct usb_interface *intf,
1582                              const struct snd    1582                              const struct snd_usb_audio_quirk *quirk,
1583                              unsigned int id)    1583                              unsigned int id)
1584 {                                                1584 {
1585         switch (id) {                            1585         switch (id) {
1586         case USB_ID(0x041e, 0x3000):             1586         case USB_ID(0x041e, 0x3000):
1587                 /* SB Extigy needs special bo    1587                 /* SB Extigy needs special boot-up sequence */
1588                 /* if more models come, this     1588                 /* if more models come, this will go to the quirk list. */
1589                 return snd_usb_extigy_boot_qu    1589                 return snd_usb_extigy_boot_quirk(dev, intf);
1590                                                  1590 
1591         case USB_ID(0x041e, 0x3020):             1591         case USB_ID(0x041e, 0x3020):
1592                 /* SB Audigy 2 NX needs its o    1592                 /* SB Audigy 2 NX needs its own boot-up magic, too */
1593                 return snd_usb_audigy2nx_boot    1593                 return snd_usb_audigy2nx_boot_quirk(dev);
1594                                                  1594 
1595         case USB_ID(0x10f5, 0x0200):             1595         case USB_ID(0x10f5, 0x0200):
1596                 /* C-Media CM106 / Turtle Bea    1596                 /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */
1597                 return snd_usb_cm106_boot_qui    1597                 return snd_usb_cm106_boot_quirk(dev);
1598                                                  1598 
1599         case USB_ID(0x0d8c, 0x0102):             1599         case USB_ID(0x0d8c, 0x0102):
1600                 /* C-Media CM6206 / CM106-Lik    1600                 /* C-Media CM6206 / CM106-Like Sound Device */
1601         case USB_ID(0x0ccd, 0x00b1): /* Terra    1601         case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */
1602                 return snd_usb_cm6206_boot_qu    1602                 return snd_usb_cm6206_boot_quirk(dev);
1603                                                  1603 
1604         case USB_ID(0x0dba, 0x3000):             1604         case USB_ID(0x0dba, 0x3000):
1605                 /* Digidesign Mbox 2 */          1605                 /* Digidesign Mbox 2 */
1606                 return snd_usb_mbox2_boot_qui    1606                 return snd_usb_mbox2_boot_quirk(dev);
1607         case USB_ID(0x0dba, 0x5000):             1607         case USB_ID(0x0dba, 0x5000):
1608                 /* Digidesign Mbox 3 */          1608                 /* Digidesign Mbox 3 */
1609                 return snd_usb_mbox3_boot_qui    1609                 return snd_usb_mbox3_boot_quirk(dev);
1610                                                  1610 
1611                                                  1611 
1612         case USB_ID(0x1235, 0x0010): /* Focus    1612         case USB_ID(0x1235, 0x0010): /* Focusrite Novation Saffire 6 USB */
1613         case USB_ID(0x1235, 0x0018): /* Focus    1613         case USB_ID(0x1235, 0x0018): /* Focusrite Novation Twitch */
1614                 return snd_usb_novation_boot_    1614                 return snd_usb_novation_boot_quirk(dev);
1615                                                  1615 
1616         case USB_ID(0x133e, 0x0815):             1616         case USB_ID(0x133e, 0x0815):
1617                 /* Access Music VirusTI Deskt    1617                 /* Access Music VirusTI Desktop */
1618                 return snd_usb_accessmusic_bo    1618                 return snd_usb_accessmusic_boot_quirk(dev);
1619                                                  1619 
1620         case USB_ID(0x17cc, 0x1000): /* Kompl    1620         case USB_ID(0x17cc, 0x1000): /* Komplete Audio 6 */
1621         case USB_ID(0x17cc, 0x1010): /* Trakt    1621         case USB_ID(0x17cc, 0x1010): /* Traktor Audio 6 */
1622         case USB_ID(0x17cc, 0x1020): /* Trakt    1622         case USB_ID(0x17cc, 0x1020): /* Traktor Audio 10 */
1623                 return snd_usb_nativeinstrume    1623                 return snd_usb_nativeinstruments_boot_quirk(dev);
1624         case USB_ID(0x0763, 0x2012):  /* M-Au    1624         case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
1625                 return snd_usb_fasttrackpro_b    1625                 return snd_usb_fasttrackpro_boot_quirk(dev);
1626         case USB_ID(0x047f, 0xc010): /* Plant    1626         case USB_ID(0x047f, 0xc010): /* Plantronics Gamecom 780 */
1627                 return snd_usb_gamecon780_boo    1627                 return snd_usb_gamecon780_boot_quirk(dev);
1628         case USB_ID(0x2466, 0x8010): /* Fract    1628         case USB_ID(0x2466, 0x8010): /* Fractal Audio Axe-Fx 3 */
1629                 return snd_usb_axefx3_boot_qu    1629                 return snd_usb_axefx3_boot_quirk(dev);
1630         case USB_ID(0x07fd, 0x0004): /* MOTU     1630         case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II */
1631                 /*                               1631                 /*
1632                  * For some reason interface     1632                  * For some reason interface 3 with vendor-spec class is
1633                  * detected on MicroBook IIc.    1633                  * detected on MicroBook IIc.
1634                  */                              1634                  */
1635                 if (get_iface_desc(intf->alts    1635                 if (get_iface_desc(intf->altsetting)->bInterfaceClass ==
1636                     USB_CLASS_VENDOR_SPEC &&     1636                     USB_CLASS_VENDOR_SPEC &&
1637                     get_iface_desc(intf->alts    1637                     get_iface_desc(intf->altsetting)->bInterfaceNumber < 3)
1638                         return snd_usb_motu_m    1638                         return snd_usb_motu_microbookii_boot_quirk(dev);
1639                 break;                           1639                 break;
1640         case USB_ID(0x2a39, 0x3f8c): /* RME D    1640         case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
1641                 return snd_usb_rme_digiface_b    1641                 return snd_usb_rme_digiface_boot_quirk(dev);
1642         }                                        1642         }
1643                                                  1643 
1644         return 0;                                1644         return 0;
1645 }                                                1645 }
1646                                                  1646 
1647 int snd_usb_apply_boot_quirk_once(struct usb_    1647 int snd_usb_apply_boot_quirk_once(struct usb_device *dev,
1648                                   struct usb_    1648                                   struct usb_interface *intf,
1649                                   const struc    1649                                   const struct snd_usb_audio_quirk *quirk,
1650                                   unsigned in    1650                                   unsigned int id)
1651 {                                                1651 {
1652         switch (id) {                            1652         switch (id) {
1653         case USB_ID(0x07fd, 0x0008): /* MOTU     1653         case USB_ID(0x07fd, 0x0008): /* MOTU M Series, 1st hardware version */
1654                 return snd_usb_motu_m_series_    1654                 return snd_usb_motu_m_series_boot_quirk(dev);
1655         }                                        1655         }
1656                                                  1656 
1657         return 0;                                1657         return 0;
1658 }                                                1658 }
1659                                                  1659 
1660 /*                                               1660 /*
1661  * check if the device uses big-endian sample    1661  * check if the device uses big-endian samples
1662  */                                              1662  */
1663 int snd_usb_is_big_endian_format(struct snd_u    1663 int snd_usb_is_big_endian_format(struct snd_usb_audio *chip,
1664                                  const struct    1664                                  const struct audioformat *fp)
1665 {                                                1665 {
1666         /* it depends on altsetting whether t    1666         /* it depends on altsetting whether the device is big-endian or not */
1667         switch (chip->usb_id) {                  1667         switch (chip->usb_id) {
1668         case USB_ID(0x0763, 0x2001): /* M-Aud    1668         case USB_ID(0x0763, 0x2001): /* M-Audio Quattro: captured data only */
1669                 if (fp->altsetting == 2 || fp    1669                 if (fp->altsetting == 2 || fp->altsetting == 3 ||
1670                         fp->altsetting == 5 |    1670                         fp->altsetting == 5 || fp->altsetting == 6)
1671                         return 1;                1671                         return 1;
1672                 break;                           1672                 break;
1673         case USB_ID(0x0763, 0x2003): /* M-Aud    1673         case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
1674                 if (chip->setup == 0x00 ||       1674                 if (chip->setup == 0x00 ||
1675                         fp->altsetting == 1 |    1675                         fp->altsetting == 1 || fp->altsetting == 2 ||
1676                         fp->altsetting == 3)     1676                         fp->altsetting == 3)
1677                         return 1;                1677                         return 1;
1678                 break;                           1678                 break;
1679         case USB_ID(0x0763, 0x2012): /* M-Aud    1679         case USB_ID(0x0763, 0x2012): /* M-Audio Fast Track Pro */
1680                 if (fp->altsetting == 2 || fp    1680                 if (fp->altsetting == 2 || fp->altsetting == 3 ||
1681                         fp->altsetting == 5 |    1681                         fp->altsetting == 5 || fp->altsetting == 6)
1682                         return 1;                1682                         return 1;
1683                 break;                           1683                 break;
1684         }                                        1684         }
1685         return 0;                                1685         return 0;
1686 }                                                1686 }
1687                                                  1687 
1688 /*                                               1688 /*
1689  * For E-Mu 0404USB/0202USB/TrackerPre/0204 s    1689  * For E-Mu 0404USB/0202USB/TrackerPre/0204 sample rate should be set for device,
1690  * not for interface.                            1690  * not for interface.
1691  */                                              1691  */
1692                                                  1692 
1693 enum {                                           1693 enum {
1694         EMU_QUIRK_SR_44100HZ = 0,                1694         EMU_QUIRK_SR_44100HZ = 0,
1695         EMU_QUIRK_SR_48000HZ,                    1695         EMU_QUIRK_SR_48000HZ,
1696         EMU_QUIRK_SR_88200HZ,                    1696         EMU_QUIRK_SR_88200HZ,
1697         EMU_QUIRK_SR_96000HZ,                    1697         EMU_QUIRK_SR_96000HZ,
1698         EMU_QUIRK_SR_176400HZ,                   1698         EMU_QUIRK_SR_176400HZ,
1699         EMU_QUIRK_SR_192000HZ                    1699         EMU_QUIRK_SR_192000HZ
1700 };                                               1700 };
1701                                                  1701 
1702 static void set_format_emu_quirk(struct snd_u    1702 static void set_format_emu_quirk(struct snd_usb_substream *subs,
1703                                  const struct    1703                                  const struct audioformat *fmt)
1704 {                                                1704 {
1705         unsigned char emu_samplerate_id = 0;     1705         unsigned char emu_samplerate_id = 0;
1706                                                  1706 
1707         /* When capture is active                1707         /* When capture is active
1708          * sample rate shouldn't be changed      1708          * sample rate shouldn't be changed
1709          * by playback substream                 1709          * by playback substream
1710          */                                      1710          */
1711         if (subs->direction == SNDRV_PCM_STRE    1711         if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) {
1712                 if (subs->stream->substream[S    1712                 if (subs->stream->substream[SNDRV_PCM_STREAM_CAPTURE].cur_audiofmt)
1713                         return;                  1713                         return;
1714         }                                        1714         }
1715                                                  1715 
1716         switch (fmt->rate_min) {                 1716         switch (fmt->rate_min) {
1717         case 48000:                              1717         case 48000:
1718                 emu_samplerate_id = EMU_QUIRK    1718                 emu_samplerate_id = EMU_QUIRK_SR_48000HZ;
1719                 break;                           1719                 break;
1720         case 88200:                              1720         case 88200:
1721                 emu_samplerate_id = EMU_QUIRK    1721                 emu_samplerate_id = EMU_QUIRK_SR_88200HZ;
1722                 break;                           1722                 break;
1723         case 96000:                              1723         case 96000:
1724                 emu_samplerate_id = EMU_QUIRK    1724                 emu_samplerate_id = EMU_QUIRK_SR_96000HZ;
1725                 break;                           1725                 break;
1726         case 176400:                             1726         case 176400:
1727                 emu_samplerate_id = EMU_QUIRK    1727                 emu_samplerate_id = EMU_QUIRK_SR_176400HZ;
1728                 break;                           1728                 break;
1729         case 192000:                             1729         case 192000:
1730                 emu_samplerate_id = EMU_QUIRK    1730                 emu_samplerate_id = EMU_QUIRK_SR_192000HZ;
1731                 break;                           1731                 break;
1732         default:                                 1732         default:
1733                 emu_samplerate_id = EMU_QUIRK    1733                 emu_samplerate_id = EMU_QUIRK_SR_44100HZ;
1734                 break;                           1734                 break;
1735         }                                        1735         }
1736         snd_emuusb_set_samplerate(subs->strea    1736         snd_emuusb_set_samplerate(subs->stream->chip, emu_samplerate_id);
1737         subs->pkt_offset_adj = (emu_samplerat    1737         subs->pkt_offset_adj = (emu_samplerate_id >= EMU_QUIRK_SR_176400HZ) ? 4 : 0;
1738 }                                                1738 }
1739                                                  1739 
1740 static int pioneer_djm_set_format_quirk(struc    1740 static int pioneer_djm_set_format_quirk(struct snd_usb_substream *subs,
1741                                         u16 w    1741                                         u16 windex)
1742 {                                                1742 {
1743         unsigned int cur_rate = subs->data_en    1743         unsigned int cur_rate = subs->data_endpoint->cur_rate;
1744         u8 sr[3];                                1744         u8 sr[3];
1745         // Convert to little endian              1745         // Convert to little endian
1746         sr[0] = cur_rate & 0xff;                 1746         sr[0] = cur_rate & 0xff;
1747         sr[1] = (cur_rate >> 8) & 0xff;          1747         sr[1] = (cur_rate >> 8) & 0xff;
1748         sr[2] = (cur_rate >> 16) & 0xff;         1748         sr[2] = (cur_rate >> 16) & 0xff;
1749         usb_set_interface(subs->dev, 0, 1);      1749         usb_set_interface(subs->dev, 0, 1);
1750         // we should derive windex from fmt-s    1750         // we should derive windex from fmt-sync_ep but it's not set
1751         snd_usb_ctl_msg(subs->stream->chip->d    1751         snd_usb_ctl_msg(subs->stream->chip->dev,
1752                 usb_sndctrlpipe(subs->stream-    1752                 usb_sndctrlpipe(subs->stream->chip->dev, 0),
1753                 0x01, 0x22, 0x0100, windex, &    1753                 0x01, 0x22, 0x0100, windex, &sr, 0x0003);
1754         return 0;                                1754         return 0;
1755 }                                                1755 }
1756                                                  1756 
1757 static void mbox3_set_format_quirk(struct snd    1757 static void mbox3_set_format_quirk(struct snd_usb_substream *subs,
1758                                 const struct     1758                                 const struct audioformat *fmt)
1759 {                                                1759 {
1760         __le32 buff4 = 0;                        1760         __le32 buff4 = 0;
1761         u8 buff1 = 0x01;                         1761         u8 buff1 = 0x01;
1762         u32 new_rate = subs->data_endpoint->c    1762         u32 new_rate = subs->data_endpoint->cur_rate;
1763         u32 current_rate;                        1763         u32 current_rate;
1764                                                  1764 
1765         // Get current rate from card and che    1765         // Get current rate from card and check if changing it is needed
1766         snd_usb_ctl_msg(subs->dev, usb_rcvctr    1766         snd_usb_ctl_msg(subs->dev, usb_rcvctrlpipe(subs->dev, 0),
1767                                         0x01,    1767                                         0x01, 0x21 | USB_DIR_IN, 0x0100, 0x8101, &buff4, 4);
1768         current_rate = le32_to_cpu(buff4);       1768         current_rate = le32_to_cpu(buff4);
1769         dev_dbg(&subs->dev->dev,                 1769         dev_dbg(&subs->dev->dev,
1770                          "MBOX3: Current conf    1770                          "MBOX3: Current configured sample rate: %d", current_rate);
1771         if (current_rate == new_rate) {          1771         if (current_rate == new_rate) {
1772                 dev_dbg(&subs->dev->dev,         1772                 dev_dbg(&subs->dev->dev,
1773                         "MBOX3: No change nee    1773                         "MBOX3: No change needed (current rate:%d == new rate:%d)",
1774                         current_rate, new_rat    1774                         current_rate, new_rate);
1775                 return;                          1775                 return;
1776         }                                        1776         }
1777                                                  1777 
1778         // Set new rate                          1778         // Set new rate
1779         dev_info(&subs->dev->dev,                1779         dev_info(&subs->dev->dev,
1780                          "MBOX3: Changing sam    1780                          "MBOX3: Changing sample rate to: %d", new_rate);
1781         buff4 = cpu_to_le32(new_rate);           1781         buff4 = cpu_to_le32(new_rate);
1782         snd_usb_ctl_msg(subs->dev, usb_sndctr    1782         snd_usb_ctl_msg(subs->dev, usb_sndctrlpipe(subs->dev, 0),
1783                                         0x01,    1783                                         0x01, 0x21, 0x0100, 0x8101, &buff4, 4);
1784                                                  1784 
1785         // Set clock source to Internal          1785         // Set clock source to Internal
1786         snd_usb_ctl_msg(subs->dev, usb_sndctr    1786         snd_usb_ctl_msg(subs->dev, usb_sndctrlpipe(subs->dev, 0),
1787                                         0x01,    1787                                         0x01, 0x21, 0x0100, 0x8001, &buff1, 1);
1788                                                  1788 
1789         // Check whether the change was succe    1789         // Check whether the change was successful
1790         buff4 = 0;                               1790         buff4 = 0;
1791         snd_usb_ctl_msg(subs->dev, usb_rcvctr    1791         snd_usb_ctl_msg(subs->dev, usb_rcvctrlpipe(subs->dev, 0),
1792                                         0x01,    1792                                         0x01, 0x21 | USB_DIR_IN, 0x0100, 0x8101, &buff4, 4);
1793         if (new_rate != le32_to_cpu(buff4))      1793         if (new_rate != le32_to_cpu(buff4))
1794                 dev_warn(&subs->dev->dev, "MB    1794                 dev_warn(&subs->dev->dev, "MBOX3: Couldn't set the sample rate");
1795 }                                                1795 }
1796                                                  1796 
1797 static const int rme_digiface_rate_table[] =     1797 static const int rme_digiface_rate_table[] = {
1798         32000, 44100, 48000, 0,                  1798         32000, 44100, 48000, 0,
1799         64000, 88200, 96000, 0,                  1799         64000, 88200, 96000, 0,
1800         128000, 176400, 192000, 0,               1800         128000, 176400, 192000, 0,
1801 };                                               1801 };
1802                                                  1802 
1803 static int rme_digiface_set_format_quirk(stru    1803 static int rme_digiface_set_format_quirk(struct snd_usb_substream *subs)
1804 {                                                1804 {
1805         unsigned int cur_rate = subs->data_en    1805         unsigned int cur_rate = subs->data_endpoint->cur_rate;
1806         u16 val;                                 1806         u16 val;
1807         int speed_mode;                          1807         int speed_mode;
1808         int id;                                  1808         int id;
1809                                                  1809 
1810         for (id = 0; id < ARRAY_SIZE(rme_digi    1810         for (id = 0; id < ARRAY_SIZE(rme_digiface_rate_table); id++) {
1811                 if (rme_digiface_rate_table[i    1811                 if (rme_digiface_rate_table[id] == cur_rate)
1812                         break;                   1812                         break;
1813         }                                        1813         }
1814                                                  1814 
1815         if (id >= ARRAY_SIZE(rme_digiface_rat    1815         if (id >= ARRAY_SIZE(rme_digiface_rate_table))
1816                 return -EINVAL;                  1816                 return -EINVAL;
1817                                                  1817 
1818         /* 2, 3, 4 for 1x, 2x, 4x */             1818         /* 2, 3, 4 for 1x, 2x, 4x */
1819         speed_mode = (id >> 2) + 2;              1819         speed_mode = (id >> 2) + 2;
1820         val = (id << 3) | (speed_mode << 12);    1820         val = (id << 3) | (speed_mode << 12);
1821                                                  1821 
1822         /* Set the sample rate */                1822         /* Set the sample rate */
1823         snd_usb_ctl_msg(subs->stream->chip->d    1823         snd_usb_ctl_msg(subs->stream->chip->dev,
1824                 usb_sndctrlpipe(subs->stream-    1824                 usb_sndctrlpipe(subs->stream->chip->dev, 0),
1825                 16, 0x40, val, 0x7078, NULL,     1825                 16, 0x40, val, 0x7078, NULL, 0);
1826         return 0;                                1826         return 0;
1827 }                                                1827 }
1828                                                  1828 
1829 void snd_usb_set_format_quirk(struct snd_usb_    1829 void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
1830                               const struct au    1830                               const struct audioformat *fmt)
1831 {                                                1831 {
1832         switch (subs->stream->chip->usb_id) {    1832         switch (subs->stream->chip->usb_id) {
1833         case USB_ID(0x041e, 0x3f02): /* E-Mu     1833         case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */
1834         case USB_ID(0x041e, 0x3f04): /* E-Mu     1834         case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */
1835         case USB_ID(0x041e, 0x3f0a): /* E-Mu     1835         case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */
1836         case USB_ID(0x041e, 0x3f19): /* E-Mu     1836         case USB_ID(0x041e, 0x3f19): /* E-Mu 0204 USB */
1837                 set_format_emu_quirk(subs, fm    1837                 set_format_emu_quirk(subs, fmt);
1838                 break;                           1838                 break;
1839         case USB_ID(0x534d, 0x0021): /* Macro    1839         case USB_ID(0x534d, 0x0021): /* MacroSilicon MS2100/MS2106 */
1840         case USB_ID(0x534d, 0x2109): /* Macro    1840         case USB_ID(0x534d, 0x2109): /* MacroSilicon MS2109 */
1841                 subs->stream_offset_adj = 2;     1841                 subs->stream_offset_adj = 2;
1842                 break;                           1842                 break;
1843         case USB_ID(0x2b73, 0x0013): /* Pione    1843         case USB_ID(0x2b73, 0x0013): /* Pioneer DJM-450 */
1844                 pioneer_djm_set_format_quirk(    1844                 pioneer_djm_set_format_quirk(subs, 0x0082);
1845                 break;                           1845                 break;
1846         case USB_ID(0x08e4, 0x017f): /* Pione    1846         case USB_ID(0x08e4, 0x017f): /* Pioneer DJM-750 */
1847         case USB_ID(0x08e4, 0x0163): /* Pione    1847         case USB_ID(0x08e4, 0x0163): /* Pioneer DJM-850 */
1848                 pioneer_djm_set_format_quirk(    1848                 pioneer_djm_set_format_quirk(subs, 0x0086);
1849                 break;                           1849                 break;
1850         case USB_ID(0x0dba, 0x5000):             1850         case USB_ID(0x0dba, 0x5000):
1851                 mbox3_set_format_quirk(subs,     1851                 mbox3_set_format_quirk(subs, fmt); /* Digidesign Mbox 3 */
1852                 break;                           1852                 break;
1853         case USB_ID(0x2a39, 0x3f8c): /* RME D    1853         case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
1854                 rme_digiface_set_format_quirk    1854                 rme_digiface_set_format_quirk(subs);
1855                 break;                           1855                 break;
1856         }                                        1856         }
1857 }                                                1857 }
1858                                                  1858 
1859 int snd_usb_select_mode_quirk(struct snd_usb_    1859 int snd_usb_select_mode_quirk(struct snd_usb_audio *chip,
1860                               const struct au    1860                               const struct audioformat *fmt)
1861 {                                                1861 {
1862         struct usb_device *dev = chip->dev;      1862         struct usb_device *dev = chip->dev;
1863         int err;                                 1863         int err;
1864                                                  1864 
1865         if (chip->quirk_flags & QUIRK_FLAG_IT    1865         if (chip->quirk_flags & QUIRK_FLAG_ITF_USB_DSD_DAC) {
1866                 /* First switch to alt set 0,    1866                 /* First switch to alt set 0, otherwise the mode switch cmd
1867                  * will not be accepted by th    1867                  * will not be accepted by the DAC
1868                  */                              1868                  */
1869                 err = usb_set_interface(dev,     1869                 err = usb_set_interface(dev, fmt->iface, 0);
1870                 if (err < 0)                     1870                 if (err < 0)
1871                         return err;              1871                         return err;
1872                                                  1872 
1873                 msleep(20); /* Delay needed a    1873                 msleep(20); /* Delay needed after setting the interface */
1874                                                  1874 
1875                 /* Vendor mode switch cmd is     1875                 /* Vendor mode switch cmd is required. */
1876                 if (fmt->formats & SNDRV_PCM_    1876                 if (fmt->formats & SNDRV_PCM_FMTBIT_DSD_U32_BE) {
1877                         /* DSD mode (DSD_U32)    1877                         /* DSD mode (DSD_U32) requested */
1878                         err = snd_usb_ctl_msg    1878                         err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), 0,
1879                                                  1879                                               USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
1880                                                  1880                                               1, 1, NULL, 0);
1881                         if (err < 0)             1881                         if (err < 0)
1882                                 return err;      1882                                 return err;
1883                                                  1883 
1884                 } else {                         1884                 } else {
1885                         /* PCM or DOP mode (S    1885                         /* PCM or DOP mode (S32) requested */
1886                         /* PCM mode (S16) req    1886                         /* PCM mode (S16) requested */
1887                         err = snd_usb_ctl_msg    1887                         err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), 0,
1888                                                  1888                                               USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
1889                                                  1889                                               0, 1, NULL, 0);
1890                         if (err < 0)             1890                         if (err < 0)
1891                                 return err;      1891                                 return err;
1892                                                  1892 
1893                 }                                1893                 }
1894                 msleep(20);                      1894                 msleep(20);
1895         }                                        1895         }
1896         return 0;                                1896         return 0;
1897 }                                                1897 }
1898                                                  1898 
1899 void snd_usb_endpoint_start_quirk(struct snd_    1899 void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)
1900 {                                                1900 {
1901         /*                                       1901         /*
1902          * "Playback Design" products send bo    1902          * "Playback Design" products send bogus feedback data at the start
1903          * of the stream. Ignore them.           1903          * of the stream. Ignore them.
1904          */                                      1904          */
1905         if (USB_ID_VENDOR(ep->chip->usb_id) =    1905         if (USB_ID_VENDOR(ep->chip->usb_id) == 0x23ba &&
1906             ep->type == SND_USB_ENDPOINT_TYPE    1906             ep->type == SND_USB_ENDPOINT_TYPE_SYNC)
1907                 ep->skip_packets = 4;            1907                 ep->skip_packets = 4;
1908                                                  1908 
1909         /*                                       1909         /*
1910          * M-Audio Fast Track C400/C600 - whe    1910          * M-Audio Fast Track C400/C600 - when packets are not skipped, real
1911          * world latency varies by approx. +/    1911          * world latency varies by approx. +/- 50 frames (at 96kHz) each time
1912          * the stream is (re)started. When sk    1912          * the stream is (re)started. When skipping packets 16 at endpoint
1913          * start up, the real world latency i    1913          * start up, the real world latency is stable within +/- 1 frame (also
1914          * across power cycles).                 1914          * across power cycles).
1915          */                                      1915          */
1916         if ((ep->chip->usb_id == USB_ID(0x076    1916         if ((ep->chip->usb_id == USB_ID(0x0763, 0x2030) ||
1917              ep->chip->usb_id == USB_ID(0x076    1917              ep->chip->usb_id == USB_ID(0x0763, 0x2031)) &&
1918             ep->type == SND_USB_ENDPOINT_TYPE    1918             ep->type == SND_USB_ENDPOINT_TYPE_DATA)
1919                 ep->skip_packets = 16;           1919                 ep->skip_packets = 16;
1920                                                  1920 
1921         /* Work around devices that report un    1921         /* Work around devices that report unreasonable feedback data */
1922         if ((ep->chip->usb_id == USB_ID(0x064    1922         if ((ep->chip->usb_id == USB_ID(0x0644, 0x8038) ||  /* TEAC UD-H01 */
1923              ep->chip->usb_id == USB_ID(0x185    1923              ep->chip->usb_id == USB_ID(0x1852, 0x5034)) && /* T+A Dac8 */
1924             ep->syncmaxsize == 4)                1924             ep->syncmaxsize == 4)
1925                 ep->tenor_fb_quirk = 1;          1925                 ep->tenor_fb_quirk = 1;
1926 }                                                1926 }
1927                                                  1927 
1928 /* quirk applied after snd_usb_ctl_msg(); not    1928 /* quirk applied after snd_usb_ctl_msg(); not applied during boot quirks */
1929 void snd_usb_ctl_msg_quirk(struct usb_device     1929 void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
1930                            __u8 request, __u8    1930                            __u8 request, __u8 requesttype, __u16 value,
1931                            __u16 index, void     1931                            __u16 index, void *data, __u16 size)
1932 {                                                1932 {
1933         struct snd_usb_audio *chip = dev_get_    1933         struct snd_usb_audio *chip = dev_get_drvdata(&dev->dev);
1934                                                  1934 
1935         if (!chip || (requesttype & USB_TYPE_    1935         if (!chip || (requesttype & USB_TYPE_MASK) != USB_TYPE_CLASS)
1936                 return;                          1936                 return;
1937                                                  1937 
1938         if (chip->quirk_flags & QUIRK_FLAG_CT    1938         if (chip->quirk_flags & QUIRK_FLAG_CTL_MSG_DELAY)
1939                 msleep(20);                      1939                 msleep(20);
1940         else if (chip->quirk_flags & QUIRK_FL    1940         else if (chip->quirk_flags & QUIRK_FLAG_CTL_MSG_DELAY_1M)
1941                 usleep_range(1000, 2000);        1941                 usleep_range(1000, 2000);
1942         else if (chip->quirk_flags & QUIRK_FL    1942         else if (chip->quirk_flags & QUIRK_FLAG_CTL_MSG_DELAY_5M)
1943                 usleep_range(5000, 6000);        1943                 usleep_range(5000, 6000);
1944 }                                                1944 }
1945                                                  1945 
1946 /*                                               1946 /*
1947  * snd_usb_interface_dsd_format_quirks() is c    1947  * snd_usb_interface_dsd_format_quirks() is called from format.c to
1948  * augment the PCM format bit-field for DSD t    1948  * augment the PCM format bit-field for DSD types. The UAC standards
1949  * don't have a designated bit field to denot    1949  * don't have a designated bit field to denote DSD-capable interfaces,
1950  * hence all hardware that is known to suppor    1950  * hence all hardware that is known to support this format has to be
1951  * listed here.                                  1951  * listed here.
1952  */                                              1952  */
1953 u64 snd_usb_interface_dsd_format_quirks(struc    1953 u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
1954                                         struc    1954                                         struct audioformat *fp,
1955                                         unsig    1955                                         unsigned int sample_bytes)
1956 {                                                1956 {
1957         struct usb_interface *iface;             1957         struct usb_interface *iface;
1958                                                  1958 
1959         /* Playback Designs */                   1959         /* Playback Designs */
1960         if (USB_ID_VENDOR(chip->usb_id) == 0x    1960         if (USB_ID_VENDOR(chip->usb_id) == 0x23ba &&
1961             USB_ID_PRODUCT(chip->usb_id) < 0x    1961             USB_ID_PRODUCT(chip->usb_id) < 0x0110) {
1962                 switch (fp->altsetting) {        1962                 switch (fp->altsetting) {
1963                 case 1:                          1963                 case 1:
1964                         fp->dsd_dop = true;      1964                         fp->dsd_dop = true;
1965                         return SNDRV_PCM_FMTB    1965                         return SNDRV_PCM_FMTBIT_DSD_U16_LE;
1966                 case 2:                          1966                 case 2:
1967                         fp->dsd_bitrev = true    1967                         fp->dsd_bitrev = true;
1968                         return SNDRV_PCM_FMTB    1968                         return SNDRV_PCM_FMTBIT_DSD_U8;
1969                 case 3:                          1969                 case 3:
1970                         fp->dsd_bitrev = true    1970                         fp->dsd_bitrev = true;
1971                         return SNDRV_PCM_FMTB    1971                         return SNDRV_PCM_FMTBIT_DSD_U16_LE;
1972                 }                                1972                 }
1973         }                                        1973         }
1974                                                  1974 
1975         /* XMOS based USB DACs */                1975         /* XMOS based USB DACs */
1976         switch (chip->usb_id) {                  1976         switch (chip->usb_id) {
1977         case USB_ID(0x139f, 0x5504): /* Nagra    1977         case USB_ID(0x139f, 0x5504): /* Nagra DAC */
1978         case USB_ID(0x20b1, 0x3089): /* Mola-    1978         case USB_ID(0x20b1, 0x3089): /* Mola-Mola DAC */
1979         case USB_ID(0x2522, 0x0007): /* LH La    1979         case USB_ID(0x2522, 0x0007): /* LH Labs Geek Out 1V5 */
1980         case USB_ID(0x2522, 0x0009): /* LH La    1980         case USB_ID(0x2522, 0x0009): /* LH Labs Geek Pulse X Inifinity 2V0 */
1981         case USB_ID(0x2522, 0x0012): /* LH La    1981         case USB_ID(0x2522, 0x0012): /* LH Labs VI DAC Infinity */
1982         case USB_ID(0x2772, 0x0230): /* Pro-J    1982         case USB_ID(0x2772, 0x0230): /* Pro-Ject Pre Box S2 Digital */
1983                 if (fp->altsetting == 2)         1983                 if (fp->altsetting == 2)
1984                         return SNDRV_PCM_FMTB    1984                         return SNDRV_PCM_FMTBIT_DSD_U32_BE;
1985                 break;                           1985                 break;
1986                                                  1986 
1987         case USB_ID(0x0d8c, 0x0316): /* Hegel    1987         case USB_ID(0x0d8c, 0x0316): /* Hegel HD12 DSD */
1988         case USB_ID(0x10cb, 0x0103): /* The B    1988         case USB_ID(0x10cb, 0x0103): /* The Bit Opus #3; with fp->dsd_raw */
1989         case USB_ID(0x16d0, 0x06b2): /* NuPri    1989         case USB_ID(0x16d0, 0x06b2): /* NuPrime DAC-10 */
1990         case USB_ID(0x16d0, 0x06b4): /* NuPri    1990         case USB_ID(0x16d0, 0x06b4): /* NuPrime Audio HD-AVP/AVA */
1991         case USB_ID(0x16d0, 0x0733): /* Furut    1991         case USB_ID(0x16d0, 0x0733): /* Furutech ADL Stratos */
1992         case USB_ID(0x16d0, 0x09d8): /* NuPri    1992         case USB_ID(0x16d0, 0x09d8): /* NuPrime IDA-8 */
1993         case USB_ID(0x16d0, 0x09db): /* NuPri    1993         case USB_ID(0x16d0, 0x09db): /* NuPrime Audio DAC-9 */
1994         case USB_ID(0x16d0, 0x09dd): /* Encor    1994         case USB_ID(0x16d0, 0x09dd): /* Encore mDSD */
1995         case USB_ID(0x1db5, 0x0003): /* Bryst    1995         case USB_ID(0x1db5, 0x0003): /* Bryston BDA3 */
1996         case USB_ID(0x20a0, 0x4143): /* WaveI    1996         case USB_ID(0x20a0, 0x4143): /* WaveIO USB Audio 2.0 */
1997         case USB_ID(0x22e1, 0xca01): /* HDTA     1997         case USB_ID(0x22e1, 0xca01): /* HDTA Serenade DSD */
1998         case USB_ID(0x249c, 0x9326): /* M2Tec    1998         case USB_ID(0x249c, 0x9326): /* M2Tech Young MkIII */
1999         case USB_ID(0x2616, 0x0106): /* PS Au    1999         case USB_ID(0x2616, 0x0106): /* PS Audio NuWave DAC */
2000         case USB_ID(0x2622, 0x0041): /* Audio    2000         case USB_ID(0x2622, 0x0041): /* Audiolab M-DAC+ */
2001         case USB_ID(0x278b, 0x5100): /* Rotel    2001         case USB_ID(0x278b, 0x5100): /* Rotel RC-1590 */
2002         case USB_ID(0x27f7, 0x3002): /* W4S D    2002         case USB_ID(0x27f7, 0x3002): /* W4S DAC-2v2SE */
2003         case USB_ID(0x29a2, 0x0086): /* Mutec    2003         case USB_ID(0x29a2, 0x0086): /* Mutec MC3+ USB */
2004         case USB_ID(0x6b42, 0x0042): /* MSB T    2004         case USB_ID(0x6b42, 0x0042): /* MSB Technology */
2005                 if (fp->altsetting == 3)         2005                 if (fp->altsetting == 3)
2006                         return SNDRV_PCM_FMTB    2006                         return SNDRV_PCM_FMTBIT_DSD_U32_BE;
2007                 break;                           2007                 break;
2008                                                  2008 
2009         /* Amanero Combo384 USB based DACs wi    2009         /* Amanero Combo384 USB based DACs with native DSD support */
2010         case USB_ID(0x16d0, 0x071a):  /* Aman    2010         case USB_ID(0x16d0, 0x071a):  /* Amanero - Combo384 */
2011                 if (fp->altsetting == 2) {       2011                 if (fp->altsetting == 2) {
2012                         switch (le16_to_cpu(c    2012                         switch (le16_to_cpu(chip->dev->descriptor.bcdDevice)) {
2013                         case 0x199:              2013                         case 0x199:
2014                                 return SNDRV_    2014                                 return SNDRV_PCM_FMTBIT_DSD_U32_LE;
2015                         case 0x19b:              2015                         case 0x19b:
2016                         case 0x203:              2016                         case 0x203:
2017                                 return SNDRV_    2017                                 return SNDRV_PCM_FMTBIT_DSD_U32_BE;
2018                         default:                 2018                         default:
2019                                 break;           2019                                 break;
2020                         }                        2020                         }
2021                 }                                2021                 }
2022                 break;                           2022                 break;
2023         case USB_ID(0x16d0, 0x0a23):             2023         case USB_ID(0x16d0, 0x0a23):
2024                 if (fp->altsetting == 2)         2024                 if (fp->altsetting == 2)
2025                         return SNDRV_PCM_FMTB    2025                         return SNDRV_PCM_FMTBIT_DSD_U32_BE;
2026                 break;                           2026                 break;
2027                                                  2027 
2028         default:                                 2028         default:
2029                 break;                           2029                 break;
2030         }                                        2030         }
2031                                                  2031 
2032         /* ITF-USB DSD based DACs */             2032         /* ITF-USB DSD based DACs */
2033         if (chip->quirk_flags & QUIRK_FLAG_IT    2033         if (chip->quirk_flags & QUIRK_FLAG_ITF_USB_DSD_DAC) {
2034                 iface = usb_ifnum_to_if(chip-    2034                 iface = usb_ifnum_to_if(chip->dev, fp->iface);
2035                                                  2035 
2036                 /* Altsetting 2 support nativ    2036                 /* Altsetting 2 support native DSD if the num of altsets is
2037                  * three (0-2),                  2037                  * three (0-2),
2038                  * Altsetting 3 support nativ    2038                  * Altsetting 3 support native DSD if the num of altsets is
2039                  * four (0-3).                   2039                  * four (0-3).
2040                  */                              2040                  */
2041                 if (fp->altsetting == iface->    2041                 if (fp->altsetting == iface->num_altsetting - 1)
2042                         return SNDRV_PCM_FMTB    2042                         return SNDRV_PCM_FMTBIT_DSD_U32_BE;
2043         }                                        2043         }
2044                                                  2044 
2045         /* Mostly generic method to detect ma    2045         /* Mostly generic method to detect many DSD-capable implementations */
2046         if ((chip->quirk_flags & QUIRK_FLAG_D    2046         if ((chip->quirk_flags & QUIRK_FLAG_DSD_RAW) && fp->dsd_raw)
2047                 return SNDRV_PCM_FMTBIT_DSD_U    2047                 return SNDRV_PCM_FMTBIT_DSD_U32_BE;
2048                                                  2048 
2049         return 0;                                2049         return 0;
2050 }                                                2050 }
2051                                                  2051 
2052 void snd_usb_audioformat_attributes_quirk(str    2052 void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,
2053                                           str    2053                                           struct audioformat *fp,
2054                                           int    2054                                           int stream)
2055 {                                                2055 {
2056         switch (chip->usb_id) {                  2056         switch (chip->usb_id) {
2057         case USB_ID(0x0a92, 0x0053): /* Audio    2057         case USB_ID(0x0a92, 0x0053): /* AudioTrak Optoplay */
2058                 /* Optoplay sets the sample r    2058                 /* Optoplay sets the sample rate attribute although
2059                  * it seems not supporting it    2059                  * it seems not supporting it in fact.
2060                  */                              2060                  */
2061                 fp->attributes &= ~UAC_EP_CS_    2061                 fp->attributes &= ~UAC_EP_CS_ATTR_SAMPLE_RATE;
2062                 break;                           2062                 break;
2063         case USB_ID(0x041e, 0x3020): /* Creat    2063         case USB_ID(0x041e, 0x3020): /* Creative SB Audigy 2 NX */
2064         case USB_ID(0x0763, 0x2003): /* M-Aud    2064         case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
2065                 /* doesn't set the sample rat    2065                 /* doesn't set the sample rate attribute, but supports it */
2066                 fp->attributes |= UAC_EP_CS_A    2066                 fp->attributes |= UAC_EP_CS_ATTR_SAMPLE_RATE;
2067                 break;                           2067                 break;
2068         case USB_ID(0x0763, 0x2001):  /* M-Au    2068         case USB_ID(0x0763, 0x2001):  /* M-Audio Quattro USB */
2069         case USB_ID(0x0763, 0x2012):  /* M-Au    2069         case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
2070         case USB_ID(0x047f, 0x0ca1): /* plant    2070         case USB_ID(0x047f, 0x0ca1): /* plantronics headset */
2071         case USB_ID(0x077d, 0x07af): /* Griff    2071         case USB_ID(0x077d, 0x07af): /* Griffin iMic (note that there is
2072                                         an ol    2072                                         an older model 77d:223) */
2073         /*                                       2073         /*
2074          * plantronics headset and Griffin iM    2074          * plantronics headset and Griffin iMic have set adaptive-in
2075          * although it's really not...           2075          * although it's really not...
2076          */                                      2076          */
2077                 fp->ep_attr &= ~USB_ENDPOINT_    2077                 fp->ep_attr &= ~USB_ENDPOINT_SYNCTYPE;
2078                 if (stream == SNDRV_PCM_STREA    2078                 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2079                         fp->ep_attr |= USB_EN    2079                         fp->ep_attr |= USB_ENDPOINT_SYNC_ADAPTIVE;
2080                 else                             2080                 else
2081                         fp->ep_attr |= USB_EN    2081                         fp->ep_attr |= USB_ENDPOINT_SYNC_SYNC;
2082                 break;                           2082                 break;
2083         case USB_ID(0x07fd, 0x0004):  /* MOTU    2083         case USB_ID(0x07fd, 0x0004):  /* MOTU MicroBook IIc */
2084                 /*                               2084                 /*
2085                  * MaxPacketsOnly attribute i    2085                  * MaxPacketsOnly attribute is erroneously set in endpoint
2086                  * descriptors. As a result t    2086                  * descriptors. As a result this card produces noise with
2087                  * all sample rates other tha    2087                  * all sample rates other than 96 kHz.
2088                  */                              2088                  */
2089                 fp->attributes &= ~UAC_EP_CS_    2089                 fp->attributes &= ~UAC_EP_CS_ATTR_FILL_MAX;
2090                 break;                           2090                 break;
2091         case USB_ID(0x1224, 0x2a25):  /* Jiel    2091         case USB_ID(0x1224, 0x2a25):  /* Jieli Technology USB PHY 2.0 */
2092                 /* mic works only when ep pac    2092                 /* mic works only when ep packet size is set to wMaxPacketSize */
2093                 fp->attributes |= UAC_EP_CS_A    2093                 fp->attributes |= UAC_EP_CS_ATTR_FILL_MAX;
2094                 break;                           2094                 break;
2095         case USB_ID(0x3511, 0x2b1e): /* Openc    2095         case USB_ID(0x3511, 0x2b1e): /* Opencomm2 UC USB Bluetooth dongle */
2096                 /* mic works only when ep pit    2096                 /* mic works only when ep pitch control is not set */
2097                 if (stream == SNDRV_PCM_STREA    2097                 if (stream == SNDRV_PCM_STREAM_CAPTURE)
2098                         fp->attributes &= ~UA    2098                         fp->attributes &= ~UAC_EP_CS_ATTR_PITCH_CONTROL;
2099                 break;                           2099                 break;
2100         }                                        2100         }
2101 }                                                2101 }
2102                                                  2102 
2103 /*                                               2103 /*
2104  * driver behavior quirk flags                   2104  * driver behavior quirk flags
2105  */                                              2105  */
2106 struct usb_audio_quirk_flags_table {             2106 struct usb_audio_quirk_flags_table {
2107         u32 id;                                  2107         u32 id;
2108         u32 flags;                               2108         u32 flags;
2109 };                                               2109 };
2110                                                  2110 
2111 #define DEVICE_FLG(vid, pid, _flags) \           2111 #define DEVICE_FLG(vid, pid, _flags) \
2112         { .id = USB_ID(vid, pid), .flags = (_    2112         { .id = USB_ID(vid, pid), .flags = (_flags) }
2113 #define VENDOR_FLG(vid, _flags) DEVICE_FLG(vi    2113 #define VENDOR_FLG(vid, _flags) DEVICE_FLG(vid, 0, _flags)
2114                                                  2114 
2115 static const struct usb_audio_quirk_flags_tab    2115 static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
2116         /* Device matches */                     2116         /* Device matches */
2117         DEVICE_FLG(0x041e, 0x3000, /* Creativ    2117         DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */
2118                    QUIRK_FLAG_IGNORE_CTL_ERRO    2118                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2119         DEVICE_FLG(0x041e, 0x4080, /* Creativ    2119         DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */
2120                    QUIRK_FLAG_GET_SAMPLE_RATE    2120                    QUIRK_FLAG_GET_SAMPLE_RATE),
2121         DEVICE_FLG(0x045e, 0x083c, /* MS USB     2121         DEVICE_FLG(0x045e, 0x083c, /* MS USB Link headset */
2122                    QUIRK_FLAG_GET_SAMPLE_RATE    2122                    QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY |
2123                    QUIRK_FLAG_DISABLE_AUTOSUS    2123                    QUIRK_FLAG_DISABLE_AUTOSUSPEND),
2124         DEVICE_FLG(0x046d, 0x084c, /* Logitec    2124         DEVICE_FLG(0x046d, 0x084c, /* Logitech ConferenceCam Connect */
2125                    QUIRK_FLAG_GET_SAMPLE_RATE    2125                    QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY_1M),
2126         DEVICE_FLG(0x046d, 0x0991, /* Logitec    2126         DEVICE_FLG(0x046d, 0x0991, /* Logitech QuickCam Pro */
2127                    QUIRK_FLAG_CTL_MSG_DELAY_1    2127                    QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR),
2128         DEVICE_FLG(0x046d, 0x09a4, /* Logitec    2128         DEVICE_FLG(0x046d, 0x09a4, /* Logitech QuickCam E 3500 */
2129                    QUIRK_FLAG_CTL_MSG_DELAY_1    2129                    QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR),
2130         DEVICE_FLG(0x0499, 0x1509, /* Steinbe    2130         DEVICE_FLG(0x0499, 0x1509, /* Steinberg UR22 */
2131                    QUIRK_FLAG_GENERIC_IMPLICI    2131                    QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2132         DEVICE_FLG(0x0499, 0x3108, /* Yamaha     2132         DEVICE_FLG(0x0499, 0x3108, /* Yamaha YIT-W12TX */
2133                    QUIRK_FLAG_GET_SAMPLE_RATE    2133                    QUIRK_FLAG_GET_SAMPLE_RATE),
2134         DEVICE_FLG(0x04d8, 0xfeea, /* Benchma    2134         DEVICE_FLG(0x04d8, 0xfeea, /* Benchmark DAC1 Pre */
2135                    QUIRK_FLAG_GET_SAMPLE_RATE    2135                    QUIRK_FLAG_GET_SAMPLE_RATE),
2136         DEVICE_FLG(0x04e8, 0xa051, /* Samsung    2136         DEVICE_FLG(0x04e8, 0xa051, /* Samsung USBC Headset (AKG) */
2137                    QUIRK_FLAG_SKIP_CLOCK_SELE    2137                    QUIRK_FLAG_SKIP_CLOCK_SELECTOR | QUIRK_FLAG_CTL_MSG_DELAY_5M),
2138         DEVICE_FLG(0x0525, 0xa4ad, /* Hamedal    2138         DEVICE_FLG(0x0525, 0xa4ad, /* Hamedal C20 usb camero */
2139                    QUIRK_FLAG_IFACE_SKIP_CLOS    2139                    QUIRK_FLAG_IFACE_SKIP_CLOSE),
2140         DEVICE_FLG(0x054c, 0x0b8c, /* Sony WA    2140         DEVICE_FLG(0x054c, 0x0b8c, /* Sony WALKMAN NW-A45 DAC */
2141                    QUIRK_FLAG_SET_IFACE_FIRST    2141                    QUIRK_FLAG_SET_IFACE_FIRST),
2142         DEVICE_FLG(0x0556, 0x0014, /* Phoenix    2142         DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
2143                    QUIRK_FLAG_GET_SAMPLE_RATE    2143                    QUIRK_FLAG_GET_SAMPLE_RATE),
2144         DEVICE_FLG(0x05a3, 0x9420, /* ELP HD     2144         DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
2145                    QUIRK_FLAG_GET_SAMPLE_RATE    2145                    QUIRK_FLAG_GET_SAMPLE_RATE),
2146         DEVICE_FLG(0x05a7, 0x1020, /* Bose Co    2146         DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
2147                    QUIRK_FLAG_GET_SAMPLE_RATE    2147                    QUIRK_FLAG_GET_SAMPLE_RATE),
2148         DEVICE_FLG(0x05e1, 0x0408, /* Syntek     2148         DEVICE_FLG(0x05e1, 0x0408, /* Syntek STK1160 */
2149                    QUIRK_FLAG_ALIGN_TRANSFER)    2149                    QUIRK_FLAG_ALIGN_TRANSFER),
2150         DEVICE_FLG(0x05e1, 0x0480, /* Hauppau    2150         DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */
2151                    QUIRK_FLAG_SHARE_MEDIA_DEV    2151                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2152         DEVICE_FLG(0x0644, 0x8043, /* TEAC UD    2152         DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */
2153                    QUIRK_FLAG_ITF_USB_DSD_DAC    2153                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
2154                    QUIRK_FLAG_IFACE_DELAY),      2154                    QUIRK_FLAG_IFACE_DELAY),
2155         DEVICE_FLG(0x0644, 0x8044, /* Esoteri    2155         DEVICE_FLG(0x0644, 0x8044, /* Esoteric D-05X */
2156                    QUIRK_FLAG_ITF_USB_DSD_DAC    2156                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
2157                    QUIRK_FLAG_IFACE_DELAY),      2157                    QUIRK_FLAG_IFACE_DELAY),
2158         DEVICE_FLG(0x0644, 0x804a, /* TEAC UD    2158         DEVICE_FLG(0x0644, 0x804a, /* TEAC UD-301 */
2159                    QUIRK_FLAG_ITF_USB_DSD_DAC    2159                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
2160                    QUIRK_FLAG_IFACE_DELAY),      2160                    QUIRK_FLAG_IFACE_DELAY),
2161         DEVICE_FLG(0x0644, 0x805f, /* TEAC Mo    2161         DEVICE_FLG(0x0644, 0x805f, /* TEAC Model 12 */
2162                    QUIRK_FLAG_FORCE_IFACE_RES    2162                    QUIRK_FLAG_FORCE_IFACE_RESET),
2163         DEVICE_FLG(0x0644, 0x806b, /* TEAC UD    2163         DEVICE_FLG(0x0644, 0x806b, /* TEAC UD-701 */
2164                    QUIRK_FLAG_ITF_USB_DSD_DAC    2164                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
2165                    QUIRK_FLAG_IFACE_DELAY),      2165                    QUIRK_FLAG_IFACE_DELAY),
2166         DEVICE_FLG(0x06f8, 0xb000, /* Hercule    2166         DEVICE_FLG(0x06f8, 0xb000, /* Hercules DJ Console (Windows Edition) */
2167                    QUIRK_FLAG_IGNORE_CTL_ERRO    2167                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2168         DEVICE_FLG(0x06f8, 0xd002, /* Hercule    2168         DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */
2169                    QUIRK_FLAG_IGNORE_CTL_ERRO    2169                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2170         DEVICE_FLG(0x0711, 0x5800, /* MCT Tri    2170         DEVICE_FLG(0x0711, 0x5800, /* MCT Trigger 5 USB-to-HDMI */
2171                    QUIRK_FLAG_GET_SAMPLE_RATE    2171                    QUIRK_FLAG_GET_SAMPLE_RATE),
2172         DEVICE_FLG(0x074d, 0x3553, /* Outlaw     2172         DEVICE_FLG(0x074d, 0x3553, /* Outlaw RR2150 (Micronas UAC3553B) */
2173                    QUIRK_FLAG_GET_SAMPLE_RATE    2173                    QUIRK_FLAG_GET_SAMPLE_RATE),
2174         DEVICE_FLG(0x0763, 0x2030, /* M-Audio    2174         DEVICE_FLG(0x0763, 0x2030, /* M-Audio Fast Track C400 */
2175                    QUIRK_FLAG_GENERIC_IMPLICI    2175                    QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2176         DEVICE_FLG(0x0763, 0x2031, /* M-Audio    2176         DEVICE_FLG(0x0763, 0x2031, /* M-Audio Fast Track C600 */
2177                    QUIRK_FLAG_GENERIC_IMPLICI    2177                    QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2178         DEVICE_FLG(0x07fd, 0x000b, /* MOTU M     2178         DEVICE_FLG(0x07fd, 0x000b, /* MOTU M Series 2nd hardware revision */
2179                    QUIRK_FLAG_CTL_MSG_DELAY_1    2179                    QUIRK_FLAG_CTL_MSG_DELAY_1M),
2180         DEVICE_FLG(0x08bb, 0x2702, /* LineX F    2180         DEVICE_FLG(0x08bb, 0x2702, /* LineX FM Transmitter */
2181                    QUIRK_FLAG_IGNORE_CTL_ERRO    2181                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2182         DEVICE_FLG(0x0951, 0x16ad, /* Kingsto    2182         DEVICE_FLG(0x0951, 0x16ad, /* Kingston HyperX */
2183                    QUIRK_FLAG_CTL_MSG_DELAY_1    2183                    QUIRK_FLAG_CTL_MSG_DELAY_1M),
2184         DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 5    2184         DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
2185                    QUIRK_FLAG_CTL_MSG_DELAY_1    2185                    QUIRK_FLAG_CTL_MSG_DELAY_1M),
2186         DEVICE_FLG(0x0c45, 0x6340, /* Sonix H    2186         DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
2187                    QUIRK_FLAG_GET_SAMPLE_RATE    2187                    QUIRK_FLAG_GET_SAMPLE_RATE),
2188         DEVICE_FLG(0x0ecb, 0x205c, /* JBL Qua    2188         DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
2189                    QUIRK_FLAG_FIXED_RATE),       2189                    QUIRK_FLAG_FIXED_RATE),
2190         DEVICE_FLG(0x0ecb, 0x2069, /* JBL Qua    2190         DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
2191                    QUIRK_FLAG_FIXED_RATE),       2191                    QUIRK_FLAG_FIXED_RATE),
2192         DEVICE_FLG(0x0fd9, 0x0008, /* Hauppau    2192         DEVICE_FLG(0x0fd9, 0x0008, /* Hauppauge HVR-950Q */
2193                    QUIRK_FLAG_SHARE_MEDIA_DEV    2193                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2194         DEVICE_FLG(0x1224, 0x2a25, /* Jieli T    2194         DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
2195                    QUIRK_FLAG_GET_SAMPLE_RATE    2195                    QUIRK_FLAG_GET_SAMPLE_RATE),
2196         DEVICE_FLG(0x1395, 0x740a, /* Sennhei    2196         DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
2197                    QUIRK_FLAG_GET_SAMPLE_RATE    2197                    QUIRK_FLAG_GET_SAMPLE_RATE),
2198         DEVICE_FLG(0x1397, 0x0507, /* Behring    2198         DEVICE_FLG(0x1397, 0x0507, /* Behringer UMC202HD */
2199                    QUIRK_FLAG_PLAYBACK_FIRST     2199                    QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2200         DEVICE_FLG(0x1397, 0x0508, /* Behring    2200         DEVICE_FLG(0x1397, 0x0508, /* Behringer UMC204HD */
2201                    QUIRK_FLAG_PLAYBACK_FIRST     2201                    QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2202         DEVICE_FLG(0x1397, 0x0509, /* Behring    2202         DEVICE_FLG(0x1397, 0x0509, /* Behringer UMC404HD */
2203                    QUIRK_FLAG_PLAYBACK_FIRST     2203                    QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2204         DEVICE_FLG(0x13e5, 0x0001, /* Serato     2204         DEVICE_FLG(0x13e5, 0x0001, /* Serato Phono */
2205                    QUIRK_FLAG_IGNORE_CTL_ERRO    2205                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2206         DEVICE_FLG(0x154e, 0x1002, /* Denon D    2206         DEVICE_FLG(0x154e, 0x1002, /* Denon DCD-1500RE */
2207                    QUIRK_FLAG_ITF_USB_DSD_DAC    2207                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
2208         DEVICE_FLG(0x154e, 0x1003, /* Denon D    2208         DEVICE_FLG(0x154e, 0x1003, /* Denon DA-300USB */
2209                    QUIRK_FLAG_ITF_USB_DSD_DAC    2209                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
2210         DEVICE_FLG(0x154e, 0x3005, /* Marantz    2210         DEVICE_FLG(0x154e, 0x3005, /* Marantz HD-DAC1 */
2211                    QUIRK_FLAG_ITF_USB_DSD_DAC    2211                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
2212         DEVICE_FLG(0x154e, 0x3006, /* Marantz    2212         DEVICE_FLG(0x154e, 0x3006, /* Marantz SA-14S1 */
2213                    QUIRK_FLAG_ITF_USB_DSD_DAC    2213                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
2214         DEVICE_FLG(0x154e, 0x300b, /* Marantz    2214         DEVICE_FLG(0x154e, 0x300b, /* Marantz SA-KI RUBY / SA-12 */
2215                    QUIRK_FLAG_DSD_RAW),          2215                    QUIRK_FLAG_DSD_RAW),
2216         DEVICE_FLG(0x154e, 0x500e, /* Denon D    2216         DEVICE_FLG(0x154e, 0x500e, /* Denon DN-X1600 */
2217                    QUIRK_FLAG_IGNORE_CLOCK_SO    2217                    QUIRK_FLAG_IGNORE_CLOCK_SOURCE),
2218         DEVICE_FLG(0x1686, 0x00dd, /* Zoom R1    2218         DEVICE_FLG(0x1686, 0x00dd, /* Zoom R16/24 */
2219                    QUIRK_FLAG_TX_LENGTH | QUI    2219                    QUIRK_FLAG_TX_LENGTH | QUIRK_FLAG_CTL_MSG_DELAY_1M),
2220         DEVICE_FLG(0x17aa, 0x1046, /* Lenovo     2220         DEVICE_FLG(0x17aa, 0x1046, /* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */
2221                    QUIRK_FLAG_DISABLE_AUTOSUS    2221                    QUIRK_FLAG_DISABLE_AUTOSUSPEND),
2222         DEVICE_FLG(0x17aa, 0x104d, /* Lenovo     2222         DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
2223                    QUIRK_FLAG_DISABLE_AUTOSUS    2223                    QUIRK_FLAG_DISABLE_AUTOSUSPEND),
2224         DEVICE_FLG(0x1852, 0x5062, /* Luxman     2224         DEVICE_FLG(0x1852, 0x5062, /* Luxman D-08u */
2225                    QUIRK_FLAG_ITF_USB_DSD_DAC    2225                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
2226         DEVICE_FLG(0x1852, 0x5065, /* Luxman     2226         DEVICE_FLG(0x1852, 0x5065, /* Luxman DA-06 */
2227                    QUIRK_FLAG_ITF_USB_DSD_DAC    2227                    QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
2228         DEVICE_FLG(0x1901, 0x0191, /* GE B850    2228         DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
2229                    QUIRK_FLAG_GET_SAMPLE_RATE    2229                    QUIRK_FLAG_GET_SAMPLE_RATE),
2230         DEVICE_FLG(0x19f7, 0x0035, /* RODE NT    2230         DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
2231                    QUIRK_FLAG_GET_SAMPLE_RATE    2231                    QUIRK_FLAG_GET_SAMPLE_RATE),
2232         DEVICE_FLG(0x1bcf, 0x2281, /* HD Webc    2232         DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
2233                    QUIRK_FLAG_GET_SAMPLE_RATE    2233                    QUIRK_FLAG_GET_SAMPLE_RATE),
2234         DEVICE_FLG(0x1bcf, 0x2283, /* NexiGo     2234         DEVICE_FLG(0x1bcf, 0x2283, /* NexiGo N930AF FHD Webcam */
2235                    QUIRK_FLAG_GET_SAMPLE_RATE    2235                    QUIRK_FLAG_GET_SAMPLE_RATE),
2236         DEVICE_FLG(0x2040, 0x7200, /* Hauppau    2236         DEVICE_FLG(0x2040, 0x7200, /* Hauppauge HVR-950Q */
2237                    QUIRK_FLAG_SHARE_MEDIA_DEV    2237                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2238         DEVICE_FLG(0x2040, 0x7201, /* Hauppau    2238         DEVICE_FLG(0x2040, 0x7201, /* Hauppauge HVR-950Q-MXL */
2239                    QUIRK_FLAG_SHARE_MEDIA_DEV    2239                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2240         DEVICE_FLG(0x2040, 0x7210, /* Hauppau    2240         DEVICE_FLG(0x2040, 0x7210, /* Hauppauge HVR-950Q */
2241                    QUIRK_FLAG_SHARE_MEDIA_DEV    2241                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2242         DEVICE_FLG(0x2040, 0x7211, /* Hauppau    2242         DEVICE_FLG(0x2040, 0x7211, /* Hauppauge HVR-950Q-MXL */
2243                    QUIRK_FLAG_SHARE_MEDIA_DEV    2243                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2244         DEVICE_FLG(0x2040, 0x7213, /* Hauppau    2244         DEVICE_FLG(0x2040, 0x7213, /* Hauppauge HVR-950Q */
2245                    QUIRK_FLAG_SHARE_MEDIA_DEV    2245                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2246         DEVICE_FLG(0x2040, 0x7217, /* Hauppau    2246         DEVICE_FLG(0x2040, 0x7217, /* Hauppauge HVR-950Q */
2247                    QUIRK_FLAG_SHARE_MEDIA_DEV    2247                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2248         DEVICE_FLG(0x2040, 0x721b, /* Hauppau    2248         DEVICE_FLG(0x2040, 0x721b, /* Hauppauge HVR-950Q */
2249                    QUIRK_FLAG_SHARE_MEDIA_DEV    2249                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2250         DEVICE_FLG(0x2040, 0x721e, /* Hauppau    2250         DEVICE_FLG(0x2040, 0x721e, /* Hauppauge HVR-950Q */
2251                    QUIRK_FLAG_SHARE_MEDIA_DEV    2251                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2252         DEVICE_FLG(0x2040, 0x721f, /* Hauppau    2252         DEVICE_FLG(0x2040, 0x721f, /* Hauppauge HVR-950Q */
2253                    QUIRK_FLAG_SHARE_MEDIA_DEV    2253                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2254         DEVICE_FLG(0x2040, 0x7240, /* Hauppau    2254         DEVICE_FLG(0x2040, 0x7240, /* Hauppauge HVR-850 */
2255                    QUIRK_FLAG_SHARE_MEDIA_DEV    2255                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2256         DEVICE_FLG(0x2040, 0x7260, /* Hauppau    2256         DEVICE_FLG(0x2040, 0x7260, /* Hauppauge HVR-950Q */
2257                    QUIRK_FLAG_SHARE_MEDIA_DEV    2257                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2258         DEVICE_FLG(0x2040, 0x7270, /* Hauppau    2258         DEVICE_FLG(0x2040, 0x7270, /* Hauppauge HVR-950Q */
2259                    QUIRK_FLAG_SHARE_MEDIA_DEV    2259                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2260         DEVICE_FLG(0x2040, 0x7280, /* Hauppau    2260         DEVICE_FLG(0x2040, 0x7280, /* Hauppauge HVR-950Q */
2261                    QUIRK_FLAG_SHARE_MEDIA_DEV    2261                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2262         DEVICE_FLG(0x2040, 0x7281, /* Hauppau    2262         DEVICE_FLG(0x2040, 0x7281, /* Hauppauge HVR-950Q-MXL */
2263                    QUIRK_FLAG_SHARE_MEDIA_DEV    2263                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2264         DEVICE_FLG(0x2040, 0x8200, /* Hauppau    2264         DEVICE_FLG(0x2040, 0x8200, /* Hauppauge Woodbury */
2265                    QUIRK_FLAG_SHARE_MEDIA_DEV    2265                    QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2266         DEVICE_FLG(0x21b4, 0x0081, /* AudioQu    2266         DEVICE_FLG(0x21b4, 0x0081, /* AudioQuest DragonFly */
2267                    QUIRK_FLAG_GET_SAMPLE_RATE    2267                    QUIRK_FLAG_GET_SAMPLE_RATE),
2268         DEVICE_FLG(0x21b4, 0x0230, /* Ayre QB    2268         DEVICE_FLG(0x21b4, 0x0230, /* Ayre QB-9 Twenty */
2269                    QUIRK_FLAG_DSD_RAW),          2269                    QUIRK_FLAG_DSD_RAW),
2270         DEVICE_FLG(0x21b4, 0x0232, /* Ayre QX    2270         DEVICE_FLG(0x21b4, 0x0232, /* Ayre QX-5 Twenty */
2271                    QUIRK_FLAG_DSD_RAW),          2271                    QUIRK_FLAG_DSD_RAW),
2272         DEVICE_FLG(0x2522, 0x0007, /* LH Labs    2272         DEVICE_FLG(0x2522, 0x0007, /* LH Labs Geek Out HD Audio 1V5 */
2273                    QUIRK_FLAG_SET_IFACE_FIRST    2273                    QUIRK_FLAG_SET_IFACE_FIRST),
2274         DEVICE_FLG(0x2708, 0x0002, /* Audient    2274         DEVICE_FLG(0x2708, 0x0002, /* Audient iD14 */
2275                    QUIRK_FLAG_IGNORE_CTL_ERRO    2275                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2276         DEVICE_FLG(0x2912, 0x30c8, /* Audioen    2276         DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
2277                    QUIRK_FLAG_GET_SAMPLE_RATE    2277                    QUIRK_FLAG_GET_SAMPLE_RATE),
2278         DEVICE_FLG(0x2b53, 0x0023, /* Fiero S    2278         DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
2279                    QUIRK_FLAG_GENERIC_IMPLICI    2279                    QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2280         DEVICE_FLG(0x2b53, 0x0024, /* Fiero S    2280         DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
2281                    QUIRK_FLAG_GENERIC_IMPLICI    2281                    QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2282         DEVICE_FLG(0x2b53, 0x0031, /* Fiero S    2282         DEVICE_FLG(0x2b53, 0x0031, /* Fiero SC-01 (firmware v1.1.0) */
2283                    QUIRK_FLAG_GENERIC_IMPLICI    2283                    QUIRK_FLAG_GENERIC_IMPLICIT_FB),
2284         DEVICE_FLG(0x2d95, 0x8011, /* VIVO US    2284         DEVICE_FLG(0x2d95, 0x8011, /* VIVO USB-C HEADSET */
2285                    QUIRK_FLAG_CTL_MSG_DELAY_1    2285                    QUIRK_FLAG_CTL_MSG_DELAY_1M),
2286         DEVICE_FLG(0x2d95, 0x8021, /* VIVO US    2286         DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
2287                    QUIRK_FLAG_CTL_MSG_DELAY_1    2287                    QUIRK_FLAG_CTL_MSG_DELAY_1M),
2288         DEVICE_FLG(0x30be, 0x0101, /* Schiit     2288         DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
2289                    QUIRK_FLAG_IGNORE_CTL_ERRO    2289                    QUIRK_FLAG_IGNORE_CTL_ERROR),
2290         DEVICE_FLG(0x413c, 0xa506, /* Dell AE    2290         DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
2291                    QUIRK_FLAG_GET_SAMPLE_RATE    2291                    QUIRK_FLAG_GET_SAMPLE_RATE),
2292         DEVICE_FLG(0x534d, 0x0021, /* MacroSi    2292         DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
2293                    QUIRK_FLAG_ALIGN_TRANSFER)    2293                    QUIRK_FLAG_ALIGN_TRANSFER),
2294         DEVICE_FLG(0x534d, 0x2109, /* MacroSi    2294         DEVICE_FLG(0x534d, 0x2109, /* MacroSilicon MS2109 */
2295                    QUIRK_FLAG_ALIGN_TRANSFER)    2295                    QUIRK_FLAG_ALIGN_TRANSFER),
2296                                                  2296 
2297         /* Vendor matches */                     2297         /* Vendor matches */
2298         VENDOR_FLG(0x045e, /* MS Lifecam */      2298         VENDOR_FLG(0x045e, /* MS Lifecam */
2299                    QUIRK_FLAG_GET_SAMPLE_RATE    2299                    QUIRK_FLAG_GET_SAMPLE_RATE),
2300         VENDOR_FLG(0x046d, /* Logitech */        2300         VENDOR_FLG(0x046d, /* Logitech */
2301                    QUIRK_FLAG_CTL_MSG_DELAY_1    2301                    QUIRK_FLAG_CTL_MSG_DELAY_1M),
2302         VENDOR_FLG(0x047f, /* Plantronics */     2302         VENDOR_FLG(0x047f, /* Plantronics */
2303                    QUIRK_FLAG_GET_SAMPLE_RATE    2303                    QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY),
2304         VENDOR_FLG(0x0644, /* TEAC Corp. */      2304         VENDOR_FLG(0x0644, /* TEAC Corp. */
2305                    QUIRK_FLAG_CTL_MSG_DELAY |    2305                    QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY),
2306         VENDOR_FLG(0x07fd, /* MOTU */            2306         VENDOR_FLG(0x07fd, /* MOTU */
2307                    QUIRK_FLAG_VALIDATE_RATES)    2307                    QUIRK_FLAG_VALIDATE_RATES),
2308         VENDOR_FLG(0x1235, /* Focusrite Novat    2308         VENDOR_FLG(0x1235, /* Focusrite Novation */
2309                    QUIRK_FLAG_VALIDATE_RATES)    2309                    QUIRK_FLAG_VALIDATE_RATES),
2310         VENDOR_FLG(0x1511, /* AURALiC */         2310         VENDOR_FLG(0x1511, /* AURALiC */
2311                    QUIRK_FLAG_DSD_RAW),          2311                    QUIRK_FLAG_DSD_RAW),
2312         VENDOR_FLG(0x152a, /* Thesycon device    2312         VENDOR_FLG(0x152a, /* Thesycon devices */
2313                    QUIRK_FLAG_DSD_RAW),          2313                    QUIRK_FLAG_DSD_RAW),
2314         VENDOR_FLG(0x18d1, /* iBasso devices     2314         VENDOR_FLG(0x18d1, /* iBasso devices */
2315                    QUIRK_FLAG_DSD_RAW),          2315                    QUIRK_FLAG_DSD_RAW),
2316         VENDOR_FLG(0x1de7, /* Phoenix Audio *    2316         VENDOR_FLG(0x1de7, /* Phoenix Audio */
2317                    QUIRK_FLAG_GET_SAMPLE_RATE    2317                    QUIRK_FLAG_GET_SAMPLE_RATE),
2318         VENDOR_FLG(0x20b1, /* XMOS based devi    2318         VENDOR_FLG(0x20b1, /* XMOS based devices */
2319                    QUIRK_FLAG_DSD_RAW),          2319                    QUIRK_FLAG_DSD_RAW),
2320         VENDOR_FLG(0x21ed, /* Accuphase Labor    2320         VENDOR_FLG(0x21ed, /* Accuphase Laboratory */
2321                    QUIRK_FLAG_DSD_RAW),          2321                    QUIRK_FLAG_DSD_RAW),
2322         VENDOR_FLG(0x22d9, /* Oppo */            2322         VENDOR_FLG(0x22d9, /* Oppo */
2323                    QUIRK_FLAG_DSD_RAW),          2323                    QUIRK_FLAG_DSD_RAW),
2324         VENDOR_FLG(0x23ba, /* Playback Design    2324         VENDOR_FLG(0x23ba, /* Playback Design */
2325                    QUIRK_FLAG_CTL_MSG_DELAY |    2325                    QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY |
2326                    QUIRK_FLAG_DSD_RAW),          2326                    QUIRK_FLAG_DSD_RAW),
2327         VENDOR_FLG(0x25ce, /* Mytek devices *    2327         VENDOR_FLG(0x25ce, /* Mytek devices */
2328                    QUIRK_FLAG_DSD_RAW),          2328                    QUIRK_FLAG_DSD_RAW),
2329         VENDOR_FLG(0x278b, /* Rotel? */          2329         VENDOR_FLG(0x278b, /* Rotel? */
2330                    QUIRK_FLAG_DSD_RAW),          2330                    QUIRK_FLAG_DSD_RAW),
2331         VENDOR_FLG(0x292b, /* Gustard/Ess bas    2331         VENDOR_FLG(0x292b, /* Gustard/Ess based devices */
2332                    QUIRK_FLAG_DSD_RAW),          2332                    QUIRK_FLAG_DSD_RAW),
2333         VENDOR_FLG(0x2972, /* FiiO devices */    2333         VENDOR_FLG(0x2972, /* FiiO devices */
2334                    QUIRK_FLAG_DSD_RAW),          2334                    QUIRK_FLAG_DSD_RAW),
2335         VENDOR_FLG(0x2ab6, /* T+A devices */     2335         VENDOR_FLG(0x2ab6, /* T+A devices */
2336                    QUIRK_FLAG_DSD_RAW),          2336                    QUIRK_FLAG_DSD_RAW),
2337         VENDOR_FLG(0x2afd, /* McIntosh Labora    2337         VENDOR_FLG(0x2afd, /* McIntosh Laboratory, Inc. */
2338                    QUIRK_FLAG_DSD_RAW),          2338                    QUIRK_FLAG_DSD_RAW),
2339         VENDOR_FLG(0x2d87, /* Cayin device */    2339         VENDOR_FLG(0x2d87, /* Cayin device */
2340                    QUIRK_FLAG_DSD_RAW),          2340                    QUIRK_FLAG_DSD_RAW),
2341         VENDOR_FLG(0x3336, /* HEM devices */     2341         VENDOR_FLG(0x3336, /* HEM devices */
2342                    QUIRK_FLAG_DSD_RAW),          2342                    QUIRK_FLAG_DSD_RAW),
2343         VENDOR_FLG(0x3353, /* Khadas devices     2343         VENDOR_FLG(0x3353, /* Khadas devices */
2344                    QUIRK_FLAG_DSD_RAW),          2344                    QUIRK_FLAG_DSD_RAW),
2345         VENDOR_FLG(0x35f4, /* MSB Technology     2345         VENDOR_FLG(0x35f4, /* MSB Technology */
2346                    QUIRK_FLAG_DSD_RAW),          2346                    QUIRK_FLAG_DSD_RAW),
2347         VENDOR_FLG(0x3842, /* EVGA */            2347         VENDOR_FLG(0x3842, /* EVGA */
2348                    QUIRK_FLAG_DSD_RAW),          2348                    QUIRK_FLAG_DSD_RAW),
2349         VENDOR_FLG(0xc502, /* HiBy devices */    2349         VENDOR_FLG(0xc502, /* HiBy devices */
2350                    QUIRK_FLAG_DSD_RAW),          2350                    QUIRK_FLAG_DSD_RAW),
2351                                                  2351 
2352         {} /* terminator */                      2352         {} /* terminator */
2353 };                                               2353 };
2354                                                  2354 
2355 void snd_usb_init_quirk_flags(struct snd_usb_    2355 void snd_usb_init_quirk_flags(struct snd_usb_audio *chip)
2356 {                                                2356 {
2357         const struct usb_audio_quirk_flags_ta    2357         const struct usb_audio_quirk_flags_table *p;
2358                                                  2358 
2359         for (p = quirk_flags_table; p->id; p+    2359         for (p = quirk_flags_table; p->id; p++) {
2360                 if (chip->usb_id == p->id ||     2360                 if (chip->usb_id == p->id ||
2361                     (!USB_ID_PRODUCT(p->id) &    2361                     (!USB_ID_PRODUCT(p->id) &&
2362                      USB_ID_VENDOR(chip->usb_    2362                      USB_ID_VENDOR(chip->usb_id) == USB_ID_VENDOR(p->id))) {
2363                         usb_audio_dbg(chip,      2363                         usb_audio_dbg(chip,
2364                                       "Set qu    2364                                       "Set quirk_flags 0x%x for device %04x:%04x\n",
2365                                       p->flag    2365                                       p->flags, USB_ID_VENDOR(chip->usb_id),
2366                                       USB_ID_    2366                                       USB_ID_PRODUCT(chip->usb_id));
2367                         chip->quirk_flags |=     2367                         chip->quirk_flags |= p->flags;
2368                         return;                  2368                         return;
2369                 }                                2369                 }
2370         }                                        2370         }
2371 }                                                2371 }
2372                                                  2372 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php