Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbaf62c0 authored by Hector Martin's avatar Hector Martin Committed by Greg Kroah-Hartman
Browse files

ALSA: usb-audio: add quirk for MacroSilicon MS2109



commit e337bf19f6af38d5c3fa6d06cd594e0f890ca1ac upstream.

These devices claim to be 96kHz mono, but actually are 48kHz stereo with
swapped channels and unaligned transfers.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarHector Martin <marcan@marcan.st>
Link: https://lore.kernel.org/r/20200702071433.237843-1-marcan@marcan.st


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e7150981
Loading
Loading
Loading
Loading
+52 −0
Original line number Original line Diff line number Diff line
@@ -3460,4 +3460,56 @@ ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
	}
	}
},
},


/*
 * MacroSilicon MS2109 based HDMI capture cards
 *
 * These claim 96kHz 1ch in the descriptors, but are actually 48kHz 2ch.
 * They also need QUIRK_AUDIO_ALIGN_TRANSFER, which makes one wonder if
 * they pretend to be 96kHz mono as a workaround for stereo being broken
 * by that...
 *
 * They also have swapped L-R channels, but that's for userspace to deal
 * with.
 */
{
	USB_DEVICE(0x534d, 0x2109),
	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
		.vendor_name = "MacroSilicon",
		.product_name = "MS2109",
		.ifnum = QUIRK_ANY_INTERFACE,
		.type = QUIRK_COMPOSITE,
		.data = &(const struct snd_usb_audio_quirk[]) {
			{
				.ifnum = 2,
				.type = QUIRK_AUDIO_ALIGN_TRANSFER,
			},
			{
				.ifnum = 2,
				.type = QUIRK_AUDIO_STANDARD_MIXER,
			},
			{
				.ifnum = 3,
				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
				.data = &(const struct audioformat) {
					.formats = SNDRV_PCM_FMTBIT_S16_LE,
					.channels = 2,
					.iface = 3,
					.altsetting = 1,
					.altset_idx = 1,
					.attributes = 0,
					.endpoint = 0x82,
					.ep_attr = USB_ENDPOINT_XFER_ISOC |
						USB_ENDPOINT_SYNC_ASYNC,
					.rates = SNDRV_PCM_RATE_CONTINUOUS,
					.rate_min = 48000,
					.rate_max = 48000,
				}
			},
			{
				.ifnum = -1
			}
		}
	}
},

#undef USB_DEVICE_VENDOR_SPEC
#undef USB_DEVICE_VENDOR_SPEC