On Sun, 12 Jan 2020 00:34:46 +0100, Alexander Tsoy wrote: > > Add delay to make sure that audio urbs are not sent too early. > Otherwise the device hangs. Windows driver makes ~2s delay, so use > about the same time delay value. > > snd_usb_apply_boot_quirk() is called 3 times for my MOTU M4, which > is an overkill. Thus a quirk that is called only once is implemented. > > Also send two vendor-specific control messages before and after > the delay. This behaviour is blindly copied from the Windows driver. > > Signed-off-by: Alexander Tsoy <alexander@xxxxxxx> The code change looks OK, but I get a lot of errors from scripts/checkpatch.pl regarding the spaces. Could you resubmit with those fixes? thanks, Takashi > --- > sound/usb/card.c | 4 ++++ > sound/usb/quirks.c | 38 ++++++++++++++++++++++++++++++++++++++ > sound/usb/quirks.h | 5 +++++ > 3 files changed, 47 insertions(+) > > diff --git a/sound/usb/card.c b/sound/usb/card.c > index 9f743ebae615..2f582ac7cf78 100644 > --- a/sound/usb/card.c > +++ b/sound/usb/card.c > @@ -600,6 +600,10 @@ static int usb_audio_probe(struct usb_interface *intf, > } > } > if (! chip) { > + err = snd_usb_apply_boot_quirk_once(dev, intf, quirk, id); > + if (err < 0) > + return err; > + > /* it's a fresh one. > * now look for an empty slot and create a new card instance > */ > diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c > index 82184036437b..c93c53126243 100644 > --- a/sound/usb/quirks.c > +++ b/sound/usb/quirks.c > @@ -1113,6 +1113,31 @@ static int snd_usb_motu_microbookii_boot_quirk(struct usb_device *dev) > return err; > } > > +static int snd_usb_motu_m_series_boot_quirk(struct usb_device *dev) > +{ > + int ret; > + > + if (snd_usb_pipe_sanity_check(dev, usb_sndctrlpipe(dev, 0))) > + return -EINVAL; > + ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), > + 1, USB_TYPE_VENDOR | USB_RECIP_DEVICE, > + 0x0, 0, NULL, 0, 1000); > + > + if (ret < 0) > + return ret; > + > + msleep(2000); > + > + ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), > + 1, USB_TYPE_VENDOR | USB_RECIP_DEVICE, > + 0x20, 0, NULL, 0, 1000); > + > + if (ret < 0) > + return ret; > + > + return 0; > +} > + > /* > * Setup quirks > */ > @@ -1297,6 +1322,19 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, > return 0; > } > > +int snd_usb_apply_boot_quirk_once(struct usb_device *dev, > + struct usb_interface *intf, > + const struct snd_usb_audio_quirk *quirk, > + unsigned int id) > +{ > + switch (id) { > + case USB_ID(0x07fd, 0x0008): /* MOTU M Series */ > + return snd_usb_motu_m_series_boot_quirk(dev); > + } > + > + return 0; > +} > + > /* > * check if the device uses big-endian samples > */ > diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h > index a80e0ddd0736..fa83a98ad7bb 100644 > --- a/sound/usb/quirks.h > +++ b/sound/usb/quirks.h > @@ -20,6 +20,11 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, > const struct snd_usb_audio_quirk *quirk, > unsigned int usb_id); > > +int snd_usb_apply_boot_quirk_once(struct usb_device *dev, > + struct usb_interface *intf, > + const struct snd_usb_audio_quirk *quirk, > + unsigned int usb_id); > + > void snd_usb_set_format_quirk(struct snd_usb_substream *subs, > struct audioformat *fmt); > > -- > 2.24.1 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel