xref: /inferno-os/os/boot/arm1110/io.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth /*
2*74a4d8c2SCharles.Forsyth  *  Definitions for IO devices.  Used only in C.
3*74a4d8c2SCharles.Forsyth  */
4*74a4d8c2SCharles.Forsyth 
5*74a4d8c2SCharles.Forsyth enum
6*74a4d8c2SCharles.Forsyth {
7*74a4d8c2SCharles.Forsyth 	/* hardware counter frequency */
8*74a4d8c2SCharles.Forsyth 	ClockFreq=	3686400,
9*74a4d8c2SCharles.Forsyth };
10*74a4d8c2SCharles.Forsyth 
11*74a4d8c2SCharles.Forsyth /*
12*74a4d8c2SCharles.Forsyth  *  IRQ's defined by SA1100
13*74a4d8c2SCharles.Forsyth  */
14*74a4d8c2SCharles.Forsyth enum
15*74a4d8c2SCharles.Forsyth {
16*74a4d8c2SCharles.Forsyth 	IRQgpio0=	0,
17*74a4d8c2SCharles.Forsyth 	IRQgpio1=	1,
18*74a4d8c2SCharles.Forsyth 	IRQgpio2=	2,
19*74a4d8c2SCharles.Forsyth 	IRQgpio3=	3,
20*74a4d8c2SCharles.Forsyth 	IRQgpio4=	4,
21*74a4d8c2SCharles.Forsyth 	IRQgpio5=	5,
22*74a4d8c2SCharles.Forsyth 	IRQgpio6=	6,
23*74a4d8c2SCharles.Forsyth 	IRQgpio7=	7,
24*74a4d8c2SCharles.Forsyth 	IRQgpio8=	8,
25*74a4d8c2SCharles.Forsyth 	IRQgpio9=	9,
26*74a4d8c2SCharles.Forsyth 	IRQgpio10=	10,
27*74a4d8c2SCharles.Forsyth 	IRQgpiohi=	11,
28*74a4d8c2SCharles.Forsyth 	IRQlcd=		12,
29*74a4d8c2SCharles.Forsyth 	IRQudc=		13,
30*74a4d8c2SCharles.Forsyth 	IRQuart1b=	15,
31*74a4d8c2SCharles.Forsyth 	IRQuart2=	16,
32*74a4d8c2SCharles.Forsyth 	IRQuart3=	17,
33*74a4d8c2SCharles.Forsyth 	IRQmcp=		18,
34*74a4d8c2SCharles.Forsyth 	IRQssp=		19,
35*74a4d8c2SCharles.Forsyth 	IRQdma0=	20,
36*74a4d8c2SCharles.Forsyth 	IRQdma1=	21,
37*74a4d8c2SCharles.Forsyth 	IRQdma2=	22,
38*74a4d8c2SCharles.Forsyth 	IRQdma3=	23,
39*74a4d8c2SCharles.Forsyth 	IRQdma4=	24,
40*74a4d8c2SCharles.Forsyth 	IRQdma5=	25,
41*74a4d8c2SCharles.Forsyth 	IRQtimer0=	26,
42*74a4d8c2SCharles.Forsyth 	IRQtimer1=	27,
43*74a4d8c2SCharles.Forsyth 	IRQtimer2=	28,
44*74a4d8c2SCharles.Forsyth 	IRQtimer3=	29,
45*74a4d8c2SCharles.Forsyth 	IRQsecond=	30,
46*74a4d8c2SCharles.Forsyth 	IRQrtc=		31,
47*74a4d8c2SCharles.Forsyth };
48*74a4d8c2SCharles.Forsyth 
49*74a4d8c2SCharles.Forsyth /*
50*74a4d8c2SCharles.Forsyth  *  GPIO lines (signal names from compaq document).  _i indicates input
51*74a4d8c2SCharles.Forsyth  *  and _o output.
52*74a4d8c2SCharles.Forsyth  */
53*74a4d8c2SCharles.Forsyth enum
54*74a4d8c2SCharles.Forsyth {
55*74a4d8c2SCharles.Forsyth 	GPIO_PWR_ON_i=		1<<0,	/* power button */
56*74a4d8c2SCharles.Forsyth 	GPIO_UP_IRQ_i=		1<<1,	/* microcontroller interrupts */
57*74a4d8c2SCharles.Forsyth 	GPIO_LDD8_o=		1<<2,	/* LCD data 8-15 */
58*74a4d8c2SCharles.Forsyth 	GPIO_LDD9_o=		1<<3,
59*74a4d8c2SCharles.Forsyth 	GPIO_LDD10_o=		1<<4,
60*74a4d8c2SCharles.Forsyth 	GPIO_LDD11_o=		1<<5,
61*74a4d8c2SCharles.Forsyth 	GPIO_LDD12_o=		1<<6,
62*74a4d8c2SCharles.Forsyth 	GPIO_LDD13_o=		1<<7,
63*74a4d8c2SCharles.Forsyth 	GPIO_LDD14_o=		1<<8,
64*74a4d8c2SCharles.Forsyth 	GPIO_LDD15_o=		1<<9,
65*74a4d8c2SCharles.Forsyth 	GPIO_CARD_IND1_i=	1<<10,	/* card inserted in PCMCIA socket 1 */
66*74a4d8c2SCharles.Forsyth 	GPIO_CARD_IRQ1_i=	1<<11,	/* PCMCIA socket 1 interrupt */
67*74a4d8c2SCharles.Forsyth 	GPIO_CLK_SET0_o=	1<<12,	/* clock selects for audio codec */
68*74a4d8c2SCharles.Forsyth 	GPIO_CLK_SET1_o=	1<<13,
69*74a4d8c2SCharles.Forsyth 	GPIO_L3_SDA_io=		1<<14,	/* UDA1341 interface */
70*74a4d8c2SCharles.Forsyth 	GPIO_L3_MODE_o=		1<<15,
71*74a4d8c2SCharles.Forsyth 	GPIO_L3_SCLK_o=		1<<16,
72*74a4d8c2SCharles.Forsyth 	GPIO_CARD_IND0_i=	1<<17,	/* card inserted in PCMCIA socket 0 */
73*74a4d8c2SCharles.Forsyth 	GPIO_KEY_ACT_i=		1<<18,	/* hot key from cradle */
74*74a4d8c2SCharles.Forsyth 	GPIO_SYS_CLK_i=		1<<19,	/* clock from codec */
75*74a4d8c2SCharles.Forsyth 	GPIO_BAT_FAULT_i=	1<<20,	/* battery fault */
76*74a4d8c2SCharles.Forsyth 	GPIO_CARD_IRQ0_i=	1<<21,	/* PCMCIA socket 0 interrupt */
77*74a4d8c2SCharles.Forsyth 	GPIO_LOCK_i=		1<<22,	/* expansion pack lock/unlock */
78*74a4d8c2SCharles.Forsyth 	GPIO_COM_DCD_i=		1<<23,	/* DCD from UART3 */
79*74a4d8c2SCharles.Forsyth 	GPIO_OPT_IRQ_i=		1<<24,	/* expansion pack IRQ */
80*74a4d8c2SCharles.Forsyth 	GPIO_COM_CTS_i=		1<<25,	/* CTS from UART3 */
81*74a4d8c2SCharles.Forsyth 	GPIO_COM_RTS_o=		1<<26,	/* RTS to UART3 */
82*74a4d8c2SCharles.Forsyth 	GPIO_OPT_IND_i=		1<<27,	/* expansion pack inserted */
83*74a4d8c2SCharles.Forsyth 
84*74a4d8c2SCharles.Forsyth /* Peripheral Unit GPIO pin assignments: alternate functions */
85*74a4d8c2SCharles.Forsyth 	GPIO_SSP_TXD_o=		1<<10,	/* SSP Transmit Data */
86*74a4d8c2SCharles.Forsyth 	GPIO_SSP_RXD_i=		1<<11,	/* SSP Receive Data */
87*74a4d8c2SCharles.Forsyth 	GPIO_SSP_SCLK_o=	1<<12,	/* SSP Sample CLocK */
88*74a4d8c2SCharles.Forsyth 	GPIO_SSP_SFRM_o=	1<<13,	/* SSP Sample FRaMe */
89*74a4d8c2SCharles.Forsyth 	/* ser. port 1: */
90*74a4d8c2SCharles.Forsyth 	GPIO_UART_TXD_o=	1<<14,	/* UART Transmit Data */
91*74a4d8c2SCharles.Forsyth 	GPIO_UART_RXD_i=	1<<15,	/* UART Receive Data */
92*74a4d8c2SCharles.Forsyth 	GPIO_SDLC_SCLK_io=	1<<16,	/* SDLC Sample CLocK (I/O) */
93*74a4d8c2SCharles.Forsyth 	GPIO_SDLC_AAF_o=	1<<17,	/* SDLC Abort After Frame */
94*74a4d8c2SCharles.Forsyth 	GPIO_UART_SCLK1_i=	1<<18,	/* UART Sample CLocK 1 */
95*74a4d8c2SCharles.Forsyth 	/* ser. port 4: */
96*74a4d8c2SCharles.Forsyth 	GPIO_SSP_CLK_i=		1<<19,	/* SSP external CLocK */
97*74a4d8c2SCharles.Forsyth 	/* ser. port 3: */
98*74a4d8c2SCharles.Forsyth 	GPIO_UART_SCLK3_i=	1<<20,	/* UART Sample CLocK 3 */
99*74a4d8c2SCharles.Forsyth 	/* ser. port 4: */
100*74a4d8c2SCharles.Forsyth 	GPIO_MCP_CLK_i=		1<<21,	/* MCP CLocK */
101*74a4d8c2SCharles.Forsyth 	/* test controller: */
102*74a4d8c2SCharles.Forsyth 	GPIO_TIC_ACK_o=		1<<21,	/* TIC ACKnowledge */
103*74a4d8c2SCharles.Forsyth 	GPIO_MBGNT_o=		1<<21,	/* Memory Bus GraNT */
104*74a4d8c2SCharles.Forsyth 	GPIO_TREQA_i=		1<<22,	/* TIC REQuest A */
105*74a4d8c2SCharles.Forsyth 	GPIO_MBREQ_i=		1<<22,	/* Memory Bus REQuest */
106*74a4d8c2SCharles.Forsyth 	GPIO_TREQB_i=		1<<23,	/* TIC REQuest B */
107*74a4d8c2SCharles.Forsyth 	GPIO_1Hz_o=			1<<25,	/* 1 Hz clock */
108*74a4d8c2SCharles.Forsyth 	GPIO_RCLK_o=		1<<26,	/* internal (R) CLocK (O, fcpu/2) */
109*74a4d8c2SCharles.Forsyth 	GPIO_32_768kHz_o=	1<<27,	/* 32.768 kHz clock (O, RTC) */
110*74a4d8c2SCharles.Forsyth };
111*74a4d8c2SCharles.Forsyth 
112*74a4d8c2SCharles.Forsyth /*
113*74a4d8c2SCharles.Forsyth  *  types of interrupts
114*74a4d8c2SCharles.Forsyth  */
115*74a4d8c2SCharles.Forsyth enum
116*74a4d8c2SCharles.Forsyth {
117*74a4d8c2SCharles.Forsyth 	GPIOrising,
118*74a4d8c2SCharles.Forsyth 	GPIOfalling,
119*74a4d8c2SCharles.Forsyth 	GPIOboth,
120*74a4d8c2SCharles.Forsyth 	IRQ,
121*74a4d8c2SCharles.Forsyth };
122*74a4d8c2SCharles.Forsyth 
123*74a4d8c2SCharles.Forsyth /* hardware registers */
124*74a4d8c2SCharles.Forsyth typedef struct Uartregs Uartregs;
125*74a4d8c2SCharles.Forsyth struct Uartregs
126*74a4d8c2SCharles.Forsyth {
127*74a4d8c2SCharles.Forsyth 	ulong	ctl[4];
128*74a4d8c2SCharles.Forsyth 	ulong	dummya;
129*74a4d8c2SCharles.Forsyth 	ulong	data;
130*74a4d8c2SCharles.Forsyth 	ulong	dummyb;
131*74a4d8c2SCharles.Forsyth 	ulong	status[2];
132*74a4d8c2SCharles.Forsyth };
133*74a4d8c2SCharles.Forsyth Uartregs *uart3regs;
134*74a4d8c2SCharles.Forsyth 
135*74a4d8c2SCharles.Forsyth /* general purpose I/O lines control registers */
136*74a4d8c2SCharles.Forsyth typedef struct GPIOregs GPIOregs;
137*74a4d8c2SCharles.Forsyth struct GPIOregs
138*74a4d8c2SCharles.Forsyth {
139*74a4d8c2SCharles.Forsyth 	ulong	level;		/* 1 == high */
140*74a4d8c2SCharles.Forsyth 	ulong	direction;	/* 1 == output */
141*74a4d8c2SCharles.Forsyth 	ulong	set;		/* a 1 sets the bit, 0 leaves it alone */
142*74a4d8c2SCharles.Forsyth 	ulong	clear;		/* a 1 clears the bit, 0 leaves it alone */
143*74a4d8c2SCharles.Forsyth 	ulong	rising;		/* rising edge detect enable */
144*74a4d8c2SCharles.Forsyth 	ulong	falling;	/* falling edge detect enable */
145*74a4d8c2SCharles.Forsyth 	ulong	edgestatus;	/* writing a 1 bit clears */
146*74a4d8c2SCharles.Forsyth 	ulong	altfunc;	/* turn on alternate function for any set bits */
147*74a4d8c2SCharles.Forsyth };
148*74a4d8c2SCharles.Forsyth 
149*74a4d8c2SCharles.Forsyth extern GPIOregs *gpioregs;
150*74a4d8c2SCharles.Forsyth 
151*74a4d8c2SCharles.Forsyth /* extra general purpose I/O bits, output only */
152*74a4d8c2SCharles.Forsyth enum
153*74a4d8c2SCharles.Forsyth {
154*74a4d8c2SCharles.Forsyth 	EGPIO_prog_flash=	1<<0,
155*74a4d8c2SCharles.Forsyth 	EGPIO_pcmcia_reset=	1<<1,
156*74a4d8c2SCharles.Forsyth 	EGPIO_exppack_reset=	1<<2,
157*74a4d8c2SCharles.Forsyth 	EGPIO_codec_reset=	1<<3,
158*74a4d8c2SCharles.Forsyth 	EGPIO_exp_nvram_power=	1<<4,
159*74a4d8c2SCharles.Forsyth 	EGPIO_exp_full_power=	1<<5,
160*74a4d8c2SCharles.Forsyth 	EGPIO_lcd_3v=		1<<6,
161*74a4d8c2SCharles.Forsyth 	EGPIO_rs232_power=	1<<7,
162*74a4d8c2SCharles.Forsyth 	EGPIO_lcd_ic_power=	1<<8,
163*74a4d8c2SCharles.Forsyth 	EGPIO_ir_power=		1<<9,
164*74a4d8c2SCharles.Forsyth 	EGPIO_audio_power=	1<<10,
165*74a4d8c2SCharles.Forsyth 	EGPIO_audio_ic_power=	1<<11,
166*74a4d8c2SCharles.Forsyth 	EGPIO_audio_mute=	1<<12,
167*74a4d8c2SCharles.Forsyth 	EGPIO_fir=		1<<13,	/* not set is sir */
168*74a4d8c2SCharles.Forsyth 	EGPIO_lcd_5v=		1<<14,
169*74a4d8c2SCharles.Forsyth 	EGPIO_lcd_9v=		1<<15,
170*74a4d8c2SCharles.Forsyth };
171*74a4d8c2SCharles.Forsyth extern ulong *egpioreg;
172*74a4d8c2SCharles.Forsyth 
173*74a4d8c2SCharles.Forsyth /* Peripheral pin controller registers */
174*74a4d8c2SCharles.Forsyth typedef struct PPCregs PPCregs;
175*74a4d8c2SCharles.Forsyth struct PPCregs {
176*74a4d8c2SCharles.Forsyth 	ulong	direction;
177*74a4d8c2SCharles.Forsyth 	ulong	state;
178*74a4d8c2SCharles.Forsyth 	ulong	assignment;
179*74a4d8c2SCharles.Forsyth 	ulong	sleepdir;
180*74a4d8c2SCharles.Forsyth 	ulong	flags;
181*74a4d8c2SCharles.Forsyth };
182*74a4d8c2SCharles.Forsyth extern PPCregs *ppcregs;
183*74a4d8c2SCharles.Forsyth 
184*74a4d8c2SCharles.Forsyth /* Synchronous Serial Port controller registers */
185*74a4d8c2SCharles.Forsyth typedef struct SSPregs SSPregs;
186*74a4d8c2SCharles.Forsyth struct SSPregs {
187*74a4d8c2SCharles.Forsyth 	ulong	control0;
188*74a4d8c2SCharles.Forsyth 	ulong	control1;
189*74a4d8c2SCharles.Forsyth 	ulong	dummy0;
190*74a4d8c2SCharles.Forsyth 	ulong	data;
191*74a4d8c2SCharles.Forsyth 	ulong	dummy1;
192*74a4d8c2SCharles.Forsyth 	ulong	status;
193*74a4d8c2SCharles.Forsyth };
194*74a4d8c2SCharles.Forsyth extern SSPregs *sspregs;
195*74a4d8c2SCharles.Forsyth 
196*74a4d8c2SCharles.Forsyth /* Multimedia Communications Port controller registers */
197*74a4d8c2SCharles.Forsyth typedef struct MCPregs MCPregs;
198*74a4d8c2SCharles.Forsyth struct MCPregs {
199*74a4d8c2SCharles.Forsyth 	ulong	control0;
200*74a4d8c2SCharles.Forsyth 	ulong	reserved0;
201*74a4d8c2SCharles.Forsyth 	ulong	data0;
202*74a4d8c2SCharles.Forsyth 	ulong	data1;
203*74a4d8c2SCharles.Forsyth 	ulong	data2;
204*74a4d8c2SCharles.Forsyth 	ulong	reserved1;
205*74a4d8c2SCharles.Forsyth 	ulong	status;
206*74a4d8c2SCharles.Forsyth 	ulong	reserved[11];
207*74a4d8c2SCharles.Forsyth 	ulong	control1;
208*74a4d8c2SCharles.Forsyth };
209*74a4d8c2SCharles.Forsyth extern MCPregs *mcpregs;
210*74a4d8c2SCharles.Forsyth 
211*74a4d8c2SCharles.Forsyth /*
212*74a4d8c2SCharles.Forsyth  *  memory configuration
213*74a4d8c2SCharles.Forsyth  */
214*74a4d8c2SCharles.Forsyth enum
215*74a4d8c2SCharles.Forsyth {
216*74a4d8c2SCharles.Forsyth 	/* bit shifts for pcmcia access time counters */
217*74a4d8c2SCharles.Forsyth 	MECR_io0=	0,
218*74a4d8c2SCharles.Forsyth 	MECR_attr0=	5,
219*74a4d8c2SCharles.Forsyth 	MECR_mem0=	10,
220*74a4d8c2SCharles.Forsyth 	MECR_fast0=	11,
221*74a4d8c2SCharles.Forsyth 	MECR_io1=	MECR_io0+16,
222*74a4d8c2SCharles.Forsyth 	MECR_attr1=	MECR_attr0+16,
223*74a4d8c2SCharles.Forsyth 	MECR_mem1=	MECR_mem0+16,
224*74a4d8c2SCharles.Forsyth 	MECR_fast1=	MECR_fast0+16,
225*74a4d8c2SCharles.Forsyth };
226*74a4d8c2SCharles.Forsyth 
227*74a4d8c2SCharles.Forsyth typedef struct MemConfRegs MemConfRegs;
228*74a4d8c2SCharles.Forsyth struct MemConfRegs
229*74a4d8c2SCharles.Forsyth {
230*74a4d8c2SCharles.Forsyth 	ulong	mdcnfg;		/* dram */
231*74a4d8c2SCharles.Forsyth 	ulong	mdcas00;	/* dram banks 0/1 */
232*74a4d8c2SCharles.Forsyth 	ulong	mdcas01;
233*74a4d8c2SCharles.Forsyth 	ulong	mdcas02;
234*74a4d8c2SCharles.Forsyth 	ulong	msc0;		/* static */
235*74a4d8c2SCharles.Forsyth 	ulong	msc1;
236*74a4d8c2SCharles.Forsyth 	ulong	mecr;		/* pcmcia */
237*74a4d8c2SCharles.Forsyth 	ulong	mdrefr;		/* dram refresh */
238*74a4d8c2SCharles.Forsyth 	ulong	mdcas20;	/* dram banks 2/3 */
239*74a4d8c2SCharles.Forsyth 	ulong	mdcas21;
240*74a4d8c2SCharles.Forsyth 	ulong	mdcas22;
241*74a4d8c2SCharles.Forsyth 	ulong	msc2;		/* static */
242*74a4d8c2SCharles.Forsyth 	ulong	smcnfg;		/* SMROM config */
243*74a4d8c2SCharles.Forsyth };
244*74a4d8c2SCharles.Forsyth extern MemConfRegs *memconfregs;
245*74a4d8c2SCharles.Forsyth 
246*74a4d8c2SCharles.Forsyth /*
247*74a4d8c2SCharles.Forsyth  *  power management
248*74a4d8c2SCharles.Forsyth  */
249*74a4d8c2SCharles.Forsyth typedef struct PowerRegs PowerRegs;
250*74a4d8c2SCharles.Forsyth struct PowerRegs
251*74a4d8c2SCharles.Forsyth {
252*74a4d8c2SCharles.Forsyth 	ulong	pmcr;	/* Power manager control register */
253*74a4d8c2SCharles.Forsyth 	ulong	pssr;	/* Power manager sleep status register */
254*74a4d8c2SCharles.Forsyth 	ulong	pspr;	/* Power manager scratch pad register */
255*74a4d8c2SCharles.Forsyth 	ulong	pwer;	/* Power manager wakeup enable register */
256*74a4d8c2SCharles.Forsyth 	ulong	pcfr;	/* Power manager general configuration register */
257*74a4d8c2SCharles.Forsyth 	ulong	ppcr;	/* Power manager PPL configuration register */
258*74a4d8c2SCharles.Forsyth 	ulong	pgsr;	/* Power manager GPIO sleep state register */
259*74a4d8c2SCharles.Forsyth 	ulong	posr;	/* Power manager oscillator status register */
260*74a4d8c2SCharles.Forsyth };
261*74a4d8c2SCharles.Forsyth extern PowerRegs *powerregs;
262