diff options
Diffstat (limited to 'sound/usb/card.c')
| -rw-r--r-- | sound/usb/card.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c index 1a033177b83f..64952e2d3ed1 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
| @@ -147,14 +147,32 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int | |||
| 147 | return -EINVAL; | 147 | return -EINVAL; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | alts = &iface->altsetting[0]; | ||
| 151 | altsd = get_iface_desc(alts); | ||
| 152 | |||
| 153 | /* | ||
| 154 | * Android with both accessory and audio interfaces enabled gets the | ||
| 155 | * interface numbers wrong. | ||
| 156 | */ | ||
| 157 | if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) || | ||
| 158 | chip->usb_id == USB_ID(0x18d1, 0x2d05)) && | ||
| 159 | interface == 0 && | ||
| 160 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC && | ||
| 161 | altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) { | ||
| 162 | interface = 2; | ||
| 163 | iface = usb_ifnum_to_if(dev, interface); | ||
| 164 | if (!iface) | ||
| 165 | return -EINVAL; | ||
| 166 | alts = &iface->altsetting[0]; | ||
| 167 | altsd = get_iface_desc(alts); | ||
| 168 | } | ||
| 169 | |||
| 150 | if (usb_interface_claimed(iface)) { | 170 | if (usb_interface_claimed(iface)) { |
| 151 | snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", | 171 | snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", |
| 152 | dev->devnum, ctrlif, interface); | 172 | dev->devnum, ctrlif, interface); |
| 153 | return -EINVAL; | 173 | return -EINVAL; |
| 154 | } | 174 | } |
| 155 | 175 | ||
| 156 | alts = &iface->altsetting[0]; | ||
| 157 | altsd = get_iface_desc(alts); | ||
| 158 | if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || | 176 | if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || |
| 159 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && | 177 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && |
| 160 | altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { | 178 | altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { |
