[ALSA] hda-intel - Add probe_mask blacklist
authorTakashi Iwai <tiwai@suse.de>
Fri, 17 Aug 2007 07:17:36 +0000 (09:17 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 16 Oct 2007 13:59:15 +0000 (15:59 +0200)
Added the black-list of probe_mask option to set the default value for
known non-working devices.  Currently, Thinkpad *60 and *61 series are set.
I'm afraid more will be added to the list in near future...

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

index 14bcc108e778d8c6bb7343e7290196a2131be69f..3d06eccc9b9c0fda0c8ad658b638dfe1cb179de8 100644 (file)
@@ -1653,7 +1653,7 @@ static int __devinit check_position_fix(struct azx *chip, int fix)
        if (fix == POS_FIX_AUTO) {
                q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
                if (q) {
-                       snd_printdd(KERN_INFO
+                       printk(KERN_INFO
                                    "hda_intel: position_fix set to %d "
                                    "for device %04x:%04x\n",
                                    q->value, q->subvendor, q->subdevice);
@@ -1663,6 +1663,36 @@ static int __devinit check_position_fix(struct azx *chip, int fix)
        return fix;
 }
 
+/*
+ * black-lists for probe_mask
+ */
+static struct snd_pci_quirk probe_mask_list[] __devinitdata = {
+       /* Thinkpad often breaks the controller communication when accessing
+        * to the non-working (or non-existing) modem codec slot.
+        */
+       SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
+       SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
+       SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
+       {}
+};
+
+static void __devinit check_probe_mask(struct azx *chip)
+{
+       const struct snd_pci_quirk *q;
+
+       if (probe_mask == -1) {
+               q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
+               if (q) {
+                       printk(KERN_INFO
+                              "hda_intel: probe_mask set to 0x%x "
+                              "for device %04x:%04x\n",
+                              q->value, q->subvendor, q->subdevice);
+                       probe_mask = q->value;
+               }
+       }
+}
+
+
 /*
  * constructor
  */
@@ -1698,6 +1728,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
        chip->msi = enable_msi;
 
        chip->position_fix = check_position_fix(chip, position_fix);
+       check_probe_mask(chip);
 
        chip->single_cmd = single_cmd;