aboutsummaryrefslogtreecommitdiffstats
path: root/sound/core/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/core/init.c')
-rw-r--r--sound/core/init.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/sound/core/init.c b/sound/core/init.c
index 2cb7099eb1e..48d38a79cbb 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -43,6 +43,40 @@ EXPORT_SYMBOL(snd_cards);
43 43
44static DEFINE_MUTEX(snd_card_mutex); 44static DEFINE_MUTEX(snd_card_mutex);
45 45
46static char *slots[SNDRV_CARDS];
47module_param_array(slots, charp, NULL, 0444);
48MODULE_PARM_DESC(slots, "Module names assigned to the slots.");
49
50/* return non-zero if the given index is already reserved for another
51 * module via slots option
52 */
53static int module_slot_mismatch(struct module *module, int idx)
54{
55#ifdef MODULE
56 char *s1, *s2;
57 if (!module || !module->name || !slots[idx])
58 return 0;
59 s1 = slots[idx];
60 s2 = module->name;
61 /* compare module name strings
62 * hyphens are handled as equivalent with underscore
63 */
64 for (;;) {
65 char c1 = *s1++;
66 char c2 = *s2++;
67 if (c1 == '-')
68 c1 = '_';
69 if (c2 == '-')
70 c2 = '_';
71 if (c1 != c2)
72 return 1;
73 if (!c1)
74 break;
75 }
76#endif
77 return 0;
78}
79
46#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE) 80#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
47int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag); 81int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
48EXPORT_SYMBOL(snd_mixer_oss_notify_callback); 82EXPORT_SYMBOL(snd_mixer_oss_notify_callback);
@@ -115,6 +149,8 @@ struct snd_card *snd_card_new(int idx, const char *xid,
115 for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) 149 for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
116 /* idx == -1 == 0xffff means: take any free slot */ 150 /* idx == -1 == 0xffff means: take any free slot */
117 if (~snd_cards_lock & idx & 1<<idx2) { 151 if (~snd_cards_lock & idx & 1<<idx2) {
152 if (module_slot_mismatch(module, idx2))
153 continue;
118 idx = idx2; 154 idx = idx2;
119 if (idx >= snd_ecards_limit) 155 if (idx >= snd_ecards_limit)
120 snd_ecards_limit = idx + 1; 156 snd_ecards_limit = idx + 1;