56 lines
1.8 KiB
Diff
56 lines
1.8 KiB
Diff
From a810364a0424c297242c6c66071a42f7675a5568 Mon Sep 17 00:00:00 2001
|
|
From: Takashi Iwai <tiwai@suse.de>
|
|
Date: Tue, 7 Jun 2011 12:23:23 +0200
|
|
Subject: [PATCH] ALSA: hda - Handle -1 as invalid position, too
|
|
|
|
When reading from the position-buffer results in -1, handle as it's
|
|
invalid and falls back to LPIB mode as well as 0.
|
|
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
sound/pci/hda/hda_intel.c | 21 +++++++++++----------
|
|
1 files changed, 11 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
|
index 966f401..45cd02f 100644
|
|
--- a/sound/pci/hda/hda_intel.c
|
|
+++ b/sound/pci/hda/hda_intel.c
|
|
@@ -1930,6 +1930,17 @@ static unsigned int azx_get_position(struct azx *chip,
|
|
default:
|
|
/* use the position buffer */
|
|
pos = le32_to_cpu(*azx_dev->posbuf);
|
|
+ if (chip->position_fix[stream] == POS_FIX_AUTO) {
|
|
+ if (!pos || pos == (u32)-1) {
|
|
+ printk(KERN_WARNING
|
|
+ "hda-intel: Invalid position buffer, "
|
|
+ "using LPIB read method instead.\n");
|
|
+ chip->position_fix[stream] = POS_FIX_LPIB;
|
|
+ pos = azx_sd_readl(azx_dev, SD_LPIB);
|
|
+ } else
|
|
+ chip->position_fix[stream] = POS_FIX_POSBUF;
|
|
+ }
|
|
+ break;
|
|
}
|
|
|
|
if (pos >= azx_dev->bufsize)
|
|
@@ -1967,16 +1978,6 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
|
|
|
|
stream = azx_dev->substream->stream;
|
|
pos = azx_get_position(chip, azx_dev);
|
|
- if (chip->position_fix[stream] == POS_FIX_AUTO) {
|
|
- if (!pos) {
|
|
- printk(KERN_WARNING
|
|
- "hda-intel: Invalid position buffer, "
|
|
- "using LPIB read method instead.\n");
|
|
- chip->position_fix[stream] = POS_FIX_LPIB;
|
|
- pos = azx_get_position(chip, azx_dev);
|
|
- } else
|
|
- chip->position_fix[stream] = POS_FIX_POSBUF;
|
|
- }
|
|
|
|
if (WARN_ONCE(!azx_dev->period_bytes,
|
|
"hda-intel: zero azx_dev->period_bytes"))
|
|
--
|
|
1.7.2.5
|
|
|