diff options
Diffstat (limited to 'sound/pci/hda')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 9f7c901a52e3..8d17963ac021 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -1153,16 +1153,6 @@ static void update_pci_byte(struct pci_dev *pci, unsigned int reg, | |||
1153 | 1153 | ||
1154 | static void azx_init_pci(struct azx *chip) | 1154 | static void azx_init_pci(struct azx *chip) |
1155 | { | 1155 | { |
1156 | /* force to non-snoop mode for a new VIA controller when BIOS is set */ | ||
1157 | if (chip->snoop && chip->driver_type == AZX_DRIVER_VIA) { | ||
1158 | u8 snoop; | ||
1159 | pci_read_config_byte(chip->pci, 0x42, &snoop); | ||
1160 | if (!(snoop & 0x80) && chip->pci->revision == 0x30) { | ||
1161 | chip->snoop = 0; | ||
1162 | snd_printdd(SFX "Force to non-snoop mode\n"); | ||
1163 | } | ||
1164 | } | ||
1165 | |||
1166 | /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) | 1156 | /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) |
1167 | * TCSEL == Traffic Class Select Register, which sets PCI express QOS | 1157 | * TCSEL == Traffic Class Select Register, which sets PCI express QOS |
1168 | * Ensuring these bits are 0 clears playback static on some HD Audio | 1158 | * Ensuring these bits are 0 clears playback static on some HD Audio |
@@ -2634,6 +2624,35 @@ static void __devinit check_msi(struct azx *chip) | |||
2634 | } | 2624 | } |
2635 | } | 2625 | } |
2636 | 2626 | ||
2627 | /* check the snoop mode availability */ | ||
2628 | static void __devinit azx_check_snoop_available(struct azx *chip) | ||
2629 | { | ||
2630 | bool snoop = chip->snoop; | ||
2631 | |||
2632 | switch (chip->driver_type) { | ||
2633 | case AZX_DRIVER_VIA: | ||
2634 | /* force to non-snoop mode for a new VIA controller | ||
2635 | * when BIOS is set | ||
2636 | */ | ||
2637 | if (snoop) { | ||
2638 | u8 val; | ||
2639 | pci_read_config_byte(chip->pci, 0x42, &val); | ||
2640 | if (!(val & 0x80) && chip->pci->revision == 0x30) | ||
2641 | snoop = false; | ||
2642 | } | ||
2643 | break; | ||
2644 | case AZX_DRIVER_ATIHDMI_NS: | ||
2645 | /* new ATI HDMI requires non-snoop */ | ||
2646 | snoop = false; | ||
2647 | break; | ||
2648 | } | ||
2649 | |||
2650 | if (snoop != chip->snoop) { | ||
2651 | snd_printk(KERN_INFO SFX "Force to %s mode\n", | ||
2652 | snoop ? "snoop" : "non-snoop"); | ||
2653 | chip->snoop = snoop; | ||
2654 | } | ||
2655 | } | ||
2637 | 2656 | ||
2638 | /* | 2657 | /* |
2639 | * constructor | 2658 | * constructor |
@@ -2680,8 +2699,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2680 | 2699 | ||
2681 | chip->single_cmd = single_cmd; | 2700 | chip->single_cmd = single_cmd; |
2682 | chip->snoop = hda_snoop; | 2701 | chip->snoop = hda_snoop; |
2683 | if (chip->driver_type == AZX_DRIVER_ATIHDMI_NS) | 2702 | azx_check_snoop_available(chip); |
2684 | chip->snoop = 0; | ||
2685 | 2703 | ||
2686 | if (bdl_pos_adj[dev] < 0) { | 2704 | if (bdl_pos_adj[dev] < 0) { |
2687 | switch (chip->driver_type) { | 2705 | switch (chip->driver_type) { |