]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[ALSA] hda-intel - Don't try to probe invalid codecs
authorTakashi Iwai <tiwai@suse.de>
Wed, 28 Mar 2007 20:29:24 +0000 (22:29 +0200)
committerAdrian Bunk <bunk@stusta.de>
Wed, 28 Mar 2007 20:29:24 +0000 (22:29 +0200)
Fix the max number of codecs detected by HD-intel (and compatible)
controllers.

ATI controllers may have up to 4 codecs while ICH up to 3.
Now max codecs is defined according to the driver type, either 3 or 4.
Currently 4 is set only to ATI chips.  Other might need the same
change, too.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
sound/pci/hda/hda_intel.c

index 0ff38cbe7471276eef0a41e07fc95eb4746b0955..e7aa8fc7e9b865848623910a686077e0f0a7879d 100644 (file)
@@ -182,7 +182,6 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
 
 /* STATESTS int mask: SD2,SD1,SD0 */
 #define STATESTS_INT_MASK      0x07
-#define AZX_MAX_CODECS         4
 
 /* SD_CTL bits */
 #define SD_CTL_STREAM_RESET    0x01    /* stream reset bit */
@@ -904,6 +903,15 @@ 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] = 3,
+       [AZX_DRIVER_ATI] = 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? */
+};
+
 static int __devinit azx_codec_create(struct azx *chip, const char *model)
 {
        struct hda_bus_template bus_temp;
@@ -920,7 +928,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
                return err;
 
        codecs = 0;
-       for (c = 0; c < AZX_MAX_CODECS; c++) {
+       for (c = 0; c < azx_max_codecs[chip->driver_type]; c++) {
                if ((chip->codec_mask & (1 << c)) & probe_mask) {
                        err = snd_hda_codec_new(chip->bus, c, NULL);
                        if (err < 0)