On 10/10/2010 11:54 PM, Mika Westerberg wrote: > When channel_disable() is called, it disables per channel interrupts and > waits until channels state becomes STATE_STALL, and then disables the > channel. Now, if the DMA transfer is disabled while the channel is in > STATE_NEXT we will not wait anything and disable the channel immediately. > This seems to cause weird data corruption for example in audio transfers. > > Fix is to wait while we are in STATE_NEXT or STATE_ON and only then > disable the channel. > > Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxx> > --- > arch/arm/mach-ep93xx/dma-m2p.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-ep93xx/dma-m2p.c b/arch/arm/mach-ep93xx/dma-m2p.c > index 8904ca4..a696d35 100644 > --- a/arch/arm/mach-ep93xx/dma-m2p.c > +++ b/arch/arm/mach-ep93xx/dma-m2p.c > @@ -276,7 +276,7 @@ static void channel_disable(struct m2p_channel *ch) > v &= ~(M2P_CONTROL_STALL_IRQ_EN | M2P_CONTROL_NFB_IRQ_EN); > m2p_set_control(ch, v); > > - while (m2p_channel_state(ch) == STATE_ON) > + while (m2p_channel_state(ch) >= STATE_ON) > cpu_relax(); > > m2p_set_control(ch, 0x0); Looks correct to me. CC'ed Lennert, who originally wrote the DMA M2P support, but otherwise: Acked-by: Ryan Mallon <ryan@xxxxxxxxxxxxxxxx> -- Bluewater Systems Ltd - ARM Technology Solution Centre Ryan Mallon 5 Amuri Park, 404 Barbadoes St ryan@xxxxxxxxxxxxxxxx PO Box 13 889, Christchurch 8013 http://www.bluewatersys.com New Zealand Phone: +64 3 3779127 Freecall: Australia 1800 148 751 Fax: +64 3 3779135 USA 1800 261 2934 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel