On Mon, 29 Jun 2009 00:08:59 +0200 Janusz Krzysztofik jkrzyszt@tis.icnet.pl wrote:
AFAIK, both CSSA_L and CDSA_L DMA registers are static. Loaded by CPU with 16 LSB of initial source and destination port addresses respectively, they are never updated by the DMA engine itself. That's why they can't be used for transfer progress indication unless updated by CPU.
The old omap-alsa driver was just updating them, intentionally or not, by reprogramming and restarting DMA every PCM period. That's why calculating PCM pointers from CSSA_L/CDSA_L worked.
Thanks for finding out this. Good to know that OMAP low-level DMA code now in this respect is as good as HW allows it.
ASoC OMAP driver transfers whole PCM buffer with single DMA transfer, so it doesn't need to update DMA source/destination port address after initial playback/capture setup, even if restarting DMA, and actually never does this. Calculating PCM pointers from CSSA_L/CDSA_L registers without updating them every period would then be wrong.
For capture, reading CPC, that follows destination port address progress, just works fine (for both old and new driver). For playback, similar hardware functionality seems to be missing, so it has to be emulated in software if required.
Kind an odd HW behaviour but that can happen. Probably it would be good to explain this also in function omap_get_dma_src_pos.
Mark, I think this is fair to queue a fix for 2.6.31.
Acked-by: Jarkko Nikula jhnikula@gmail.com