www.pudn.com > S3C2410-qin.rar > S3C2410.h


/*
 * linux/include/asm-arm/arch-s3c2410/S3C2410.h
 *
 * Definition of constants related to the S3C2410 microprocessor
 * This file is based on the S3C2410 User Manual 2002,01,23.
 *
 * Copyright (C) 2002 MIZI Research, Inc.
 *
 *  Author: Janghoon Lyu 
 *  Date  : $Date: 2002/05/29 08:52:38 $
 *
 *  $Revision: 1.1.2.7 $
 *
   Tue May 14 2002 Janghoon Lyu 
   - Initial code for VIVI
     
   Tue May 21 2002 Janghoon Lyu 
   - add and modify for LINUX

   Wed Jul 24 2002 SeonKon Choi 
   - add USB Device/Host
   - Errata (rev 0.1)

   Fri Aug 16 2002 Yong-iL Joh 
   - add set_GPIO_mode(), GPCON(), GPDAT(x), GPUP()
   - add BWSCON_DW(x,y)
   - apply new irq scheme

   Fri Aug 16 2002 SeonKon Choi 
   - add CLKCON bitfield

   Fri Aug 30 2002 Janghoon Lyu 
   - add registers related to Power Management

   Mon Oct 14 2002 Janghoon Lyu 
   - add the new gpio interface, and the remove old gpio interface

 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file COPYING in the main directory of this archive
 * for more details.
 */

#ifndef _S3C2410_H_
#define _S3C2410_H_

#include "hardware.h"
#include "bitfield.h"

/*
 * Memory Controller (Page 5-15)
 *
 * Register
   BWSCON	Bus Width & Wait Status Control	[word, R/W, 0x000000]
   BANKCON0	boot ROM Control		[word, R/W, 0x0700]
   BANKCON1	BANK1 Control			[word, R/W, 0x0700]
   BANKCON2	BANK2 Control			[word, R/W, 0x0700]
   BANKCON3	BANK3 Control			[word, R/W, 0x0700]
   BANKCON4	BANK4 Control			[word, R/W, 0x0700]
   BANKCON5	BANK5 Control			[word, R/W, 0x0700]
   BANKCON6	BANK6 Control			[word, R/W, 0x1808]
   BANKCON7	BANK7 Control			[word, R/W, 0x1808]
   REFRESH	DRAM/SDRAM Refresh Control	[word, R/W, 0xac0000]
   BANKSIZE	Flexible Bank Size		[word, R/W, 0x0]
   MRSRB6	Mode register set for SDRAM	[word, R/W]
   MRSRB7	Mode register set for SDRAM	[word, R/W]
 *
 */

#define bMEMCON(Nb)	__REG(0x48000000 + (Nb))
#define BWSCON		bMEMCON(0)
#define bBANKCON(Nb)	bMEMCON((Nb+1)*4)
#define BANKCON0	bBANKCON(0)
#define BANKCON1	bBANKCON(1)
#define BANKCON2	bBANKCON(2)
#define BANKCON3	bBANKCON(3)
#define BANKCON4	bBANKCON(4)
#define BANKCON5	bBANKCON(5)
#define BANKCON6	bBANKCON(6)
#define BANKCON7	bBANKCON(7)
#define REFRESH		bMEMCON(0x24)
#define BANKSIZE	bMEMCON(0x28)
#define MRSRB6		bMEMCON(0x2C)
#define MRSRB7		bMEMCON(0x30)

#define fBWSCON_ST(Nb)	Fld(1,((Nb)*4)+3)	/* Using UB/LB for Bank (Nb), init: 0 */
#define fBWSCON_WS(Nb)	Fld(1,((Nb)*4)+2)	/* WAIT enable for Bank (Nb), init: 0 */
#define fBWSCON_DW(Nb)	Fld(2,(Nb)*4)		/* data bus width for Bank (Nb), init: 0 */
#define fBWSCON_DW0	Fld(2,1)	/* initital state is undef */
#define BWSCON_ST7	FMsk(fBWSCON_ST(7))
#define BWSCON_WS7	FMsk(fBWSCON_WS(7))
#define BWSCON_DW7	FMsk(fBWSCON_DW(7))
#define BWSCON_ST6	FMsk(fBWSCON_ST(6))
#define BWSCON_WS6	FMsk(fBWSCON_WS(6))
#define BWSCON_DW6	FMsk(fBWSCON_DW(6))
#define BWSCON_ST5	FMsk(fBWSCON_ST(5))
#define BWSCON_WS5	FMsk(fBWSCON_WS(5))
#define BWSCON_DW5	FMsk(fBWSCON_DW(5))
#define BWSCON_ST4	FMsk(fBWSCON_ST(4))
#define BWSCON_WS4	FMsk(fBWSCON_WS(4))
#define BWSCON_DW4	FMsk(fBWSCON_DW(4))
#define BWSCON_ST3	FMsk(fBWSCON_ST(3))
#define BWSCON_WS3	FMsk(fBWSCON_WS(3))
#define BWSCON_DW3	FMsk(fBWSCON_DW(3))
#define BWSCON_ST2	FMsk(fBWSCON_ST(2))
#define BWSCON_WS2	FMsk(fBWSCON_WS(2))
#define BWSCON_DW2	FMsk(fBWSCON_DW(2))
#define BWSCON_ST1	FMsk(fBWSCON_ST(1))
#define BWSCON_WS1	FMsk(fBWSCON_WS(1))
#define BWSCON_DW1	FMsk(fBWSCON_DW(1))
#define BWSCON_DW0	FMsk(fBWSCON_DW0)
#define BWSCON_DW_8	0x0		/* set bus width to  8bit */
#define BWSCON_DW_16	0x1		/* set bus width to 16bit */
#define BWSCON_DW_32	0x2		/* set bus width to 32bit */
#define BWSCON_DW(x,y)	FInsrt((y), fBWSCON_DW(x))

#define	fBANKCON_Tacs	Fld(2,13)	/* Address set-up before nBCSn, init: 0 */
#define	BANKCON_Tacs	FMsk(fBANKCON_Tacs)
#define BANKCON_Tacs0	FInsrt(0x0, fBANKCON_Tacs)	/* 0 clock */
#define BANKCON_Tacs1	FInsrt(0x1, fBANKCON_Tacs)	/* 1 clock */
#define BANKCON_Tacs2	FInsrt(0x2, fBANKCON_Tacs)	/* 2 clock */
#define BANKCON_Tacs4	FInsrt(0x3, fBANKCON_Tacs)	/* 4 clock */

#define	fBANKCON_Tcos	Fld(2,11)	/* Chip selection set-up nOE, init: 0 */
#define	BANKCON_Tcos	FMsk(fBANKCON_Tcos)
#define BANKCON_Tcos0	FInsrt(0x0, fBANKCON_Tcos)	/* 0 clock */
#define BANKCON_Tcos1	FInsrt(0x1, fBANKCON_Tcos)	/* 1 clock */
#define BANKCON_Tcos2	FInsrt(0x2, fBANKCON_Tcos)	/* 2 clock */
#define BANKCON_Tcos4	FInsrt(0x3, fBANKCON_Tcos)	/* 4 clock */

#define	fBANKCON_Tacc	Fld(3,8)	/* Access cycle, init: 0x7 */
#define BANKCON_Tacc	FMsk(fBANKCON_Tacc)
#define BANKCON_Tacc1	FInsrt(0x0, fBANKCON_Tacc)	/* 1 clock */
#define BANKCON_Tacc2	FInsrt(0x1, fBANKCON_Tacc)	/* 2 clock */
#define BANKCON_Tacc3	FInsrt(0x2, fBANKCON_Tacc)	/* 3 clock */
#define BANKCON_Tacc4	FInsrt(0x3, fBANKCON_Tacc)	/* 4 clock */
#define BANKCON_Tacc6	FInsrt(0x4, fBANKCON_Tacc)	/* 6 clock */
#define BANKCON_Tacc8	FInsrt(0x5, fBANKCON_Tacc)	/* 8 clock */
#define BANKCON_Tacc10	FInsrt(0x6, fBANKCON_Tacc)	/* 10 clock */
#define BANKCON_Tacc14	FInsrt(0x7, fBANKCON_Tacc)	/* 14 clock */

#define	fBANKCON_Toch	Fld(2,6)	/* Chip selection hold on nOE, init: 0 */
#define	BANKCON_Toch	FMsk(fBANKCON_Toch)
#define BANKCON_Toch0	FInsrt(0x0, fBANKCON_Toch)	/* 0 clock */
#define BANKCON_Toch1	FInsrt(0x1, fBANKCON_Toch)	/* 1 clock */
#define BANKCON_Toch2	FInsrt(0x2, fBANKCON_Toch)	/* 2 clock */
#define BANKCON_Toch4	FInsrt(0x3, fBANKCON_Toch)	/* 4 clock */

#define	fBANKCON_Tcah	Fld(2,4)	/* Address holding time after nBCSn, init: 0 */
#define	BANKCON_Tcah	FMsk(fBANKCON_Tcah)
#define BANKCON_Tcah0	FInsrt(0x0, fBANKCON_Tcah)	/* 0 clock */
#define BANKCON_Tcah1	FInsrt(0x1, fBANKCON_Tcah)	/* 1 clock */
#define BANKCON_Tcah2	FInsrt(0x2, fBANKCON_Tcah)	/* 2 clock */
#define BANKCON_Tcah4	FInsrt(0x3, fBANKCON_Tcah)	/* 4 clock */

#define	fBANKCON_Tacp	Fld(2,2)	/* Page mode access cycle @ Page mode, init: 0 */
#define	BANKCON_Tacp	FMsk(fBANKCON_Tacp)
#define BANKCON_Tacp2	FInsrt(0x0, fBANKCON_Tacp)	/* 2 clock */
#define BANKCON_Tacp3	FInsrt(0x1, fBANKCON_Tacp)	/* 3 clock */
#define BANKCON_Tacp4	FInsrt(0x2, fBANKCON_Tacp)	/* 4 clock */
#define BANKCON_Tacp6	FInsrt(0x3, fBANKCON_Tacp)	/* 6 clock */

#define	fBANKCON_PMC	Fld(2,0)	/* Page mode configuration, init: 0 */
#define	BANKCON_PMC	FMsk(fBANKCON_PMC)
#define BANKCON_PMC1	FInsrt(0x0, fBANKCON_PMC)	/* normal (1 data) */
#define BANKCON_PMC4	FInsrt(0x1, fBANKCON_PMC)	/* 4 data */
#define BANKCON_PMC8	FInsrt(0x2, fBANKCON_PMC)	/* 8 data */
#define BANKCON_PMC16	FInsrt(0x3, fBANKCON_PMC)	/* 16 data */

#define fBANKCON_MT	Fld(2,15)	/* memory type for BANK6 and BANK7 */
#define BANKCON_MT	FMsk(fBANKCON_MT)
#define BANKCON_MT_ROM	FInsrt(0x0, fBANKCON_MT)	/* ROM or SRAM */
#define BANKCON_MT_EDO	FInsrt(0x2, fBANKCON_MT)	/* EDO DRAM */
#define BANKCON_MT_SDRM	FInsrt(0x3, fBANKCON_MT)	/* Sync. DRAM */

#define fBANKCON_Trcd	Fld(2,4)	/* RAS to CAS delay, init: 0 */
#define BANKCON_Trcd	FMsk(fBANKCON_Trcd)
#define BANKCON_Trcd1	FInsrt(0x0, fBANKCON_Trcd)	/* 1 clock */
#define BANKCON_Trcd2	FInsrt(0x1, fBANKCON_Trcd)	/* 2 clock */
#define BANKCON_Trcd3	FInsrt(0x2, fBANKCON_Trcd)	/* 3 clock */
#define BANKCON_Trcd4	FInsrt(0x3, fBANKCON_Trcd)	/* 4 clock */

#define fBANKCON_Tcas	Fld(1,3)	/* CAS pulse width, init: 0 */
#define BANKCON_Tcas	FMsk(fBANKCON_Tcas)
#define BANKCON_Tcas1	FInsrt(0x0, fBANKCON_Tcas)	/* 1 clock */
#define BANKCON_Tcas2	FInsrt(0x1, fBANKCON_Tcas)	/* 2 clock */

#define fBANKCON_Tcp	Fld(1,2)	/* CAS pre-charge, init: 0 */
#define BANKCON_Tcp	FMsk(fBANKCON_Tcp)
#define BANKCON_Tcp1	FInsrt(0x0, fBANKCON_Tcp)	/* 1 clock */
#define BANKCON_Tcp2	FInsrt(0x1, fBANKCON_Tcp)	/* 2 clock */

#define fBANKCON_CAN	Fld(2,0)	/* Column address number, init: 0 */
#define BANKCON_CAN	FMsk(fBANKCON_CAN)
#define BANKCON_CAN8	FInsrt(0x0, fBANKCON_CAN)	/* 8-bit */
#define BANKCON_CAN9	FInsrt(0x1, fBANKCON_CAN)	/* 9-bit */
#define BANKCON_CAN10	FInsrt(0x2, fBANKCON_CAN)	/* 10-bit */
#define BANKCON_CAN11	FInsrt(0x3, fBANKCON_CAN)	/* 11-bit */

#define fBANKCON_STrcd	Fld(2,2)	/* RAS to CAS delay, init: 0x2 */
#define BANKCON_STrcd	FMsk(fBANKCON_STrcd)
#define BANKCON_STrcd2	FInsrt(0x0, fBANKCON_STrcd)	/* 2 clock */
#define BANKCON_STrcd3	FInsrt(0x1, fBANKCON_STrcd)	/* 3 clock */
#define BANKCON_STrcd4	FInsrt(0x2, fBANKCON_STrcd)	/* 4 clock */

#define fBANKCON_SCAN	Fld(2,0)	/* Column address number, init: 0 */
#define BANKCON_SCAN	FMsk(fBANKCON_SCAN)
#define BANKCON_SCAN8	FInsrt(0x0, fBANKCON_SCAN)	/* 8-bit */
#define BANKCON_SCAN9	FInsrt(0x1, fBANKCON_SCAN)	/* 9-bit */
#define BANKCON_SCAN10	FInsrt(0x2, fBANKCON_SCAN)	/* 10-bit */

#define REFRESH_REFEN	(1 << 23)	/* DRAM/SDRAM Refresh Enable, init: 0x1 */

#define REFRESH_TREFMD	(1 << 22)	/* DRAM/SDRAM Refresh Mode, init: 0 */
#define REFRESH_TREFMD_Auto	(0 << 22)	/* CBR/Auto Refresh */
#define REFRESH_TREFMD_Self	(1 << 22)	/* Self Refresh */

#define fREFRESH_Trp	Fld(2,20)	/* DRAM/SDRAM RAS pre-charge, init: 0x2 */
#define REFRESH_Trp	FMsk(fREFRESH_Trp)
#define REFRESH_Trp15	FInsrt(0x0, fBANKCON_Trp)	/* DRAM : 1.5 clocks */
#define REFRESH_Trp25	FInsrt(0x1, fBANKCON_Trp)	/* DRAM : 2.5 clocks */
#define REFRESH_Trp35	FInsrt(0x2, fBANKCON_Trp)	/* DRAM : 3.5 clocks */
#define REFRESH_Trp45	FInsrt(0x3, fBANKCON_Trp)	/* DRAM : 4.5 clocks */
#define REFRESH_Trp2	FInsrt(0x0, fBANKCON_Trp)	/* SDRAM : 2 clocks */
#define REFRESH_Trp3	FInsrt(0x1, fBANKCON_Trp)	/* SDRAM : 3 clocks */
#define REFRESH_Trp4	FInsrt(0x2, fBANKCON_Trp)	/* SDRAM : 4 clocks */

#define fREFRESH_Trc	Fld(2,18)	/* SDRAM RC minimum time, init: 0x3 */
#define REFRESH_Trc	FMsk(fREFRESH_Trc)
#define REFRESH_Trc4	FInsrt(0x0, fBANKCON_Trc)	/* 4 clocks */
#define REFRESH_Trc5	FInsrt(0x1, fBANKCON_Trc)	/* 5 clocks */
#define REFRESH_Trc6	FInsrt(0x2, fBANKCON_Trc)	/* 6 clocks */
#define REFRESH_Trc7	FInsrt(0x3, fBANKCON_Trc)	/* 7 clocks */

#define fREFRESH_Tchr	Fld(2,18)	/* DRAM CAS hold time, init: 0 */
#define REFRESH_Tchr	FMsk(fREFRESH_Tchr)
#define REFRESH_Tchr1	FInsrt(0x0, fBANKCON_Tchr)	/* 1 clock */
#define REFRESH_Tchr2	FInsrt(0x1, fBANKCON_Tchr)	/* 2 clocks */
#define REFRESH_Tchr3	FInsrt(0x2, fBANKCON_Tchr)	/* 3 clocks */
#define REFRESH_Tchr4	FInsrt(0x3, fBANKCON_Tchr)	/* 4 clocks */

#define fREFRESH_RC	Fld(11,0)	/* DRAM/SDRAM Refresh Counter, init: 0 */
#define REFRESH_RC	FMsk(fREFRESH_RC)
#define REFRESH_RC_VALUE(refresh_period, HCLK) \
			(F1stBit(Fld(1,11)) + 1 - (HCLK)*(refresh_period))

#define fBANKSIZE_SCLK	Fld(1,4) /* SCLK is enable only during SDRAM access cycle
				    for reducing power cosumption.
				    When SDRAM isn't be accessed, SCLK is 'L' level.
				    0 = SCLK is always active
				    1 = SCLK is active only during the access
				    init: 0 */
#define BANKSIZE_SCLK	FMsk(fBANKSIZE_SCLK)

#define fBANKSIZE_MAP	Fld(2,0)	/* BANK6/7 memory map, init: 0 */
#define BANKSIZE_MAP	FMsk(fBANKSIZE_MAP)
#define BANKSIZE_MAP32	FInsrt(0x0, fBANKCON_MAP)	/* 32M/32M */
#define BANKSIZE_MAP2	FInsrt(0x4, fBANKCON_MAP)	/*  2M/ 2M */
#define BANKSIZE_MAP4	FInsrt(0x5, fBANKCON_MAP)	/*  4M/ 4M */
#define BANKSIZE_MAP8	FInsrt(0x6, fBANKCON_MAP)	/*  8M/ 8M */
#define BANKSIZE_MAP16	FInsrt(0x7, fBANKCON_MAP)	/* 16M/16M */

#define fMRSR_WBL	Fld(1,9)	/* Write burst length */
#define MRSR_WBL	FMsk(fMRSR_WBL)
#define	MRSR_WBL_Burst	FInsrt(0x0, fBANKCON_WBL)	/* Burst(Fixed) */

#define fMRSR_TM	Fld(2,7)	/* Test Mode */
#define MRSR_TM		FMsk(fMRSR_TM)
#define	MRSR_TM_Set	FInsrt(0x0, fBANKCON_TM)	/* Mode Register set(Fixed) */

#define fMRSR_CL	Fld(3,4)	/* CAS Latency */
#define MRSR_CL		FMsk(fMRSR_CL)
#define	MRSR_CL1	FInsrt(0x0, fBANKCON_CL)	/* 1 clock */
#define	MRSR_CL2	FInsrt(0x2, fBANKCON_CL)	/* 2 clocks */
#define	MRSR_CL3	FInsrt(0x3, fBANKCON_CL)	/* 3 clocks */

#define fMRSR_BT	Fld(1,3)	/* Burst Type */
#define MRSR_BT		FMsk(fMRSR_BT)
#define	MRSR_BT_Seq	FInsrt(0x0, fBANKCON_BT)	/* sequential(Fixed) */

#define fMRSR_BL	Fld(3,0)	/* Burst Length */
#define MRSR_BL		FMsk(fMRSR_BL)
#define	MRSR_BL1	FInsrt(0x0, fBANKCON_BL)	/* 1 (Fixed) */


/* Clock and Power Management */
#define CLK_CTL_BASE		0x4C000000
#define bCLKCTL(Nb)		__REG(CLK_CTL_BASE + (Nb))
/* Offset */
#define oLOCKTIME		0x00	/* R/W, PLL lock time count register */
#define oMPLLCON		0x04	/* R/W, MPLL configuration register */
#define oUPLLCON		0x08	/* R/W, UPLL configuration register */
#define oCLKCON			0x0C	/* R/W, Clock generator control reg. */
#define oCLKSLOW		0x10	/* R/W, Slow clock control register */
#define oCLKDIVN		0x14	/* R/W, Clock divider control */
/* Registers */
#define LOCKTIME		bCLKCTL(oLOCKTIME)
#define MPLLCON			bCLKCTL(oMPLLCON)
#define UPLLCON			bCLKCTL(oUPLLCON)
#define CLKCON			bCLKCTL(oCLKCON)
#define CLKSLOW			bCLKCTL(oCLKSLOW)
#define CLKDIVN			bCLKCTL(oCLKDIVN)
/* Fields */
#define fPLL_MDIV		Fld(8,12)
#define fPLL_PDIV		Fld(6,4)
#define fPLL_SDIV		Fld(2,0)
/* bits */
#define CLKCON_SPI		(1<<18)
#define CLKCON_IIS		(1<<17)
#define CLKCON_IIC		(1<<16)
#define CLKCON_ADC		(1<<15)
#define CLKCON_RTC		(1<<14)
#define CLKCON_GPIO		(1<<13)
#define CLKCON_UART2		(1<<12)
#define CLKCON_UART1		(1<<11)
#define CLKCON_UART0		(1<<10)
#define CLKCON_SDI		(1<<9)
#define CLKCON_PWM		(1<<8)
#define CLKCON_USBD		(1<<7)
#define CLKCON_USBH		(1<<6)
#define CLKCON_LCDC		(1<<5)
#define CLKCON_NAND		(1<<4)
#define CLKCON_POWEROFF		(1<<3)
#define CLKCON_IDLE		(1<<2)


/*
 * I/O Port (Page 9-8)
 *
 * Register
   GPACON	Port A Control				[word, R/W, 0x7ffff]
   GPADAT	Port A Data				[word, R/W, ?]
   GPBCON	Port B Control				[word, R/W, 0x0]
   GPBDAT	Port B Data				[word, R/W, ?]
   GPBUP	Pull-up Control B (low active)		[word, R/W, 0x0]
   GPCCON	Port C Control				[word, R/W, 0x0]
   GPCDAT	Port C Data				[word, R/W, ?]
   GPCUP	Pull-up Control C (low active)		[word, R/W, 0x0]
   GPDCON	Port D Control				[word, R/W, 0x0]
   GPDDAT	Port D Data				[word, R/W, ?]
   GPDUP	Pull-up Control D (low active) 		[word, R/W, 0xF000]
   GPECON	Port E Control				[word, R/W, 0x0]
   GPEDAT	Port E Data				[word, R/W, ?]
   GPEUP	Pull-up Control E (low active)		[word, R/W, 0x0]
   GPFCON	Port F Control				[word, R/W, 0x0]
   GPFDAT	Port F Data				[word, R/W, ?]
   GPFUP	Pull-up Control F (low active)		[word, R/W, 0x0]
   GPGCON	Port G Control				[word, R/W, 0x0]
   GPGDAT	Port G Data				[word, R/W, ?]
   GPGUP	Pull-up Control G (low active)		[word, R/W, 0xF800]
   GPHCON	Port H Control				[word, R/W, 0x0]
   GPHDAT	Port H Data				[word, R/W, ?]
   GPHUP	Pull-up Control H (low active)		[word, R/W, 0x0]
   MISCCR	Miscellaneous Control			[word, R/W, 0x10330]
   DCLKCON	DCLK0/1 Control				[word, R/W, 0x0]
   EXTINT0	External Interrupt 0 Control		[word, R/W, 0x0]
   EXTINT1	External Interrupt 0 Control		[word, R/W, 0x0]
   EXTINT2	External Interrupt 0 Control		[word, R/W, 0x0]
   EINFLT0	Reserved
   EINFLT1	Reserved
   EINFLT2	External Interrupt 2 Filter		[word, R/W, 0x0]
   EINFLT3	External Interrupt 3 Filter		[word, R/W, 0x0]
   EINTMASK	External Interrupt Mask			[word, R/W, 0x00fffff0]
   EINTPEND	External Interrupt Pending		[word, R/W, 0x0]
   GSTATUS0	General Status (External Pin status)	[word, R,   ?]
   GSTATUS1	General Status (Chip ID)		[word, R/W, 0x32410000]
 *
 */
#define GPIO_CTL_BASE		0x56000000
#define bGPIO(p)		__REG(GPIO_CTL_BASE + (p))
#define MISCCR			bGPIO(0x80)
#define DCLKCON			bGPIO(0x84)
#define EXTINT0			bGPIO(0x88)
#define EXTINT1			bGPIO(0x8c)
#define EXTINT2			bGPIO(0x90)
#define EINTFLT0		bGPIO(0x94)
#define EINTFLT1		bGPIO(0x98)
#define EINTFLT2		bGPIO(0x9c)
#define EINTFLT3		bGPIO(0xa0)
#define EINTMASK		bGPIO(0xa4)
#define EINTPEND		bGPIO(0xa8)
#define GSTATUS0		bGPIO(0xac)
#define GSTATUS1		bGPIO(0xb0)

#define GSTATUS2                bGPIO(0xb4)
#define GSTATUS3                bGPIO(0xb8)
#define GSTATUS4                bGPIO(0xbc)

#define GPACON                  bGPIO(0x00)
#define GPADAT                  bGPIO(0x04)
#define GPBCON                  bGPIO(0x10)
#define GPBDAT                  bGPIO(0x14)
#define GPBUP                   bGPIO(0x18)
#define GPCCON                  bGPIO(0x20)
#define GPCDAT                  bGPIO(0x24)
#define GPCUP                   bGPIO(0x28)
#define GPDCON                  bGPIO(0x30)
#define GPDDAT                  bGPIO(0x34)
#define GPDUP                   bGPIO(0x38)
#define GPECON                  bGPIO(0x40)
#define GPEDAT                  bGPIO(0x44)
#define GPEUP                   bGPIO(0x48)
#define GPFCON                  bGPIO(0x50)
#define GPFDAT                  bGPIO(0x54)
#define GPFUP                   bGPIO(0x58)
#define GPGCON                  bGPIO(0x60)
#define GPGDAT                  bGPIO(0x64)
#define GPGUP                   bGPIO(0x68)
#define GPHCON                  bGPIO(0x70)
#define GPHDAT                  bGPIO(0x74)
#define GPHUP                   bGPIO(0x78)

/* Miscellaneous */
#define MISCCR_nRSTCON		(1 << 16)	/* nRSTOUT software control */
#define MISCCR_USB0_SUSPEND	(1 << 12)	/* set USB port 0 to Sleep */
#define MISCCR_USB1_SUSPEND	(1 << 13)	/* set USB port 1 to Sleep */
#define fMISCCR_CLKSEL(x)	Fld(3, 4*((x)+1))
#define MISCCR_CLKSEL(x)	FMsk(fMISCCR_CLKSEL(x))
				/* select ? CLK with CLKOUTx pad */
#define MISCCR_CLKSEL_MPLL(x)	FInsrt(0x0, fMISCCR_CLKSEL(x))
#define MISCCR_CLKSEL_UPLL(x)	FInsrt(0x1, fMISCCR_CLKSEL(x))
#define MISCCR_CLKSEL_FCLK(x)	FInsrt(0x2, fMISCCR_CLKSEL(x))
#define MISCCR_CLKSEL_HCLK(x)	FInsrt(0x3, fMISCCR_CLKSEL(x))
#define MISCCR_CLKSEL_PCLK(x)	FInsrt(0x4, fMISCCR_CLKSEL(x))
#define MISCCR_CLKSEL_DCLK(x)	FInsrt(0x5, fMISCCR_CLKSEL(x))
#define MISCCR_USBPAD		(1 << 3)	/* use pads related USB for
						   0: USB slave, 1: USB host */
#define MISCCR_HZSTOP		(1 << 2)	/* 0: HZ@stop
						   1: previous state of PAD */
#define MISCCR_SPUCR1		(1 << 1)	/* DATA[31:16] port pull-up */
#define MISCCR_SPUCR0		(1 << 0)	/* DATA[15:0] port pull-up */

/* DCLK control register */
#define fDCLKCMP(x)		Fld(4,8+16*(x))	/* DCLK Compare value clock */
#define mDCLKCMP(x)		FMsk(fDCLKCMP(x))
#define DCLKCMP(x, y)		Finsrt((y), fDCLKCMP(x))
#define fDCLKDIV(x)		Fld(4,4+16*(x))	/* DCLK divide value */
#define mDCLKDIV(x)		FMsk(fDCLKDIV(x))
#define DCLKDIV(x, y)		Finsrt((y), fDCLKDIV(x))
#define DCLKSEL_PCLK(x)		(0 << (1+16*(x))
				 /* Select PCLK as DCLK Source Clock */
#define DCLKSEL_USB(x)		(1 << (1+16*(x))
				 /* Select USBCLK as DCLK Source Clock */
#define DCLK1CMP		mDCLKCMP(1)
#define DCLK1DIV		mDCLKDIV(1)
#define DCLK1SEL_PCLK		DCLKSEL_PCLK(1)
#define DCLK1SEL_USB		DCLKSEL_USB(1)
#define DCLK0CMP		mDCLKCMP(0)
#define DCLK0DIV		mDCLKDIV(0)
#define DCLK0SEL_PCLK		DCLKSEL_PCLK(0)
#define DCLK0SEL_USB		DCLKSEL_USB(0)

/* General Status */
#define GSTAT0_nWAIT		(1 << 3)	/* Status of nWAIT pin */
#define GSTAT0_NCON1		(1 << 2)	/* Status of NCON1 pin */
#define GSTAT0_NCON0		(1 << 1)	/* Status of NCON0 pin */
#define GSTAT0_BATT_FLT		(1 << 0)	/* Status of BATT_FLT pin */

/*
 * 2002-10-08: Janghoon Lyu 
 * »õ·Ó°Ô ½ÃµµÇØ º¾´Ï´Ù. 
 * | MODE | PULLUP | PORT | OFFSET |
 */

#define GPCON(x)	__REG2(0x56000000, (x) * 0x10)
#define GPDAT(x)	__REG2(0x56000004, (x) * 0x10)
#define GPUP(x)	__REG2(0x56000008, (x) * 0x10)

#define GPIO_OFS_SHIFT		0
#define GPIO_PORT_SHIFTT	8
#define GPIO_PULLUP_SHIFT	16 
#define GPIO_MODE_SHIFT		24
#define GPIO_OFS_MASK		0x000000ff
#define GPIO_PORT_MASK		0x0000ff00
#define GPIO_PULLUP_MASK	0x00ff0000
#define GPIO_MODE_MASK		0xff000000
#define GPIO_MODE_IN		(0 << GPIO_MODE_SHIFT)
#define GPIO_MODE_OUT		(1 << GPIO_MODE_SHIFT)
#define GPIO_MODE_ALT0		(2 << GPIO_MODE_SHIFT)
#define GPIO_MODE_ALT1		(3 << GPIO_MODE_SHIFT)
#define GPIO_PULLUP_EN		(0 << GPIO_PULLUP_SHIFT)
#define GPIO_PULLUP_DIS		(1 << GPIO_PULLUP_SHIFT) 

#define PORTA_OFS		0
#define PORTB_OFS		1
#define PORTC_OFS		2
#define PORTD_OFS		3
#define PORTE_OFS		4
#define PORTF_OFS		5
#define PORTG_OFS		6
#define PORTH_OFS		7

#define MAKE_GPIO_NUM(p, o)	((p << GPIO_PORT_SHIFTT) | (o << GPIO_OFS_SHIFT))

#define GRAB_MODE(x)		(((x) & GPIO_MODE_MASK) >> GPIO_MODE_SHIFT)
#define GRAB_PULLUP(x)		(((x) & GPIO_PULLUP_MASK) >> GPIO_PULLUP_SHIFT)
#define GRAB_PORT(x)		(((x) & GPIO_PORT_MASK) >> GPIO_PORT_SHIFTT)
#define GRAB_OFS(x)		(((x) & GPIO_OFS_MASK) >> GPIO_OFS_SHIFT)

#define set_gpio_ctrl(x) \
	({ GPCON(GRAB_PORT((x))) &= ~(0x3 << (GRAB_OFS((x))*2)); \
	   GPCON(GRAB_PORT(x)) |= (GRAB_MODE(x) << (GRAB_OFS((x))*2)); \
	   GPUP(GRAB_PORT((x))) &= ~(1 << GRAB_OFS((x))); \
	   GPUP(GRAB_PORT((x))) |= (GRAB_PULLUP((x)) << GRAB_OFS((x))); })
#define set_gpio_pullup(x) \
	({ GPUP(GRAB_PORT((x))) &= ~(1 << GRAB_OFS((x))); \
	   GPUP(GRAB_PORT((x))) |= (GRAB_PULLUP((x)) << GRAB_OFS((x))); })
#define set_gpio_pullup_user(x, v) \
	({ GPUP(GRAB_PORT((x))) &= ~(1 << GRAB_OFS((x))); \
	   GPUP(GRAB_PORT((x))) |= ((v) << GRAB_OFS((x))); })
