提交 a1585d76 编写于 作者: T Takashi Iwai

ALSA: hda - Check non-snoop in a single place

Merge the checks for VIA and ATI-HDMI into a single place for better
code-flow management.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 1815b34a
...@@ -1153,16 +1153,6 @@ static void update_pci_byte(struct pci_dev *pci, unsigned int reg, ...@@ -1153,16 +1153,6 @@ static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
static void azx_init_pci(struct azx *chip) static void azx_init_pci(struct azx *chip)
{ {
/* force to non-snoop mode for a new VIA controller when BIOS is set */
if (chip->snoop && chip->driver_type == AZX_DRIVER_VIA) {
u8 snoop;
pci_read_config_byte(chip->pci, 0x42, &snoop);
if (!(snoop & 0x80) && chip->pci->revision == 0x30) {
chip->snoop = 0;
snd_printdd(SFX "Force to non-snoop mode\n");
}
}
/* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
* TCSEL == Traffic Class Select Register, which sets PCI express QOS * TCSEL == Traffic Class Select Register, which sets PCI express QOS
* Ensuring these bits are 0 clears playback static on some HD Audio * 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,6 +2624,35 @@ static void __devinit check_msi(struct azx *chip)
} }
} }
/* check the snoop mode availability */
static void __devinit azx_check_snoop_available(struct azx *chip)
{
bool snoop = chip->snoop;
switch (chip->driver_type) {
case AZX_DRIVER_VIA:
/* force to non-snoop mode for a new VIA controller
* when BIOS is set
*/
if (snoop) {
u8 val;
pci_read_config_byte(chip->pci, 0x42, &val);
if (!(val & 0x80) && chip->pci->revision == 0x30)
snoop = false;
}
break;
case AZX_DRIVER_ATIHDMI_NS:
/* new ATI HDMI requires non-snoop */
snoop = false;
break;
}
if (snoop != chip->snoop) {
snd_printk(KERN_INFO SFX "Force to %s mode\n",
snoop ? "snoop" : "non-snoop");
chip->snoop = snoop;
}
}
/* /*
* constructor * constructor
...@@ -2680,8 +2699,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, ...@@ -2680,8 +2699,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
chip->single_cmd = single_cmd; chip->single_cmd = single_cmd;
chip->snoop = hda_snoop; chip->snoop = hda_snoop;
if (chip->driver_type == AZX_DRIVER_ATIHDMI_NS) azx_check_snoop_available(chip);
chip->snoop = 0;
if (bdl_pos_adj[dev] < 0) { if (bdl_pos_adj[dev] < 0) {
switch (chip->driver_type) { switch (chip->driver_type) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册