Commit 1f074fe5 authored by Takashi Iwai's avatar Takashi Iwai

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.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f7483854
...@@ -808,7 +808,8 @@ static int endpoint_set_interface(struct snd_usb_audio *chip, ...@@ -808,7 +808,8 @@ static int endpoint_set_interface(struct snd_usb_audio *chip,
return err; return err;
} }
snd_usb_set_interface_quirk(chip); if (chip->quirk_flags & QUIRK_FLAG_IFACE_DELAY)
msleep(50);
return 0; return 0;
} }
......
...@@ -1570,22 +1570,6 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) ...@@ -1570,22 +1570,6 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)
ep->tenor_fb_quirk = 1; 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 */ /* 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, void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
__u8 request, __u8 requesttype, __u16 value, __u8 request, __u8 requesttype, __u16 value,
...@@ -1841,11 +1825,14 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { ...@@ -1841,11 +1825,14 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */ DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */
QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER), QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */ 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 */ 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 */ 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) */ DEVICE_FLG(0x074d, 0x3553, /* Outlaw RR2150 (Micronas UAC3553B) */
QUIRK_FLAG_GET_SAMPLE_RATE), QUIRK_FLAG_GET_SAMPLE_RATE),
DEVICE_FLG(0x0951, 0x16ad, /* Kingston HyperX */ DEVICE_FLG(0x0951, 0x16ad, /* Kingston HyperX */
...@@ -1919,11 +1906,11 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { ...@@ -1919,11 +1906,11 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
VENDOR_FLG(0x047f, /* Plantronics */ VENDOR_FLG(0x047f, /* Plantronics */
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY), QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY),
VENDOR_FLG(0x0644, /* TEAC Corp. */ VENDOR_FLG(0x0644, /* TEAC Corp. */
QUIRK_FLAG_CTL_MSG_DELAY), QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY),
VENDOR_FLG(0x1de7, /* Phoenix Audio */ VENDOR_FLG(0x1de7, /* Phoenix Audio */
QUIRK_FLAG_GET_SAMPLE_RATE), QUIRK_FLAG_GET_SAMPLE_RATE),
VENDOR_FLG(0x23ba, /* Playback Design */ VENDOR_FLG(0x23ba, /* Playback Design */
QUIRK_FLAG_CTL_MSG_DELAY), QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY),
{} /* terminator */ {} /* terminator */
}; };
......
...@@ -33,7 +33,6 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, ...@@ -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_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, void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
__u8 request, __u8 requesttype, __u16 value, __u8 request, __u8 requesttype, __u16 value,
__u16 index, void *data, __u16 size); __u16 index, void *data, __u16 size);
......
...@@ -153,6 +153,8 @@ extern bool snd_usb_skip_validation; ...@@ -153,6 +153,8 @@ extern bool snd_usb_skip_validation;
* Add a delay of 1-2ms at each control message handling * Add a delay of 1-2ms at each control message handling
* QUIRK_FLAG_CTL_MSG_DELAY_5M: * QUIRK_FLAG_CTL_MSG_DELAY_5M:
* Add a delay of 5-6ms at each control message handling * 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) #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
...@@ -166,5 +168,6 @@ extern bool snd_usb_skip_validation; ...@@ -166,5 +168,6 @@ extern bool snd_usb_skip_validation;
#define QUIRK_FLAG_CTL_MSG_DELAY (1U << 8) #define QUIRK_FLAG_CTL_MSG_DELAY (1U << 8)
#define QUIRK_FLAG_CTL_MSG_DELAY_1M (1U << 9) #define QUIRK_FLAG_CTL_MSG_DELAY_1M (1U << 9)
#define QUIRK_FLAG_CTL_MSG_DELAY_5M (1U << 10) #define QUIRK_FLAG_CTL_MSG_DELAY_5M (1U << 10)
#define QUIRK_FLAG_IFACE_DELAY (1U << 11)
#endif /* __USBAUDIO_H */ #endif /* __USBAUDIO_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment