ALSA: hda - Handle -1 as invalid position, too
authorTakashi Iwai <tiwai@suse.de>
Tue, 7 Jun 2011 10:23:23 +0000 (12:23 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 7 Jun 2011 10:23:23 +0000 (12:23 +0200)
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

index 966f40147bc36dbca7af8a42210512f8b489f1d4..45cd02f1ad880a33c564c0491139837e1d3b28d2 100644 (file)
@@ -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"))