#define set_gpio_mode(x) \
	({ GPCON(GRAB_PORT((x))) &= ~(0x3 << (GRAB_OFS((x))*2)); \
	   GPCON(GRAB_PORT((x))) |= (GRAB_MODE((x)) << (GRAB_OFS((x))*2)); })
#define set_gpio_mode_user(x, v) \
	({ GPCON(GRAB_PORT((x))) & = ~(0x3 << (GRAB_OFS((x))*2)); \
	   GPCON(GRAB_PORT((x))) |= ((v) << (GRAB_OFS((x))*2)); })
#define set_gpioA_mode(x) \
	({ GPCON(GRAB_PORT((x))) &= ~(0x1 << GRAB_OFS((x))); \
	   GPCON(GRAB_PORT((x))) |= (GRAB_MODE((x)) << GRAB_OFS((x))); })
#define read_gpio_bit(x)	((GPDAT(GRAB_PORT((x))) & (1<> GRAB_OFS((x)))
#define read_gpio_reg(x)	(GPDAT(GRAB_PORT((x)))
#define write_gpio_bit(x, v) \
	({ GPDAT(GRAB_PORT((x))) &= ~(0x1 << GRAB_OFS((x))); \
	   GPDAT(GRAB_PORT((x))) |= ((v) << GRAB_OFS((x))); })
#define write_gpio_reg(x, v)	(GPDAT(GRAB_PORT((x))) = (v))
	

#define GPIO_A0				MAKE_GPIO_NUM(PORTA_OFS, 0)
#define GPIO_A1				MAKE_GPIO_NUM(PORTA_OFS, 1)
#define GPIO_A2				MAKE_GPIO_NUM(PORTA_OFS, 2)
#define GPIO_A3				MAKE_GPIO_NUM(PORTA_OFS, 3)
#define GPIO_A4				MAKE_GPIO_NUM(PORTA_OFS, 4)
#define GPIO_A5				MAKE_GPIO_NUM(PORTA_OFS, 5)
#define GPIO_A6				MAKE_GPIO_NUM(PORTA_OFS, 6)
#define GPIO_A7				MAKE_GPIO_NUM(PORTA_OFS, 7)
#define GPIO_A8				MAKE_GPIO_NUM(PORTA_OFS, 8)
#define GPIO_A9				MAKE_GPIO_NUM(PORTA_OFS, 9)
#define GPIO_A10			MAKE_GPIO_NUM(PORTA_OFS, 10)
#define GPIO_A11			MAKE_GPIO_NUM(PORTA_OFS, 11)
#define GPIO_A12			MAKE_GPIO_NUM(PORTA_OFS, 12)
#define GPIO_A13			MAKE_GPIO_NUM(PORTA_OFS, 13)
#define GPIO_A14			MAKE_GPIO_NUM(PORTA_OFS, 14)
#define GPIO_A15			MAKE_GPIO_NUM(PORTA_OFS, 15)
#define GPIO_A16			MAKE_GPIO_NUM(PORTA_OFS, 16)
#define GPIO_A17			MAKE_GPIO_NUM(PORTA_OFS, 17)
#define GPIO_A18			MAKE_GPIO_NUM(PORTA_OFS, 18)
#define GPIO_A19			MAKE_GPIO_NUM(PORTA_OFS, 19)
#define GPIO_A20			MAKE_GPIO_NUM(PORTA_OFS, 20)
#define GPIO_A21			MAKE_GPIO_NUM(PORTA_OFS, 21)
#define GPIO_A22			MAKE_GPIO_NUM(PORTA_OFS, 22)

#define GPIO_B0				MAKE_GPIO_NUM(PORTB_OFS, 0)
#define GPIO_B1				MAKE_GPIO_NUM(PORTB_OFS, 1)
#define GPIO_B2				MAKE_GPIO_NUM(PORTB_OFS, 2)
#define GPIO_B3				MAKE_GPIO_NUM(PORTB_OFS, 3)
#define GPIO_B4				MAKE_GPIO_NUM(PORTB_OFS, 4)
#define GPIO_B5				MAKE_GPIO_NUM(PORTB_OFS, 5)
#define GPIO_B6				MAKE_GPIO_NUM(PORTB_OFS, 6)
#define GPIO_B7				MAKE_GPIO_NUM(PORTB_OFS, 7)
#define GPIO_B8				MAKE_GPIO_NUM(PORTB_OFS, 8)
#define GPIO_B9				MAKE_GPIO_NUM(PORTB_OFS, 9)
#define GPIO_B10			MAKE_GPIO_NUM(PORTB_OFS, 10)

#define GPIO_C0				MAKE_GPIO_NUM(PORTC_OFS, 0)
#define GPIO_C1				MAKE_GPIO_NUM(PORTC_OFS, 1)
#define GPIO_C2				MAKE_GPIO_NUM(PORTC_OFS, 2)
#define GPIO_C3				MAKE_GPIO_NUM(PORTC_OFS, 3)
#define GPIO_C4				MAKE_GPIO_NUM(PORTC_OFS, 4)
#define GPIO_C5				MAKE_GPIO_NUM(PORTC_OFS, 5)
#define GPIO_C6				MAKE_GPIO_NUM(PORTC_OFS, 6)
#define GPIO_C7				MAKE_GPIO_NUM(PORTC_OFS, 7)
#define GPIO_C8				MAKE_GPIO_NUM(PORTC_OFS, 8)
#define GPIO_C9				MAKE_GPIO_NUM(PORTC_OFS, 9)
#define GPIO_C10			MAKE_GPIO_NUM(PORTC_OFS, 10)
#define GPIO_C11			MAKE_GPIO_NUM(PORTC_OFS, 11)
#define GPIO_C12			MAKE_GPIO_NUM(PORTC_OFS, 12)
#define GPIO_C13			MAKE_GPIO_NUM(PORTC_OFS, 13)
#define GPIO_C14			MAKE_GPIO_NUM(PORTC_OFS, 14)
#define GPIO_C15			MAKE_GPIO_NUM(PORTC_OFS, 15)

#define GPIO_D0				MAKE_GPIO_NUM(PORTD_OFS, 0)
#define GPIO_D1				MAKE_GPIO_NUM(PORTD_OFS, 1)
#define GPIO_D2				MAKE_GPIO_NUM(PORTD_OFS, 2)
#define GPIO_D3				MAKE_GPIO_NUM(PORTD_OFS, 3)
#define GPIO_D4				MAKE_GPIO_NUM(PORTD_OFS, 4)
#define GPIO_D5				MAKE_GPIO_NUM(PORTD_OFS, 5)
#define GPIO_D6				MAKE_GPIO_NUM(PORTD_OFS, 6)
#define GPIO_D7				MAKE_GPIO_NUM(PORTD_OFS, 7)
#define GPIO_D8				MAKE_GPIO_NUM(PORTD_OFS, 8)
#define GPIO_D9				MAKE_GPIO_NUM(PORTD_OFS, 9)
#define GPIO_D10			MAKE_GPIO_NUM(PORTD_OFS, 10)
#define GPIO_D11			MAKE_GPIO_NUM(PORTD_OFS, 11)
#define GPIO_D12			MAKE_GPIO_NUM(PORTD_OFS, 12)
#define GPIO_D13			MAKE_GPIO_NUM(PORTD_OFS, 13)
#define GPIO_D14			MAKE_GPIO_NUM(PORTD_OFS, 14)
#define GPIO_D15			MAKE_GPIO_NUM(PORTD_OFS, 15)

#define GPIO_E0				MAKE_GPIO_NUM(PORTE_OFS, 0)
#define GPIO_E1				MAKE_GPIO_NUM(PORTE_OFS, 1)
#define GPIO_E2				MAKE_GPIO_NUM(PORTE_OFS, 2)
#define GPIO_E3				MAKE_GPIO_NUM(PORTE_OFS, 3)
#define GPIO_E4				MAKE_GPIO_NUM(PORTE_OFS, 4)
#define GPIO_E5				MAKE_GPIO_NUM(PORTE_OFS, 5)
#define GPIO_E6				MAKE_GPIO_NUM(PORTE_OFS, 6)
#define GPIO_E7				MAKE_GPIO_NUM(PORTE_OFS, 7)
#define GPIO_E8				MAKE_GPIO_NUM(PORTE_OFS, 8)
#define GPIO_E9				MAKE_GPIO_NUM(PORTE_OFS, 9)
#define GPIO_E10			MAKE_GPIO_NUM(PORTE_OFS, 10)
#define GPIO_E11			MAKE_GPIO_NUM(PORTE_OFS, 11)
#define GPIO_E12			MAKE_GPIO_NUM(PORTE_OFS, 12)
#define GPIO_E13			MAKE_GPIO_NUM(PORTE_OFS, 13)
#define GPIO_E14			MAKE_GPIO_NUM(PORTE_OFS, 14)
#define GPIO_E15			MAKE_GPIO_NUM(PORTE_OFS, 15)

#define GPIO_F0				MAKE_GPIO_NUM(PORTF_OFS, 0)
#define GPIO_F1				MAKE_GPIO_NUM(PORTF_OFS, 1)
#define GPIO_F2				MAKE_GPIO_NUM(PORTF_OFS, 2)
#define GPIO_F3				MAKE_GPIO_NUM(PORTF_OFS, 3)
#define GPIO_F4				MAKE_GPIO_NUM(PORTF_OFS, 4)
#define GPIO_F5				MAKE_GPIO_NUM(PORTF_OFS, 5)
#define GPIO_F6				MAKE_GPIO_NUM(PORTF_OFS, 6)
#define GPIO_F7				MAKE_GPIO_NUM(PORTF_OFS, 7)

#define GPIO_G0				MAKE_GPIO_NUM(PORTG_OFS, 0)
#define GPIO_G1				MAKE_GPIO_NUM(PORTG_OFS, 1)
#define GPIO_G2				MAKE_GPIO_NUM(PORTG_OFS, 2)
#define GPIO_G3				MAKE_GPIO_NUM(PORTG_OFS, 3)
#define GPIO_G4				MAKE_GPIO_NUM(PORTG_OFS, 4)
#define GPIO_G5				MAKE_GPIO_NUM(PORTG_OFS, 5)
#define GPIO_G6				MAKE_GPIO_NUM(PORTG_OFS, 6)
#define GPIO_G7				MAKE_GPIO_NUM(PORTG_OFS, 7)
#define GPIO_G8				MAKE_GPIO_NUM(PORTG_OFS, 8)
#define GPIO_G9				MAKE_GPIO_NUM(PORTG_OFS, 9)
#define GPIO_G10			MAKE_GPIO_NUM(PORTG_OFS, 10)
#define GPIO_G11			MAKE_GPIO_NUM(PORTG_OFS, 11)
#define GPIO_G12			MAKE_GPIO_NUM(PORTG_OFS, 12)
#define GPIO_G13			MAKE_GPIO_NUM(PORTG_OFS, 13)
#define GPIO_G14			MAKE_GPIO_NUM(PORTG_OFS, 14)
#define GPIO_G15			MAKE_GPIO_NUM(PORTG_OFS, 15)

#define GPIO_H0				MAKE_GPIO_NUM(PORTH_OFS, 0)
#define GPIO_H1				MAKE_GPIO_NUM(PORTH_OFS, 1)
#define GPIO_H2				MAKE_GPIO_NUM(PORTH_OFS, 2)
#define GPIO_H3				MAKE_GPIO_NUM(PORTH_OFS, 3)
#define GPIO_H4				MAKE_GPIO_NUM(PORTH_OFS, 4)
#define GPIO_H5				MAKE_GPIO_NUM(PORTH_OFS, 5)
#define GPIO_H6				MAKE_GPIO_NUM(PORTH_OFS, 6)
#define GPIO_H7				MAKE_GPIO_NUM(PORTH_OFS, 7)
#define GPIO_H8				MAKE_GPIO_NUM(PORTH_OFS, 8)
#define GPIO_H9				MAKE_GPIO_NUM(PORTH_OFS, 9)
#define GPIO_H10			MAKE_GPIO_NUM(PORTH_OFS, 10)

#define GPIO_MODE_TOUT			GPIO_MODE_ALT0
#define GPIO_MODE_nXBACK		GPIO_MODE_ALT0
#define GPIO_MODE_nXBREQ		GPIO_MODE_ALT0
#define GPIO_MODE_nXDACK		GPIO_MODE_ALT0
#define GPIO_MODE_nXDREQ		GPIO_MODE_ALT0
#define GPIO_MODE_LEND			GPIO_MODE_ALT0
#define GPIO_MODE_VCLK			GPIO_MODE_ALT0
#define GPIO_MODE_VLINE			GPIO_MODE_ALT0
#define GPIO_MODE_VFRAME		GPIO_MODE_ALT0
#define GPIO_MODE_VM			GPIO_MODE_ALT0
#define GPIO_MODE_LCDVF			GPIO_MODE_ALT0
#define GPIO_MODE_VD			GPIO_MODE_ALT0
#define GPIO_MODE_IICSDA		GPIO_MODE_ALT0
#define GPIO_MODE_IICSCL		GPIO_MODE_ALT0
#define GPIO_MODE_SPICLK		GPIO_MODE_ALT0
#define GPIO_MODE_SPIMOSI		GPIO_MODE_ALT0
#define GPIO_MODE_SPIMISO		GPIO_MODE_ALT0
#define GPIO_MODE_SDDAT			GPIO_MODE_ALT0
#define GPIO_MODE_SDCMD			GPIO_MODE_ALT0
#define GPIO_MODE_SDCLK			GPIO_MODE_ALT0
#define GPIO_MODE_I2SSDO		GPIO_MODE_ALT0
#define GPIO_MODE_I2SSDI		GPIO_MODE_ALT0
#define GPIO_MODE_CDCLK			GPIO_MODE_ALT0
#define GPIO_MODE_I2SSCLK		GPIO_MODE_ALT0
#define GPIO_MODE_I2SLRCK		GPIO_MODE_ALT0
#define GPIO_MODE_I2SSDI_ABNORMAL	GPIO_MODE_ALT1
#define GPIO_MODE_nSS			GPIO_MODE_ALT1
#define GPIO_MODE_EINT			GPIO_MODE_ALT0
#define GPIO_MODE_nYPON			GPIO_MODE_ALT1
#define GPIO_MODE_YMON			GPIO_MODE_ALT1
#define GPIO_MODE_nXPON			GPIO_MODE_ALT1
#define GPIO_MODE_XMON			GPIO_MODE_ALT1
#define GPIO_MODE_UART			GPIO_MODE_ALT0	
#define GPIO_MODE_TCLK_ABNORMAL		GPIO_MODE_ALT1
#define GPIO_MODE_SPICLK_ABNORMAL	GPIO_MODE_ALT1
#define GPIO_MODE_SPIMOSI_ABNORMAL	GPIO_MODE_ALT1
#define GPIO_MODE_SPIMISO_ABNORMAL	GPIO_MODE_ALT1
#define GPIO_MODE_LCD_PWRDN		GPIO_MODE_ALT1

