ALSA: usb-audio: Add quirk for Focusrite Scarlett 18i6

Probing this device currently fails in snd_usb_audio_probe() because
the call to snd_usb_create_mixer() fails.  This is due to unknown or
non-standard interface descriptor subtypes in parse_audio_unit():

  usbaudio: unit 51: unexpected type 0x09
  snd-usb-audio: probe of 1-8:1.0 failed with error -5

Some people are working around this by recompiling usb-audio with the
call to snd_usb_create_mixer() commented out.  It would be nice to
avoid that.

While the best idea would be to look into the mixer creation failure,
a reasonable short-term solution is to use quirks to only probe the
trouble-free interfaces.  This allows audio and MIDI interfaces to be
used without any obvious issues.

Interface 0 is the main one to ignore.  It contains lots of
control-fu, including the unexpected interface descriptor subtypes.
Interface 5 is for firmware updates and I'm not sure how to get
support for this.  Interface 3 is some sort of control interface that
I don't understand:

    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0
      iInterface              0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength            9
        bInCollection           1
        baInterfaceNr( 0)       1

Signed-off-by: Martin Schwenke <martin@meltin.net>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Martin Schwenke 2012-11-13 19:38:03 +11:00 committed by Takashi Iwai
parent b7838c2b91
commit 1762a59d8e

View File

@ -2955,6 +2955,58 @@ YAMAHA_DEVICE(0x7010, "UB99"),
}
},
{
/*
* Focusrite Scarlett 18i6
*
* Avoid mixer creation, which otherwise fails because some of
* the interface descriptor subtypes for interface 0 are
* unknown. That should be fixed or worked-around but this at
* least allows the device to be used successfully with a DAW
* and an external mixer. See comments below about other
* ignored interfaces.
*/
USB_DEVICE(0x1235, 0x8004),
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
.vendor_name = "Focusrite",
.product_name = "Scarlett 18i6",
.ifnum = QUIRK_ANY_INTERFACE,
.type = QUIRK_COMPOSITE,
.data = & (const struct snd_usb_audio_quirk[]) {
{
/* InterfaceSubClass 1 (Control Device) */
.ifnum = 0,
.type = QUIRK_IGNORE_INTERFACE
},
{
.ifnum = 1,
.type = QUIRK_AUDIO_STANDARD_INTERFACE
},
{
.ifnum = 2,
.type = QUIRK_AUDIO_STANDARD_INTERFACE
},
{
/* InterfaceSubClass 1 (Control Device) */
.ifnum = 3,
.type = QUIRK_IGNORE_INTERFACE
},
{
.ifnum = 4,
.type = QUIRK_MIDI_STANDARD_INTERFACE
},
{
/* InterfaceSubClass 1 (Device Firmware Update) */
.ifnum = 5,
.type = QUIRK_IGNORE_INTERFACE
},
{
.ifnum = -1
}
}
}
},
{
/*
* Some USB MIDI devices don't have an audio control interface,