Skip to content

Commit f09f039

Browse files
asahilinatiwai
authored andcommitted
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>
1 parent f7d306b commit f09f039

File tree

3 files changed

+176
-168
lines changed

3 files changed

+176
-168
lines changed

sound/usb/mixer_quirks.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4116,6 +4116,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
41164116
err = snd_bbfpro_controls_create(mixer);
41174117
break;
41184118
case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
4119+
case USB_ID(0x2a39, 0x3fa0): /* RME Digiface USB (alternate) */
41194120
err = snd_rme_digiface_controls_create(mixer);
41204121
break;
41214122
case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */

sound/usb/quirks-table.h

Lines changed: 173 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -3673,176 +3673,181 @@ YAMAHA_DEVICE(0x7010, "UB99"),
36733673
}
36743674
}
36753675
},
3676-
{
3677-
/* Only claim interface 0 */
3678-
.match_flags = USB_DEVICE_ID_MATCH_VENDOR |
3679-
USB_DEVICE_ID_MATCH_PRODUCT |
3680-
USB_DEVICE_ID_MATCH_INT_CLASS |
3681-
USB_DEVICE_ID_MATCH_INT_NUMBER,
3682-
.idVendor = 0x2a39,
3683-
.idProduct = 0x3f8c,
3684-
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
3685-
.bInterfaceNumber = 0,
3686-
QUIRK_DRIVER_INFO {
3687-
QUIRK_DATA_COMPOSITE {
3676+
#define QUIRK_RME_DIGIFACE(pid) \
3677+
{ \
3678+
/* Only claim interface 0 */ \
3679+
.match_flags = USB_DEVICE_ID_MATCH_VENDOR | \
3680+
USB_DEVICE_ID_MATCH_PRODUCT | \
3681+
USB_DEVICE_ID_MATCH_INT_CLASS | \
3682+
USB_DEVICE_ID_MATCH_INT_NUMBER, \
3683+
.idVendor = 0x2a39, \
3684+
.idProduct = pid, \
3685+
.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
3686+
.bInterfaceNumber = 0, \
3687+
QUIRK_DRIVER_INFO { \
3688+
QUIRK_DATA_COMPOSITE { \
36883689
/*
36893690
* Three modes depending on sample rate band,
36903691
* with different channel counts for in/out
3691-
*/
3692-
{ QUIRK_DATA_STANDARD_MIXER(0) },
3693-
{
3694-
QUIRK_DATA_AUDIOFORMAT(0) {
3695-
.formats = SNDRV_PCM_FMTBIT_S32_LE,
3696-
.channels = 34, // outputs
3697-
.fmt_bits = 24,
3698-
.iface = 0,
3699-
.altsetting = 1,
3700-
.altset_idx = 1,
3701-
.endpoint = 0x02,
3702-
.ep_idx = 1,
3703-
.ep_attr = USB_ENDPOINT_XFER_ISOC |
3704-
USB_ENDPOINT_SYNC_ASYNC,
3705-
.rates = SNDRV_PCM_RATE_32000 |
3706-
SNDRV_PCM_RATE_44100 |
3707-
SNDRV_PCM_RATE_48000,
3708-
.rate_min = 32000,
3709-
.rate_max = 48000,
3710-
.nr_rates = 3,
3711-
.rate_table = (unsigned int[]) {
3712-
32000, 44100, 48000,
3713-
},
3714-
.sync_ep = 0x81,
3715-
.sync_iface = 0,
3716-
.sync_altsetting = 1,
3717-
.sync_ep_idx = 0,
3718-
.implicit_fb = 1,
3719-
},
3720-
},
3721-
{
3722-
QUIRK_DATA_AUDIOFORMAT(0) {
3723-
.formats = SNDRV_PCM_FMTBIT_S32_LE,
3724-
.channels = 18, // outputs
3725-
.fmt_bits = 24,
3726-
.iface = 0,
3727-
.altsetting = 1,
3728-
.altset_idx = 1,
3729-
.endpoint = 0x02,
3730-
.ep_idx = 1,
3731-
.ep_attr = USB_ENDPOINT_XFER_ISOC |
3732-
USB_ENDPOINT_SYNC_ASYNC,
3733-
.rates = SNDRV_PCM_RATE_64000 |
3734-
SNDRV_PCM_RATE_88200 |
3735-
SNDRV_PCM_RATE_96000,
3736-
.rate_min = 64000,
3737-
.rate_max = 96000,
3738-
.nr_rates = 3,
3739-
.rate_table = (unsigned int[]) {
3740-
64000, 88200, 96000,
3741-
},
3742-
.sync_ep = 0x81,
3743-
.sync_iface = 0,
3744-
.sync_altsetting = 1,
3745-
.sync_ep_idx = 0,
3746-
.implicit_fb = 1,
3747-
},
3748-
},
3749-
{
3750-
QUIRK_DATA_AUDIOFORMAT(0) {
3751-
.formats = SNDRV_PCM_FMTBIT_S32_LE,
3752-
.channels = 10, // outputs
3753-
.fmt_bits = 24,
3754-
.iface = 0,
3755-
.altsetting = 1,
3756-
.altset_idx = 1,
3757-
.endpoint = 0x02,
3758-
.ep_idx = 1,
3759-
.ep_attr = USB_ENDPOINT_XFER_ISOC |
3760-
USB_ENDPOINT_SYNC_ASYNC,
3761-
.rates = SNDRV_PCM_RATE_KNOT |
3762-
SNDRV_PCM_RATE_176400 |
3763-
SNDRV_PCM_RATE_192000,
3764-
.rate_min = 128000,
3765-
.rate_max = 192000,
3766-
.nr_rates = 3,
3767-
.rate_table = (unsigned int[]) {
3768-
128000, 176400, 192000,
3769-
},
3770-
.sync_ep = 0x81,
3771-
.sync_iface = 0,
3772-
.sync_altsetting = 1,
3773-
.sync_ep_idx = 0,
3774-
.implicit_fb = 1,
3775-
},
3776-
},
3777-
{
3778-
QUIRK_DATA_AUDIOFORMAT(0) {
3779-
.formats = SNDRV_PCM_FMTBIT_S32_LE,
3780-
.channels = 32, // inputs
3781-
.fmt_bits = 24,
3782-
.iface = 0,
3783-
.altsetting = 1,
3784-
.altset_idx = 1,
3785-
.endpoint = 0x81,
3786-
.ep_attr = USB_ENDPOINT_XFER_ISOC |
3787-
USB_ENDPOINT_SYNC_ASYNC,
3788-
.rates = SNDRV_PCM_RATE_32000 |
3789-
SNDRV_PCM_RATE_44100 |
3790-
SNDRV_PCM_RATE_48000,
3791-
.rate_min = 32000,
3792-
.rate_max = 48000,
3793-
.nr_rates = 3,
3794-
.rate_table = (unsigned int[]) {
3795-
32000, 44100, 48000,
3796-
}
3797-
}
3798-
},
3799-
{
3800-
QUIRK_DATA_AUDIOFORMAT(0) {
3801-
.formats = SNDRV_PCM_FMTBIT_S32_LE,
3802-
.channels = 16, // inputs
3803-
.fmt_bits = 24,
3804-
.iface = 0,
3805-
.altsetting = 1,
3806-
.altset_idx = 1,
3807-
.endpoint = 0x81,
3808-
.ep_attr = USB_ENDPOINT_XFER_ISOC |
3809-
USB_ENDPOINT_SYNC_ASYNC,
3810-
.rates = SNDRV_PCM_RATE_64000 |
3811-
SNDRV_PCM_RATE_88200 |
3812-
SNDRV_PCM_RATE_96000,
3813-
.rate_min = 64000,
3814-
.rate_max = 96000,
3815-
.nr_rates = 3,
3816-
.rate_table = (unsigned int[]) {
3817-
64000, 88200, 96000,
3818-
}
3819-
}
3820-
},
3821-
{
3822-
QUIRK_DATA_AUDIOFORMAT(0) {
3823-
.formats = SNDRV_PCM_FMTBIT_S32_LE,
3824-
.channels = 8, // inputs
3825-
.fmt_bits = 24,
3826-
.iface = 0,
3827-
.altsetting = 1,
3828-
.altset_idx = 1,
3829-
.endpoint = 0x81,
3830-
.ep_attr = USB_ENDPOINT_XFER_ISOC |
3831-
USB_ENDPOINT_SYNC_ASYNC,
3832-
.rates = SNDRV_PCM_RATE_KNOT |
3833-
SNDRV_PCM_RATE_176400 |
3834-
SNDRV_PCM_RATE_192000,
3835-
.rate_min = 128000,
3836-
.rate_max = 192000,
3837-
.nr_rates = 3,
3838-
.rate_table = (unsigned int[]) {
3839-
128000, 176400, 192000,
3840-
}
3841-
}
3842-
},
3843-
QUIRK_COMPOSITE_END
3844-
}
3845-
}
3846-
},
3692+
*/ \
3693+
{ QUIRK_DATA_STANDARD_MIXER(0) }, \
3694+
{ \
3695+
QUIRK_DATA_AUDIOFORMAT(0) { \
3696+
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
3697+
.channels = 34, /* outputs */ \
3698+
.fmt_bits = 24, \
3699+
.iface = 0, \
3700+
.altsetting = 1, \
3701+
.altset_idx = 1, \
3702+
.endpoint = 0x02, \
3703+
.ep_idx = 1, \
3704+
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
3705+
USB_ENDPOINT_SYNC_ASYNC, \
3706+
.rates = SNDRV_PCM_RATE_32000 | \
3707+
SNDRV_PCM_RATE_44100 | \
3708+
SNDRV_PCM_RATE_48000, \
3709+
.rate_min = 32000, \
3710+
.rate_max = 48000, \
3711+
.nr_rates = 3, \
3712+
.rate_table = (unsigned int[]) { \
3713+
32000, 44100, 48000, \
3714+
}, \
3715+
.sync_ep = 0x81, \
3716+
.sync_iface = 0, \
3717+
.sync_altsetting = 1, \
3718+
.sync_ep_idx = 0, \
3719+
.implicit_fb = 1, \
3720+
}, \
3721+
}, \
3722+
{ \
3723+
QUIRK_DATA_AUDIOFORMAT(0) { \
3724+
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
3725+
.channels = 18, /* outputs */ \
3726+
.fmt_bits = 24, \
3727+
.iface = 0, \
3728+
.altsetting = 1, \
3729+
.altset_idx = 1, \
3730+
.endpoint = 0x02, \
3731+
.ep_idx = 1, \
3732+
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
3733+
USB_ENDPOINT_SYNC_ASYNC, \
3734+
.rates = SNDRV_PCM_RATE_64000 | \
3735+
SNDRV_PCM_RATE_88200 | \
3736+
SNDRV_PCM_RATE_96000, \
3737+
.rate_min = 64000, \
3738+
.rate_max = 96000, \
3739+
.nr_rates = 3, \
3740+
.rate_table = (unsigned int[]) { \
3741+
64000, 88200, 96000, \
3742+
}, \
3743+
.sync_ep = 0x81, \
3744+
.sync_iface = 0, \
3745+
.sync_altsetting = 1, \
3746+
.sync_ep_idx = 0, \
3747+
.implicit_fb = 1, \
3748+
}, \
3749+
}, \
3750+
{ \
3751+
QUIRK_DATA_AUDIOFORMAT(0) { \
3752+
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
3753+
.channels = 10, /* outputs */ \
3754+
.fmt_bits = 24, \
3755+
.iface = 0, \
3756+
.altsetting = 1, \
3757+
.altset_idx = 1, \
3758+
.endpoint = 0x02, \
3759+
.ep_idx = 1, \
3760+
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
3761+
USB_ENDPOINT_SYNC_ASYNC, \
3762+
.rates = SNDRV_PCM_RATE_KNOT | \
3763+
SNDRV_PCM_RATE_176400 | \
3764+
SNDRV_PCM_RATE_192000, \
3765+
.rate_min = 128000, \
3766+
.rate_max = 192000, \
3767+
.nr_rates = 3, \
3768+
.rate_table = (unsigned int[]) { \
3769+
128000, 176400, 192000, \
3770+
}, \
3771+
.sync_ep = 0x81, \
3772+
.sync_iface = 0, \
3773+
.sync_altsetting = 1, \
3774+
.sync_ep_idx = 0, \
3775+
.implicit_fb = 1, \
3776+
}, \
3777+
}, \
3778+
{ \
3779+
QUIRK_DATA_AUDIOFORMAT(0) { \
3780+
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
3781+
.channels = 32, /* inputs */ \
3782+
.fmt_bits = 24, \
3783+
.iface = 0, \
3784+
.altsetting = 1, \
3785+
.altset_idx = 1, \
3786+
.endpoint = 0x81, \
3787+
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
3788+
USB_ENDPOINT_SYNC_ASYNC, \
3789+
.rates = SNDRV_PCM_RATE_32000 | \
3790+
SNDRV_PCM_RATE_44100 | \
3791+
SNDRV_PCM_RATE_48000, \
3792+
.rate_min = 32000, \
3793+
.rate_max = 48000, \
3794+
.nr_rates = 3, \
3795+
.rate_table = (unsigned int[]) { \
3796+
32000, 44100, 48000, \
3797+
} \
3798+
} \
3799+
}, \
3800+
{ \
3801+
QUIRK_DATA_AUDIOFORMAT(0) { \
3802+
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
3803+
.channels = 16, /* inputs */ \
3804+
.fmt_bits = 24, \
3805+
.iface = 0, \
3806+
.altsetting = 1, \
3807+
.altset_idx = 1, \
3808+
.endpoint = 0x81, \
3809+
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
3810+
USB_ENDPOINT_SYNC_ASYNC, \
3811+
.rates = SNDRV_PCM_RATE_64000 | \
3812+
SNDRV_PCM_RATE_88200 | \
3813+
SNDRV_PCM_RATE_96000, \
3814+
.rate_min = 64000, \
3815+
.rate_max = 96000, \
3816+
.nr_rates = 3, \
3817+
.rate_table = (unsigned int[]) { \
3818+
64000, 88200, 96000, \
3819+
} \
3820+
} \
3821+
}, \
3822+
{ \
3823+
QUIRK_DATA_AUDIOFORMAT(0) { \
3824+
.formats = SNDRV_PCM_FMTBIT_S32_LE, \
3825+
.channels = 8, /* inputs */ \
3826+
.fmt_bits = 24, \
3827+
.iface = 0, \
3828+
.altsetting = 1, \
3829+
.altset_idx = 1, \
3830+
.endpoint = 0x81, \
3831+
.ep_attr = USB_ENDPOINT_XFER_ISOC | \
3832+
USB_ENDPOINT_SYNC_ASYNC, \
3833+
.rates = SNDRV_PCM_RATE_KNOT | \
3834+
SNDRV_PCM_RATE_176400 | \
3835+
SNDRV_PCM_RATE_192000, \
3836+
.rate_min = 128000, \
3837+
.rate_max = 192000, \
3838+
.nr_rates = 3, \
3839+
.rate_table = (unsigned int[]) { \
3840+
128000, 176400, 192000, \
3841+
} \
3842+
} \
3843+
}, \
3844+
QUIRK_COMPOSITE_END \
3845+
} \
3846+
} \
3847+
}
3848+
3849+
QUIRK_RME_DIGIFACE(0x3f8c),
3850+
QUIRK_RME_DIGIFACE(0x3fa0),
3851+
38473852
#undef USB_DEVICE_VENDOR_SPEC
38483853
#undef USB_AUDIO_DEVICE

sound/usb/quirks.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,6 +1665,7 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev,
16651665
return snd_usb_motu_microbookii_boot_quirk(dev);
16661666
break;
16671667
case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
1668+
case USB_ID(0x2a39, 0x3fa0): /* RME Digiface USB (alternate) */
16681669
return snd_usb_rme_digiface_boot_quirk(dev);
16691670
}
16701671

@@ -1878,6 +1879,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
18781879
mbox3_set_format_quirk(subs, fmt); /* Digidesign Mbox 3 */
18791880
break;
18801881
case USB_ID(0x2a39, 0x3f8c): /* RME Digiface USB */
1882+
case USB_ID(0x2a39, 0x3fa0): /* RME Digiface USB (alternate) */
18811883
rme_digiface_set_format_quirk(subs);
18821884
break;
18831885
}

0 commit comments

Comments
 (0)