فهرست منبع

ALSA: hda - Drop hard dependency on CONFIG_SND_DYNAMIC_MINORS

Currently HDMI codec driver sets the hard dependency (reverse
selection) on CONFIG_SND_DYNAMIC_MINORS because the recent codecs may
support more than two PCMs.  But, this doesn't mean that we need
always this option, since there can be a single PCM stream even with
the modern codecs.

This patch drops the hard dependency again but give more sensible
error message when no enough PCMs are available due to the lack of
this option.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 12 سال پیش
والد
کامیت
36bb00d4b2
2فایلهای تغییر یافته به همراه15 افزوده شده و 5 حذف شده
  1. 0 1
      sound/pci/hda/Kconfig
  2. 15 4
      sound/pci/hda/hda_codec.c

+ 0 - 1
sound/pci/hda/Kconfig

@@ -140,7 +140,6 @@ config SND_HDA_CODEC_VIA
 
 
 config SND_HDA_CODEC_HDMI
 config SND_HDA_CODEC_HDMI
 	bool "Build HDMI/DisplayPort HD-audio codec support"
 	bool "Build HDMI/DisplayPort HD-audio codec support"
-	select SND_DYNAMIC_MINORS
 	default y
 	default y
 	help
 	help
 	  Say Y here to include HDMI and DisplayPort HD-audio codec
 	  Say Y here to include HDMI and DisplayPort HD-audio codec

+ 15 - 4
sound/pci/hda/hda_codec.c

@@ -4461,12 +4461,13 @@ const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = {
 
 
 /*
 /*
  * get the empty PCM device number to assign
  * get the empty PCM device number to assign
- *
- * note the max device number is limited by HDA_MAX_PCMS, currently 10
  */
  */
-static int get_empty_pcm_device(struct hda_bus *bus, int type)
+static int get_empty_pcm_device(struct hda_bus *bus, unsigned int type)
 {
 {
 	/* audio device indices; not linear to keep compatibility */
 	/* audio device indices; not linear to keep compatibility */
+	/* assigned to static slots up to dev#10; if more needed, assign
+	 * the later slot dynamically (when CONFIG_SND_DYNAMIC_MINORS=y)
+	 */
 	static int audio_idx[HDA_PCM_NTYPES][5] = {
 	static int audio_idx[HDA_PCM_NTYPES][5] = {
 		[HDA_PCM_TYPE_AUDIO] = { 0, 2, 4, 5, -1 },
 		[HDA_PCM_TYPE_AUDIO] = { 0, 2, 4, 5, -1 },
 		[HDA_PCM_TYPE_SPDIF] = { 1, -1 },
 		[HDA_PCM_TYPE_SPDIF] = { 1, -1 },
@@ -4480,18 +4481,28 @@ static int get_empty_pcm_device(struct hda_bus *bus, int type)
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 
 
-	for (i = 0; audio_idx[type][i] >= 0 ; i++)
+	for (i = 0; audio_idx[type][i] >= 0; i++) {
+#ifndef CONFIG_SND_DYNAMIC_MINORS
+		if (audio_idx[type][i] >= 8)
+			break;
+#endif
 		if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits))
 		if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits))
 			return audio_idx[type][i];
 			return audio_idx[type][i];
+	}
 
 
+#ifdef CONFIG_SND_DYNAMIC_MINORS
 	/* non-fixed slots starting from 10 */
 	/* non-fixed slots starting from 10 */
 	for (i = 10; i < 32; i++) {
 	for (i = 10; i < 32; i++) {
 		if (!test_and_set_bit(i, bus->pcm_dev_bits))
 		if (!test_and_set_bit(i, bus->pcm_dev_bits))
 			return i;
 			return i;
 	}
 	}
+#endif
 
 
 	snd_printk(KERN_WARNING "Too many %s devices\n",
 	snd_printk(KERN_WARNING "Too many %s devices\n",
 		snd_hda_pcm_type_name[type]);
 		snd_hda_pcm_type_name[type]);
+#ifndef CONFIG_SND_DYNAMIC_MINORS
+	snd_printk(KERN_WARNING "Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y\n");
+#endif
 	return -EAGAIN;
 	return -EAGAIN;
 }
 }