ALSA: hda - Align BDL position adjustment parameter
authorTakashi Iwai <tiwai@suse.de>
Tue, 15 Jul 2008 14:28:43 +0000 (16:28 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 16 Jul 2008 10:03:24 +0000 (12:03 +0200)
It seems NVidia and other hardwares require the alignment for period
update timing.  For satisfying this condition, align the position
adjustment for delayed wake-up to the initial bdl_pos_adj value.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c

index 16715a68ba5e59c362b5ea3d3db252b4f022523d..ef9f072b47fcc65749729d22fa8e1390c1f8a8de 100644 (file)
@@ -1047,9 +1047,13 @@ static int azx_setup_periods(struct azx *chip,
        pos_adj = bdl_pos_adj[chip->dev_index];
        if (pos_adj > 0) {
                struct snd_pcm_runtime *runtime = substream->runtime;
+               int pos_align = pos_adj;
                pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
                if (!pos_adj)
-                       pos_adj = 1;
+                       pos_adj = pos_align;
+               else
+                       pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
+                               pos_align;
                pos_adj = frames_to_bytes(runtime, pos_adj);
                if (pos_adj >= period_bytes) {
                        snd_printk(KERN_WARNING "Too big adjustment %d\n",