aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/hda_intel.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2008-03-14 10:52:20 -0400
committerTakashi Iwai <tiwai@suse.de>2008-04-24 06:00:24 -0400
commitee9d6b9a30ae83f15fe8c8d2337ebc0a38151d38 (patch)
tree93cfed38dfeaf35a590139ec7999203daf20a3d3 /sound/pci/hda/hda_intel.c
parent3da23cac3d6b93803b8c381a755870cbafcd3212 (diff)
[ALSA] hda-intel - Fix power-off hang on ASUS P5AD2
The hda-intel driver has a problem at power-off on ASUS P5AD2. It's caused when the position-buffer is enabled -- most likely a hardware-specific problem. This patch adds a quirk to avoid the unnecessary enablement of position-buffer. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_intel.c')
-rw-r--r--sound/pci/hda/hda_intel.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 3d9f0bd63ba6..9a20fb1bef4f 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1059,9 +1059,12 @@ static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1059 azx_sd_writel(azx_dev, SD_BDLPU, upper_32bit(azx_dev->bdl.addr)); 1059 azx_sd_writel(azx_dev, SD_BDLPU, upper_32bit(azx_dev->bdl.addr));
1060 1060
1061 /* enable the position buffer */ 1061 /* enable the position buffer */
1062 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE)) 1062 if (chip->position_fix == POS_FIX_POSBUF ||
1063 azx_writel(chip, DPLBASE, 1063 chip->position_fix == POS_FIX_AUTO) {
1064 (u32)chip->posbuf.addr |ICH6_DPLBASE_ENABLE); 1064 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1065 azx_writel(chip, DPLBASE,
1066 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1067 }
1065 1068
1066 /* set the interrupt enable bits in the descriptor control register */ 1069 /* set the interrupt enable bits in the descriptor control register */
1067 azx_sd_writel(azx_dev, SD_CTL, 1070 azx_sd_writel(azx_dev, SD_CTL,
@@ -1707,6 +1710,7 @@ static int azx_dev_free(struct snd_device *device)
1707static struct snd_pci_quirk position_fix_list[] __devinitdata = { 1710static struct snd_pci_quirk position_fix_list[] __devinitdata = {
1708 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_NONE), 1711 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_NONE),
1709 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_NONE), 1712 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_NONE),
1713 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_NONE),
1710 {} 1714 {}
1711}; 1715};
1712 1716