/* UART */
#define UART_CTL_BASE		0x50000000
#define UART0_CTL_BASE		UART_CTL_BASE
#define UART1_CTL_BASE		UART_CTL_BASE + 0x4000
#define UART2_CTL_BASE		UART_CTL_BASE + 0x8000
#define bUART(x, Nb)		__REG(UART_CTL_BASE + (x)*0x4000 + (Nb))
/* Offset */
#define oULCON			0x00	/* R/W, UART line control register */
#define oUCON			0x04	/* R/W, UART control register */
#define oUFCON			0x08	/* R/W, UART FIFO control register */
#define oUMCON			0x0C	/* R/W, UART modem control register */
#define oUTRSTAT		0x10	/* R  , UART Tx/Rx status register */
#define oUERSTAT		0x14	/* R  , UART Rx error status register */
#define oUFSTAT			0x18	/* R  , UART FIFO status register */
#define oUMSTAT			0x1C	/* R  , UART Modem status register */
#define oUTXHL			0x20	/*   W, UART transmit(little-end) buffer */
#define oUTXHB			0x23	/*   W, UART transmit(big-end) buffer */
#define oURXHL			0x24	/* R  , UART receive(little-end) buffer */
#define oURXHB			0x27	/* R  , UART receive(big-end) buffer */
#define oUBRDIV			0x28	/* R/W, Baud rate divisor register */
/* Registers */
#define ULCON0			bUART(0, oULCON)
#define UCON0			bUART(0, oUCON)
#define UFCON0			bUART(0, oUFCON)
#define UMCON0			bUART(0, oUMCON)
#define UTRSTAT0		bUART(0, oUTRSTAT)
#define UERSTAT0		bUART(0, oUERSTAT)
#define UFSTAT0			bUART(0, oUFSTAT)
#define UMSTAT0			bUART(0, oUMSTAT)
#define UTXH0			bUART(0, oUTXHL)
#define URXH0			bUART(0, oURXHL)
#define UBRDIV0			bUART(0, oUBRDIV)
#define ULCON1			bUART(1, oULCON)
#define UCON1			bUART(1, oUCON)
#define UFCON1			bUART(1, oUFCON)
#define UMCON1			bUART(1, oUMCON)
#define UTRSTAT1		bUART(1, oUTRSTAT)
#define UERSTAT1		bUART(1, oUERSTAT)
#define UFSTAT1			bUART(1, oUFSTAT)
#define UMSTAT1			bUART(1, oUMSTAT)
#define UTXH1			bUART(1, oUTXHL)
#define URXH1			bUART(1, oURXHL)
#define UBRDIV1			bUART(1, oUBRDIV)
#define ULCON2			bUART(2, oULCON)
#define UCON2			bUART(2, oUCON)
#define UFCON2			bUART(2, oUFCON)
#define UMCON2			bUART(2, oUMCON)
#define UTRSTAT2		bUART(2, oUTRSTAT)
#define UERSTAT2		bUART(2, oUERSTAT)
#define UFSTAT2			bUART(2, oUFSTAT)
#define UMSTAT2			bUART(2, oUMSTAT)
#define UTXH2			bUART(2, oUTXHL)
#define URXH2			bUART(2, oURXHL)
#define UBRDIV2			bUART(2, oUBRDIV)
/* ... */
#define UTRSTAT_TX_EMPTY	(1 << 2)
#define UTRSTAT_RX_READY	(1 << 0)
#define UART_ERR_MASK		0xF 

#define ULCON_IR		(1 << 6)	/* use Infra-Red mode */

#define fULCON_PAR		Fld(3,3)	/* what parity mode? */
#define ULCON_PAR		FMsk(fULCON_PAR)
#define ULCON_PAR_NONE		FInsrt(0x0, fULCON_PAR) /* No Parity */
#define ULCON_PAR_ODD		FInsrt(0x4, fULCON_PAR) /* Odd Parity */
#define ULCON_PAR_EVEN		FInsrt(0x5, fULCON_PAR) /* Even Parity */
#define ULCON_PAR_1		FInsrt(0x6, fULCON_PAR) /* Parity force/checked as 1 */
#define ULCON_PAR_0		FInsrt(0x7, fULCON_PAR) /* Parity force/checked as 0 */

#define ULCON_STOP		(1 << 2)	/* The number of stop bits */
#define ULCON_ONE_STOP		(0 << 2)	/* 1 stop bit */
#define ULCON_TWO_STOP		(1 << 2)	/* 2 stop bit */

#define fULCON_WL		Fld(2, 0)	/* word length */
#define ULCON_WL		FMsk(fULCON_WL)
#define ULCON_WL5		FInsrt(0x0, fULCON_WL)	/* 5 bits */
#define ULCON_WL6		FInsrt(0x1, fULCON_WL)	/* 6 bits */
#define ULCON_WL7		FInsrt(0x2, fULCON_WL)	/* 7 bits */
#define ULCON_WL8		FInsrt(0x3, fULCON_WL)	/* 8 bits */

#define ULCON_CFGMASK		(ULCON_IR | ULCON_PAR | ULCON_WL)

#define UCON_CLK_SEL		(1 << 10)	/* select clock for UART */
#define UCON_CLK_PCLK		(0 << 10)	/* PCLK for UART baud rate */
#define UCON_CLK_UCLK		(1 << 10)	/* UCLK for UART baud rate */
#define UCON_TX_INT_TYPE	(1 << 9)	/* TX Interrupt request type */
#define UCON_TX_INT_PLS		(0 << 9)	/* Pulse */
#define UCON_TX_INT_LVL		(1 << 9)	/* Level */

#define UCON_RX_INT_TYPE	(1 << 8)	/* RX Interrupt request type */
#define UCON_RX_INT_PLS		(0 << 8)	/* Pulse */
#define UCON_RX_INT_LVL		(1 << 8)	/* Level */

#define UCON_RX_TIMEOUT		(1 << 7)	/* RX timeout enable */
#define UCON_RX_ERR_INT		(1 << 6)	/* RX error status interrupt enable */
#define UCON_LOOPBACK		(1 << 5)	/* to enter the loop-back mode */
#define UCON_BRK_SIG		(1 << 4)	/* to send a break during 1 frame time */

#define fUCON_TX	Fld(2,2)		/* function to write Tx data
						   to the UART Tx buffer */
#define UCON_TX		FMsk(fUCON_TX)
#define UCON_TX_DIS	FInsrt(0x0, fUCON_TX)	/* Disable */
#define UCON_TX_INT	FInsrt(0x1, fUCON_TX)	/* Interrupt or polling */
#define UCON_TX_DMA0	FInsrt(0x2, fUCON_TX)	/* DMA0 request */
#define UCON_TX_DMA1	FInsrt(0x3, fUCON_TX)	/* DMA1 request */

#define fUCON_RX	Fld(2,0)		/* function to read data
						   from UART Rx buffer */
#define UCON_RX		FMsk(fUCON_RX)
#define UCON_RX_DIS	FInsrt(0x0, fUCON_RX)	/* Disable */
#define UCON_RX_INT	FInsrt(0x1, fUCON_RX)	/* Interrupt or polling */
#define UCON_RX_DMA0	FInsrt(0x2, fUCON_RX)	/* DMA0 request */
#define UCON_RX_DMA1	FInsrt(0x3, fUCON_RX)	/* DMA1 request */

#define fUFCON_TX_TR	Fld(2,6)	/* trigger level of transmit FIFO */
#define UFCON_TX_TR	FMsk(fUFCON_TX_TR)
#define UFCON_TX_TR0	FInsrt(0x0, fUFCON_TX_TR)	/* Empty */
#define UFCON_TX_TR4	FInsrt(0x1, fUFCON_TX_TR)	/* 4-byte */
#define UFCON_TX_TR8	FInsrt(0x2, fUFCON_TX_TR)	/* 8-byte */
#define UFCON_TX_TR12	FInsrt(0x3, fUFCON_TX_TR)	/* 12-byte */

#define fUFCON_RX_TR	Fld(2,4)	/* trigger level of receive FIFO */
#define UFCON_RX_TR	FMsk(fUFCON_RX_TR)
#define UFCON_RX_TR0	FInsrt(0x0, fUFCON_RX_TR)	/* Empty */
#define UFCON_RX_TR4	FInsrt(0x1, fUFCON_RX_TR)	/* 4-byte */
#define UFCON_RX_TR8	FInsrt(0x2, fUFCON_RX_TR)	/* 8-byte */
#define UFCON_RX_TR12	FInsrt(0x3, fUFCON_RX_TR)	/* 12-byte */

#define UFCON_TX_REQ	(1 << 2)	/* auto-cleared after resetting FIFO */
#define UFCON_RX_REQ	(1 << 1)	/* auto-cleared after resetting FIFO */
#define UFCON_FIFO_EN	(1 << 0)	/* FIFO Enable */

#define UMCON_AFC	(1 << 4)	/* Enable Auto Flow Control */
#define UMCON_SEND	(1 << 0)	/* when not-AFC,
						set nRTS 1:'L' 0:'H' level */

#define UTRSTAT_TR_EMP	(1 << 2)	/* 1: Transmitter buffer &
						shifter register empty */
#define UTRSTAT_TX_EMP	(1 << 1)	/* Transmit buffer reg. is empty */
#define UTRSTAT_RX_RDY	(1 << 0)	/* Receive buffer reg. has data */

#define UERSTAT_BRK	(1 << 3)	/* Break receive */
#define UERSTAT_FRAME	(1 << 2)	/* Frame Error */
#define UERSTAT_PARITY	(1 << 1)	/* Parity Error */
#define UERSTAT_OVERRUN	(1 << 0)	/* Overrun Error */

#define UFSTAT_TX_FULL	(1 << 9)	/* Transmit FIFO is full */
#define UFSTAT_RX_FULL	(1 << 8)	/* Receive FIFO is full */

#define fUFSTAT_TX_CNT	Fld(4,4)	/* Number of data in Tx FIFO */
#define UFSTAT_TX_CNT	FMsk(fUFSTAT_TX_CNT)

#define fUFSTAT_RX_CNT	Fld(4,0)	/* Number of data in Rx FIFO */
#define UFSTAT_RX_CNT	FMsk(fUFSTAT_RX_CNT)

#define UMSTAT_dCTS	(1 << 3)	/* see Page 11-16 */
#define UMSTAT_CTS	(1 << 0)	/* CTS(Clear to Send) signal */

#define UTXH_DATA	0x000000FF	/* Transmit data for UARTn */
#define URXH_DATA	0x000000FF	/* Receive data for UARTn */
#define UBRDIVn		0x0000FFFF	/* Baud rate division value (> 0) */
/* UBRDIVn = (int)(PCLK/(bsp * 16)-1 or	UBRDIVn = (int)(UCLK/(bsp * 16)-1 */

/* Interrupts */
#define INT_CTL_BASE		0x4A000000
#define INTBASE			__REG(INT_CTL_BASE)
#define bINTCTL(Nb)		__REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oSRCPND			0x00
#define oINTMOD			0x04
#define oINTMSK			0x08
#define oPRIORITY		0x0C
#define oINTPND			0x10
#define oINTOFFSET		0x14
#define oSUBSRCPND		0x18
#define oINTSUBMSK		0x1C
/* Registers */
#define SRCPND			bINTCTL(oSRCPND)
#define INTMOD			bINTCTL(oINTMOD)
#define INTMSK			bINTCTL(oINTMSK)
#define PRIORITY		bINTCTL(oPRIORITY)
#define INTPND			bINTCTL(oINTPND)
#define INTOFFSET		bINTCTL(oINTOFFSET)
#define SUBSRCPND		bINTCTL(oSUBSRCPND)
#define INTSUBMSK		bINTCTL(oINTSUBMSK)

#define INT_ADCTC		(1 << 31)	/* ADC EOC interrupt */
#define INT_RTC			(1 << 30)	/* RTC alarm interrupt */
#define INT_SPI1		(1 << 29)	/* UART1 transmit interrupt */
#define INT_UART0		(1 << 28)	/* UART0 transmit interrupt */
#define INT_IIC			(1 << 27)	/* IIC interrupt */
#define INT_USBH		(1 << 26)	/* USB host interrupt */
#define INT_USBD		(1 << 25)	/* USB device interrupt */
#define INT_RESERVED24		(1 << 24)
#define INT_UART1		(1 << 23)	/* UART1 receive interrupt */
#define INT_SPI0		(1 << 22)	/* SPI interrupt */
#define INT_MMC			(1 << 21)	/* MMC interrupt */
#define INT_DMA3		(1 << 20)	/* DMA channel 3 interrupt */
#define INT_DMA2		(1 << 19)	/* DMA channel 2 interrupt */
#define INT_DMA1		(1 << 18)	/* DMA channel 1 interrupt */
#define INT_DMA0		(1 << 17)	/* DMA channel 0 interrupt */
#define INT_LCD			(1 << 16)	/* reserved for future use */
#define INT_UART2		(1 << 15)	/* UART 2 interrupt  */
#define INT_TIMER4		(1 << 14)	/* Timer 4 interrupt */
#define INT_TIMER3		(1 << 13)	/* Timer 3 interrupt */
#define INT_TIMER2		(1 << 12)	/* Timer 2 interrupt */
#define INT_TIMER1		(1 << 11)	/* Timer 1 interrupt */
#define INT_TIMER0		(1 << 10)	/* Timer 0 interrupt */
#define INT_WDT			(1 << 9)	/* Watch-Dog timer interrupt */
#define INT_TICK		(1 << 8)	/* RTC time tick interrupt  */
#define INT_nBAT_FLT		(1 << 7)
#define INT_RESERVED6		(1 << 6)	/* Reserved for future use */
#define INT_EINT8_23		(1 << 5)	/* External interrupt 8 ~ 23 */
#define INT_EINT4_7		(1 << 4)	/* External interrupt 4 ~ 7 */
#define INT_EINT3		(1 << 3)	/* External interrupt 3 */
#define INT_EINT2		(1 << 2)	/* External interrupt 2 */
#define INT_EINT1		(1 << 1)	/* External interrupt 1 */
#define INT_EINT0		(1 << 0)	/* External interrupt 0 */

#define INT_ADC			(1 << 10)
#define INT_TC			(1 << 9)
#define INT_ERR2		(1 << 8)
#define INT_TXD2		(1 << 7)
#define INT_RXD2		(1 << 6)
#define INT_ERR1		(1 << 5)
#define INT_TXD1		(1 << 4)
#define INT_RXD1		(1 << 3)
#define INT_ERR0		(1 << 2)
#define INT_TXD0		(1 << 1)
#define INT_RXD0		(1 << 0)

/* Real Time Clock */
/* Registers */
#define bRTC(Nb)		__REG(0x57000000 + (Nb))
#define RTCCON			bRTC(0x40)
#define TICNT			bRTC(0x44)
#define RTCALM			bRTC(0x50)
#define ALMSEC			bRTC(0x54)
#define ALMMIN			bRTC(0x58)
#define ALMHOUR			bRTC(0x5c)
#define ALMDAY			bRTC(0x60)
#define ALMMON			bRTC(0x64)
#define ALMYEAR			bRTC(0x68)
#define RTCRST			bRTC(0x6c)
#define BCDSEC			bRTC(0x70)
#define BCDMIN			bRTC(0x74)
#define BCDHOUR			bRTC(0x78)
#define BCDDATE			bRTC(0x7c)
#define BCDDAY			bRTC(0x80)
#define BCDMON			bRTC(0x84)
#define BCDYEAR			bRTC(0x88)
/* Fields */
#define fRTC_SEC		Fld(7,0)
#define fRTC_MIN		Fld(7,0)
#define fRTC_HOUR		Fld(6,0)
#define fRTC_DAY		Fld(6,0)
#define fRTC_DATE		Fld(2,0)
#define fRTC_MON		Fld(5,0)
#define fRTC_YEAR		Fld(8,0)
/* Mask */
#define Msk_RTCSEC		FMsk(fRTC_SEC)
#define Msk_RTCMIN		FMsk(fRTC_MIN)
#define Msk_RTCHOUR		FMsk(fRTC_HOUR)
#define Msk_RTCDAY		FMsk(fRTC_DAY)
#define Msk_RTCDATE		FMsk(fRTC_DATE)
#define Msk_RTCMON		FMsk(fRTC_MON)
#define Msk_RTCYEAR		FMsk(fRTC_YEAR)
/* bits */
#define RTCCON_EN		(1 << 0) /* RTC Control Enable */
#define RTCCON_CLKSEL		(1 << 1) /* BCD clock as XTAL 1/2^25 clock */
#define RTCCON_CNTSEL		(1 << 2) /* 0: Merge BCD counters */
#define RTCCON_CLKRST		(1 << 3) /* RTC clock count reset */

/* RTC Alarm */
#define RTCALM_GLOBAL		(1 << 6) /* Global alarm enable */
#define RTCALM_YEAR		(1 << 5) /* Year alarm enable */
#define RTCALM_MON		(1 << 4) /* Month alarm enable */
#define RTCALM_DAY		(1 << 3) /* Day alarm enable */
#define RTCALM_HOUR		(1 << 2) /* Hour alarm enable */
#define RTCALM_MIN		(1 << 1) /* Minute alarm enable */
#define RTCALM_SEC		(1 << 0) /* Second alarm enable */
#define RTCALM_EN		(RTCALM_GLOBAL | RTCALM_YEAR | RTCALM_MON |\
				RTCALM_DAY | RTCALM_HOUR | RTCALM_MIN |\
				RTCALM_SEC)
#define RTCALM_DIS		(~RTCALM_EN)

