@@ -327,24 +327,16 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
327
327
return 0 ;
328
328
}
329
329
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 )
336
334
{
335
+ struct usb_host_interface * alts ;
337
336
struct usb_interface * iface ;
338
337
int is_playback = subs -> direction == SNDRV_PCM_STREAM_PLAYBACK ;
339
- unsigned int ep , attr ;
340
338
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 ;
348
340
349
341
switch (subs -> stream -> chip -> usb_id ) {
350
342
case USB_ID (0x0763 , 0x2030 ): /* M-Audio Fast Track C400 */
@@ -388,6 +380,45 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
388
380
goto add_sync_ep ;
389
381
}
390
382
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
+
391
422
if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC ) ||
392
423
(!is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE )) &&
393
424
altsd -> bNumEndpoints >= 2 ) {
@@ -420,7 +451,6 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
420
451
implicit_fb = (get_endpoint (alts , 1 )-> bmAttributes & USB_ENDPOINT_USAGE_MASK )
421
452
== USB_ENDPOINT_USAGE_IMPLICIT_FB ;
422
453
423
- add_sync_ep :
424
454
subs -> sync_endpoint = snd_usb_add_endpoint (subs -> stream -> chip ,
425
455
alts , ep , !subs -> direction ,
426
456
implicit_fb ?
0 commit comments