[PATCH v2] ALSA: usb-audio: Add support for Arturia AF16Rig

Phil Willoughby
2026-03-28T08:14:41Z

Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.com>
Tested-by: Phil Willoughby <willerz@gmail.com>
Signed-off-by: Phil Willoughby <willerz@gmail.com>
---
sound/usb/clock.c | 4 +
sound/usb/quirks-table.h | 165 +++++++++++++++++++++++++++++++++++++++
2 files changed, 169 insertions(+)

diff --git a/sound/usb/clock.c b/sound/usb/clock.c
index 842ba5b801ea..3e597976ae9d 100644
--- a/sound/usb/clock.c
+++ b/sound/usb/clock.c
@@ -266,6 +266,10 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip,
UAC2_CS_CONTROL_CLOCK_VALID))
return true;

+ /* The Arturia AF16Rig reports that its clock is readable when it isn't */
+ if (chip->usb_id == USB_ID(0x1c75, 0xaf20))
+ return true;
+
err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
UAC2_CS_CONTROL_CLOCK_VALID << 8,
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
index eafc0d73cca1..8f79a15055a6 100644
--- a/sound/usb/quirks-table.h
+++ b/sound/usb/quirks-table.h
@@ -3900,5 +3900,170 @@ YAMAHA_DEVICE(0x7010, "UB99"),
QUIRK_RME_DIGIFACE(0x3f8c),
QUIRK_RME_DIGIFACE(0x3fa0),

+/* Arturia AudioFuse 16Rig Audio */
+/* AF16Rig MIDI has USB PID 0xaf21 and appears to work OK without quirks */
+{
+ USB_DEVICE(0x1c75, 0xaf20),
+ QUIRK_DRIVER_INFO {
+ .vendor_name = "Arturia",
+ .product_name = "AF16Rig",
+ QUIRK_DATA_COMPOSITE {
+ { QUIRK_DATA_STANDARD_MIXER(0) },
+ {
+ QUIRK_DATA_AUDIOFORMAT(1) { /* Playback */
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
+ .channels = 34,
+ .fmt_type = UAC_FORMAT_TYPE_I_PCM,
+ .fmt_bits = 24,
+ .fmt_sz = 4,
+ .iface = 1,
+ .altsetting = 1,
+ .altset_idx = 1,
+ .endpoint = 0x01,
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
+ USB_ENDPOINT_SYNC_ASYNC,
+ .datainterval = 1,
+ .protocol = UAC_VERSION_2,
+ .maxpacksize = 0x03b8,
+ .rates = SNDRV_PCM_RATE_44100|
+ SNDRV_PCM_RATE_48000,
+ .rate_min = 44100,
+ .rate_max = 48000,
+ .nr_rates = 2,
+ .rate_table = (unsigned int[]) { 44100, 48000 },
+ .clock = 41,
+ }
+ },
+ {
+ QUIRK_DATA_AUDIOFORMAT(1) { /* Playback */
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
+ .channels = 18,
+ .fmt_type = UAC_FORMAT_TYPE_I_PCM,
+ .fmt_bits = 24,
+ .fmt_sz = 4,
+ .iface = 1,
+ .altsetting = 1,
+ .altset_idx = 1,
+ .endpoint = 0x01,
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
+ USB_ENDPOINT_SYNC_ASYNC,
+ .datainterval = 1,
+ .protocol = UAC_VERSION_2,
+ .maxpacksize = 0x03a8,
+ .rates = SNDRV_PCM_RATE_88200|
+ SNDRV_PCM_RATE_96000,
+ .rate_min = 88200,
+ .rate_max = 96000,
+ .nr_rates = 2,
+ .rate_table = (unsigned int[]) { 88200, 96000 },
+ .clock = 41,
+ }
+ },
+ {
+ QUIRK_DATA_AUDIOFORMAT(1) { /* Playback */
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
+ .channels = 10,
+ .fmt_type = UAC_FORMAT_TYPE_I_PCM,
+ .fmt_bits = 24,
+ .fmt_sz = 4,
+ .iface = 1,
+ .altsetting = 3,
+ .altset_idx = 3,
+ .endpoint = 0x01,
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
+ USB_ENDPOINT_SYNC_ASYNC,
+ .datainterval = 1,
+ .protocol = UAC_VERSION_2,
+ .maxpacksize = 0x03e8,
+ .rates = SNDRV_PCM_RATE_176400|
+ SNDRV_PCM_RATE_192000,
+ .rate_min = 176400,
+ .rate_max = 192000,
+ .nr_rates = 2,
+ .rate_table = (unsigned int[]) { 176400, 192000 },
+ .clock = 41,
+ }
+ },
+ {
+ QUIRK_DATA_AUDIOFORMAT(2) { /* Capture */
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
+ .channels = 34,
+ .fmt_type = UAC_FORMAT_TYPE_I_PCM,
+ .fmt_bits = 24,
+ .fmt_sz = 4,
+ .iface = 2,
+ .altsetting = 1,
+ .altset_idx = 1,
+ .endpoint = 0x81,
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
+ USB_ENDPOINT_SYNC_ASYNC,
+ .datainterval = 1,
+ .protocol = UAC_VERSION_2,
+ .maxpacksize = 0x03b8,
+ .rates = SNDRV_PCM_RATE_44100|
+ SNDRV_PCM_RATE_48000,
+ .rate_min = 44100,
+ .rate_max = 48000,
+ .nr_rates = 2,
+ .rate_table = (unsigned int[]) { 44100, 48000 },
+ .clock = 41,
+ }
+ },
+ {
+ QUIRK_DATA_AUDIOFORMAT(2) { /* Capture */
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
+ .channels = 18,
+ .fmt_type = UAC_FORMAT_TYPE_I_PCM,
+ .fmt_bits = 24,
+ .fmt_sz = 4,
+ .iface = 2,
+ .altsetting = 2,
+ .altset_idx = 2,
+ .endpoint = 0x81,
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
+ USB_ENDPOINT_SYNC_ASYNC,
+ .datainterval = 1,
+ .protocol = UAC_VERSION_2,
+ .maxpacksize = 0x03a8,
+ .rates = SNDRV_PCM_RATE_88200|
+ SNDRV_PCM_RATE_96000,
+ .rate_min = 88200,
+ .rate_max = 96000,
+ .nr_rates = 2,
+ .rate_table = (unsigned int[]) { 88200, 96000 },
+ .clock = 41,
+ }
+ },
+ {
+ QUIRK_DATA_AUDIOFORMAT(2) { /* Capture */
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
+ .channels = 10,
+ .fmt_type = UAC_FORMAT_TYPE_I_PCM,
+ .fmt_bits = 24,
+ .fmt_sz = 4,
+ .iface = 2,
+ .altsetting = 3,
+ .altset_idx = 3,
+ .endpoint = 0x81,
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
+ USB_ENDPOINT_SYNC_ASYNC,
+ .datainterval = 1,
+ .protocol = UAC_VERSION_2,
+ .maxpacksize = 0x03e8,
+ .rates = SNDRV_PCM_RATE_176400|
+ SNDRV_PCM_RATE_192000,
+ .rate_min = 176400,
+ .rate_max = 192000,
+ .nr_rates = 2,
+ .rate_table = (unsigned int[]) { 176400, 192000 },
+ .clock = 41,
+ }
+ },
+ { QUIRK_DATA_IGNORE(3) }, /* Firmware update */
+ QUIRK_COMPOSITE_END
+ }
+ }
+},
+
#undef USB_DEVICE_VENDOR_SPEC
#undef USB_AUDIO_DEVICE
--
2.53.0