/*
 * Helpfile for jazzdma.c -- Mips Jazz R4030 DMA controller support
 */
#ifndef _ASM_JAZZDMA_H
#define _ASM_JAZZDMA_H

/*
 * Prototypes and macros
 */
extern unsigned long vdma_alloc(unsigned long paddr, unsigned long size);
extern int vdma_free(unsigned long laddr);
extern int vdma_remap(unsigned long laddr, unsigned long paddr,
                      unsigned long size);
extern unsigned long vdma_phys2log(unsigned long paddr);
extern unsigned long vdma_log2phys(unsigned long laddr);
extern void vdma_stats(void);		/* for debugging only */

extern void vdma_enable(int channel);
extern void vdma_disable(int channel);
extern void vdma_set_mode(int channel, int mode);
extern void vdma_set_addr(int channel, long addr);
extern void vdma_set_count(int channel, int count);
extern int vdma_get_residue(int channel);
extern int vdma_get_enable(int channel);

/*
 * some definitions used by the driver functions
 */
#define VDMA_PAGESIZE		4096
#define VDMA_PGTBL_ENTRIES	4096
#define VDMA_PGTBL_SIZE		(sizeof(VDMA_PGTBL_ENTRY) * VDMA_PGTBL_ENTRIES)
#define VDMA_PAGE_EMPTY		0xff000000

/*
 * Macros to get page no. and offset of a given address
 * Note that VDMA_PAGE() works for physical addresses only
 */
#define VDMA_PAGE(a)            ((unsigned int)(a) >> 12)
#define VDMA_OFFSET(a)          ((unsigned int)(a) & (VDMA_PAGESIZE-1))

/*
 * error code returned by vdma_alloc()
 * (See also arch/mips/kernel/jazzdma.c)
 */
#define VDMA_ERROR              0xffffffff

/*
 * VDMA pagetable entry description
 */
typedef volatile struct VDMA_PGTBL_ENTRY {
	unsigned int frame;		/* physical frame no. */
	unsigned int owner;		/* owner of this entry (0=free) */
} VDMA_PGTBL_ENTRY;


/*
 * DMA channel control registers
 * in the R4030 MCT_ADR chip
 */
#define JAZZ_R4030_CHNL_MODE	0xE0000100	/* 8 DMA Channel Mode Registers, */
						/* 0xE0000100,120,140... */
#define JAZZ_R4030_CHNL_ENABLE  0xE0000108	/* 8 DMA Channel Enable Regs, */
						/* 0xE0000108,128,148... */
#define JAZZ_R4030_CHNL_COUNT   0xE0000110	/* 8 DMA Channel Byte Cnt Regs, */
						/* 0xE0000110,130,150... */
#define JAZZ_R4030_CHNL_ADDR	0xE0000118	/* 8 DMA Channel Address Regs, */
						/* 0xE0000118,138,158... */

/* channel enable register bits */

#define R4030_CHNL_ENABLE        (1<<0)
#define R4030_CHNL_WRITE         (1<<1)
#define R4030_TC_INTR            (1<<8)
#define R4030_MEM_INTR           (1<<9)
#define R4030_ADDR_INTR          (1<<10)

/*
 * Channel mode register bits
 */
#define R4030_MODE_ATIME_40      (0) /* device access time on remote bus */
#define R4030_MODE_ATIME_80      (1)
#define R4030_MODE_ATIME_120     (2)
#define R4030_MODE_ATIME_160     (3)
#define R4030_MODE_ATIME_200     (4)
#define R4030_MODE_ATIME_240     (5)
#define R4030_MODE_ATIME_280     (6)
#define R4030_MODE_ATIME_320     (7)
#define R4030_MODE_WIDTH_8       (1<<3)	/* device data bus width */
#define R4030_MODE_WIDTH_16      (2<<3)
#define R4030_MODE_WIDTH_32      (3<<3)
#define R4030_MODE_INTR_EN       (1<<5)
#define R4030_MODE_BURST         (1<<6)	/* Rev. 2 only */
#define R4030_MODE_FAST_ACK      (1<<7)	/* Rev. 2 only */

#endif /* _ASM_JAZZDMA_H */