/* PWM Timer */
#define bPWM_TIMER(Nb)		__REG(0x51000000 + (Nb))
#define bPWM_BUFn(Nb,x)		bPWM_TIMER(0x0c + (Nb)*0x0c + (x))
/* Registers */
#define TCFG0			bPWM_TIMER(0x00)
#define TCFG1			bPWM_TIMER(0x04)
#define TCON			bPWM_TIMER(0x08)
#define TCNTB0			bPWM_BUFn(0,0x0)
#define TCMPB0			bPWM_BUFn(0,0x4)
#define TCNTO0			bPWM_BUFn(0,0x8)
#define TCNTB1			bPWM_BUFn(1,0x0)
#define TCMPB1			bPWM_BUFn(1,0x4)
#define TCNTO1			bPWM_BUFn(1,0x8)
#define TCNTB2			bPWM_BUFn(2,0x0)
#define TCMPB2			bPWM_BUFn(2,0x4)
#define TCNTO2			bPWM_BUFn(2,0x8)
#define TCNTB3			bPWM_BUFn(3,0x0)
#define TCMPB3			bPWM_BUFn(3,0x4)
#define TCNTO3			bPWM_BUFn(3,0x8)
#define TCNTB4			bPWM_BUFn(4,0x0)
#define TCNTO4			bPWM_BUFn(4,0x4)
/* Fields */
#define fTCFG0_DZONE		Fld(8,16)	/* the dead zone length (= timer 0) */
#define fTCFG0_PRE1		Fld(8,8)	/* prescaler value for time 2,3,4 */
#define fTCFG0_PRE0		Fld(8,0)        /* prescaler value for time 0,1 */
#define fTCON_TIMER0	Fld(5,0)
#define fTCON_TIMER1	Fld(4,8)
#define fTCON_TIMER2	Fld(4,12)
#define fTCON_TIMER3	Fld(4,16)

/* bits */
#define TCFG0_DZONE(x)		FInsrt((x), fTCFG0_DZONE)
#define TCFG0_PRE1(x)		FInsrt((x), fTCFG0_PRE1)
#define TCFG0_PRE0(x)		FInsrt((x), fTCFG0_PRE0)

#define TCON_4_AUTO		(1 << 22)	/* auto reload on/off for Timer 4 */
#define TCON_4_UPDATE		(1 << 21)	/* manual Update TCNTB4 */
#define TCON_4_ONOFF		(1 << 20)	/* 0: Stop, 1: start Timer 4 */
#define COUNT_4_ON		(TCON_4_ONOFF*1)
#define COUNT_4_OFF		(TCON_4_ONOFF*0)
#define TCON_3_AUTO     (1 << 19)       /* auto reload on/off for Timer 3 */
#define TCON_3_INVERT   (1 << 18)       /* 1: Inverter on for TOUT3 */
#define TCON_3_MAN      (1 << 17)       /* manual Update TCNTB3,TCMPB3 */
#define TCON_3_ONOFF    (1 << 16)       /* 0: Stop, 1: start Timer 3 */
#define TCON_2_AUTO     (1 << 15)       /* auto reload on/off for Timer 3 */
#define TCON_2_INVERT   (1 << 14)       /* 1: Inverter on for TOUT3 */
#define TCON_2_MAN      (1 << 13)       /* manual Update TCNTB3,TCMPB3 */
#define TCON_2_ONOFF    (1 << 12)       /* 0: Stop, 1: start Timer 3 */
#define TCON_1_AUTO     (1 << 11)       /* auto reload on/off for Timer 3 */
#define TCON_1_INVERT   (1 << 10)       /* 1: Inverter on for TOUT3 */
#define TCON_1_MAN      (1 << 9)       /* manual Update TCNTB3,TCMPB3 */
#define TCON_1_ONOFF    (1 << 8)       /* 0: Stop, 1: start Timer 3 */
#define TCON_0_AUTO     (1 << 3)       /* auto reload on/off for Timer 3 */
#define TCON_0_INVERT   (1 << 2)       /* 1: Inverter on for TOUT3 */
#define TCON_0_MAN      (1 << 1)       /* manual Update TCNTB3,TCMPB3 */
#define TCON_0_ONOFF    (1 << 0)       /* 0: Stop, 1: start Timer 3 */

#define TIMER3_ATLOAD_ON        (TCON_3_AUTO*1)
#define TIMER3_ATLAOD_OFF       FClrBit(TCON, TCON_3_AUTO)
#define TIMER3_IVT_ON   (TCON_3_INVERT*1)
#define TIMER3_IVT_OFF  (FClrBit(TCON, TCON_3_INVERT))
#define TIMER3_MANUP    (TCON_3_MAN*1)
#define TIMER3_NOP      (FClrBit(TCON, TCON_3_MAN))
#define TIMER3_ON       (TCON_3_ONOFF*1)
#define TIMER3_OFF      (FClrBit(TCON, TCON_3_ONOFF))
#define TIMER2_ATLOAD_ON        (TCON_2_AUTO*1)
#define TIMER2_ATLAOD_OFF       FClrBit(TCON, TCON_2_AUTO)
#define TIMER2_IVT_ON   (TCON_2_INVERT*1)
#define TIMER2_IVT_OFF  (FClrBit(TCON, TCON_2_INVERT))
#define TIMER2_MANUP    (TCON_2_MAN*1)
#define TIMER2_NOP      (FClrBit(TCON, TCON_2_MAN))
#define TIMER2_ON       (TCON_2_ONOFF*1)
#define TIMER2_OFF      (FClrBit(TCON, TCON_2_ONOFF))
#define TIMER1_ATLOAD_ON        (TCON_1_AUTO*1)
#define TIMER1_ATLAOD_OFF       FClrBit(TCON, TCON_1_AUTO)
#define TIMER1_IVT_ON   (TCON_1_INVERT*1)
#define TIMER1_IVT_OFF  (FClrBit(TCON, TCON_1_INVERT))
#define TIMER1_MANUP    (TCON_1_MAN*1)
#define TIMER1_NOP      (FClrBit(TCON, TCON_1_MAN))
#define TIMER1_ON       (TCON_1_ONOFF*1)
#define TIMER1_OFF      (FClrBit(TCON, TCON_1_ONOFF))
#define TIMER0_ATLOAD_ON        (TCON_0_AUTO*1)
#define TIMER0_ATLAOD_OFF       FClrBit(TCON, TCON_0_AUTO)
#define TIMER0_IVT_ON   (TCON_0_INVERT*1)
#define TIMER0_IVT_OFF  (FClrBit(TCON, TCON_0_INVERT))
#define TIMER0_MANUP    (TCON_0_MAN*1)
#define TIMER0_NOP      (FClrBit(TCON, TCON_0_MAN))
#define TIMER0_ON       (TCON_0_ONOFF*1)
#define TIMER0_OFF      (FClrBit(TCON, TCON_0_ONOFF))

#define TCON_TIMER1_CLR   FClrFld(TCON, fTCON_TIMER1);
#define TCON_TIMER2_CLR   FClrFld(TCON, fTCON_TIMER2);
#define TCON_TIMER3_CLR   FClrFld(TCON, fTCON_TIMER3);


/*
 * LCD Controller (Page 15-23)
 *
 * Register
   LCDCON1	LCD Control 1				[word, R/W, 0x00000000]
   LCDCON2	LCD Control 2				[word, R/W, 0x00000000]
   LCDCON3	LCD Control 3				[word, R/W, 0x00000000]
   LCDCON4	LCD Control 4				[word, R/W, 0x00000000]
   LCDCON5	LCD Control 5				[word, R/W, 0x00000000]
   LCDADDR1	STN/TFT: Frame Buffer Start Addr1	[word, R/W, 0x00000000]
   LCDADDR2	STN/TFT: Frame Buffer Start Addr2	[word, R/W, 0x00000000]
   LCDADDR3	STN/TFT: Virtual Screen Address Set	[word, R/W, 0x00000000]
   REDLUT	STN: Red Lookup Table			[word, R/W, 0x00000000]
   GREENLUT	STN: Green Lookup Table			[word, R/W, 0x00000000]
   BLUELUT	STN: Blue Lookup Table			[word, R/W, 0x0000]
   DP1_2	STN: Dithering Pattern Duty 1/2		[word, R/W]
   DP4_7	STN: Dithering Pattern Duty 4/7		[word, R/W]
   DP3_5	STN: Dithering Pattern Duty 3/5		[word, R/W]
   DP2_3	STN: Dithering Pattern Duty 2/3		[word, R/W]
   DP5_7	STN: Dithering Pattern Duty 5/7		[word, R/W]
   DP3_4	STN: Dithering Pattern Duty 3/4		[word, R/W]
   DP4_5	STN: Dithering Pattern Duty 4/5		[word, R/W]
   DP6_7	STN: Dithering Pattern Duty 6/7		[word, R/W]
   DITHMODE	STN: Dithering Mode			[word, R/W, 0x00000000]
   TPAL		TFT: Temporary Pallete			[word, R/W, 0x00000000]
 *
 */

#define bLCD_CTL(Nb)	__REG(0x4d000000 + (Nb))
#define LCDCON1		bLCD_CTL(0x00)
#define LCDCON2		bLCD_CTL(0x04)
#define LCDCON3		bLCD_CTL(0x08)
#define LCDCON4		bLCD_CTL(0x0c)
#define LCDCON5		bLCD_CTL(0x10)
#define LCDADDR1	bLCD_CTL(0x14)
#define LCDADDR2	bLCD_CTL(0x18)
#define LCDADDR3	bLCD_CTL(0x1c)
#define REDLUT		bLCD_CTL(0x20)
#define GREENLUT	bLCD_CTL(0x24)
#define BLUELUT		bLCD_CTL(0x28)
#define DITHMODE	bLCD_CTL(0x4c)
#define TPAL		bLCD_CTL(0x50)
#define LCDINTPND	bLCD_CTL(0x54)
#define LCDSRCPND	bLCD_CTL(0x58)
#define LCDINTMSK	bLCD_CTL(0x5c)
#define LCDLPCSEL	bLCD_CTL(0x60)

#define fLCD1_LINECNT	Fld(10,18)	/* the status of the line counter */
#define LCD1_LINECNT	FMsk(fLCD_LINECNT)

#define fLCD1_CLKVAL	Fld(10,8)	/* rates of VCLK and CLKVAL[9:0] */
#define LCD1_CLKVAL(x)	FInsrt((x), fLCD1_CLKVAL)
#define LCD1_CLKVAL_MSK	FMask(fLCD1_CLKVAL)

#define LCD1_MMODE (1<<7)

#define fLCD1_PNR	Fld(2,5)	/* select the display mode */
#define LCD1_PNR_4D	FInsrt(0x0, fLCD1_PNR)	/* STN: 4-bit dual scan */
#define LCD1_PNR_4S	FInsrt(0x1, fLCD1_PNR)	/* STN: 4-bit single scan */
#define LCD1_PNR_8S	FInsrt(0x2, fLCD1_PNR)	/* STN: 8-bit single scan */
#define LCD1_PNR_TFT	FInsrt(0x3, fLCD1_PNR)	/* TFT LCD */

#define fLCD1_BPP	Fld(4,1)	/* select BPP(Bit Per Pixel) */
#define LCD1_BPP_1S	FInsrt(0x0, fLCD1_BPP)	/* STN: 1 bpp, mono */
#define LCD1_BPP_2S	FInsrt(0x1, fLCD1_BPP)	/* STN: 2 bpp, 4-grey */
#define LCD1_BPP_4S	FInsrt(0x2, fLCD1_BPP)	/* STN: 4 bpp, 16-grey */
#define LCD1_BPP_8S	FInsrt(0x3, fLCD1_BPP)	/* STN: 8 bpp, color */
#define LCD1_BPP_12S	FInsrt(0x4, fLCD1_BPP)	/* STN: 12 bpp, color */
#define LCD1_BPP_1T	FInsrt(0x8, fLCD1_BPP)	/* TFT: 1 bpp */
#define LCD1_BPP_2T	FInsrt(0x9, fLCD1_BPP)	/* TFT: 2 bpp */
#define LCD1_BPP_4T	FInsrt(0xa, fLCD1_BPP)	/* TFT: 4 bpp */
#define LCD1_BPP_8T	FInsrt(0xb, fLCD1_BPP)	/* TFT: 8 bpp */
#define LCD1_BPP_16T	FInsrt(0xc, fLCD1_BPP)	/* TFT: 16 bpp */

#define LCD1_ENVID	(1 << 0)	/* 1: Enable the video output */

#define fLCD2_VBPD	Fld(8,24)	/* TFT: (Vertical Back Porch)
	   # of inactive lines at the start of a frame,
	   after vertical synchronization period. */
//#define LCD2_VBPD	FMsk(fLCD2_VBPD)
#define LCD2_VBPD(x)	FInsrt((x), fLCD2_VBPD)

#define fLCD2_LINEVAL	Fld(10,14)	/* TFT/STN: vertical size of LCD */
#define LCD2_LINEVAL(x)	FInsrt((x), fLCD2_LINEVAL)
#define LCD2_LINEVAL_MSK	FMsk(fLCD2_LINEVAL)

#define fLCD2_VFPD	Fld(8,6)	/* TFT: (Vertical Front Porch)
	   # of inactive lines at the end of a frame,
	   before vertical synchronization period. */
//#define LCD2_VFPD	FMsk(fLCD2_VFPD)
#define LCD2_VFPD(x)	FInsrt((x), fLCD2_VFPD)

#define fLCD2_VSPW	Fld(6,0)	/* TFT: (Vertical Sync Pulse Width)
	   the VSYNC pulse's high level width
	   by counting the # of inactive lines */
//#define LCD2_VSPW	FMsk(fLCD2_VSPW)
#define LCD2_VSPW(x)	FInsrt((x), fLCD2_VSPW)

#define fLCD3_HBPD	Fld(7,19)	/* TFT: (Horizontal Back Porch)
	   # of VCLK periods between the falling edge of HSYNC
	   and the start of active data */
//#define LCD3_HBPD	FMsk(fLCD3_HBPD)
#define LCD3_HBPD(x)	FInsrt((x), fLCD3_HBPD)

#define fLCD3_WDLY	Fld(7,19)	/* STN: delay between VLINE and
	   VCLK by counting the # of the HCLK */
#define LCD3_WDLY	FMsk(fLCD3_WDLY)
#define LCD3_WDLY	FMsk(fLCD3_WDLY)
#define LCD3_WDLY_16	FInsrt(0x0, fLCD3_WDLY)	/* 16 clock */
#define LCD3_WDLY_32	FInsrt(0x1, fLCD3_WDLY)	/* 32 clock */
#define LCD3_WDLY_64	FInsrt(0x2, fLCD3_WDLY)	/* 64 clock */
#define LCD3_WDLY_128	FInsrt(0x3, fLCD3_WDLY)	/* 128 clock */

#define fLCD3_HOZVAL	Fld(11,8)	/* horizontal size of LCD */
//#define LCD3_HOZVAL	FMsk(fLCD3_HOZVAL)
#define LCD3_HOZVAL(x)	FInsrt((x), fLCD3_HOZVAL)
#define LCD3_HOZVAL_MSK	FMsk(fLCD3_HOZVAL)

#define fLCD3_HFPD	Fld(8,0)	/* TFT: (Horizontal Front Porch)
	   # of VCLK periods between the end of active date
	   and the rising edge of HSYNC */
//#define LCD3_HFPD	FMsk(LCD3_HFPD)
#define LCD3_HFPD(x)	FInsrt((x), fLCD3_HFPD)

#define fLCD3_LINEBLNK	Fld(8,0)	/* STN: the blank time
	   in one horizontal line duration time.
	   the unit of LINEBLNK is HCLK x 8 */
//#define LCD3_LINEBLNK	FMsk(fLCD3_LINEBLNK)
#define LCD3_LINEBLNK	FInsrt(fLCD3_LINEBLNK)

#if 0
#define LCD4_PALADDEN	(1 << 24)	/* TFT: enable Pallete index offset */

#define fLCD4_ADDVAL	Fld(8,16)	/* TFT: Pallete index offset */
#define LCD4_ADDVAL	FMsk(fLCD4_ADDVAL)
#endif

#define fLCD4_MVAL	Fld(8,8)	/* STN: the rate at which the VM signal
	   will toggle if the MMODE bit is set logic '1' */
//#define LCD4_MVAL	FMsk(fLCD4_MVAL)
#define LCD4_MVAL(x)	FInsrt((x), fLCD4_MVAL)

#define fLCD4_HSPW	Fld(8,0)	/* TFT: (Horizontal Sync Pulse Width)
	   HSYNC pulse's high lvel width by counting the # of the VCLK */
//#define LCD4_HSPW	FMsk(fLCD4_HSPW)
#define LCD4_HSPW(x)	FInsrt((x), fLCD4_HSPW)

#define fLCD4_WLH	Fld(8,0)	/* STN: VLINE pulse's high level width
	   by counting the # of the HCLK */
//#define LCD4_WLH	FMsk(fLCD4_WLH)
#define LCD4_WLH(x)	FInsrt((x), fLCD4_WLH)
#define LCD4_WLH_16	FInsrt(0x0, fLCD4_WLH)	/* 16 clock */
#define LCD4_WLH_32	FInsrt(0x1, fLCD4_WLH)	/* 32 clock */
#define LCD4_WLH_64	FInsrt(0x2, fLCD4_WLH)	/* 64 clock */
#define LCD4_WLH_128	FInsrt(0x3, fLCD4_WLH)	/* 128 clock */

#define fLCD5_VSTAT	Fld(2,19)	/* TFT: Vertical Status (ReadOnly) */
#define LCD5_VSTAT	FMsk(fLCD5_VSTAT)
#define LCD5_VSTAT_VS	0x00	/* VSYNC */
#define LCD5_VSTAT_BP	0x01	/* Back Porch */
#define LCD5_VSTAT_AC	0x02	/* Active */
#define LCD5_VSTAT_FP	0x03	/* Front Porch */

#define fLCD5_HSTAT	Fld(2,17)	/* TFT: Horizontal Status (ReadOnly) */
#define LCD5_HSTAT	FMsk(fLCD5_HSTAT)
#define LCD5_HSTAT_HS	0x00	/* HSYNC */
#define LCD5_HSTAT_BP	0x01	/* Back Porch */
#define LCD5_HSTAT_AC	0x02	/* Active */
#define LCD5_HSTAT_FP	0x03	/* Front Porch */

#if 0
#define LCD5_BGREN	(1 << 16)	/* STN,1 : VD output order is BGR */
#define LCD5_SLOWCLK	(1 << 14)	/* STN,1 : SLOW CLK SYNC enable */
#define LCD5_SELFREF	(1 << 13)	/* STN,1 : LCD self refresh enable */
#endif
#define LCD5_BPP24BL	(1 << 12)
#define LCD5_FRM565		(1 << 11)
#define LCD5_INVVCLK	(1 << 10)	/* STN/TFT :
	   1 : video data is fetched at VCLK falling edge
	   0 : video data is fetched at VCLK rising edge */
#define LCD5_INVVLINE	(1 << 9)	/* STN/TFT :
	   1 : VLINE/HSYNC pulse polarity is inverted */
#define LCD5_INVVFRAME	(1 << 8)	/* STN/TFT :
	   1 : VFRAME/VSYNC pulse polarity is inverted */
#define LCD5_INVVD	(1 << 7)	/* STN/TFT :
	   1 : VD (video data) pulse polarity is inverted */
#define LCD5_INVVDEN	(1 << 6)	/* TFT :
	   1 : VDEN signal polarity is inverted */
#define LCD5_INVPWREN	(1 << 5)
#define LCD5_INVLEND	(1 << 4)	/* TFT :
	   1 : LEND signal polarity is inverted */
#define LCD5_PWREN	(1 << 3)
#define LCD5_LEND	(1 << 2)	/* TFT,1 : Enable LEND signal */
#define LCD5_BSWP	(1 << 1)	/* STN/TFT,1 : Byte swap enable */
#define LCD5_HWSWP	(1 << 0)	/* STN/TFT,1 : HalfWord swap enable */

#define fLCDADDR_BANK	Fld(9,21)	/* bank location for video buffer */
#define LCDADDR_BANK(x)	FInsrt((x), fLCDADDR_BANK)

#define fLCDADDR_BASEU	Fld(21,0)	/* address of upper left corner */
#define LCDADDR_BASEU(x)	FInsrt((x), fLCDADDR_BASEU)

#define fLCDADDR_BASEL	Fld(21,0)	/* address of lower right corner */
#define LCDADDR_BASEL(x)	FInsrt((x), fLCDADDR_BASEL)

#define fLCDADDR_OFFSET	Fld(11,11)	/* Virtual screen offset size
					   (# of half words) */
#define LCDADDR_OFFSET(x)	FInsrt((x), fLCDADDR_OFFSET)

#define fLCDADDR_PAGE	Fld(11,0)	/* Virtual screen page width
					   (# of half words) */
#define LCDADDR_PAGE(x)	FInsrt((x), fLCDADDR_PAGE)

#define TPAL_LEN	(1 << 24)	/* 1 : Temp. Pallete Register enable */
#define fTPAL_VAL	Fld(24,0)	/* Temp. Pallete Register value */
//#define TPAL_VAL	FMsk(fTPAL_VAL)
#define TPAL_VAL(x)	FInsrt((x), fTPAL_VAL)
#define TPAL_VAL_RED(x)	FInsrt((x), Fld(8,16))
#define TPAL_VAL_GREEN(x)	FInsrt((x), Fld(8,8))
#define TPAL_VAL_BLUE(x)	FInsrt((x), Fld(8,0))


/*
 * NAND Flash Controller (Page 6-1 ~ 6-8)
 *
 * Register
   NFCONF   NAND Flash Configuration    [word, R/W, 0x00000000]
   NFCMD    NAND Flash Command Set      [word, R/W, 0x00000000]
   NFADDR   NAND Flash Address Set      [word, R/W, 0x00000000]
   NFDATA   NAND Flash Data             [word, R/W, 0x00000000]
   NFSTAT   NAND Flash Status           [word, R, 0x00000000]
   NFECC    NAND Flash ECC              [3 bytes, R, 0x00000000]
 *
 */
#define bNAND_CTL(Nb)	__REG(0x4e000000 + (Nb))
#define NFCONF		bNAND_CTL(0x00)
#define NFCMD       bNAND_CTL(0x04)
#define NFADDR      bNAND_CTL(0x08)
#define NFDATA      bNAND_CTL(0x0c)
#define NFSTAT      bNAND_CTL(0x10)
#define NFECC       bNAND_CTL(0x14)

#define fNFCONF_TWRPH1   Fld(3,0)
#define NFCONF_TWRPH1    FMsk(fNFCONF_TWRPH1)
#define NFCONF_TWRPH1_0  FInsrt(0x0, fNFCONF_TWRPH1) /* 0 */
#define fNFCONF_TWRPH0   Fld(3,4)
#define NFCONF_TWRPH0    FMsk(fNFCONF_TWRPH0)
#define NFCONF_TWRPH0_3  FInsrt(0x3, fNFCONF_TWRPH0) /* 3 */
#define fNFCONF_TACLS    Fld(3,8)
#define NFCONF_TACLS     FMsk(fNFCONF_TACLS)
#define NFCONF_TACLS_0   FInsrt(0x0, fNFCONF_TACLS) /* 0 */
#define fNFCONF_nFCE     Fld(1,11)
#define NFCONF_nFCE      FMsk(fNFCONF_nFCE)
#define NFCONF_nFCE_LOW  FInsrt(0x0, fNFCONF_nFCE) /* active */
#define NFCONF_nFCE_HIGH FInsrt(0x1, fNFCONF_nFCE) /* inactive */
#define fNFCONF_ECC      Fld(1,12)
#define NFCONF_ECC       FMsk(fNFCONF_ECC)
#define NFCONF_ECC_NINIT FInsrt(0x0, fNFCONF_ECC) /* not initialize */
#define NFCONF_ECC_INIT  FInsrt(0x1, fNFCONF_ECC)    /* initialize */
#define fNFCONF_ADDRSTEP Fld(1,13)                 /* Addressing Step */
#define NFCONF_ADDRSTEP  FMsk(fNFCONF_ADDRSTEP)
#define fNFCONF_PAGESIZE Fld(1,14)
#define NFCONF_PAGESIZE  FMsk(fNFCONF_PAGESIZE)
#define NFCONF_PAGESIZE_256  FInsrt(0x0, fNFCONF_PAGESIZE) /* 256 bytes */
#define NFCONF_PAGESIZE_512  FInsrt(0x1, fNFCONF_PAGESIZE) /* 512 bytes */
#define fNFCONF_FCTRL    Fld(1,15)  /* Flash controller enable/disable */
#define NFCONF_FCTRL     FMsk(fNFCONF_FCTRL)
#define NFCONF_FCTRL_DIS FInsrt(0x0, fNFCONF_FCTRL) /* Disable */
#define NFCONF_FCTRL_EN  FInsrt(0x1, fNFCONF_FCTRL) /* Enable */

#define NFSTAT_RnB      (1 << 0)
#define NFSTAT_nFWE     (1 << 8)
#define NFSTAT_nFRE     (1 << 9)
#define NFSTAT_ALE      (1 << 10)
#define NFSTAT_CLE      (1 << 11)
#define NFSTAT_AUTOBOOT (1 << 15)

/* ADC and Touch Screen Interface */
#define ADC_CTL_BASE		0x58000000
#define bADC_CTL(Nb)		__REG(ADC_CTL_BASE + (Nb))
/* Offset */
#define oADCCON			0x00	/* R/W, ADC control register */
#define oADCTSC			0x04	/* R/W, ADC touch screen ctl reg */
#define oADCDLY			0x08	/* R/W, ADC start or interval delay reg */
#define oADCDAT0		0x0c	/* R  , ADC conversion data reg */
#define oADCDAT1		0x10	/* R  , ADC conversion data reg */
/* Registers */
#define ADCCON			bADC_CTL(oADCCON)
#define ADCTSC			bADC_CTL(oADCTSC)
#define ADCDLY			bADC_CTL(oADCDLY)
#define ADCDAT0			bADC_CTL(oADCDAT0)
#define ADCDAT1			bADC_CTL(oADCDAT1)
/* Field */
#define fADCCON_PRSCVL		Fld(8, 6)
#define fADCCON_INPUT		Fld(3, 3)
#define fTSC_XY_PST		Fld(2, 0)
#define fADC_DELAY		Fld(6, 0)
#define fDAT_UPDOWN		Fld(1, 15)
#define fDAT_AUTO_PST		Fld(1, 14)
#define fDAT_XY_PST		Fld(2, 12)
#define fDAT_XPDATA		Fld(10, 0)
#define fDAT_YPDATA		Fld(10, 0)
/* ... */
#define ADC_IN0                 0
#define ADC_IN1                 1
#define ADC_IN2                 2
#define ADC_IN3                 3
#define ADC_IN4                 4
#define ADC_IN5                 5
#define ADC_IN6                 6
#define ADC_IN7                 7
#define ADC_BUSY		1
#define ADC_READY		0
#define NOP_MODE		0
#define X_AXIS_MODE		1
#define Y_AXIS_MODE		2
#define WAIT_INT_MODE		3
/* ... */
#define ADCCON_ECFLG		(1 << 15)
#define PRESCALE_ENDIS		(1 << 14)
#define PRESCALE_DIS		(PRESCALE_ENDIS*0)
#define PRESCALE_EN		(PRESCALE_ENDIS*1)
#if 0
#define PRSCVL(x)		({ FClrFld(ADCCON, fADCCON_PRSCVL); \
				   FInsrt((x), fADCCON_PRSCVL); })
#define ADC_INPUT(x)		({ FClrFld(ADCCON, fADCCON_INPUT); \
				   FInsrt((x), fADCCON_INPUT); })
#endif
#define PRSCVL(x)		(x << 6)
#define ADC_INPUT(x)		(x << 3)
#define ADCCON_STDBM		(1 << 2)        /* 1: standby mode, 0: normal mode */
#define ADC_NORMAL_MODE		FClrBit(ADCCON, ADCCON_STDBM)
#define ADC_STANDBY_MODE	(ADCCON_STDBM*1)
#define ADCCON_READ_START	(1 << 1)
#define ADC_START_BY_RD_DIS	FClrBit(ADCCON, ADCCON_READ_START)
#define ADC_START_BY_RD_EN	(ADCCON_READ_START*1)
#define ADC_START		(1 << 0)

#define UD_SEN			(1 << 8)
#define DOWN_INT		(UD_SEN*0)
#define UP_INT			(UD_SEN*1)
#define YM_SEN			(1 << 7)
#define YM_HIZ			(YM_SEN*0)
#define YM_GND			(YM_SEN*1)
#define YP_SEN                  (1 << 6)
//#define YP_SEN			(0)
#define YP_EXTVLT		(YP_SEN*0)
#define YP_AIN			(YP_SEN*1)
#define XM_SEN			(1 << 5)
#define XM_HIZ			(XM_SEN*0)
#define XM_GND			(XM_SEN*1)
#define XP_SEN                  (1 << 4)
//#define XP_SEN			(0)
#define XP_EXTVLT		(XP_SEN*0)
#define XP_AIN			(XP_SEN*1)
#define XP_PULL_UP		(1 << 3)
#define XP_PULL_UP_EN		(XP_PULL_UP*0)
#define XP_PULL_UP_DIS		(XP_PULL_UP*1)
#define AUTO_PST		(1 << 2)
#define CONVERT_MAN		(AUTO_PST*0)
#define CONVERT_AUTO		(AUTO_PST*1)
#define XP_PST(x)		(x << 0)

/* DMA */
#define DMA_CTL_BASE	0x4b000000
#define bDMA_CTL(Nb,x)	__REG(DMA_CTL_BASE + (0x40*Nb) + (x))
/* DMA channel 0 */
#define DISRC0			bDMA_CTL(0, 0x00)
#define DISRCC0			bDMA_CTL(0, 0x04)
#define DIDST0			bDMA_CTL(0, 0x08)
#define DIDSTC0			bDMA_CTL(0, 0x0c)
#define DCON0			bDMA_CTL(0, 0x10)
#define DSTAT0			bDMA_CTL(0, 0x14)
#define DCSRC0			bDMA_CTL(0, 0x18)
#define DCDST0			bDMA_CTL(0, 0x1c)
#define DMTRIG0			bDMA_CTL(0, 0x20)
/* DMA channel 1 */
#define DISRC1			bDMA_CTL(1, 0x00)
#define DISRCC1			bDMA_CTL(1, 0x04)
#define DIDST1			bDMA_CTL(1, 0x08)
#define DIDSTC1			bDMA_CTL(1, 0x0c)
#define DCON1			bDMA_CTL(1, 0x10)
#define DSTAT1			bDMA_CTL(1, 0x14)
#define DCSRC1			bDMA_CTL(1, 0x18)
#define DCDST1			bDMA_CTL(1, 0x1c)
#define DMTRIG1			bDMA_CTL(1, 0x20)
/* DMA channel 2 */
#define DISRC2			bDMA_CTL(2, 0x00)
#define DISRCC2			bDMA_CTL(2, 0x04)
#define DIDST2			bDMA_CTL(2, 0x08)
#define DIDSTC2			bDMA_CTL(2, 0x0c)
#define DCON2			bDMA_CTL(2, 0x10)
#define DSTAT2			bDMA_CTL(2, 0x14)
#define DCSRC2			bDMA_CTL(2, 0x18)
#define DCDST2			bDMA_CTL(2, 0x1c)
#define DMTRIG2			bDMA_CTL(2, 0x20)
/* DMA channel 3 */
#define DISRC3			bDMA_CTL(3, 0x00)
#define DISRCC3			bDMA_CTL(3, 0x04)
#define DIDST3			bDMA_CTL(3, 0x08)
#define DIDSTC3			bDMA_CTL(3, 0x0c)
#define DCON3			bDMA_CTL(3, 0x10)
#define DSTAT3			bDMA_CTL(3, 0x14)
#define DCSRC3			bDMA_CTL(3, 0x18)
#define DCDST3			bDMA_CTL(3, 0x1c)
#define DMTRIG3			bDMA_CTL(3, 0x20)

/* DISRC, DIDST Control registers */
#define fDMA_BASE_ADDR		Fld(30, 0)      /* base address of src/dst data */
#define DMA_BASE_ADDR(x)	FInsrt(x, fDMA_BASE_ADDR)
#define LOC_SRC			(1 << 1)	/* select the location of source */
#define ON_AHB			(LOC_SRC*0)
#define ON_APB			(LOC_SRC*1)
#define ADDR_MODE		(1 << 0)       /* select the address increment */
#define ADDR_INC		(ADDR_MODE*0)
#define ADDR_FIX		(ADDR_MODE*1)

/* DCON Definitions */
#define DCON_MODE		(1 << 31)	/* 0: demand, 1: handshake */
#define DEMAND_MODE		(DCON_MODE*0)
#define HS_MODE			(DCON_MODE*1)
#define DCON_SYNC		(1 << 30)       /* sync to 0:PCLK, 1:HCLK */
#define SYNC_PCLK		(DCON_SYNC*0)
#define SYNC_HCLK		(DCON_SYNC*1)
#define DCON_INT		(1 << 29)
#define POLLING_MODE		(DCON_INT*0)
#define INT_MODE		(DCON_INT*1)
#define DCON_TSZ		(1 << 28)	/* tx size 0: a unit, 1: burst */
#define TSZ_UNIT		(DCON_TSZ*0)
#define TSZ_BURST		(DCON_TSZ*1)
#define DCON_SERVMODE		(1 << 27)	/* 0: single, 1: whole service */
#define SINGLE_SERVICE		(DCON_SERVMODE*0)
#define WHOLE_SERVICE		(DCON_SERVMODE*1)
#define fDCON_HWSRC		Fld(3, 24)	/* select request source */
#define CH0_nXDREQ0		0
#define CH0_UART0		1
#define CH0_MMC			2
#define CH0_TIMER		3
#define CH0_USBEP1		4
#define CH1_nXDREQ1		0
#define CH1_UART1		1
#define CH1_I2SSDI		2
#define CH1_SPI			3
#define CH1_USBEP2		4
#define CH2_I2SSDO		0
#define CH2_I2SSDI		1
#define CH2_MMC			2
#define CH2_TIMER		3
#define CH2_USBEP3		4
#define CH3_UART2		0
#define CH3_MMC			1
#define CH3_SPI			2
#define CH3_TIMER		3
#define CH3_USBEP4		4
#define HWSRC(x)		FInsrt(x, fDCON_HWSRC)
#define DCON_SWHW_SEL		(1 << 23)	/* DMA src 0: s/w 1: h/w */
#define DMA_SRC_SW		(DCON_SWHW_SEL*0)
#define DMA_SRC_HW		(DCON_SWHW_SEL*1)
#define DCON_RELOAD		(1 << 22)	/* set auto-reload */
#define SET_ATRELOAD		(DCON_RELOAD*0)
#define CLR_ATRELOAD		(DCON_RELOAD*1)
#define fDCON_DSZ		Fld(2, 20)
#define DSZ_BYTE		0
#define DSZ_HALFWORD		1
#define DSZ_WORD		2
#define DSZ(x)			FInsrt(x, fDCON_DSZ)
#define readDSZ(x)		FExtr(x, fDCON_DSZ)
#define fDCON_TC		Fld(20,0)
#define TX_CNT(x)		FInsrt(x, fDCON_TC)
/* STATUS Register Definitions  */
#define fDSTAT_ST		Fld(2,20)	/* Status of DMA Controller */
#define fDSTAT_TC		Fld(20,0)	/* Current value of transfer count */
#define DMA_STATUS(chan)	FExtr((DSTAT0 + (0x20 * chan)), fDSTAT_ST)
#define DMA_BUSY		(1 << 0)
#define DMA_READY		(0 << 0)
#define DMA_CURR_TC(chan)	FExtr((DSTAT0 + (0x20 * chan)), fDSTAT_TC)      
/* DMA Trigger Register Definitions */
#define DMASKTRIG_STOP		(1 << 2)	/* Stop the DMA operation */
#define DMA_STOP		(DMASKTRIG_STOP*1)
#define DMA_STOP_CLR		(DMASKTRIG_STOP*0)
#define DMASKTRIG_ONOFF		(1 << 1)	/* DMA channel on/off */
#define CHANNEL_ON		(DMASKTRIG_ONOFF*1)
#define CHANNEL_OFF		(DMASKTRIG_ONOFF*0)
#define DMASKTRIG_SW		(1 << 0)	/* Trigger DMA ch. in S/W req. mode */
#define DMA_SW_REQ_CLR		(DMASKTRIG_SW*0)
#define DMA_SW_REQ		(DMASKTRIG_SW*1)

/* IIS Bus Interface */
#define IIS_CTL_BASE		0x55000000
#define bIIS_CTL(Nb)		__REG(IIS_CTL_BASE + (Nb))
#define IISCON			bIIS_CTL(0x00)
#define IISMOD			bIIS_CTL(0x04)
#define IISPSR			bIIS_CTL(0x08)
#define IISFIFOC		bIIS_CTL(0x0c)
#define IISFIFOE		bIIS_CTL(0x10)

#define IISCON_CH_RIGHT (1 << 8)        /* Right channel */
#define IISCON_CH_LEFT  (0 << 8)        /* Left channel */
#define IISCON_TX_RDY   (1 << 7)        /* Transmit FIFO is ready(not empty) */
#define IISCON_RX_RDY   (1 << 6)        /* Receive FIFO is ready (not full) */
#define IISCON_TX_DMA   (1 << 5)        /* Transmit DMA service reqeust */
#define IISCON_RX_DMA   (1 << 4)        /* Receive DMA service reqeust */
#define IISCON_TX_IDLE  (1 << 3)        /* Transmit Channel idle */
#define IISCON_RX_IDLE  (1 << 2)        /* Receive Channel idle */
#define IISCON_PRESCALE (1 << 1)        /* IIS Prescaler Enable */
#define IISCON_EN       (1 << 0)        /* IIS enable(start) */

#define IISMOD_SEL_MA   (0 << 8)        /* Master mode
					                                              (IISLRCK, IISCLK are Output) */
#define IISMOD_SEL_SL   (1 << 8)        /* Slave mode
					                                              (IISLRCK, IISCLK are Input) */
#define fIISMOD_SEL_TR  Fld(2, 6)       /* Transmit/Receive mode */
#define IISMOD_SEL_TR   FMsk(fIISMOD_SEL_TR)
#define IISMOD_SEL_NO   FInsrt(0x0, fIISMOD_SEL_TR)     /* No Transfer */
#define IISMOD_SEL_RX   FInsrt(0x1, fIISMOD_SEL_TR)     /* Receive */
#define IISMOD_SEL_TX   FInsrt(0x2, fIISMOD_SEL_TR)     /* Transmit */
#define IISMOD_SEL_BOTH FInsrt(0x3, fIISMOD_SEL_TR)     /* Tx & Rx */
#define IISMOD_CH_RIGHT (0 << 5)        /* high for right channel */
#define IISMOD_CH_LEFT  (1 << 5)        /* high for left channel */
#define IISMOD_FMT_IIS  (0 << 4)        /* IIS-compatible format */
#define IISMOD_FMT_MSB  (1 << 4)        /* MSB(left)-justified format */
#define IISMOD_BIT_8    (0 << 3)        /* Serial data bit/channel is 8 bit*/
#define IISMOD_BIT_16   (1 << 3)        /* Serial data bit/channel is 16 bit*/
#define IISMOD_FREQ_256 (0 << 2)        /* Master clock freq = 256 fs */
#define IISMOD_FREQ_384 (1 << 2)        /* Master clock freq = 384 fs */
#define fIISMOD_SFREQ   Fld(2, 0)       /* Serial bit clock frequency */
#define IISMOD_SFREQ    FMsk(fIISMOD_SFREQ)     /* fs = sampling frequency */
#define IISMOD_SFREQ_16 FInsrt(0x0, fIISMOD_SFREQ)      /* 16 fs */
#define IISMOD_SFREQ_32 FInsrt(0x1, fIISMOD_SFREQ)      /* 32 fs */
#define IISMOD_SFREQ_48 FInsrt(0x2, fIISMOD_SFREQ)      /* 48 fs */

#define fIISPSR_A       Fld(5, 5)       /* Prescaler Control A */
#define IISPSR_A(x)     FInsrt((x), fIISPSR_A)
#define fIISPSR_B       Fld(5, 0)       /* Prescaler Control B */
#define IISPSR_B(x)     FInsrt((x), fIISPSR_B)  

#define IISFCON_TX_NORM (0 << 15)       /* Transmit FIFO access mode: normal */
#define IISFCON_TX_DMA  (1 << 15)       /* Transmit FIFO access mode: DMA */
#define IISFCON_RX_NORM (0 << 14)       /* Receive FIFO access mode: normal */
#define IISFCON_RX_DMA  (1 << 14)       /* Receive FIFO access mode: DMA */
#define IISFCON_TX_EN   (1 << 13)        /* Transmit FIFO enable */
#define IISFCON_RX_EN   (1 << 12)        /* Recevice FIFO enable */
#define fIISFCON_TX_CNT Fld(6, 6)       /* Tx FIFO data count (Read-Only) */
#define IISFCON_TX_CNT  FMsk(fIISFCON_TX_CNT)
#define fIISFCON_RX_CNT Fld(6, 0)       /* Rx FIFO data count (Read-Only) */
#define IISFCON_RX_CNT  FMsk(fIISFCON_RX_CNT)

/* USB Device - Little Endian : 
 * (B) : byte(8 bit) access
 * (W) : word(32 bit) access
 */
#define bUD(Nb)		__REG(0x52000000 + (Nb))
#define UD_FUNC		bUD(0x140) // Function address  (B)
#define UD_PWR		bUD(0x144) // Power management (B)
#define UD_INT		bUD(0x148) // Endpoint interrupt pending/clear (B)
#define UD_USBINT	bUD(0x158) // USB interrupt pending/clear (B)
#define UD_INTE		bUD(0x15c) // Endpoint interrupt enable (B)
#define UD_USBINTE	bUD(0x16c) // USB interrupt enable (B)
#define UD_FRAMEL	bUD(0x170) // Frame number low-byte (B)
#define UD_FRAMEH	bUD(0x174) // Frame number high-byte (B)
#define UD_INDEX	bUD(0x178) // Index (B)
#define UD_FIFO0	bUD(0x1c0) // Endpoint 0 FIFO (B)
#define UD_FIFO1	bUD(0x1c4) // Endpoint 1 FIFO (B)
#define UD_FIFO2	bUD(0x1c8) // Endpoint 2 FIFO (B)
#define UD_FIFO3	bUD(0x1cc) // Endpoint 3 FIFO (B)
#define UD_FIFO4	bUD(0x1d0) // Endpoint 4 FIFO (B)
#define UD_DMACON1	bUD(0x200) // Endpoint 1 DMA control (B)
#define UD_DMAUC1	bUD(0x204) // Endpoint 1 DMA unit counter (B)
#define UD_DMAFC1	bUD(0x208) // Endpoint 1 DMA FIFO counter
#define UD_DMATCL1	bUD(0x20c) // Endpoint 1 DMA Transfer counter low-byte
#define UD_DMATCM1	bUD(0x210) // Endpoint 1 DMA Transfer counter middle-byte
#define UD_DMATCH1	bUD(0x214) // Endpoint 1 DMA Transfer counter high-byte
#define UD_DMACON2	bUD(0x218) // Endpoint 2 DMA control (B)
#define UD_DMAUC2	bUD(0x21c) // Endpoint 2 DMA unit counter (B)
#define UD_DMAFC2	bUD(0x220) // Endpoint 2 DMA FIFO counter
#define UD_DMATCL2	bUD(0x224) // Endpoint 2 DMA Transfer counter low-byte
#define UD_DMATCM2	bUD(0x228) // Endpoint 2 DMA Transfer counter middle-byte
#define UD_DMATCH2	bUD(0x22c) // Endpoint 2 DMA Transfer counter high-byte
#define UD_DMACON3	bUD(0x240) // Endpoint 3 DMA control (B)
#define UD_DMAUC3	bUD(0x244) // Endpoint 3 DMA unit counter (B)
#define UD_DMAFC3	bUD(0x248) // Endpoint 3 DMA FIFO counter
#define UD_DMATCL3	bUD(0x24c) // Endpoint 3 DMA Transfer counter low-byte
#define UD_DMATCM3	bUD(0x250) // Endpoint 3 DMA Transfer counter middle-byte
#define UD_DMATCH3	bUD(0x254) // Endpoint 3 DMA Transfer counter high-byte
#define UD_DMACON4	bUD(0x258) // Endpoint 4 DMA control (B)
#define UD_DMAUC4	bUD(0x25c) // Endpoint 4 DMA unit counter (B)
#define UD_DMAFC4	bUD(0x260) // Endpoint 4 DMA FIFO counter
#define UD_DMATCL4	bUD(0x264) // Endpoint 4 DMA Transfer counter low-byte
#define UD_DMATCM4	bUD(0x268) // Endpoint 4 DMA Transfer counter middle-byte
#define UD_DMATCH4	bUD(0x26c) // Endpoint 4 DMA Transfer counter high-byte
#define UD_MAXP		bUD(0x180) // Endpoint MAX Packet
#define UD_ICSR1	bUD(0x184) // EP In control status register 1 (B)
#define UD_ICSR2	bUD(0x188) // EP In control status register 2 (B)
#define UD_OCSR1	bUD(0x190) // EP Out control status register 1 (B)
#define UD_OCSR2	bUD(0x194) // EP Out control status register 2 (B)
#define UD_OFCNTL	bUD(0x198) // EP Out Write counter low-byte (B)
#define UD_OFCNTH	bUD(0x19c) // EP Out Write counter high-byte (B)

#define UD_FUNC_UD	(1 << 7)
#define fUD_FUNC_ADDR	Fld(7,0)	/* USB Device Addr. assigned by host */
#define UD_FUNC_ADDR	FMsk(fUD_FUNC_ADDR)

#define UD_PWR_ISOUP	(1<<7) // R/W
#define UD_PWR_RESET	(1<<3) // R
#define UD_PWR_RESUME	(1<<2) // R/W
#define UD_PWR_SUSPND	(1<<1) // R
#define UD_PWR_ENSUSPND	(1<<0) // R/W

#define UD_PWR_DEFAULT	0x00

#define UD_INT_EP4	(1<<4)	// R/W (clear only)
#define UD_INT_EP3	(1<<3)	// R/W (clear only)
#define UD_INT_EP2	(1<<2)	// R/W (clear only)
#define UD_INT_EP1	(1<<1)	// R/W (clear only)
#define UD_INT_EP0	(1<<0)	// R/W (clear only)

#define UD_USBINT_RESET	(1<<2) // R/W (clear only)
#define UD_USBINT_RESUM	(1<<1) // R/W (clear only)
#define UD_USBINT_SUSPND (1<<0) // R/W (clear only)

#define UD_INTE_EP4	(1<<4) // R/W
#define UD_INTE_EP3	(1<<3) // R/W
#define UD_INTE_EP2	(1<<2) // R/W
#define UD_INTE_EP1	(1<<1) // R/W
#define UD_INTE_EP0	(1<<0) // R/W

#define UD_USBINTE_RESET	(1<<2) // R/W
#define UD_USBINTE_SUSPND	(1<<0) // R/W

#define fUD_FRAMEL_NUM	Fld(8,0) // R
#define UD_FRAMEL_NUM	FMsk(fUD_FRAMEL_NUM)

#define fUD_FRAMEH_NUM	Fld(8,0) // R
#define UD_FRAMEH_NUM	FMsk(fUD_FRAMEH_NUM)

#define UD_INDEX_EP0	(0x00)
#define UD_INDEX_EP1	(0x01) // ??
#define UD_INDEX_EP2	(0x02) // ??
#define UD_INDEX_EP3	(0x03) // ??
#define UD_INDEX_EP4	(0x04) // ??

#define UD_ICSR1_CLRDT	(1<<6)   // R/W
#define UD_ICSR1_SENTSTL (1<<5)  // R/W (clear only)
#define UD_ICSR1_SENDSTL (1<<4)  // R/W
#define UD_ICSR1_FFLUSH (1<<3)  // W	(set only)
#define UD_ICSR1_UNDRUN  (1<<2)  // R/W (clear only)
#define UD_ICSR1_PKTRDY	 (1<<0)  // R/W (set only)

#define UD_ICSR2_AUTOSET (1<<7) // R/W
#define UD_ICSR2_ISO	 (1<<6)	// R/W
#define UD_ICSR2_MODEIN	 (1<<5) // R/W
#define UD_ICSR2_DMAIEN	 (1<<4) // R/W

#define UD_OCSR1_CLRDT	(1<<7) // R/W
#define UD_OCSR1_SENTSTL	(1<<6)	// R/W (clear only)
#define UD_OCSR1_SENDSTL	(1<<5)	// R/W
#define UD_OCSR1_FFLUSH		(1<<4) // R/W
#define UD_OCSR1_DERROR		(1<<3) // R
#define UD_OCSR1_OVRRUN		(1<<2) // R/W (clear only)
#define UD_OCSR1_PKTRDY		(1<<0) // R/W (clear only)

#define UD_OCSR2_AUTOCLR	(1<<7) // R/W
#define UD_OCSR2_ISO		(1<<6) // R/W
#define UD_OCSR2_DMAIEN		(1<<5) // R/W

#define fUD_FIFO_DATA	Fld(8,0) // R/W
#define UD_FIFO0_DATA	FMsk(fUD_FIFO_DATA)
#define UD_FIFO1_DATA	FMsk(fUD_FIFO_DATA)
#define UD_FIFO2_DATA	FMsk(fUD_FIFO_DATA)
#define UD_FIFO3_DATA	FMsk(fUD_FIFO_DATA)
#define UD_FIFO4_DATA	FMsk(fUD_FIFO_DATA)

#define UD_MAXP_8	(1<<0)
#define UD_MAXP_16	(1<<1)
#define UD_MAXP_32	(1<<2)
#define UD_MAXP_64	(1<<3)

#define fUD_OFCNT_DATA	Fld(8,0)
#define UD_OFCNTL_DATA	FMsk(fUD_OFCNT_DATA) //R
#define UD_OFCNTH_DATA	FMsk(fUD_OFCNT_DATA) //R

