提交 304cd07f 编写于 作者: T Takashi Iwai 提交者: Jaroslav Kysela

[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: NTakashi Iwai <tiwai@suse.de>
Signed-off-by: NJaroslav Kysela <perex@perex.cz>
上级 e97a5167
...@@ -57,7 +57,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -57,7 +57,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
- Default: 1 - Default: 1
- For auto-loading more than one card, specify this - For auto-loading more than one card, specify this
option together with snd-card-X aliases. 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 Module snd-pcm-oss
------------------ ------------------
...@@ -2140,6 +2142,23 @@ alias sound-slot-1 snd-ens1371 ...@@ -2140,6 +2142,23 @@ alias sound-slot-1 snd-ens1371
In this example, the interwave card is always loaded as the first card In this example, the interwave card is always loaded as the first card
(index 0) and ens1371 as the second (index 1). (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 ALSA PCM devices to OSS devices mapping
======================================= =======================================
......
...@@ -43,6 +43,40 @@ EXPORT_SYMBOL(snd_cards); ...@@ -43,6 +43,40 @@ EXPORT_SYMBOL(snd_cards);
static DEFINE_MUTEX(snd_card_mutex); 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) #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); int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
EXPORT_SYMBOL(snd_mixer_oss_notify_callback); EXPORT_SYMBOL(snd_mixer_oss_notify_callback);
...@@ -115,6 +149,8 @@ struct snd_card *snd_card_new(int idx, const char *xid, ...@@ -115,6 +149,8 @@ struct snd_card *snd_card_new(int idx, const char *xid,
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
/* idx == -1 == 0xffff means: take any free slot */ /* idx == -1 == 0xffff means: take any free slot */
if (~snd_cards_lock & idx & 1<<idx2) { if (~snd_cards_lock & idx & 1<<idx2) {
if (module_slot_mismatch(module, idx2))
continue;
idx = idx2; idx = idx2;
if (idx >= snd_ecards_limit) if (idx >= snd_ecards_limit)
snd_ecards_limit = idx + 1; snd_ecards_limit = idx + 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册