summaryrefslogtreecommitdiffstats
path: root/sound/usb/pcm.c
diff options
context:
space:
mode:
authorEldad Zack <eldad@fogrefinery.com>2013-08-03 04:50:18 -0400
committerTakashi Iwai <tiwai@suse.de>2013-08-06 04:49:21 -0400
commita60945fd08e45fceca9e3525d70e080f7ad60a4e (patch)
tree5b78766c192fa0700bf2e78ef99f40875706b474 /sound/usb/pcm.c
parent71bb64c56d787a221752b1de034fe8c07c737f5c (diff)
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>
Diffstat (limited to 'sound/usb/pcm.c')
-rw-r--r--sound/usb/pcm.c60
1 files changed, 45 insertions, 15 deletions
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index e24ce7d58d83..0016f28039f2 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -327,24 +327,16 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
327 return 0; 327 return 0;
328} 328}
329 329
330 330static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
331static int set_sync_endpoint(struct snd_usb_substream *subs, 331 struct usb_device *dev,
332 struct audioformat *fmt, 332 struct usb_interface_descriptor *altsd,
333 struct usb_device *dev, 333 unsigned int attr)
334 struct usb_host_interface *alts,
335 struct usb_interface_descriptor *altsd)
336{ 334{
335 struct usb_host_interface *alts;
337 struct usb_interface *iface; 336 struct usb_interface *iface;
338 int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK; 337 int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
339 unsigned int ep, attr;
340 int implicit_fb = 0; 338 int implicit_fb = 0;
341 339 unsigned int ep;
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;
348 340
349 switch (subs->stream->chip->usb_id) { 341 switch (subs->stream->chip->usb_id) {
350 case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */ 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 goto add_sync_ep; 380 goto add_sync_ep;
389 } 381 }
390 382
383 /* No quirk */
384 return 0;
385
386add_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
400static 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 if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) || 422 if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) ||
392 (!is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE)) && 423 (!is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE)) &&
393 altsd->bNumEndpoints >= 2) { 424 altsd->bNumEndpoints >= 2) {
@@ -420,7 +451,6 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
420 implicit_fb = (get_endpoint(alts, 1)->bmAttributes & USB_ENDPOINT_USAGE_MASK) 451 implicit_fb = (get_endpoint(alts, 1)->bmAttributes & USB_ENDPOINT_USAGE_MASK)
421 == USB_ENDPOINT_USAGE_IMPLICIT_FB; 452 == USB_ENDPOINT_USAGE_IMPLICIT_FB;
422 453
423add_sync_ep:
424 subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip, 454 subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
425 alts, ep, !subs->direction, 455 alts, ep, !subs->direction,
426 implicit_fb ? 456 implicit_fb ?