diff options
-rw-r--r-- | Documentation/sound/alsa/ALSA-Configuration.txt | 21 | ||||
-rw-r--r-- | sound/core/init.c | 36 |
2 files changed, 56 insertions, 1 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 8e49c19f6c96..f34821d6d52a 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -57,7 +57,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
57 | - Default: 1 | 57 | - Default: 1 |
58 | - For auto-loading more than one card, specify this | 58 | - For auto-loading more than one card, specify this |
59 | option together with snd-card-X aliases. | 59 | option together with snd-card-X aliases. |
60 | 60 | slots - Reserve the slot index for the given driver. | |
61 | This option takes multiple strings. | ||
62 | See "Module Autoloading Support" section for details. | ||
61 | 63 | ||
62 | Module snd-pcm-oss | 64 | Module snd-pcm-oss |
63 | ------------------ | 65 | ------------------ |
@@ -2140,6 +2142,23 @@ alias sound-slot-1 snd-ens1371 | |||
2140 | In this example, the interwave card is always loaded as the first card | 2142 | In this example, the interwave card is always loaded as the first card |
2141 | (index 0) and ens1371 as the second (index 1). | 2143 | (index 0) and ens1371 as the second (index 1). |
2142 | 2144 | ||
2145 | Alternative (and new) way to fixate the slot assignment is to use | ||
2146 | "slots" option of snd module. In the case above, specify like the | ||
2147 | following: | ||
2148 | |||
2149 | options snd slots=snd-interwave,snd-ens1371 | ||
2150 | |||
2151 | Then, the first slot (#0) is reserved for snd-interwave driver, and | ||
2152 | the second (#1) for snd-ens1371. You can omit index option in each | ||
2153 | driver if slots option is used (although you can still have them at | ||
2154 | the same time as long as they don't conflict). | ||
2155 | |||
2156 | The slots option is especially useful for avoiding the possible | ||
2157 | hot-plugging and the resultant slot conflict. For example, in the | ||
2158 | case above again, the first two slots are already reserved. If any | ||
2159 | other driver (e.g. snd-usb-audio) is loaded before snd-interwave or | ||
2160 | snd-ens1371, it will be assigned to the third or later slot. | ||
2161 | |||
2143 | 2162 | ||
2144 | ALSA PCM devices to OSS devices mapping | 2163 | ALSA PCM devices to OSS devices mapping |
2145 | ======================================= | 2164 | ======================================= |
diff --git a/sound/core/init.c b/sound/core/init.c index 2cb7099eb1e1..48d38a79cbbb 100644 --- a/sound/core/init.c +++ b/sound/core/init.c | |||
@@ -43,6 +43,40 @@ EXPORT_SYMBOL(snd_cards); | |||
43 | 43 | ||
44 | static DEFINE_MUTEX(snd_card_mutex); | 44 | static DEFINE_MUTEX(snd_card_mutex); |
45 | 45 | ||
46 | static char *slots[SNDRV_CARDS]; | ||
47 | module_param_array(slots, charp, NULL, 0444); | ||
48 | MODULE_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 | */ | ||
53 | static 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) |
47 | int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag); | 81 | int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag); |
48 | EXPORT_SYMBOL(snd_mixer_oss_notify_callback); | 82 | EXPORT_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; |