ALSA: pcm - Fix unbalanced pm_qos_request
[linux-2.6.git] / sound / core / isadma.c
index 1a37895..950e19b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ISA DMA support functions
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -26,7 +26,6 @@
 
 #undef HAVE_REALLY_SLOW_DMA_CONTROLLER
 
-#include <sound/driver.h>
 #include <sound/core.h>
 #include <asm/dma.h>
 
@@ -56,6 +55,8 @@ void snd_dma_program(unsigned long dma,
        release_dma_lock(flags);
 }
 
+EXPORT_SYMBOL(snd_dma_program);
+
 /**
  * snd_dma_disable - stop the ISA DMA transfer
  * @dma: the dma number
@@ -72,6 +73,8 @@ void snd_dma_disable(unsigned long dma)
        release_dma_lock(flags);
 }
 
+EXPORT_SYMBOL(snd_dma_disable);
+
 /**
  * snd_dma_pointer - return the current pointer to DMA transfer buffer in bytes
  * @dma: the dma number
@@ -82,16 +85,24 @@ void snd_dma_disable(unsigned long dma)
 unsigned int snd_dma_pointer(unsigned long dma, unsigned int size)
 {
        unsigned long flags;
-       unsigned int result;
+       unsigned int result, result1;
 
        flags = claim_dma_lock();
        clear_dma_ff(dma);
        if (!isa_dma_bridge_buggy)
                disable_dma(dma);
        result = get_dma_residue(dma);
+       /*
+        * HACK - read the counter again and choose higher value in order to
+        * avoid reading during counter lower byte roll over if the
+        * isa_dma_bridge_buggy is set.
+        */
+       result1 = get_dma_residue(dma);
        if (!isa_dma_bridge_buggy)
                enable_dma(dma);
        release_dma_lock(flags);
+       if (unlikely(result < result1))
+               result = result1;
 #ifdef CONFIG_SND_DEBUG
        if (result > size)
                snd_printk(KERN_ERR "pointer (0x%x) for DMA #%ld is greater than transfer size (0x%x)\n", result, dma, size);
@@ -101,3 +112,5 @@ unsigned int snd_dma_pointer(unsigned long dma, unsigned int size)
        else
                return size - result;
 }
+
+EXPORT_SYMBOL(snd_dma_pointer);