Commit a810364a authored by Takashi Iwai's avatar Takashi Iwai

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: default avatarTakashi Iwai <tiwai@suse.de>
parent 384a48d7
...@@ -1930,6 +1930,17 @@ static unsigned int azx_get_position(struct azx *chip, ...@@ -1930,6 +1930,17 @@ static unsigned int azx_get_position(struct azx *chip,
default: default:
/* use the position buffer */ /* use the position buffer */
pos = le32_to_cpu(*azx_dev->posbuf); 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) if (pos >= azx_dev->bufsize)
...@@ -1967,16 +1978,6 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) ...@@ -1967,16 +1978,6 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
stream = azx_dev->substream->stream; stream = azx_dev->substream->stream;
pos = azx_get_position(chip, azx_dev); 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, if (WARN_ONCE(!azx_dev->period_bytes,
"hda-intel: zero azx_dev->period_bytes")) "hda-intel: zero azx_dev->period_bytes"))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment