ALSA: hda - allow probing of 4 codecs
authorTakashi Iwai <tiwai@suse.de>
Wed, 3 Sep 2008 14:00:44 +0000 (16:00 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 9 Sep 2008 07:10:49 +0000 (09:10 +0200)
Allow probing of 4 codecs on known good situations.
On some known bad situations, it should be avoided.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/hda/hda_intel.c

index 52a3adfac7f8b8cc2d8bad286685a1aea4711126..60cc44abf58f2e915444e07ae6029297d622c9e9 100644 (file)
@@ -222,9 +222,9 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
 #define RIRB_INT_OVERRUN       0x04
 #define RIRB_INT_MASK          0x05
 
-/* STATESTS int mask: SD2,SD1,SD0 */
-#define AZX_MAX_CODECS         3
-#define STATESTS_INT_MASK      0x07
+/* STATESTS int mask: S3,SD2,SD1,SD0 */
+#define AZX_MAX_CODECS         4
+#define STATESTS_INT_MASK      0x0f
 
 /* SD_CTL bits */
 #define SD_CTL_STREAM_RESET    0x01    /* stream reset bit */
@@ -410,6 +410,7 @@ enum {
        AZX_DRIVER_ULI,
        AZX_DRIVER_NVIDIA,
        AZX_DRIVER_TERA,
+       AZX_NUM_DRIVERS, /* keep this as last entry */
 };
 
 static char *driver_short_names[] __devinitdata = {
@@ -1184,23 +1185,26 @@ static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
  * Codec initialization
  */
 
-static unsigned int azx_max_codecs[] __devinitdata = {
-       [AZX_DRIVER_ICH] = 4,           /* Some ICH9 boards use SD3 */
-       [AZX_DRIVER_SCH] = 3,
-       [AZX_DRIVER_ATI] = 4,
-       [AZX_DRIVER_ATIHDMI] = 4,
-       [AZX_DRIVER_VIA] = 3,           /* FIXME: correct? */
-       [AZX_DRIVER_SIS] = 3,           /* FIXME: correct? */
-       [AZX_DRIVER_ULI] = 3,           /* FIXME: correct? */
-       [AZX_DRIVER_NVIDIA] = 3,        /* FIXME: correct? */
+/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
+static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] __devinitdata = {
        [AZX_DRIVER_TERA] = 1,
 };
 
+/* number of slots to probe as default
+ * this can be different from azx_max_codecs[] -- e.g. some boards
+ * report wrongly the non-existing 4th slot availability
+ */
+static unsigned int azx_default_codecs[AZX_NUM_DRIVERS] __devinitdata = {
+       [AZX_DRIVER_ICH] = 3,
+       [AZX_DRIVER_ATI] = 3,
+};
+
 static int __devinit azx_codec_create(struct azx *chip, const char *model,
                                      unsigned int codec_probe_mask)
 {
        struct hda_bus_template bus_temp;
        int c, codecs, audio_codecs, err;
+       int def_slots, max_slots;
 
        memset(&bus_temp, 0, sizeof(bus_temp));
        bus_temp.private_data = chip;
@@ -1217,7 +1221,13 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model,
                return err;
 
        codecs = audio_codecs = 0;
-       for (c = 0; c < AZX_MAX_CODECS; c++) {
+       max_slots = azx_max_codecs[chip->driver_type];
+       if (!max_slots)
+               max_slots = AZX_MAX_CODECS;
+       def_slots = azx_default_codecs[chip->driver_type];
+       if (!def_slots)
+               def_slots = max_slots;
+       for (c = 0; c < def_slots; c++) {
                if ((chip->codec_mask & (1 << c)) & codec_probe_mask) {
                        struct hda_codec *codec;
                        err = snd_hda_codec_new(chip->bus, c, &codec);
@@ -1230,7 +1240,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model,
        }
        if (!audio_codecs) {
                /* probe additional slots if no codec is found */
-               for (; c < azx_max_codecs[chip->driver_type]; c++) {
+               for (; c < max_slots; c++) {
                        if ((chip->codec_mask & (1 << c)) & codec_probe_mask) {
                                err = snd_hda_codec_new(chip->bus, c, NULL);
                                if (err < 0)