diff options
Diffstat (limited to 'sound/core/sound.c')
-rw-r--r-- | sound/core/sound.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/sound/core/sound.c b/sound/core/sound.c index a8eda02bcf1c..4d28e5212611 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <sound/initval.h> | 33 | #include <sound/initval.h> |
34 | #include <linux/kmod.h> | 34 | #include <linux/kmod.h> |
35 | #include <linux/devfs_fs_kernel.h> | 35 | #include <linux/devfs_fs_kernel.h> |
36 | #include <linux/mutex.h> | ||
36 | 37 | ||
37 | #define SNDRV_OS_MINORS 256 | 38 | #define SNDRV_OS_MINORS 256 |
38 | 39 | ||
@@ -61,7 +62,7 @@ MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR); | |||
61 | int snd_ecards_limit; | 62 | int snd_ecards_limit; |
62 | 63 | ||
63 | static struct snd_minor *snd_minors[SNDRV_OS_MINORS]; | 64 | static struct snd_minor *snd_minors[SNDRV_OS_MINORS]; |
64 | static DECLARE_MUTEX(sound_mutex); | 65 | static DEFINE_MUTEX(sound_mutex); |
65 | 66 | ||
66 | extern struct class *sound_class; | 67 | extern struct class *sound_class; |
67 | 68 | ||
@@ -120,15 +121,15 @@ void *snd_lookup_minor_data(unsigned int minor, int type) | |||
120 | struct snd_minor *mreg; | 121 | struct snd_minor *mreg; |
121 | void *private_data; | 122 | void *private_data; |
122 | 123 | ||
123 | if (minor > ARRAY_SIZE(snd_minors)) | 124 | if (minor >= ARRAY_SIZE(snd_minors)) |
124 | return NULL; | 125 | return NULL; |
125 | down(&sound_mutex); | 126 | mutex_lock(&sound_mutex); |
126 | mreg = snd_minors[minor]; | 127 | mreg = snd_minors[minor]; |
127 | if (mreg && mreg->type == type) | 128 | if (mreg && mreg->type == type) |
128 | private_data = mreg->private_data; | 129 | private_data = mreg->private_data; |
129 | else | 130 | else |
130 | private_data = NULL; | 131 | private_data = NULL; |
131 | up(&sound_mutex); | 132 | mutex_unlock(&sound_mutex); |
132 | return private_data; | 133 | return private_data; |
133 | } | 134 | } |
134 | 135 | ||
@@ -139,7 +140,7 @@ static int snd_open(struct inode *inode, struct file *file) | |||
139 | struct file_operations *old_fops; | 140 | struct file_operations *old_fops; |
140 | int err = 0; | 141 | int err = 0; |
141 | 142 | ||
142 | if (minor > ARRAY_SIZE(snd_minors)) | 143 | if (minor >= ARRAY_SIZE(snd_minors)) |
143 | return -ENODEV; | 144 | return -ENODEV; |
144 | mptr = snd_minors[minor]; | 145 | mptr = snd_minors[minor]; |
145 | if (mptr == NULL) { | 146 | if (mptr == NULL) { |
@@ -256,7 +257,7 @@ int snd_register_device(int type, struct snd_card *card, int dev, | |||
256 | preg->f_ops = f_ops; | 257 | preg->f_ops = f_ops; |
257 | preg->private_data = private_data; | 258 | preg->private_data = private_data; |
258 | strcpy(preg->name, name); | 259 | strcpy(preg->name, name); |
259 | down(&sound_mutex); | 260 | mutex_lock(&sound_mutex); |
260 | #ifdef CONFIG_SND_DYNAMIC_MINORS | 261 | #ifdef CONFIG_SND_DYNAMIC_MINORS |
261 | minor = snd_find_free_minor(); | 262 | minor = snd_find_free_minor(); |
262 | #else | 263 | #else |
@@ -265,7 +266,7 @@ int snd_register_device(int type, struct snd_card *card, int dev, | |||
265 | minor = -EBUSY; | 266 | minor = -EBUSY; |
266 | #endif | 267 | #endif |
267 | if (minor < 0) { | 268 | if (minor < 0) { |
268 | up(&sound_mutex); | 269 | mutex_unlock(&sound_mutex); |
269 | kfree(preg); | 270 | kfree(preg); |
270 | return minor; | 271 | return minor; |
271 | } | 272 | } |
@@ -276,7 +277,7 @@ int snd_register_device(int type, struct snd_card *card, int dev, | |||
276 | device = card->dev; | 277 | device = card->dev; |
277 | class_device_create(sound_class, NULL, MKDEV(major, minor), device, "%s", name); | 278 | class_device_create(sound_class, NULL, MKDEV(major, minor), device, "%s", name); |
278 | 279 | ||
279 | up(&sound_mutex); | 280 | mutex_unlock(&sound_mutex); |
280 | return 0; | 281 | return 0; |
281 | } | 282 | } |
282 | 283 | ||
@@ -297,7 +298,7 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) | |||
297 | struct snd_minor *mptr; | 298 | struct snd_minor *mptr; |
298 | 299 | ||
299 | cardnum = card ? card->number : -1; | 300 | cardnum = card ? card->number : -1; |
300 | down(&sound_mutex); | 301 | mutex_lock(&sound_mutex); |
301 | for (minor = 0; minor < ARRAY_SIZE(snd_minors); ++minor) | 302 | for (minor = 0; minor < ARRAY_SIZE(snd_minors); ++minor) |
302 | if ((mptr = snd_minors[minor]) != NULL && | 303 | if ((mptr = snd_minors[minor]) != NULL && |
303 | mptr->type == type && | 304 | mptr->type == type && |
@@ -305,7 +306,7 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) | |||
305 | mptr->device == dev) | 306 | mptr->device == dev) |
306 | break; | 307 | break; |
307 | if (minor == ARRAY_SIZE(snd_minors)) { | 308 | if (minor == ARRAY_SIZE(snd_minors)) { |
308 | up(&sound_mutex); | 309 | mutex_unlock(&sound_mutex); |
309 | return -EINVAL; | 310 | return -EINVAL; |
310 | } | 311 | } |
311 | 312 | ||
@@ -315,7 +316,7 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) | |||
315 | class_device_destroy(sound_class, MKDEV(major, minor)); | 316 | class_device_destroy(sound_class, MKDEV(major, minor)); |
316 | 317 | ||
317 | snd_minors[minor] = NULL; | 318 | snd_minors[minor] = NULL; |
318 | up(&sound_mutex); | 319 | mutex_unlock(&sound_mutex); |
319 | kfree(mptr); | 320 | kfree(mptr); |
320 | return 0; | 321 | return 0; |
321 | } | 322 | } |
@@ -354,7 +355,7 @@ static void snd_minor_info_read(struct snd_info_entry *entry, struct snd_info_bu | |||
354 | int minor; | 355 | int minor; |
355 | struct snd_minor *mptr; | 356 | struct snd_minor *mptr; |
356 | 357 | ||
357 | down(&sound_mutex); | 358 | mutex_lock(&sound_mutex); |
358 | for (minor = 0; minor < SNDRV_OS_MINORS; ++minor) { | 359 | for (minor = 0; minor < SNDRV_OS_MINORS; ++minor) { |
359 | if (!(mptr = snd_minors[minor])) | 360 | if (!(mptr = snd_minors[minor])) |
360 | continue; | 361 | continue; |
@@ -371,7 +372,7 @@ static void snd_minor_info_read(struct snd_info_entry *entry, struct snd_info_bu | |||
371 | snd_iprintf(buffer, "%3i: : %s\n", minor, | 372 | snd_iprintf(buffer, "%3i: : %s\n", minor, |
372 | snd_device_type_name(mptr->type)); | 373 | snd_device_type_name(mptr->type)); |
373 | } | 374 | } |
374 | up(&sound_mutex); | 375 | mutex_unlock(&sound_mutex); |
375 | } | 376 | } |
376 | 377 | ||
377 | int __init snd_minor_info_init(void) | 378 | int __init snd_minor_info_init(void) |