ALSA: snd_dma_pointer workaround for chipsets with buggy DMA
authorKrzysztof Helt <krzysztof.h1@wp.pl>
Sun, 11 Oct 2009 10:48:00 +0000 (12:48 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 11 Oct 2009 16:03:13 +0000 (18:03 +0200)
commit8066e51ae7329220f459470a38387f8533e99141
treebc3ffe555efdbd35ac91fdacdf9a9972f7886b5d
parent633c7e92bdd54ba939f2bd3b78c72e1e1a1dd077
ALSA: snd_dma_pointer workaround for chipsets with buggy DMA

The chipsets with the isa_dma_bridge_buggy set do not stop DMA during
DMA counter reads. The DMA counter is read in two 8-bit read steps
on x86 platform. Sometimes, such reads happen during higher byte
change so the lower byte is already decremented (rolled over) but
the higher byte is not. It introduces an error that position is
moved 256 bytes ahead of the true position. Thus, the next DMA
position read can return a lower value then the previous read.
If the DMA position is decreased (reversed) the ALSA subsystem is
tricked into the playback underrun error and resets the playback.
It results in a "pop" during a playback.

Work around the issue by reading the counter twice and choosing a higher
value.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/isadma.c