ALSA: usb-audio: Move interface setup delay into quirk_flags
authorTakashi Iwai <tiwai@suse.de>
Thu, 29 Jul 2021 07:38:55 +0000 (09:38 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 2 Aug 2021 07:06:02 +0000 (09:06 +0200)
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 <tiwai@suse.de>
sound/usb/endpoint.c
sound/usb/quirks.c
sound/usb/quirks.h
sound/usb/usbaudio.h

index 6016e97faf69ee9d72f150282f83097894a8c0fa..d33685874a6ba2f92cca3c2e3c4427c583ba9f60 100644 (file)
@@ -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;
 }
 
index a6b78cbf5089389dd74b5c3a10d053847254e904..f47078209bcc7c0eaa13cea500bc587441665085 100644 (file)
@@ -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 */
 };
index 0a49e074ae6a16b17e865f363e0132635f797c63..31abb7cb01a526d59aeaa78d2e46d16c686083c7 100644 (file)
@@ -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);
index 69fa81150f36f3721f06dbf8703a94d6f687b073..57b5dcf211d45a21af104c631d1d23db9d87d2f8 100644 (file)
@@ -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 */