}
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);