aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-10-26 15:10:15 +0200
committerJaroslav Kysela <perex@perex.cz>2008-01-31 17:29:11 +0100
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.
- Default: 1
- For auto-loading more than one card, specify this
option together with snd-card-X aliases.
-
+ slots - Reserve the slot index for the given driver.
+ This option takes multiple strings.
+ See "Module Autoloading Support" section for details.
Module snd-pcm-oss
------------------
@@ -2140,6 +2142,23 @@ alias sound-slot-1 snd-ens1371
In this example, the interwave card is always loaded as the first card
(index 0) and ens1371 as the second (index 1).
+Alternative (and new) way to fixate the slot assignment is to use
+"slots" option of snd module. In the case above, specify like the
+following:
+
+options snd slots=snd-interwave,snd-ens1371
+
+Then, the first slot (#0) is reserved for snd-interwave driver, and
+the second (#1) for snd-ens1371. You can omit index option in each
+driver if slots option is used (although you can still have them at
+the same time as long as they don't conflict).
+
+The slots option is especially useful for avoiding the possible
+hot-plugging and the resultant slot conflict. For example, in the
+case above again, the first two slots are already reserved. If any
+other driver (e.g. snd-usb-audio) is loaded before snd-interwave or
+snd-ens1371, it will be assigned to the third or later slot.
+
ALSA PCM devices to OSS devices mapping
=======================================
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);
static DEFINE_MUTEX(snd_card_mutex);
+static char *slots[SNDRV_CARDS];
+module_param_array(slots, charp, NULL, 0444);
+MODULE_PARM_DESC(slots, "Module names assigned to the slots.");
+
+/* return non-zero if the given index is already reserved for another
+ * module via slots option
+ */
+static int module_slot_mismatch(struct module *module, int idx)
+{
+#ifdef MODULE
+ char *s1, *s2;
+ if (!module || !module->name || !slots[idx])
+ return 0;
+ s1 = slots[idx];
+ s2 = module->name;
+ /* compare module name strings
+ * hyphens are handled as equivalent with underscore
+ */
+ for (;;) {
+ char c1 = *s1++;
+ char c2 = *s2++;
+ if (c1 == '-')
+ c1 = '_';
+ if (c2 == '-')
+ c2 = '_';
+ if (c1 != c2)
+ return 1;
+ if (!c1)
+ break;
+ }
+#endif
+ return 0;
+}
+
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
EXPORT_SYMBOL(snd_mixer_oss_notify_callback);
@@ -115,6 +149,8 @@ struct snd_card *snd_card_new(int idx, const char *xid,
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
/* idx == -1 == 0xffff means: take any free slot */
if (~snd_cards_lock & idx & 1<<idx2) {
+ if (module_slot_mismatch(module, idx2))
+ continue;
idx = idx2;
if (idx >= snd_ecards_limit)
snd_ecards_limit = idx + 1;