patch-2.1.125 linux/include/asm-i386/dma.h
Next file: linux/include/asm-i386/unistd.h
Previous file: linux/fs/super.c
Back to the patch index
Back to the overall index
- Lines: 49
- Date:
Thu Oct 8 21:32:14 1998
- Orig file:
v2.1.124/linux/include/asm-i386/dma.h
- Orig date:
Fri Jul 31 17:06:09 1998
diff -u --recursive --new-file v2.1.124/linux/include/asm-i386/dma.h linux/include/asm-i386/dma.h
@@ -9,6 +9,8 @@
#define _ASM_DMA_H
#include <asm/io.h> /* need byte IO */
+#include <asm/spinlock.h> /* And spinlocks */
+#include <linux/delay.h>
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
@@ -129,6 +131,21 @@
#define DMA_MODE_WRITE 0x48 /* memory to I/O, no autoinit, increment, single mode */
#define DMA_MODE_CASCADE 0xC0 /* pass thru DREQ->HRQ, DACK<-HLDA only */
+
+extern spinlock_t dma_spin_lock;
+
+static __inline__ unsigned long claim_dma_lock(void)
+{
+ unsigned long flags;
+ spin_lock_irqsave(&dma_spin_lock, flags);
+ return flags;
+}
+
+static __inline__ void release_dma_lock(unsigned long flags)
+{
+ spin_unlock_irqrestore(&dma_spin_lock, flags);
+}
+
/* enable/disable a specific DMA channel */
static __inline__ void enable_dma(unsigned int dmanr)
{
@@ -144,6 +161,8 @@
dma_outb(dmanr | 4, DMA1_MASK_REG);
else
dma_outb((dmanr & 3) | 4, DMA2_MASK_REG);
+ /* I hate voodoo programming but .. */
+ udelay(20);
}
/* Clear the 'DMA Pointer Flip Flop'.
@@ -151,7 +170,7 @@
* Use this once to initialize the FF to a known state.
* After that, keep track of it. :-)
* --- In order to do that, the DMA routines below should ---
- * --- only be used while interrupts are disabled! ---
+ * --- only be used while holding the DMA lock ! ---
*/
static __inline__ void clear_dma_ff(unsigned int dmanr)
{
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov