|
@@ -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;
|
|
|
}
|
|
|
|
|
|
/*
|