|
@@ -172,3 +172,47 @@ static __inline__ void release_dma_lock(unsigned long flags)
|
|
|
static __inline__ void enable_dma(unsigned int dmanr)
|
|
|
{
|
|
|
if (dmanr<=3)
|
|
|
+ dma_outb(dmanr, DMA1_MASK_REG);
|
|
|
+ else
|
|
|
+ dma_outb(dmanr & 3, DMA2_MASK_REG);
|
|
|
+}
|
|
|
+
|
|
|
+static __inline__ void disable_dma(unsigned int dmanr)
|
|
|
+{
|
|
|
+ if (dmanr<=3)
|
|
|
+ dma_outb(dmanr | 4, DMA1_MASK_REG);
|
|
|
+ else
|
|
|
+ dma_outb((dmanr & 3) | 4, DMA2_MASK_REG);
|
|
|
+}
|
|
|
+
|
|
|
+/* Clear the 'DMA Pointer Flip Flop'.
|
|
|
+ * Write 0 for LSB/MSB, 1 for MSB/LSB access.
|
|
|
+ * 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 holding the DMA lock ! ---
|
|
|
+ */
|
|
|
+static __inline__ void clear_dma_ff(unsigned int dmanr)
|
|
|
+{
|
|
|
+ if (dmanr<=3)
|
|
|
+ dma_outb(0, DMA1_CLEAR_FF_REG);
|
|
|
+ else
|
|
|
+ dma_outb(0, DMA2_CLEAR_FF_REG);
|
|
|
+}
|
|
|
+
|
|
|
+/* set mode (above) for a specific DMA channel */
|
|
|
+static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
|
|
|
+{
|
|
|
+ if (dmanr<=3)
|
|
|
+ dma_outb(mode | dmanr, DMA1_MODE_REG);
|
|
|
+ else
|
|
|
+ dma_outb(mode | (dmanr&3), DMA2_MODE_REG);
|
|
|
+}
|
|
|
+
|
|
|
+/* Set only the page register bits of the transfer address.
|
|
|
+ * This is used for successive transfers when we know the contents of
|
|
|
+ * the lower 16 bits of the DMA current address register, but a 64k boundary
|
|
|
+ * may have been crossed.
|
|
|
+ */
|
|
|
+static __inline__ void set_dma_page(unsigned int dmanr, char pagenr)
|
|
|
+{
|