ALSA: Refactor slot assignment code
authorTakashi Iwai <tiwai@suse.de>
Thu, 23 Jan 2014 10:02:15 +0000 (11:02 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 23 Jan 2014 10:45:24 +0000 (11:45 +0100)
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>
sound/core/init.c

index e3c93cd77ee7918d0defad431f476b3254c2971a..0d42fcda0de2805235ea7fd3a685633050132f23 100644 (file)
@@ -131,6 +131,31 @@ static inline int init_info_for_card(struct snd_card *card)
 #define init_info_for_card(card)
 #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
  *  @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;
-       int err, idx2;
+       int err;
 
        if (snd_BUG_ON(!card_ret))
                return -EINVAL;
@@ -167,32 +192,10 @@ int snd_card_create(int idx, const char *xid,
                strlcpy(card->id, xid, sizeof(card->id));
        err = 0;
        mutex_lock(&snd_card_mutex);
-       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 (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) /* first check the matching module-name slot */
+               idx = get_slot_from_bitmask(idx, module_slot_match, module);
+       if (idx < 0) /* if not matched, assign an empty slot */
+               idx = get_slot_from_bitmask(idx, check_empty_slot, module);
        if (idx < 0)
                err = -ENODEV;
        else if (idx < snd_ecards_limit) {