NetBSD-5.0.2/sys/arch/i386/stand/lib/isadma.c

Compare this file to the similar file:
Show the results in this format:

/*	$NetBSD: isadma.c,v 1.1.1.1 1997/03/14 02:40:32 perry Exp $	*/

/* from: NetBSD:dev/isa/isadma.c */

#include <sys/types.h>
#include <machine/pio.h>

#include <lib/libsa/stand.h>

#include "isadmavar.h"

#define	IO_DMA1		0x000		/* 8237A DMA Controller #1 */
#define	IO_DMA2		0x0C0		/* 8237A DMA Controller #2 */
#define	DMA37MD_CASCADE	0xc0	/* cascade mode */
#define	DMA1_SMSK	(IO_DMA1 + 1*10)	/* single mask register */
#define	DMA1_MODE	(IO_DMA1 + 1*11)	/* mode register */
#define	DMA2_SMSK	(IO_DMA2 + 2*10)	/* single mask register */
#define	DMA2_MODE	(IO_DMA2 + 2*11)	/* mode register */

/*
 * isa_dmacascade(): program 8237 DMA controller channel to accept
 * external dma control by a board.
 */
void
isa_dmacascade(chan)
	int chan;
{

#ifdef ISADMA_DEBUG
	if (chan < 0 || chan > 7)
		panic("isa_dmacascade: impossible request"); 
#endif

	/* set dma channel mode, and set dma channel mode */
	if ((chan & 4) == 0) {
		outb(DMA1_MODE, chan | DMA37MD_CASCADE);
		outb(DMA1_SMSK, chan);
	} else {
		chan &= 3;

		outb(DMA2_MODE, chan | DMA37MD_CASCADE);
		outb(DMA2_SMSK, chan);
	}
}