diff options
-rw-r--r-- | sound/usb/card.c | 75 |
1 files changed, 30 insertions, 45 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c index 7ecd0e8a5c51..be16bdc53c2a 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
@@ -112,7 +112,7 @@ static struct usb_driver usb_audio_driver; | |||
112 | 112 | ||
113 | /* | 113 | /* |
114 | * disconnect streams | 114 | * disconnect streams |
115 | * called from snd_usb_audio_disconnect() | 115 | * called from usb_audio_disconnect() |
116 | */ | 116 | */ |
117 | static void snd_usb_stream_disconnect(struct list_head *head) | 117 | static void snd_usb_stream_disconnect(struct list_head *head) |
118 | { | 118 | { |
@@ -475,14 +475,14 @@ static int snd_usb_audio_create(struct usb_interface *intf, | |||
475 | * only at the first time. the successive calls of this function will | 475 | * only at the first time. the successive calls of this function will |
476 | * append the pcm interface to the corresponding card. | 476 | * append the pcm interface to the corresponding card. |
477 | */ | 477 | */ |
478 | static struct snd_usb_audio * | 478 | static int usb_audio_probe(struct usb_interface *intf, |
479 | snd_usb_audio_probe(struct usb_device *dev, | 479 | const struct usb_device_id *usb_id) |
480 | struct usb_interface *intf, | ||
481 | const struct usb_device_id *usb_id) | ||
482 | { | 480 | { |
483 | const struct snd_usb_audio_quirk *quirk = (const struct snd_usb_audio_quirk *)usb_id->driver_info; | 481 | struct usb_device *dev = interface_to_usbdev(intf); |
484 | int i, err; | 482 | const struct snd_usb_audio_quirk *quirk = |
483 | (const struct snd_usb_audio_quirk *)usb_id->driver_info; | ||
485 | struct snd_usb_audio *chip; | 484 | struct snd_usb_audio *chip; |
485 | int i, err; | ||
486 | struct usb_host_interface *alts; | 486 | struct usb_host_interface *alts; |
487 | int ifnum; | 487 | int ifnum; |
488 | u32 id; | 488 | u32 id; |
@@ -492,10 +492,11 @@ snd_usb_audio_probe(struct usb_device *dev, | |||
492 | id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), | 492 | id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), |
493 | le16_to_cpu(dev->descriptor.idProduct)); | 493 | le16_to_cpu(dev->descriptor.idProduct)); |
494 | if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum) | 494 | if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum) |
495 | goto __err_val; | 495 | return -ENXIO; |
496 | 496 | ||
497 | if (snd_usb_apply_boot_quirk(dev, intf, quirk) < 0) | 497 | err = snd_usb_apply_boot_quirk(dev, intf, quirk); |
498 | goto __err_val; | 498 | if (err < 0) |
499 | return err; | ||
499 | 500 | ||
500 | /* | 501 | /* |
501 | * found a config. now register to ALSA | 502 | * found a config. now register to ALSA |
@@ -508,6 +509,7 @@ snd_usb_audio_probe(struct usb_device *dev, | |||
508 | if (usb_chip[i] && usb_chip[i]->dev == dev) { | 509 | if (usb_chip[i] && usb_chip[i]->dev == dev) { |
509 | if (usb_chip[i]->shutdown) { | 510 | if (usb_chip[i]->shutdown) { |
510 | dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n"); | 511 | dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n"); |
512 | err = -EIO; | ||
511 | goto __error; | 513 | goto __error; |
512 | } | 514 | } |
513 | chip = usb_chip[i]; | 515 | chip = usb_chip[i]; |
@@ -523,15 +525,16 @@ snd_usb_audio_probe(struct usb_device *dev, | |||
523 | if (enable[i] && ! usb_chip[i] && | 525 | if (enable[i] && ! usb_chip[i] && |
524 | (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) && | 526 | (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) && |
525 | (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) { | 527 | (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) { |
526 | if (snd_usb_audio_create(intf, dev, i, quirk, | 528 | err = snd_usb_audio_create(intf, dev, i, quirk, |
527 | &chip) < 0) { | 529 | &chip); |
530 | if (err < 0) | ||
528 | goto __error; | 531 | goto __error; |
529 | } | ||
530 | chip->pm_intf = intf; | 532 | chip->pm_intf = intf; |
531 | break; | 533 | break; |
532 | } | 534 | } |
533 | if (!chip) { | 535 | if (!chip) { |
534 | dev_err(&dev->dev, "no available usb audio device\n"); | 536 | dev_err(&dev->dev, "no available usb audio device\n"); |
537 | err = -ENODEV; | ||
535 | goto __error; | 538 | goto __error; |
536 | } | 539 | } |
537 | } | 540 | } |
@@ -548,28 +551,32 @@ snd_usb_audio_probe(struct usb_device *dev, | |||
548 | err = 1; /* continue */ | 551 | err = 1; /* continue */ |
549 | if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) { | 552 | if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) { |
550 | /* need some special handlings */ | 553 | /* need some special handlings */ |
551 | if ((err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk)) < 0) | 554 | err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk); |
555 | if (err < 0) | ||
552 | goto __error; | 556 | goto __error; |
553 | } | 557 | } |
554 | 558 | ||
555 | if (err > 0) { | 559 | if (err > 0) { |
556 | /* create normal USB audio interfaces */ | 560 | /* create normal USB audio interfaces */ |
557 | if (snd_usb_create_streams(chip, ifnum) < 0 || | 561 | err = snd_usb_create_streams(chip, ifnum); |
558 | snd_usb_create_mixer(chip, ifnum, ignore_ctl_error) < 0) { | 562 | if (err < 0) |
563 | goto __error; | ||
564 | err = snd_usb_create_mixer(chip, ifnum, ignore_ctl_error); | ||
565 | if (err < 0) | ||
559 | goto __error; | 566 | goto __error; |
560 | } | ||
561 | } | 567 | } |
562 | 568 | ||
563 | /* we are allowed to call snd_card_register() many times */ | 569 | /* we are allowed to call snd_card_register() many times */ |
564 | if (snd_card_register(chip->card) < 0) { | 570 | err = snd_card_register(chip->card); |
571 | if (err < 0) | ||
565 | goto __error; | 572 | goto __error; |
566 | } | ||
567 | 573 | ||
568 | usb_chip[chip->index] = chip; | 574 | usb_chip[chip->index] = chip; |
569 | chip->num_interfaces++; | 575 | chip->num_interfaces++; |
570 | chip->probing = 0; | 576 | chip->probing = 0; |
577 | usb_set_intfdata(intf, chip); | ||
571 | mutex_unlock(®ister_mutex); | 578 | mutex_unlock(®ister_mutex); |
572 | return chip; | 579 | return 0; |
573 | 580 | ||
574 | __error: | 581 | __error: |
575 | if (chip) { | 582 | if (chip) { |
@@ -578,17 +585,16 @@ snd_usb_audio_probe(struct usb_device *dev, | |||
578 | chip->probing = 0; | 585 | chip->probing = 0; |
579 | } | 586 | } |
580 | mutex_unlock(®ister_mutex); | 587 | mutex_unlock(®ister_mutex); |
581 | __err_val: | 588 | return err; |
582 | return NULL; | ||
583 | } | 589 | } |
584 | 590 | ||
585 | /* | 591 | /* |
586 | * we need to take care of counter, since disconnection can be called also | 592 | * we need to take care of counter, since disconnection can be called also |
587 | * many times as well as usb_audio_probe(). | 593 | * many times as well as usb_audio_probe(). |
588 | */ | 594 | */ |
589 | static void snd_usb_audio_disconnect(struct usb_device *dev, | 595 | static void usb_audio_disconnect(struct usb_interface *intf) |
590 | struct snd_usb_audio *chip) | ||
591 | { | 596 | { |
597 | struct snd_usb_audio *chip = usb_get_intfdata(intf); | ||
592 | struct snd_card *card; | 598 | struct snd_card *card; |
593 | struct list_head *p; | 599 | struct list_head *p; |
594 | 600 | ||
@@ -630,27 +636,6 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
630 | } | 636 | } |
631 | } | 637 | } |
632 | 638 | ||
633 | /* | ||
634 | * new 2.5 USB kernel API | ||
635 | */ | ||
636 | static int usb_audio_probe(struct usb_interface *intf, | ||
637 | const struct usb_device_id *id) | ||
638 | { | ||
639 | struct snd_usb_audio *chip; | ||
640 | chip = snd_usb_audio_probe(interface_to_usbdev(intf), intf, id); | ||
641 | if (chip) { | ||
642 | usb_set_intfdata(intf, chip); | ||
643 | return 0; | ||
644 | } else | ||
645 | return -EIO; | ||
646 | } | ||
647 | |||
648 | static void usb_audio_disconnect(struct usb_interface *intf) | ||
649 | { | ||
650 | snd_usb_audio_disconnect(interface_to_usbdev(intf), | ||
651 | usb_get_intfdata(intf)); | ||
652 | } | ||
653 | |||
654 | #ifdef CONFIG_PM | 639 | #ifdef CONFIG_PM |
655 | 640 | ||
656 | int snd_usb_autoresume(struct snd_usb_audio *chip) | 641 | int snd_usb_autoresume(struct snd_usb_audio *chip) |