From 1f074fe569870ed91c8ad2f67cccd9db5265443e Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 29 Jul 2021 09:38:55 +0200 Subject: [PATCH] ALSA: usb-audio: Move interface setup delay into quirk_flags Yet another delay is applied at switching the interface. This can be moved to quirk_flags, too. Link: https://lore.kernel.org/r/20210729073855.19043-10-tiwai@suse.de Signed-off-by: Takashi Iwai --- sound/usb/endpoint.c | 3 ++- sound/usb/quirks.c | 29 ++++++++--------------------- sound/usb/quirks.h | 1 - sound/usb/usbaudio.h | 3 +++ 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 6016e97..d336858 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -808,7 +808,8 @@ static int endpoint_set_interface(struct snd_usb_audio *chip, return err; } - snd_usb_set_interface_quirk(chip); + if (chip->quirk_flags & QUIRK_FLAG_IFACE_DELAY) + msleep(50); return 0; } diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index a6b78cb..f470782 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -1570,22 +1570,6 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) ep->tenor_fb_quirk = 1; } -void snd_usb_set_interface_quirk(struct snd_usb_audio *chip) -{ - if (!chip) - return; - /* - * "Playback Design" products need a 50ms delay after setting the - * USB interface. - */ - switch (USB_ID_VENDOR(chip->usb_id)) { - case 0x23ba: /* Playback Design */ - case 0x0644: /* TEAC Corp. */ - msleep(50); - break; - } -} - /* quirk applied after snd_usb_ctl_msg(); not applied during boot quirks */ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, @@ -1841,11 +1825,14 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */ QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER), DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */ - QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), + QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY | + QUIRK_FLAG_IFACE_DELAY), DEVICE_FLG(0x0644, 0x8044, /* Esoteric D-05X */ - QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), + QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY | + QUIRK_FLAG_IFACE_DELAY), DEVICE_FLG(0x0644, 0x804a, /* TEAC UD-301 */ - QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), + QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY | + QUIRK_FLAG_IFACE_DELAY), DEVICE_FLG(0x074d, 0x3553, /* Outlaw RR2150 (Micronas UAC3553B) */ QUIRK_FLAG_GET_SAMPLE_RATE), DEVICE_FLG(0x0951, 0x16ad, /* Kingston HyperX */ @@ -1919,11 +1906,11 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { VENDOR_FLG(0x047f, /* Plantronics */ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY), VENDOR_FLG(0x0644, /* TEAC Corp. */ - QUIRK_FLAG_CTL_MSG_DELAY), + QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY), VENDOR_FLG(0x1de7, /* Phoenix Audio */ QUIRK_FLAG_GET_SAMPLE_RATE), VENDOR_FLG(0x23ba, /* Playback Design */ - QUIRK_FLAG_CTL_MSG_DELAY), + QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY), {} /* terminator */ }; diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h index 0a49e074..31abb7c 100644 --- a/sound/usb/quirks.h +++ b/sound/usb/quirks.h @@ -33,7 +33,6 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep); -void snd_usb_set_interface_quirk(struct snd_usb_audio *chip); void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size); diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 69fa811..57b5dcf 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -153,6 +153,8 @@ extern bool snd_usb_skip_validation; * Add a delay of 1-2ms at each control message handling * QUIRK_FLAG_CTL_MSG_DELAY_5M: * Add a delay of 5-6ms at each control message handling + * QUIRK_FLAG_IFACE_DELAY: + * Add a delay of 50ms at each interface setup */ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0) @@ -166,5 +168,6 @@ extern bool snd_usb_skip_validation; #define QUIRK_FLAG_CTL_MSG_DELAY (1U << 8) #define QUIRK_FLAG_CTL_MSG_DELAY_1M (1U << 9) #define QUIRK_FLAG_CTL_MSG_DELAY_5M (1U << 10) +#define QUIRK_FLAG_IFACE_DELAY (1U << 11) #endif /* __USBAUDIO_H */ -- 2.7.4