mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 17:23:36 +00:00
ALSA: usb-audio: Add extra PID for RME Digiface USB
It seems there is an alternate version of the hardware with a different PID. User testing reveals this still works with the same interface as far as the kernel is concerned, so just add the extra PID. Thanks to Heiko Engemann for testing with this version. Due to the way quirks-table.h is structured, that means we have to turn the entire quirk struct into a macro to avoid duplicating it... Cc: stable@vger.kernel.org Signed-off-by: Asahi Lina <lina@asahilina.net> Link: https://patch.msgid.link/20241202-rme-digiface-usb-id-v1-1-50f730d7a46e@asahilina.net Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
f7d306b47a
commit
f09f0397db
@ -4116,6 +4116,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
|
||||
err = snd_bbfpro_controls_create(mixer);
|
||||
break;
|
||||
case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
|
||||
case USB_ID(0x2a39, 0x3fa0): /* RME Digiface USB (alternate) */
|
||||
err = snd_rme_digiface_controls_create(mixer);
|
||||
break;
|
||||
case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */
|
||||
|
@ -3673,176 +3673,181 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
/* Only claim interface 0 */
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR |
|
||||
USB_DEVICE_ID_MATCH_PRODUCT |
|
||||
USB_DEVICE_ID_MATCH_INT_CLASS |
|
||||
USB_DEVICE_ID_MATCH_INT_NUMBER,
|
||||
.idVendor = 0x2a39,
|
||||
.idProduct = 0x3f8c,
|
||||
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
|
||||
.bInterfaceNumber = 0,
|
||||
QUIRK_DRIVER_INFO {
|
||||
QUIRK_DATA_COMPOSITE {
|
||||
#define QUIRK_RME_DIGIFACE(pid) \
|
||||
{ \
|
||||
/* Only claim interface 0 */ \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR | \
|
||||
USB_DEVICE_ID_MATCH_PRODUCT | \
|
||||
USB_DEVICE_ID_MATCH_INT_CLASS | \
|
||||
USB_DEVICE_ID_MATCH_INT_NUMBER, \
|
||||
.idVendor = 0x2a39, \
|
||||
.idProduct = pid, \
|
||||
.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
|
||||
.bInterfaceNumber = 0, \
|
||||
QUIRK_DRIVER_INFO { \
|
||||
QUIRK_DATA_COMPOSITE { \
|
||||
/*
|
||||
* Three modes depending on sample rate band,
|
||||
* with different channel counts for in/out
|
||||
*/
|
||||
{ QUIRK_DATA_STANDARD_MIXER(0) },
|
||||
{
|
||||
QUIRK_DATA_AUDIOFORMAT(0) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.channels = 34, // outputs
|
||||
.fmt_bits = 24,
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x02,
|
||||
.ep_idx = 1,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC |
|
||||
USB_ENDPOINT_SYNC_ASYNC,
|
||||
.rates = SNDRV_PCM_RATE_32000 |
|
||||
SNDRV_PCM_RATE_44100 |
|
||||
SNDRV_PCM_RATE_48000,
|
||||
.rate_min = 32000,
|
||||
.rate_max = 48000,
|
||||
.nr_rates = 3,
|
||||
.rate_table = (unsigned int[]) {
|
||||
32000, 44100, 48000,
|
||||
},
|
||||
.sync_ep = 0x81,
|
||||
.sync_iface = 0,
|
||||
.sync_altsetting = 1,
|
||||
.sync_ep_idx = 0,
|
||||
.implicit_fb = 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
QUIRK_DATA_AUDIOFORMAT(0) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.channels = 18, // outputs
|
||||
.fmt_bits = 24,
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x02,
|
||||
.ep_idx = 1,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC |
|
||||
USB_ENDPOINT_SYNC_ASYNC,
|
||||
.rates = SNDRV_PCM_RATE_64000 |
|
||||
SNDRV_PCM_RATE_88200 |
|
||||
SNDRV_PCM_RATE_96000,
|
||||
.rate_min = 64000,
|
||||
.rate_max = 96000,
|
||||
.nr_rates = 3,
|
||||
.rate_table = (unsigned int[]) {
|
||||
64000, 88200, 96000,
|
||||
},
|
||||
.sync_ep = 0x81,
|
||||
.sync_iface = 0,
|
||||
.sync_altsetting = 1,
|
||||
.sync_ep_idx = 0,
|
||||
.implicit_fb = 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
QUIRK_DATA_AUDIOFORMAT(0) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.channels = 10, // outputs
|
||||
.fmt_bits = 24,
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x02,
|
||||
.ep_idx = 1,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC |
|
||||
USB_ENDPOINT_SYNC_ASYNC,
|
||||
.rates = SNDRV_PCM_RATE_KNOT |
|
||||
SNDRV_PCM_RATE_176400 |
|
||||
SNDRV_PCM_RATE_192000,
|
||||
.rate_min = 128000,
|
||||
.rate_max = 192000,
|
||||
.nr_rates = 3,
|
||||
.rate_table = (unsigned int[]) {
|
||||
128000, 176400, 192000,
|
||||
},
|
||||
.sync_ep = 0x81,
|
||||
.sync_iface = 0,
|
||||
.sync_altsetting = 1,
|
||||
.sync_ep_idx = 0,
|
||||
.implicit_fb = 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
QUIRK_DATA_AUDIOFORMAT(0) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.channels = 32, // inputs
|
||||
.fmt_bits = 24,
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x81,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC |
|
||||
USB_ENDPOINT_SYNC_ASYNC,
|
||||
.rates = SNDRV_PCM_RATE_32000 |
|
||||
SNDRV_PCM_RATE_44100 |
|
||||
SNDRV_PCM_RATE_48000,
|
||||
.rate_min = 32000,
|
||||
.rate_max = 48000,
|
||||
.nr_rates = 3,
|
||||
.rate_table = (unsigned int[]) {
|
||||
32000, 44100, 48000,
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
QUIRK_DATA_AUDIOFORMAT(0) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.channels = 16, // inputs
|
||||
.fmt_bits = 24,
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x81,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC |
|
||||
USB_ENDPOINT_SYNC_ASYNC,
|
||||
.rates = SNDRV_PCM_RATE_64000 |
|
||||
SNDRV_PCM_RATE_88200 |
|
||||
SNDRV_PCM_RATE_96000,
|
||||
.rate_min = 64000,
|
||||
.rate_max = 96000,
|
||||
.nr_rates = 3,
|
||||
.rate_table = (unsigned int[]) {
|
||||
64000, 88200, 96000,
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
QUIRK_DATA_AUDIOFORMAT(0) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.channels = 8, // inputs
|
||||
.fmt_bits = 24,
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x81,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC |
|
||||
USB_ENDPOINT_SYNC_ASYNC,
|
||||
.rates = SNDRV_PCM_RATE_KNOT |
|
||||
SNDRV_PCM_RATE_176400 |
|
||||
SNDRV_PCM_RATE_192000,
|
||||
.rate_min = 128000,
|
||||
.rate_max = 192000,
|
||||
.nr_rates = 3,
|
||||
.rate_table = (unsigned int[]) {
|
||||
128000, 176400, 192000,
|
||||
}
|
||||
}
|
||||
},
|
||||
QUIRK_COMPOSITE_END
|
||||
}
|
||||
}
|
||||
},
|
||||
*/ \
|
||||
{ QUIRK_DATA_STANDARD_MIXER(0) }, \
|
||||
{ \
|
||||
QUIRK_DATA_AUDIOFORMAT(0) { \
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
|
||||
.channels = 34, /* outputs */ \
|
||||
.fmt_bits = 24, \
|
||||
.iface = 0, \
|
||||
.altsetting = 1, \
|
||||
.altset_idx = 1, \
|
||||
.endpoint = 0x02, \
|
||||
.ep_idx = 1, \
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
|
||||
USB_ENDPOINT_SYNC_ASYNC, \
|
||||
.rates = SNDRV_PCM_RATE_32000 | \
|
||||
SNDRV_PCM_RATE_44100 | \
|
||||
SNDRV_PCM_RATE_48000, \
|
||||
.rate_min = 32000, \
|
||||
.rate_max = 48000, \
|
||||
.nr_rates = 3, \
|
||||
.rate_table = (unsigned int[]) { \
|
||||
32000, 44100, 48000, \
|
||||
}, \
|
||||
.sync_ep = 0x81, \
|
||||
.sync_iface = 0, \
|
||||
.sync_altsetting = 1, \
|
||||
.sync_ep_idx = 0, \
|
||||
.implicit_fb = 1, \
|
||||
}, \
|
||||
}, \
|
||||
{ \
|
||||
QUIRK_DATA_AUDIOFORMAT(0) { \
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
|
||||
.channels = 18, /* outputs */ \
|
||||
.fmt_bits = 24, \
|
||||
.iface = 0, \
|
||||
.altsetting = 1, \
|
||||
.altset_idx = 1, \
|
||||
.endpoint = 0x02, \
|
||||
.ep_idx = 1, \
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
|
||||
USB_ENDPOINT_SYNC_ASYNC, \
|
||||
.rates = SNDRV_PCM_RATE_64000 | \
|
||||
SNDRV_PCM_RATE_88200 | \
|
||||
SNDRV_PCM_RATE_96000, \
|
||||
.rate_min = 64000, \
|
||||
.rate_max = 96000, \
|
||||
.nr_rates = 3, \
|
||||
.rate_table = (unsigned int[]) { \
|
||||
64000, 88200, 96000, \
|
||||
}, \
|
||||
.sync_ep = 0x81, \
|
||||
.sync_iface = 0, \
|
||||
.sync_altsetting = 1, \
|
||||
.sync_ep_idx = 0, \
|
||||
.implicit_fb = 1, \
|
||||
}, \
|
||||
}, \
|
||||
{ \
|
||||
QUIRK_DATA_AUDIOFORMAT(0) { \
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
|
||||
.channels = 10, /* outputs */ \
|
||||
.fmt_bits = 24, \
|
||||
.iface = 0, \
|
||||
.altsetting = 1, \
|
||||
.altset_idx = 1, \
|
||||
.endpoint = 0x02, \
|
||||
.ep_idx = 1, \
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
|
||||
USB_ENDPOINT_SYNC_ASYNC, \
|
||||
.rates = SNDRV_PCM_RATE_KNOT | \
|
||||
SNDRV_PCM_RATE_176400 | \
|
||||
SNDRV_PCM_RATE_192000, \
|
||||
.rate_min = 128000, \
|
||||
.rate_max = 192000, \
|
||||
.nr_rates = 3, \
|
||||
.rate_table = (unsigned int[]) { \
|
||||
128000, 176400, 192000, \
|
||||
}, \
|
||||
.sync_ep = 0x81, \
|
||||
.sync_iface = 0, \
|
||||
.sync_altsetting = 1, \
|
||||
.sync_ep_idx = 0, \
|
||||
.implicit_fb = 1, \
|
||||
}, \
|
||||
}, \
|
||||
{ \
|
||||
QUIRK_DATA_AUDIOFORMAT(0) { \
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
|
||||
.channels = 32, /* inputs */ \
|
||||
.fmt_bits = 24, \
|
||||
.iface = 0, \
|
||||
.altsetting = 1, \
|
||||
.altset_idx = 1, \
|
||||
.endpoint = 0x81, \
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
|
||||
USB_ENDPOINT_SYNC_ASYNC, \
|
||||
.rates = SNDRV_PCM_RATE_32000 | \
|
||||
SNDRV_PCM_RATE_44100 | \
|
||||
SNDRV_PCM_RATE_48000, \
|
||||
.rate_min = 32000, \
|
||||
.rate_max = 48000, \
|
||||
.nr_rates = 3, \
|
||||
.rate_table = (unsigned int[]) { \
|
||||
32000, 44100, 48000, \
|
||||
} \
|
||||
} \
|
||||
}, \
|
||||
{ \
|
||||
QUIRK_DATA_AUDIOFORMAT(0) { \
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
|
||||
.channels = 16, /* inputs */ \
|
||||
.fmt_bits = 24, \
|
||||
.iface = 0, \
|
||||
.altsetting = 1, \
|
||||
.altset_idx = 1, \
|
||||
.endpoint = 0x81, \
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
|
||||
USB_ENDPOINT_SYNC_ASYNC, \
|
||||
.rates = SNDRV_PCM_RATE_64000 | \
|
||||
SNDRV_PCM_RATE_88200 | \
|
||||
SNDRV_PCM_RATE_96000, \
|
||||
.rate_min = 64000, \
|
||||
.rate_max = 96000, \
|
||||
.nr_rates = 3, \
|
||||
.rate_table = (unsigned int[]) { \
|
||||
64000, 88200, 96000, \
|
||||
} \
|
||||
} \
|
||||
}, \
|
||||
{ \
|
||||
QUIRK_DATA_AUDIOFORMAT(0) { \
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
|
||||
.channels = 8, /* inputs */ \
|
||||
.fmt_bits = 24, \
|
||||
.iface = 0, \
|
||||
.altsetting = 1, \
|
||||
.altset_idx = 1, \
|
||||
.endpoint = 0x81, \
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
|
||||
USB_ENDPOINT_SYNC_ASYNC, \
|
||||
.rates = SNDRV_PCM_RATE_KNOT | \
|
||||
SNDRV_PCM_RATE_176400 | \
|
||||
SNDRV_PCM_RATE_192000, \
|
||||
.rate_min = 128000, \
|
||||
.rate_max = 192000, \
|
||||
.nr_rates = 3, \
|
||||
.rate_table = (unsigned int[]) { \
|
||||
128000, 176400, 192000, \
|
||||
} \
|
||||
} \
|
||||
}, \
|
||||
QUIRK_COMPOSITE_END \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
QUIRK_RME_DIGIFACE(0x3f8c),
|
||||
QUIRK_RME_DIGIFACE(0x3fa0),
|
||||
|
||||
#undef USB_DEVICE_VENDOR_SPEC
|
||||
#undef USB_AUDIO_DEVICE
|
||||
|
@ -1665,6 +1665,7 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev,
|
||||
return snd_usb_motu_microbookii_boot_quirk(dev);
|
||||
break;
|
||||
case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
|
||||
case USB_ID(0x2a39, 0x3fa0): /* RME Digiface USB (alternate) */
|
||||
return snd_usb_rme_digiface_boot_quirk(dev);
|
||||
}
|
||||
|
||||
@ -1878,6 +1879,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
|
||||
mbox3_set_format_quirk(subs, fmt); /* Digidesign Mbox 3 */
|
||||
break;
|
||||
case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
|
||||
case USB_ID(0x2a39, 0x3fa0): /* RME Digiface USB (alternate) */
|
||||
rme_digiface_set_format_quirk(subs);
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user