ALSA: Refactor slot assignment code
There are two loops that are almost identical but only with different checks. Refactor them with a simple helper, and give a bit more comments what's doing there. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
4c3773eda4
commit
deb6596f16
1 changed files with 30 additions and 27 deletions
|
@ -131,6 +131,31 @@ static inline int init_info_for_card(struct snd_card *card)
|
||||||
#define init_info_for_card(card)
|
#define init_info_for_card(card)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int check_empty_slot(struct module *module, int slot)
|
||||||
|
{
|
||||||
|
return !slots[slot] || !*slots[slot];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return an empty slot number (>= 0) found in the given bitmask @mask.
|
||||||
|
* @mask == -1 == 0xffffffff means: take any free slot up to 32
|
||||||
|
* when no slot is available, return the original @mask as is.
|
||||||
|
*/
|
||||||
|
static int get_slot_from_bitmask(int mask, int (*check)(struct module *, int),
|
||||||
|
struct module *module)
|
||||||
|
{
|
||||||
|
int slot;
|
||||||
|
|
||||||
|
for (slot = 0; slot < SNDRV_CARDS; slot++) {
|
||||||
|
if (slot < 32 && !(mask & (1U << slot)))
|
||||||
|
continue;
|
||||||
|
if (!test_bit(slot, snd_cards_lock)) {
|
||||||
|
if (check(module, slot))
|
||||||
|
return slot; /* found */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mask; /* unchanged */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_card_create - create and initialize a soundcard structure
|
* snd_card_create - create and initialize a soundcard structure
|
||||||
* @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
|
* @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
|
||||||
|
@ -152,7 +177,7 @@ int snd_card_create(int idx, const char *xid,
|
||||||
struct snd_card **card_ret)
|
struct snd_card **card_ret)
|
||||||
{
|
{
|
||||||
struct snd_card *card;
|
struct snd_card *card;
|
||||||
int err, idx2;
|
int err;
|
||||||
|
|
||||||
if (snd_BUG_ON(!card_ret))
|
if (snd_BUG_ON(!card_ret))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -167,32 +192,10 @@ int snd_card_create(int idx, const char *xid,
|
||||||
strlcpy(card->id, xid, sizeof(card->id));
|
strlcpy(card->id, xid, sizeof(card->id));
|
||||||
err = 0;
|
err = 0;
|
||||||
mutex_lock(&snd_card_mutex);
|
mutex_lock(&snd_card_mutex);
|
||||||
if (idx < 0) {
|
if (idx < 0) /* first check the matching module-name slot */
|
||||||
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) {
|
idx = get_slot_from_bitmask(idx, module_slot_match, module);
|
||||||
/* idx == -1 == 0xffff means: take any free slot */
|
if (idx < 0) /* if not matched, assign an empty slot */
|
||||||
if (idx2 < 32 && !(idx & (1U << idx2)))
|
idx = get_slot_from_bitmask(idx, check_empty_slot, module);
|
||||||
continue;
|
|
||||||
if (!test_bit(idx2, snd_cards_lock)) {
|
|
||||||
if (module_slot_match(module, idx2)) {
|
|
||||||
idx = idx2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (idx < 0) {
|
|
||||||
for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) {
|
|
||||||
/* idx == -1 == 0xffff means: take any free slot */
|
|
||||||
if (idx2 < 32 && !(idx & (1U << idx2)))
|
|
||||||
continue;
|
|
||||||
if (!test_bit(idx2, snd_cards_lock)) {
|
|
||||||
if (!slots[idx2] || !*slots[idx2]) {
|
|
||||||
idx = idx2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
else if (idx < snd_ecards_limit) {
|
else if (idx < snd_ecards_limit) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue