aboutsummaryrefslogtreecommitdiffstats
path: root/sound/core/device.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2006-06-23 08:38:23 -0400
committerJaroslav Kysela <perex@suse.cz>2006-09-23 04:36:58 -0400
commitc461482c8072bb073e6146db320d3da85cdc89ad (patch)
tree3b69cfd292a488a8cb57ac9b040bd2b1b1a1e26d /sound/core/device.c
parent746d4a02e68499fc6c1f8d0c43d2271853ade181 (diff)
[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>
Diffstat (limited to 'sound/core/device.c')
-rw-r--r--sound/core/device.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/sound/core/device.c b/sound/core/device.c
index 6ce4da4a1081..ccb25816ac9e 100644
--- a/sound/core/device.c
+++ b/sound/core/device.c
@@ -71,7 +71,7 @@ EXPORT_SYMBOL(snd_device_new);
71 * @device_data: the data pointer to release 71 * @device_data: the data pointer to release
72 * 72 *
73 * Removes the device from the list on the card and invokes the 73 * Removes the device from the list on the card and invokes the
74 * callback, dev_unregister or dev_free, corresponding to the state. 74 * callbacks, dev_disconnect and dev_free, corresponding to the state.
75 * Then release the device. 75 * Then release the device.
76 * 76 *
77 * Returns zero if successful, or a negative error code on failure or if the 77 * 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)
90 continue; 90 continue;
91 /* unlink */ 91 /* unlink */
92 list_del(&dev->list); 92 list_del(&dev->list);
93 if ((dev->state == SNDRV_DEV_REGISTERED || 93 if (dev->state == SNDRV_DEV_REGISTERED &&
94 dev->state == SNDRV_DEV_DISCONNECTED) && 94 dev->ops->dev_disconnect)
95 dev->ops->dev_unregister) { 95 if (dev->ops->dev_disconnect(dev))
96 if (dev->ops->dev_unregister(dev)) 96 snd_printk(KERN_ERR
97 snd_printk(KERN_ERR "device unregister failure\n"); 97 "device disconnect failure\n");
98 } else { 98 if (dev->ops->dev_free) {
99 if (dev->ops->dev_free) { 99 if (dev->ops->dev_free(dev))
100 if (dev->ops->dev_free(dev)) 100 snd_printk(KERN_ERR "device free failure\n");
101 snd_printk(KERN_ERR "device free failure\n");
102 }
103 } 101 }
104 kfree(dev); 102 kfree(dev);
105 return 0; 103 return 0;