#define UD_DMACONx_INRUNOB	(1<<7) // R
#define fUD_DMACON_STATE	Fld(3,4) // R
#define UD_DMACONx_STATE	FMsk(fUD_DMACON_STATE) // R/W
#define UD_DMACONx_DEMEN	(1<<3) // R/W
#define UD_DMACONx_ORUN		(1<<2) // R/W
#define UD_DMACONx_IRUN		(1<<1) // R/W
#define UD_DMACONx_DMAMODE	(1<<0) // R/W

#define fUD_DMAUC_DATA	Fld(8,0)
#define UD_DMAUCx_DATA	FMsk(fUD_DMAUC_DATA)

#define fUD_DMAFC_DATA	Fld(8,0)
#define UD_DMAFCx_DATA	FMsk(fUD_DMAFC_DATA)

#define fUD_DMATC_DATA	Fld(8,0)
#define UD_DMATCL_DATA	FMsk(fUD_DMATC_DATA)
#define UD_DMATCM_DATA	FMsk(fUD_DMATC_DATA)
#define UD_DMATCH_DATA	FMsk(fUD_DMATC_DATA)

#define EP0_CSR_OPKRDY	(1<<0)
#define EP0_CSR_IPKRDY	(1<<1)
#define EP0_CSR_SENTSTL	(1<<2)
#define EP0_CSR_DE	(1<<3)
#define EP0_CSR_SE	(1<<4)
#define EP0_CSR_SENDSTL	(1<<5)
#define EP0_CSR_SOPKTRDY (1<<6)
#define EP0_CSR_SSE	(1<<7)


/* USB Host - OHCI registers */
#define USBHOST_CTL_BASE 0x49000000

/*
 * SPI (Page 22-6)
 *
 * Register
   SPCON0	SPI Control				[byte, R/W, 0x00]
   SPSTA0	SPI Status				[byte, R  , 0x01]
   SPPIN0	SPI Pin Control				[byte, R/W, 0x02]
   SPPRE0	SPI Baud Rate Prescaler			[byte, R/W, 0x00]
   SPTDAT0	SPI Tx Data				[byte, R/W, 0x00]
   SPRDAT0	SPI Rx Data				[byte, R  , 0x00]

   SPCON1	SPI Control				[byte, R/W, 0x00]
   SPSTA1	SPI Status				[byte, R  , 0x01]
   SPPIN1	SPI Pin Control				[byte, R/W, 0x02]
   SPPRE1	SPI Baud Rate Prescaler			[byte, R/W, 0x00]
   SPTDAT1	SPI Tx Data				[byte, R/W, 0x00]
   SPRDAT1	SPI Rx Data				[byte, R  , 0x00]
 *
 */
#define bSPI(Nb)	__REG(0x59000000 + (Nb))
#define SPCON0		bSPI(0x00)
#define SPSTA0		bSPI(0x04)
#define SPPIN0		bSPI(0x08)
#define SPPRE0		bSPI(0x0c)
#define SPTDAT0		bSPI(0x10)
#define SPRDAT0		bSPI(0x14)
#define SPCON1		bSPI(0x20 + 0x00)
#define SPSTA1		bSPI(0x20 + 0x04)
#define SPPIN1		bSPI(0x20 + 0x08)
#define SPPRE1		bSPI(0x20 + 0x0c)
#define SPTDAT1		bSPI(0x20 + 0x10)
#define SPRDAT1		bSPI(0x20 + 0x14)

#define fSPCON_SMOD	Fld(2,5)	/* SPI Mode Select */
#define SPCON_SMOD	FMsk(fSPCON_SMOD)
#define SPCON_SMOD_POLL	FInsrt(0x0, fSPCON_SMOD)	/* polling mode */
#define SPCON_SMOD_INT	FInsrt(0x1, fSPCON_SMOD)	/* interrupt mode */
#define SPCON_SMOD_DMA	FInsrt(0x2, fSPCON_SMOD)	/* DMA mode */
#define SPCON_ENSCK	(1 << 4)	/* Enable SCK */
#define SPCON_MSTR	(1 << 3)	/* Master/Slave select
					   0: slave, 1: master */
#define SPCON_CPOL	(1 << 2)	/* Clock polarity select
					   1: active low, 0: active high */
#define SPCON_CPOL_LOW	(1 << 2)
#define SPCON_CPOL_HIGH	(0 << 2)
#define SPCON_CPHA	(1 << 1)	/* Clock Phase Select
					   0: format A, 1: format B */
#define SPCON_CPHA_FMTA	(0 << 1)
#define SPCON_CPHA_FMTB	(1 << 1)
#define SPCON_TAGD	(1 << 0)	/* Tx auto garbage data mode enable
			in normal mode, you only want to receive data,
					you should tranmit dummy 0xFF data */

#define SPSTA_DCOL	(1 << 2)	/* Data Collision Error */
#define SPSTA_MULF	(1 << 1)	/* Multi Master Error */
#define SPSTA_READY	(1 << 0)	/* data Tx/Rx ready */

#define SPPIN_ENMUL	(1 << 2)	/* Multi Master Error detect Enable */
#define SPPIN_KEEP	(1 << 0)	/* Master Out keep */


/*
 * SDI (Secure Digital Interface, Page 19-4)
 *
 * Register
   SDICON	SDI Control				[ 5, R/W, 0x0]
   SDIPRE	SDI Baud Rate Prescaler			[ 8, R/W, 0x0]
   SDICARG	SDI Command Argument			[32, R/W, 0x0]
   SDICCON	SDI Command Control			[13, R/W, 0x0]
   SDICSTA	SDI Command Status			[13, R/W, 0x0]
   SDIRSP0	SDI Response Register 0			[32, R  , 0x0]
   SDIRSP1	SDI Response Register 1			[32, R  , 0x0]
   SDIRSP2	SDI Response Register 2			[32, R  , 0x0]
   SDIRSP3	SDI Response Register 3			[32, R  , 0x0]
   SDIDTIMER	SDI Data/Busy Timer 			[16, R/W, 0x2000]
   SDIBSIZE	SDI Block Size				[12, R/W, 0x0]
   SDIDCON	SDI Data Control			[22, R/W, 0x0]
   SDIDCNT	SDI Data Domain Counter			[24, R  , 0x0]
   SDIDSTA	SDI Data Status				[11, R/W, 0x0]
   SDIFSTA	SDI FIFO Status				[14, R  , 0x0]
   SDIDAT	SDI Data				[32, R/W, 0x0]
   SDIIMSK	SDI Interrupt Mask			[18, R/W, 0x0]
 *
 */
#define bSDI(Nb)	__REG(0x5a000000 + (Nb))
#define SDICON		bSDI(0x00)
#define SDIPRE		bSDI(0x04)
#define SDICARG		bSDI(0x08)
#define SDICCON		bSDI(0x0c)
#define SDICSTA		bSDI(0x10)
#define SDIRSP0		bSDI(0x14)
#define SDIRSP1		bSDI(0x18)
#define SDIRSP2		bSDI(0x1c)
#define SDIRSP3		bSDI(0x20)
#define SDIDTIMER	bSDI(0x24)
#define SDIBSIZE	bSDI(0x28)
#define SDIDCON		bSDI(0x2c)
#define SDIDCNT		bSDI(0x30)
#define SDIDSTA		bSDI(0x34)
#define SDIFSTA		bSDI(0x38)
#define SDIDAT		bSDI(0x3c)
#define SDIIMSK		bSDI(0x40)

#define SDICON_BYTE	(1 << 4)	/* Byte Order Type */
#define SDICON_LE	(0 << 4)	/* D[7:0],D[15:8],D[23:16],D[31:24] */
#define SDICON_BE	(1 << 4)	/* D[31:24],D[23:16],D[15:8],D[7:0] */
#define SDICON_INT	(1 << 3)	/* Receive SDIO INterrupt from card */
#define SDICON_RWE	(1 << 2)	/* Read Wait Enable */
#define SDICON_FRESET	(1 << 1)	/* FIFO Reset */
#define SDICON_ENCLK	(1 << 0)	/* Clock Out Enable */

#define SDIPRE_MSK	(0xff)		/* Baud rate = PCLK/2/(value + 1) */

#define SDICCON_ABORT	(1 << 12)	/* Command type: Abort(CMD12,CMD52) */
#define SDICCON_DATA	(1 << 11)	/* Command type: with Data */
#define SDICCON_LRSP	(1 << 10)	/* Response is 136-bit long */
#define SDICCON_WRSP	(1 << 9)	/* Wait for Response */
#define SDICCON_START	(1 << 8)	/* 0: cmd ready, 1: cmd start */
#define SDICCON_CMD_MSK	(0xff)		/* with start 2bit */

#define SDICSTA_CRC	(1 << 12)	/* CRC error */
#define SDICSTA_SENT	(1 << 11)	/* Command sent */
#define SDICSTA_TOUT	(1 << 10)	/* Command Timeout */
#define SDICSTA_RSP	(1 << 9)	/* Command Response received */
#define SDICSTA_BUSY	(1 << 8)	/* Command transfer in progress */
#define SDICSTA_ALLFLAG	(0x1f00)	/* All flags mask */
#define SDICSTA_RSP_MSK	(0xff)		/* with start 2bit */
#define SDICSTA_ERR	(0x1400)	/* CRC, TOUT */

#define SDIRSP1_CRC7	FExtr(SDIRSP1, Fld(8,24))

#define SDIDCON_PRD	(1 << 21)	/* SDIO Interrupt period is ... */
				/* when last data block is transferred. */
#define SDIDCON_PRD_2	(0 << 21)	/* 0: exact 2 cycle */
#define SDIDCON_PRD_N	(1 << 21)	/* 1: more cycle */
#define SDIDCON_TARSP	(1 << 20)	/* when data transmit start ... */
#define SDIDCON_TARSP_0	(0 << 20)	/* 0: directly after DatMode set */
#define SDIDCON_TARSP_1	(1 << 20)	/* 1: after response receive */
#define SDIDCON_RACMD	(1 << 19)	/* when data receive start ... */
#define SDIDCON_RACMD_0	(0 << 19)	/* 0: directly after DatMode set */
#define SDIDCON_RACMD_1	(1 << 19)	/* 1: after command sent */
#define SDIDCON_BACMD	(1 << 18)	/* when busy receive start ... */
#define SDIDCON_BACMD_0	(0 << 18)	/* 0: directly after DatMode set */
#define SDIDCON_BACMD_1	(1 << 18)	/* 1: after command sent */
#define SDIDCON_BLK	(1 << 17)	/* transfer mode. 0:stream, 1:block */
#define SDIDCON_WIDE	(1 << 16)	/* Enable Wide bus mode */
#define SDIDCON_DMA	(1 << 15)	/* Enable DMA */
#define SDIDCON_STOP	(1 << 14)	/* Stop by force */
#define fSDIDCON_DatMode Fld(2,12)	/* which direction of data transfer */
#define SDIDCON_READY	FInsrt(0x0, fSDIDCON_DatMode)	/* ready */
#define SDIDCON_BUSY	FInsrt(0x1, fSDIDCON_DatMode)	/* only busy check */
#define SDIDCON_RX	FInsrt(0x2, fSDIDCON_DatMode)	/* Data receive */
#define SDIDCON_TX	FInsrt(0x3, fSDIDCON_DatMode)	/* Data transmit */
#define SDIDCON_BNUM	FMsk(Fld(12,0))	/* Block Number(0~4095) */

#define SDIDCNT_CNT(x)	FExtr((x), Fld(12,12))	/* Remaining Blk No. */
#define SDIDCNT_SIZE(x)	FExtr((x), Fld(12,0))	/* Remaining byte of 1 block */

#define SDIDSTA_RWQ	(1 << 10)	/* Read wait request occur */
#define SDIDSTA_INT	(1 << 9)	/* SDIO interrupt detect */
#define SDIDSTA_EFIFO	(1 << 8)	/* FIFO fail */
#define SDIDSTA_ETCRC	(1 << 7)	/* Block sent(CRC status error) */
#define SDIDSTA_ERCRC	(1 << 6)	/* Block received(CRC error) */
#define SDIDSTA_TOUT	(1 << 5)	/* Data/Busy receive timeout */
#define SDIDSTA_DFIN	(1 << 4)	/* Data transfer complete */
#define SDIDSTA_BFIN	(1 << 3)	/* Only busy check is finished */
#define SDIDSTA_SBIT	(1 << 2)	/* Start bit is not detected */
#define SDIDSTA_TX	(1 << 1)	/* data Tx in progress */
#define SDIDSTA_RX	(1 << 0)	/* data Rx in progress */
#define SDIDSTA_ERR	(0x1e4)		/* EFIFO, ETCRC, ERCRC, TOUT, SBIT */
#define fSDIDSTA_ALL	Fld(11, 0)
#define SDIDSTA_ALL	FMsk(fSDIDSTA_ALL)

#define SDIFSTA_TX	(1 << 13)	/* 0: FIFO is full, 1: FIFO ready */
#define SDIFSTA_RX	(1 << 12)	/* 0: FIFO empty, 1: Data in FIFO */
#define SDIFSTA_TX_HALF	(1 << 11)	/* Data in FIFO are 0:33~64, 1:0~32 */
#define SDIFSTA_TX_EMP	(1 << 10)	/* FIFO is empty */
#define SDIFSTA_RX_LAST	(1 << 9)	/* Last Data ready in FIFO */
#define SDIFSTA_RX_FULL	(1 << 8)	/* FIFO is full */
#define SDIFSTA_RX_HALF	(1 << 7)	/* Data in FIFO are 0:0~31, 1:32~64 */
#define SDIFSTA_CNT	(0x7f)		/* Number of data in FIFO */

#define SDIIMSK_RCRC	(1 << 17)	/* Response CRC error */
#define SDIIMSK_CSENT	(1 << 16)	/* Command Sent */
#define SDIIMSK_CTOUT	(1 << 15)	/* Command Response Timeout */
#define SDIIMSK_CRSP	(1 << 14)	/* Command Response received */
#define SDIIMSK_RWAIT	(1 << 13)	/* Read Wait Request */
#define SDIIMSK_CARD	(1 << 12)	/* SDIO Interrupt from card */
#define SDIIMSK_EFIFO	(1 << 11)	/* FIFO fail error */
#define SDIIMSK_ETCRC	(1 << 10)	/* CRC status error */
#define SDIIMSK_ERCRC	(1 << 9)	/* Data CRC fail */
#define SDIIMSK_TOUT	(1 << 8)	/* Data Timeout */
#define SDIIMSK_DFIN	(1 << 7)	/* Data transfer complete (cnt = 0) */
#define SDIIMSK_BFIN	(1 << 6)	/* Busy check complete */
#define SDIIMSK_SBIT	(1 << 5)	/* Start bit Error */
#define SDIIMSK_TX_HALF	(1 << 4)	/* Tx FIFO half */
#define SDIIMSK_TX_EMP	(1 << 3)	/* Tx FIFO empty */
#define SDIIMSK_RX_LAST	(1 << 2)	/* Rx FIFO has last data */
#define SDIIMSK_RX_FULL	(1 << 1)	/* Rx FIFO full */
#define SDIIMSK_RX_HALF	(1 << 0)	/* Rx FIFO half */
#define SDIIMSK_ALL	(0x3ffff)

#define SDI_MAX_TX_FIFO	64
#define SDI_MAX_RX_FIFO	64

#define GPIO_SDDAT3	GPIO_E10
#define GPIO_SDDAT2	GPIO_E9
#define GPIO_SDDAT1	GPIO_E8
#define GPIO_SDDAT0	GPIO_E7
#define GPIO_SDCMD	GPIO_E6
#define GPIO_SDCLK	GPIO_E5


/*
 * Power Management
 */
#define PMST            GSTATUS2
#define PMSR0           GSTATUS3
#define PMSR1           GSTATUS4
#define PMCTL0          CLKCON  
#define PMCTL1          MISCCR  
#define SCLKE           (1 << 19)
#define SCLK1           (1 << 18)
#define SCLK0           (1 << 17)
#define USBSPD1         (1 << 13)
#define USBSPD0         (1 << 12)
#define PMST_WDR        (1 << 2)
#define PMST_SMR        (1 << 1)
#define PMST_HWR        (1 << 0)

/*
 * Watchdog timer
 */
#define bWTCON(Nb)	__REG(0x53000000 + (Nb))
#define WTCON		bWTCON(0)
#define WTDAT		bWTCON(4)
#define WTCNT		bWTCON(8)

#endif // _S3C2410_H_
/*
 | $Id: linuette_common.h,v 1.3 2002/05/10 15:52:08 tolkien Exp $
 |
 | Local Variables:
 | mode: c
 | mode: font-lock
 | version-control: t
 | delete-old-versions: t
 | End:
 |
 | -*- End-Of-File -*-
 */