aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-10-26 09:10:15 -0400
committerJaroslav Kysela <perex@perex.cz>2008-01-31 11:29:11 -0500
commit304cd07f92027af7e92d742d9554c3be9fa4d4cf (patch)
tree79129c34ac5a4ae063b6d0bd8cd62bd0fbb45ac0
parente97a516701cfc3c4b27444212208884214d10c20 (diff)
[ALSA] Introduce slots option to snd module
Introduced the global 'slots' option to snd module. This option provides an alternative way to handle the order of multiple sound card instances. It's an easier approach to avoid conflict with hotplug devices, and can be used together with the existing 'order' option of each card driver. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--Documentation/sound/alsa/ALSA-Configuration.txt21
-rw-r--r--sound/core/init.c36
2 files changed, 56 insertions, 1 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
index 8e49c19f6c9..f34821d6d52 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
2140In this example, the interwave card is always loaded as the first card 2142In 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
2145Alternative (and new) way to fixate the slot assignment is to use
2146"slots" option of snd module. In the case above, specify like the
2147following:
2148
2149options snd slots=snd-interwave,snd-ens1371
2150
2151Then, the first slot (#0) is reserved for snd-interwave driver, and
2152the second (#1) for snd-ens1371. You can omit index option in each
2153driver if slots option is used (although you can still have them at
2154the same time as long as they don't conflict).
2155
2156The slots option is especially useful for avoiding the possible
2157hot-plugging and the resultant slot conflict. For example, in the
2158case above again, the first two slots are already reserved. If any
2159other driver (e.g. snd-usb-audio) is loaded before snd-interwave or
2160snd-ens1371, it will be assigned to the third or later slot.
2161
2143 2162
2144ALSA PCM devices to OSS devices mapping 2163ALSA PCM devices to OSS devices mapping
2145======================================= 2164=======================================
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;