summaryrefslogtreecommitdiff
path: root/sound/usb/pcm.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2020-11-23 09:53:42 +0100
committerTakashi Iwai <tiwai@suse.de>2020-11-23 15:16:53 +0100
commit6234fdc1cede3c1deda8324bdbb8274c0f4ff192 (patch)
treecf4d0f4457962fd077b7f6c64414809887f7a296 /sound/usb/pcm.c
parent8ec08b1a5cf8e4de1db8919a27d0e2a801b09d24 (diff)
ALSA: usb-audio: Quirk for BOSS GT-001
The capture stream of BOSS GT-001 seems always requiring to be tied with the playback stream. OTOH, the playback stream of this device doesn't seem working in the implicit fb mode, per se, since the playback must be running before the capture stream. This patch tries to address the points above: - Avoid the implicit fb mode for the playback - Set up a fake sync EP for the capture stream with the hard-coded playback stream using the implicit fb mode Reported-by: Keith Milner <kamilner@superlative.org> Tested-by: Keith Milner <kamilner@superlative.org> Tested-by: Dylan Robinson <dylan_robinson@motu.com> Link: https://lore.kernel.org/r/20201123085347.19667-37-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb/pcm.c')
-rw-r--r--sound/usb/pcm.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index 5953e22a72c5..676acc20595b 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -403,6 +403,9 @@ static int audioformat_implicit_fb_quirk(struct snd_usb_audio *chip,
case USB_ID(0x0582, 0x01d8): /* BOSS Katana */
/* BOSS Katana amplifiers do not need quirks */
return 0;
+ case USB_ID(0x0582, 0x01e5): /* BOSS GT-001 */
+ /* BOSS GT-001 needs no implicit fb for playback */
+ return 0;
}
/* Generic UAC2 implicit feedback */
@@ -454,6 +457,30 @@ add_sync_ep:
return 1;
}
+static int audioformat_capture_quirk(struct snd_usb_audio *chip,
+ struct audioformat *fmt,
+ struct usb_host_interface *alts)
+{
+ struct usb_device *dev = chip->dev;
+
+ switch (chip->usb_id) {
+ case USB_ID(0x0582, 0x01e5): /* BOSS GT-001 */
+ if (!snd_usb_get_host_interface(chip, 0x01, 0x01))
+ return 0;
+ fmt->sync_ep = 0x0d;
+ fmt->sync_iface = 0x01;
+ fmt->sync_altsetting = 0x01;
+ fmt->sync_ep_idx = 0;
+ fmt->implicit_fb = 1;
+ dev_dbg(&dev->dev, "%d:%d: added fake capture sync sync_ep=%x, iface=%d, alt=%d\n",
+ fmt->iface, fmt->altsetting, fmt->sync_ep, fmt->sync_iface,
+ fmt->sync_altsetting);
+ return 1;
+ }
+ return 0;
+
+}
+
int snd_usb_audioformat_set_sync_ep(struct snd_usb_audio *chip,
struct audioformat *fmt)
{
@@ -474,6 +501,10 @@ int snd_usb_audioformat_set_sync_ep(struct snd_usb_audio *chip,
err = audioformat_implicit_fb_quirk(chip, fmt, alts);
if (err > 0)
return 0;
+ } else {
+ err = audioformat_capture_quirk(chip, fmt, alts);
+ if (err > 0)
+ return 0;
}
if (altsd->bNumEndpoints < 2)