[alsa-devel] [PATCH] teac ud-501/ud-503 usb delay
Takashi Iwai
tiwai at suse.de
Mon Jan 25 11:59:33 CET 2016
On Sun, 24 Jan 2016 17:36:17 +0100,
Guillaume Fougnies wrote:
>
>
> Hello,
>
> This is a small patch against sound/usb/quirks.c to correct "Teac
> Corp." products delay.
> Tested on Teac UD-501 and UD-503 products, could not harm other
> Teac products.
> It corrects the "clock source 41 is not valid, cannot use" error
> for both devices.
> And more critically on the new UD-503, a complete freeze of the
> teac usb interface when switching between different rate/format.
> (Freeze only solved by a power switch of the device...)
>
> The patch matches the problem of the "Playback Design" products. I just
> refactored a bit the code to include Teac products properly.
The changes look almost good to me. Could you fix small nitpick below
and resubmit with a proper changelog, and most importantly, with your
sign-off, in order to merge to upstream?
>
> Regards,
> Guillaume
>
>
> ---
> sound/usb/quirks.c | 58 +++++++++++++++++++++++++++++++-----------------------
> 1 file changed, 33 insertions(+), 25 deletions(-)
>
> diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
> index 23ea6d8..f3faaef 100644
> --- a/sound/usb/quirks.c
> +++ b/sound/usb/quirks.c
> @@ -1202,40 +1202,48 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)
> void snd_usb_set_interface_quirk(struct usb_device *dev)
> {
> /*
> - * "Playback Design" products need a 50ms delay after setting the
> + * Products needing a 50ms delay after setting the
> * USB interface.
> */
> - if (le16_to_cpu(dev->descriptor.idVendor) == 0x23ba)
> - mdelay(50);
> + switch (le16_to_cpu(dev->descriptor.idVendor)) {
> + case 0x23ba: /* Playback Design */
> + case 0x0644: /* TEAC Corp. */
In the kernel code, case is has the same indent level as switch.
> + mdelay(50);
> + }
Put break after mdelay() call as the common practice.
> }
>
> 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)
> {
> - /*
> - * "Playback Design" products need a 20ms delay after each
> - * class compliant request
> - */
> - if ((le16_to_cpu(dev->descriptor.idVendor) == 0x23ba) &&
> - (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
> - mdelay(20);
> -
> - /* Marantz/Denon devices with USB DAC functionality need a delay
> - * after each class compliant request
> - */
> - if (is_marantz_denon_dac(USB_ID(le16_to_cpu(dev->descriptor.idVendor),
> - le16_to_cpu(dev->descriptor.idProduct)))
> - && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
> - mdelay(20);
> + if ((requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) {
> + switch (le16_to_cpu(dev->descriptor.idVendor)) {
> + /*
> + * "Playback Design"/"TEAC Corp." products need a 20ms delay after each
> + * class compliant request
> + */
> + case 0x23ba: /* "Playback Design" */
> + case 0x0644: /* TEAC Corp. */
> + mdelay(20);
> + return;
> +
> + /* Zoom R16/24 needs a tiny delay here, otherwise requests like
> + * get/set frequency return as failed despite actually succeeding.
> + */
> + case 0x1686:
> + /* restrict to 0x00dd */
> + if (le16_to_cpu(dev->descriptor.idProduct) == 0x00dd)
> + mdelay(1);
> + return;
> + }
>
> - /* Zoom R16/24 needs a tiny delay here, otherwise requests like
> - * get/set frequency return as failed despite actually succeeding.
> - */
> - if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1686) &&
> - (le16_to_cpu(dev->descriptor.idProduct) == 0x00dd) &&
> - (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
> - mdelay(1);
> + /* Marantz/Denon devices with USB DAC functionality need a delay
> + * after each class compliant request
> + */
> + if (is_marantz_denon_dac(USB_ID(le16_to_cpu(dev->descriptor.idVendor),
> + le16_to_cpu(dev->descriptor.idProduct))))
> + mdelay(20);
> + }
In this case, I prefer keeping the old code as is.
Just add the check for your device there in a new if block.
thanks,
Takashi
More information about the Alsa-devel
mailing list