diff options
author | Eldad Zack <eldad@fogrefinery.com> | 2013-08-03 04:50:18 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2013-08-06 04:49:21 -0400 |
commit | a60945fd08e45fceca9e3525d70e080f7ad60a4e (patch) | |
tree | 5b78766c192fa0700bf2e78ef99f40875706b474 /sound/usb/pcm.c | |
parent | 71bb64c56d787a221752b1de034fe8c07c737f5c (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.c | 60 |
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 | 330 | static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, | |
331 | static 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 | |||
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 | 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 | ||
423 | add_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 ? |