]> Pileus Git - ~andy/linux/blobdiff - sound/usb/stream.c
Merge remote-tracking branch 'spi/fix/s3c64xx' into spi-linus
[~andy/linux] / sound / usb / stream.c
index 1ea5871cb980ea9f9f81aea0414e694b91ef0932..c4339f97226bddea9db02c578e6fb5774d1d5a0c 100644 (file)
@@ -493,10 +493,10 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
                altsd = get_iface_desc(alts);
                protocol = altsd->bInterfaceProtocol;
                /* skip invalid one */
-               if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
+               if (((altsd->bInterfaceClass != USB_CLASS_AUDIO ||
+                     (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&
+                      altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC)) &&
                     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
-                   (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&
-                    altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC) ||
                    altsd->bNumEndpoints < 1 ||
                    le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0)
                        continue;
@@ -512,6 +512,15 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
                if (snd_usb_apply_interface_quirk(chip, iface_no, altno))
                        continue;
 
+               /*
+                * Roland audio streaming interfaces are marked with protocols
+                * 0/1/2, but are UAC 1 compatible.
+                */
+               if (USB_ID_VENDOR(chip->usb_id) == 0x0582 &&
+                   altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
+                   protocol <= 2)
+                       protocol = UAC_VERSION_1;
+
                chconfig = 0;
                /* get audio formats */
                switch (protocol) {