|
@@ -112,7 +112,7 @@ static struct usb_driver usb_audio_driver;
|
|
|
|
|
|
/*
|
|
|
* disconnect streams
|
|
|
- * called from snd_usb_audio_disconnect()
|
|
|
+ * called from usb_audio_disconnect()
|
|
|
*/
|
|
|
static void snd_usb_stream_disconnect(struct list_head *head)
|
|
|
{
|
|
@@ -475,14 +475,14 @@ static int snd_usb_audio_create(struct usb_interface *intf,
|
|
|
* only at the first time. the successive calls of this function will
|
|
|
* append the pcm interface to the corresponding card.
|
|
|
*/
|
|
|
-static struct snd_usb_audio *
|
|
|
-snd_usb_audio_probe(struct usb_device *dev,
|
|
|
- struct usb_interface *intf,
|
|
|
- const struct usb_device_id *usb_id)
|
|
|
+static int usb_audio_probe(struct usb_interface *intf,
|
|
|
+ const struct usb_device_id *usb_id)
|
|
|
{
|
|
|
- const struct snd_usb_audio_quirk *quirk = (const struct snd_usb_audio_quirk *)usb_id->driver_info;
|
|
|
- int i, err;
|
|
|
+ struct usb_device *dev = interface_to_usbdev(intf);
|
|
|
+ const struct snd_usb_audio_quirk *quirk =
|
|
|
+ (const struct snd_usb_audio_quirk *)usb_id->driver_info;
|
|
|
struct snd_usb_audio *chip;
|
|
|
+ int i, err;
|
|
|
struct usb_host_interface *alts;
|
|
|
int ifnum;
|
|
|
u32 id;
|
|
@@ -492,10 +492,11 @@ snd_usb_audio_probe(struct usb_device *dev,
|
|
|
id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
|
|
|
le16_to_cpu(dev->descriptor.idProduct));
|
|
|
if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum)
|
|
|
- goto __err_val;
|
|
|
+ return -ENXIO;
|
|
|
|
|
|
- if (snd_usb_apply_boot_quirk(dev, intf, quirk) < 0)
|
|
|
- goto __err_val;
|
|
|
+ err = snd_usb_apply_boot_quirk(dev, intf, quirk);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
|
|
|
/*
|
|
|
* found a config. now register to ALSA
|
|
@@ -508,6 +509,7 @@ snd_usb_audio_probe(struct usb_device *dev,
|
|
|
if (usb_chip[i] && usb_chip[i]->dev == dev) {
|
|
|
if (usb_chip[i]->shutdown) {
|
|
|
dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n");
|
|
|
+ err = -EIO;
|
|
|
goto __error;
|
|
|
}
|
|
|
chip = usb_chip[i];
|
|
@@ -523,15 +525,16 @@ snd_usb_audio_probe(struct usb_device *dev,
|
|
|
if (enable[i] && ! usb_chip[i] &&
|
|
|
(vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) &&
|
|
|
(pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) {
|
|
|
- if (snd_usb_audio_create(intf, dev, i, quirk,
|
|
|
- &chip) < 0) {
|
|
|
+ err = snd_usb_audio_create(intf, dev, i, quirk,
|
|
|
+ &chip);
|
|
|
+ if (err < 0)
|
|
|
goto __error;
|
|
|
- }
|
|
|
chip->pm_intf = intf;
|
|
|
break;
|
|
|
}
|
|
|
if (!chip) {
|
|
|
dev_err(&dev->dev, "no available usb audio device\n");
|
|
|
+ err = -ENODEV;
|
|
|
goto __error;
|
|
|
}
|
|
|
}
|
|
@@ -548,28 +551,32 @@ snd_usb_audio_probe(struct usb_device *dev,
|
|
|
err = 1; /* continue */
|
|
|
if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) {
|
|
|
/* need some special handlings */
|
|
|
- if ((err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk)) < 0)
|
|
|
+ err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk);
|
|
|
+ if (err < 0)
|
|
|
goto __error;
|
|
|
}
|
|
|
|
|
|
if (err > 0) {
|
|
|
/* create normal USB audio interfaces */
|
|
|
- if (snd_usb_create_streams(chip, ifnum) < 0 ||
|
|
|
- snd_usb_create_mixer(chip, ifnum, ignore_ctl_error) < 0) {
|
|
|
+ err = snd_usb_create_streams(chip, ifnum);
|
|
|
+ if (err < 0)
|
|
|
+ goto __error;
|
|
|
+ err = snd_usb_create_mixer(chip, ifnum, ignore_ctl_error);
|
|
|
+ if (err < 0)
|
|
|
goto __error;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/* we are allowed to call snd_card_register() many times */
|
|
|
- if (snd_card_register(chip->card) < 0) {
|
|
|
+ err = snd_card_register(chip->card);
|
|
|
+ if (err < 0)
|
|
|
goto __error;
|
|
|
- }
|
|
|
|
|
|
usb_chip[chip->index] = chip;
|
|
|
chip->num_interfaces++;
|
|
|
chip->probing = 0;
|
|
|
+ usb_set_intfdata(intf, chip);
|
|
|
mutex_unlock(®ister_mutex);
|
|
|
- return chip;
|
|
|
+ return 0;
|
|
|
|
|
|
__error:
|
|
|
if (chip) {
|
|
@@ -578,17 +585,16 @@ snd_usb_audio_probe(struct usb_device *dev,
|
|
|
chip->probing = 0;
|
|
|
}
|
|
|
mutex_unlock(®ister_mutex);
|
|
|
- __err_val:
|
|
|
- return NULL;
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* we need to take care of counter, since disconnection can be called also
|
|
|
* many times as well as usb_audio_probe().
|
|
|
*/
|
|
|
-static void snd_usb_audio_disconnect(struct usb_device *dev,
|
|
|
- struct snd_usb_audio *chip)
|
|
|
+static void usb_audio_disconnect(struct usb_interface *intf)
|
|
|
{
|
|
|
+ struct snd_usb_audio *chip = usb_get_intfdata(intf);
|
|
|
struct snd_card *card;
|
|
|
struct list_head *p;
|
|
|
|
|
@@ -630,27 +636,6 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * new 2.5 USB kernel API
|
|
|
- */
|
|
|
-static int usb_audio_probe(struct usb_interface *intf,
|
|
|
- const struct usb_device_id *id)
|
|
|
-{
|
|
|
- struct snd_usb_audio *chip;
|
|
|
- chip = snd_usb_audio_probe(interface_to_usbdev(intf), intf, id);
|
|
|
- if (chip) {
|
|
|
- usb_set_intfdata(intf, chip);
|
|
|
- return 0;
|
|
|
- } else
|
|
|
- return -EIO;
|
|
|
-}
|
|
|
-
|
|
|
-static void usb_audio_disconnect(struct usb_interface *intf)
|
|
|
-{
|
|
|
- snd_usb_audio_disconnect(interface_to_usbdev(intf),
|
|
|
- usb_get_intfdata(intf));
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_PM
|
|
|
|
|
|
int snd_usb_autoresume(struct snd_usb_audio *chip)
|