Skip to content

Commit a60945f

Browse files
eldadtiwai
authored andcommitted
ALSA: usb-audio: move implicit fb quirks to separate function
Separate setting implicit feedback quirks from setting a sync endpoint (which may also be explicit feedback or async). Signed-off-by: Eldad Zack <eldad@fogrefinery.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent 71bb64c commit a60945f

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

sound/usb/pcm.c

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -327,24 +327,16 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
327327
return 0;
328328
}
329329

330-
331-
static int set_sync_endpoint(struct snd_usb_substream *subs,
332-
struct audioformat *fmt,
333-
struct usb_device *dev,
334-
struct usb_host_interface *alts,
335-
struct usb_interface_descriptor *altsd)
330+
static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
331+
struct usb_device *dev,
332+
struct usb_interface_descriptor *altsd,
333+
unsigned int attr)
336334
{
335+
struct usb_host_interface *alts;
337336
struct usb_interface *iface;
338337
int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
339-
unsigned int ep, attr;
340338
int implicit_fb = 0;
341-
342-
/* we need a sync pipe in async OUT or adaptive IN mode */
343-
/* check the number of EP, since some devices have broken
344-
* descriptors which fool us. if it has only one EP,
345-
* assume it as adaptive-out or sync-in.
346-
*/
347-
attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE;
339+
unsigned int ep;
348340

349341
switch (subs->stream->chip->usb_id) {
350342
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
@@ -388,6 +380,45 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
388380
goto add_sync_ep;
389381
}
390382

383+
/* No quirk */
384+
return 0;
385+
386+
add_sync_ep:
387+
subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
388+
alts, ep, !subs->direction,
389+
implicit_fb ?
390+
SND_USB_ENDPOINT_TYPE_DATA :
391+
SND_USB_ENDPOINT_TYPE_SYNC);
392+
if (!subs->sync_endpoint)
393+
return -EINVAL;
394+
395+
subs->data_endpoint->sync_master = subs->sync_endpoint;
396+
397+
return 0;
398+
}
399+
400+
static int set_sync_endpoint(struct snd_usb_substream *subs,
401+
struct audioformat *fmt,
402+
struct usb_device *dev,
403+
struct usb_host_interface *alts,
404+
struct usb_interface_descriptor *altsd)
405+
{
406+
int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
407+
unsigned int ep, attr;
408+
int implicit_fb = 0;
409+
int err;
410+
411+
/* we need a sync pipe in async OUT or adaptive IN mode */
412+
/* check the number of EP, since some devices have broken
413+
* descriptors which fool us. if it has only one EP,
414+
* assume it as adaptive-out or sync-in.
415+
*/
416+
attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE;
417+
418+
err = set_sync_ep_implicit_fb_quirk(subs, dev, altsd, attr);
419+
if (err < 0)
420+
return err;
421+
391422
if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) ||
392423
(!is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE)) &&
393424
altsd->bNumEndpoints >= 2) {
@@ -420,7 +451,6 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
420451
implicit_fb = (get_endpoint(alts, 1)->bmAttributes & USB_ENDPOINT_USAGE_MASK)
421452
== USB_ENDPOINT_USAGE_IMPLICIT_FB;
422453

423-
add_sync_ep:
424454
subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
425455
alts, ep, !subs->direction,
426456
implicit_fb ?

0 commit comments

Comments
 (0)