rk: revert 20f3d0b+v3.0.66 to v3.0
[firefly-linux-kernel-4.4.55.git] / sound / usb / card.c
index 8d0a3c145e61b856b02589f8facf168cf03dd21d..220c6167dd86d5ed2164db0c73b97afac1ba6ec5 100644 (file)
@@ -335,7 +335,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
                return -ENOMEM;
        }
 
-       init_rwsem(&chip->shutdown_rwsem);
+       mutex_init(&chip->shutdown_mutex);
        chip->index = idx;
        chip->dev = dev;
        chip->card = card;
@@ -529,11 +529,8 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
        return chip;
 
  __error:
-       if (chip) {
-               if (!chip->num_interfaces)
-                       snd_card_free(chip->card);
-               chip->probing = 0;
-       }
+       if (chip && !chip->num_interfaces)
+               snd_card_free(chip->card);
        mutex_unlock(&register_mutex);
  __err_val:
        return NULL;
@@ -554,11 +551,9 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
 
        chip = ptr;
        card = chip->card;
-       down_write(&chip->shutdown_rwsem);
-       chip->shutdown = 1;
-       up_write(&chip->shutdown_rwsem);
-
        mutex_lock(&register_mutex);
+       mutex_lock(&chip->shutdown_mutex);
+       chip->shutdown = 1;
        chip->num_interfaces--;
        if (chip->num_interfaces <= 0) {
                snd_card_disconnect(card);
@@ -575,9 +570,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
                        snd_usb_mixer_disconnect(p);
                }
                usb_chip[chip->index] = NULL;
+               mutex_unlock(&chip->shutdown_mutex);
                mutex_unlock(&register_mutex);
                snd_card_free_when_closed(card);
        } else {
+               mutex_unlock(&chip->shutdown_mutex);
                mutex_unlock(&register_mutex);
        }
 }
@@ -609,20 +606,16 @@ int snd_usb_autoresume(struct snd_usb_audio *chip)
 {
        int err = -ENODEV;
 
-       down_read(&chip->shutdown_rwsem);
        if (!chip->shutdown && !chip->probing)
                err = usb_autopm_get_interface(chip->pm_intf);
-       up_read(&chip->shutdown_rwsem);
 
        return err;
 }
 
 void snd_usb_autosuspend(struct snd_usb_audio *chip)
 {
-       down_read(&chip->shutdown_rwsem);
        if (!chip->shutdown && !chip->probing)
                usb_autopm_put_interface(chip->pm_intf);
-       up_read(&chip->shutdown_rwsem);
 }
 
 static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)