}
 EXPORT_SYMBOL(omap_get_dma_dst_pos);
 
-/*
- * Returns current source transfer counting for the given DMA channel.
- * Can be used to monitor the progress of a transfer inside a block.
- * It must be called with disabled interrupts.
- */
-int omap_get_dma_src_addr_counter(int lch)
-{
-       return (dma_addr_t)dma_read(CSAC(lch));
-}
-EXPORT_SYMBOL(omap_get_dma_src_addr_counter);
-
 int omap_get_dma_active_status(int lch)
 {
        return (dma_read(CCR(lch)) & OMAP_DMA_CCR_EN) != 0;
 
                        void *data);
 extern dma_addr_t omap_get_dma_src_pos(int lch);
 extern dma_addr_t omap_get_dma_dst_pos(int lch);
-extern int omap_get_dma_src_addr_counter(int lch);
 extern void omap_clear_dma(int lch);
 extern int omap_get_dma_active_status(int lch);
 extern int omap_dma_running(void);
 
 static struct snd_card_omap_codec      *alsa_codec;
 static struct omap_alsa_codec_config   *alsa_codec_config;
 
+/* FIXME: Please change to use omap asoc framework instead, this can be racy */
+static dma_addr_t dma_start_pos;
+
 /*
  * HW interface start and stop helper functions
  */
        spin_lock_irqsave(&s->dma_lock, flags);
 
        /* For the current period let's see where we are */
-       count = omap_get_dma_src_addr_counter(s->lch[s->dma_q_head]);
+       count = omap_get_dma_src_pos(s->lch[s->dma_q_head]) - dma_start_pos;
 
        spin_unlock_irqrestore(&s->dma_lock, flags);
 
                if (cpu_is_omap1510())
                        omap_stop_alsa_sound_dma(s);
 
-               ret = omap_start_alsa_sound_dma(s,
-                               (dma_addr_t)runtime->dma_area + offset,
-                               dma_size);
+               dma_start_pos = (dma_addr_t)runtime->dma_area + offset;
+               ret = omap_start_alsa_sound_dma(s, dma_start_pos, dma_size);
                if (ret) {
                        printk(KERN_ERR "audio_process_dma: cannot"
                                        " queue DMA buffer (%i)\n", ret);