From 21bb5aafce4350e243f9be3d981c0beb2e2c5ab4 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 10 Apr 2013 00:56:03 +0800 Subject: [PATCH] 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: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/clock.c | 3 +++ sound/usb/pcm.c | 7 +------ sound/usb/quirks.c | 10 ++++++++++ sound/usb/quirks.h | 1 + 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sound/usb/clock.c b/sound/usb/clock.c index ae35e7d22e73..b0ec3643eb62 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -32,6 +32,7 @@ #include "card.h" #include "helper.h" #include "clock.h" +#include "quirks.h" static struct uac_clock_source_descriptor * 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, * interface is active. */ if (rate != prev_rate) { usb_set_interface(dev, iface, 0); + snd_usb_set_interface_quirk(dev); usb_set_interface(dev, iface, fmt->altsetting); + snd_usb_set_interface_quirk(dev); } return 0; diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 754cb5bb1f79..815a37d2e3e0 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -349,12 +349,7 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) subs->interface = fmt->iface; subs->altset_idx = fmt->altset_idx; - /* - * "Playback Design" products need a 50ms delay after setting the - * USB interface. - */ - if (le16_to_cpu(dev->descriptor.idVendor) == 0x23ba) - mdelay(50); + snd_usb_set_interface_quirk(dev); } subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index a2ac004bbd9a..292798185afc 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -892,6 +892,16 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) 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, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size) diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h index 0ca9e91067a6..7c3681fd1c3c 100644 --- a/sound/usb/quirks.h +++ b/sound/usb/quirks.h @@ -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_set_interface_quirk(struct usb_device *dev); 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); -- 2.20.1