[ALSA] Unregister device files at disconnection
Orignally proposed by Sam Revitch <sam.revitch@gmail.com>. Unregister device files at disconnection to avoid the futher accesses. Also, the dev_unregister callback is removed and replaced with the combination of disconnect + free. A new function snd_card_free_when_closed() is introduced, which is used in USB disconnect callback. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
committed by
Jaroslav Kysela
parent
746d4a02e6
commit
c461482c80
@@ -71,7 +71,7 @@ EXPORT_SYMBOL(snd_device_new);
|
||||
* @device_data: the data pointer to release
|
||||
*
|
||||
* Removes the device from the list on the card and invokes the
|
||||
* callback, dev_unregister or dev_free, corresponding to the state.
|
||||
* callbacks, dev_disconnect and dev_free, corresponding to the state.
|
||||
* Then release the device.
|
||||
*
|
||||
* Returns zero if successful, or a negative error code on failure or if the
|
||||
@@ -90,16 +90,14 @@ int snd_device_free(struct snd_card *card, void *device_data)
|
||||
continue;
|
||||
/* unlink */
|
||||
list_del(&dev->list);
|
||||
if ((dev->state == SNDRV_DEV_REGISTERED ||
|
||||
dev->state == SNDRV_DEV_DISCONNECTED) &&
|
||||
dev->ops->dev_unregister) {
|
||||
if (dev->ops->dev_unregister(dev))
|
||||
snd_printk(KERN_ERR "device unregister failure\n");
|
||||
} else {
|
||||
if (dev->ops->dev_free) {
|
||||
if (dev->ops->dev_free(dev))
|
||||
snd_printk(KERN_ERR "device free failure\n");
|
||||
}
|
||||
if (dev->state == SNDRV_DEV_REGISTERED &&
|
||||
dev->ops->dev_disconnect)
|
||||
if (dev->ops->dev_disconnect(dev))
|
||||
snd_printk(KERN_ERR
|
||||
"device disconnect failure\n");
|
||||
if (dev->ops->dev_free) {
|
||||
if (dev->ops->dev_free(dev))
|
||||
snd_printk(KERN_ERR "device free failure\n");
|
||||
}
|
||||
kfree(dev);
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user