Merge tag 'vfio-v3.19-rc1' of git://github.com/awilliam/linux-vfio
[firefly-linux-kernel-4.4.55.git] / sound / usb / card.c
index f61ebb17cc64e3dd33aadd41185e00ea460ebbe9..1fab9778807a0015f2578f0504306ed852eb4932 100644 (file)
@@ -112,15 +112,13 @@ 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)
+static void snd_usb_stream_disconnect(struct snd_usb_stream *as)
 {
        int idx;
-       struct snd_usb_stream *as;
        struct snd_usb_substream *subs;
 
-       as = list_entry(head, struct snd_usb_stream, list);
        for (idx = 0; idx < 2; idx++) {
                subs = &as->substream[idx];
                if (!subs->num_formats)
@@ -307,10 +305,10 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
 
 static int snd_usb_audio_free(struct snd_usb_audio *chip)
 {
-       struct list_head *p, *n;
+       struct snd_usb_endpoint *ep, *n;
 
-       list_for_each_safe(p, n, &chip->ep_list)
-               snd_usb_endpoint_free(p);
+       list_for_each_entry_safe(ep, n, &chip->ep_list, list)
+               snd_usb_endpoint_free(ep);
 
        mutex_destroy(&chip->mutex);
        kfree(chip);
@@ -323,16 +321,6 @@ static int snd_usb_audio_dev_free(struct snd_device *device)
        return snd_usb_audio_free(chip);
 }
 
-static void remove_trailing_spaces(char *str)
-{
-       char *p;
-
-       if (!*str)
-               return;
-       for (p = str + strlen(str) - 1; p >= str && isspace(*p); p--)
-               *p = 0;
-}
-
 /*
  * create a chip instance and set its names.
  */
@@ -416,7 +404,7 @@ static int snd_usb_audio_create(struct usb_interface *intf,
                                USB_ID_PRODUCT(chip->usb_id));
                }
        }
-       remove_trailing_spaces(card->shortname);
+       strim(card->shortname);
 
        /* retrieve the vendor and device strings as longname */
        if (quirk && quirk->vendor_name && *quirk->vendor_name) {
@@ -430,7 +418,7 @@ static int snd_usb_audio_create(struct usb_interface *intf,
                /* we don't really care if there isn't any vendor string */
        }
        if (len > 0) {
-               remove_trailing_spaces(card->longname);
+               strim(card->longname);
                if (*card->longname)
                        strlcat(card->longname, " ", sizeof(card->longname));
        }
@@ -475,14 +463,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 +480,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 +497,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 +513,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 +539,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(&register_mutex);
-       return chip;
+       return 0;
 
  __error:
        if (chip) {
@@ -578,17 +573,16 @@ snd_usb_audio_probe(struct usb_device *dev,
                chip->probing = 0;
        }
        mutex_unlock(&register_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;
        bool was_shutdown;
@@ -604,12 +598,14 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
 
        mutex_lock(&register_mutex);
        if (!was_shutdown) {
+               struct snd_usb_stream *as;
                struct snd_usb_endpoint *ep;
+               struct usb_mixer_interface *mixer;
 
                snd_card_disconnect(card);
                /* release the pcm resources */
-               list_for_each(p, &chip->pcm_list) {
-                       snd_usb_stream_disconnect(p);
+               list_for_each_entry(as, &chip->pcm_list, list) {
+                       snd_usb_stream_disconnect(as);
                }
                /* release the endpoint resources */
                list_for_each_entry(ep, &chip->ep_list, list) {
@@ -620,8 +616,8 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
                        snd_usbmidi_disconnect(p);
                }
                /* release mixer resources */
-               list_for_each(p, &chip->mixer_list) {
-                       snd_usb_mixer_disconnect(p);
+               list_for_each_entry(mixer, &chip->mixer_list, list) {
+                       snd_usb_mixer_disconnect(mixer);
                }
        }
 
@@ -635,27 +631,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)