ALSA: hda - vectorize get_empty_pcm_device()
authorWu Fengguang <fengguang.wu@intel.com>
Fri, 30 Oct 2009 10:38:26 +0000 (11:38 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 30 Oct 2009 10:38:26 +0000 (11:38 +0100)
This unifies the code and data structure,
and makes it easy to add more HDMI devices.

Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c

index af989f6..49289cd 100644 (file)
@@ -2885,43 +2885,26 @@ static int get_empty_pcm_device(struct hda_bus *bus, int type)
        static const char *dev_name[HDA_PCM_NTYPES] = {
                "Audio", "SPDIF", "HDMI", "Modem"
        };
-       /* starting device index for each PCM type */
-       static int dev_idx[HDA_PCM_NTYPES] = {
-               [HDA_PCM_TYPE_AUDIO] = 0,
-               [HDA_PCM_TYPE_SPDIF] = 1,
-               [HDA_PCM_TYPE_HDMI] = 3,
-               [HDA_PCM_TYPE_MODEM] = 6
+       /* audio device indices; not linear to keep compatibility */
+       static int audio_idx[HDA_PCM_NTYPES][5] = {
+               [HDA_PCM_TYPE_AUDIO] = { 0, 2, 4, 5, -1 },
+               [HDA_PCM_TYPE_SPDIF] = { 1, -1 },
+               [HDA_PCM_TYPE_HDMI]  = { 3, -1 },
+               [HDA_PCM_TYPE_MODEM] = { 6, -1 },
        };
-       /* normal audio device indices; not linear to keep compatibility */
-       static int audio_idx[4] = { 0, 2, 4, 5 };
-       int i, dev;
-
-       switch (type) {
-       case HDA_PCM_TYPE_AUDIO:
-               for (i = 0; i < ARRAY_SIZE(audio_idx); i++) {
-                       dev = audio_idx[i];
-                       if (!test_bit(dev, bus->pcm_dev_bits))
-                               goto ok;
-               }
-               snd_printk(KERN_WARNING "Too many audio devices\n");
-               return -EAGAIN;
-       case HDA_PCM_TYPE_SPDIF:
-       case HDA_PCM_TYPE_HDMI:
-       case HDA_PCM_TYPE_MODEM:
-               dev = dev_idx[type];
-               if (test_bit(dev, bus->pcm_dev_bits)) {
-                       snd_printk(KERN_WARNING "%s already defined\n",
-                                  dev_name[type]);
-                       return -EAGAIN;
-               }
-               break;
-       default:
+       int i;
+
+       if (type >= HDA_PCM_NTYPES) {
                snd_printk(KERN_WARNING "Invalid PCM type %d\n", type);
                return -EINVAL;
        }
- ok:
-       set_bit(dev, bus->pcm_dev_bits);
-       return dev;
+
+       for (i = 0; audio_idx[type][i] >= 0 ; i++)
+               if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits))
+                       return audio_idx[type][i];
+
+       snd_printk(KERN_WARNING "Too many %s devices\n", dev_name[type]);
+       return -EAGAIN;
 }
 
 /*