diff options
Diffstat (limited to 'sound/usb/card.c')
| -rw-r--r-- | sound/usb/card.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c index 561bb74fd36..dbf7999d18b 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -339,7 +339,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,  	}  	mutex_init(&chip->mutex); -	mutex_init(&chip->shutdown_mutex); +	init_rwsem(&chip->shutdown_rwsem);  	chip->index = idx;  	chip->dev = dev;  	chip->card = card; @@ -559,9 +559,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,  		return;  	card = chip->card; -	mutex_lock(®ister_mutex); -	mutex_lock(&chip->shutdown_mutex); +	down_write(&chip->shutdown_rwsem);  	chip->shutdown = 1; +	up_write(&chip->shutdown_rwsem); + +	mutex_lock(®ister_mutex);  	chip->num_interfaces--;  	if (chip->num_interfaces <= 0) {  		snd_card_disconnect(card); @@ -582,11 +584,9 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,  			snd_usb_mixer_disconnect(p);  		}  		usb_chip[chip->index] = NULL; -		mutex_unlock(&chip->shutdown_mutex);  		mutex_unlock(®ister_mutex);  		snd_card_free_when_closed(card);  	} else { -		mutex_unlock(&chip->shutdown_mutex);  		mutex_unlock(®ister_mutex);  	}  } @@ -618,16 +618,20 @@ 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)  |