Commit 21bb5aaf authored by Daniel Mack's avatar Daniel Mack Committed by Takashi Iwai

ALSA: snd-usb: Playback Design: use usb_set_inferface quirk from more locations

It turns out the devices from Playback Design need the delay quirk
after usb_set_interface from clocks.c as well. Make it a proper
quirks function and factor out the code to quirks.c.
Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 78daea29
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "card.h" #include "card.h"
#include "helper.h" #include "helper.h"
#include "clock.h" #include "clock.h"
#include "quirks.h"
static struct uac_clock_source_descriptor * static struct uac_clock_source_descriptor *
snd_usb_find_clock_source(struct usb_host_interface *ctrl_iface, snd_usb_find_clock_source(struct usb_host_interface *ctrl_iface,
...@@ -392,7 +393,9 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, ...@@ -392,7 +393,9 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface,
* interface is active. */ * interface is active. */
if (rate != prev_rate) { if (rate != prev_rate) {
usb_set_interface(dev, iface, 0); usb_set_interface(dev, iface, 0);
snd_usb_set_interface_quirk(dev);
usb_set_interface(dev, iface, fmt->altsetting); usb_set_interface(dev, iface, fmt->altsetting);
snd_usb_set_interface_quirk(dev);
} }
return 0; return 0;
......
...@@ -349,12 +349,7 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) ...@@ -349,12 +349,7 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
subs->interface = fmt->iface; subs->interface = fmt->iface;
subs->altset_idx = fmt->altset_idx; subs->altset_idx = fmt->altset_idx;
/* snd_usb_set_interface_quirk(dev);
* "Playback Design" products need a 50ms delay after setting the
* USB interface.
*/
if (le16_to_cpu(dev->descriptor.idVendor) == 0x23ba)
mdelay(50);
} }
subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
......
...@@ -892,6 +892,16 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) ...@@ -892,6 +892,16 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)
ep->skip_packets = 16; ep->skip_packets = 16;
} }
void snd_usb_set_interface_quirk(struct usb_device *dev)
{
/*
* "Playback Design" products need a 50ms delay after setting the
* USB interface.
*/
if (le16_to_cpu(dev->descriptor.idVendor) == 0x23ba)
mdelay(50);
}
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)
......
...@@ -26,6 +26,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, ...@@ -26,6 +26,7 @@ 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 usb_device *dev);
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);
......
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