xref: /inferno-os/os/mpc/800io.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth typedef struct BD BD;
2*74a4d8c2SCharles.Forsyth typedef struct CPMdev CPMdev;
3*74a4d8c2SCharles.Forsyth typedef struct GTimer GTimer;
4*74a4d8c2SCharles.Forsyth typedef struct I2Cdev I2Cdev;
5*74a4d8c2SCharles.Forsyth typedef struct PCMconftab PCMconftab;
6*74a4d8c2SCharles.Forsyth typedef struct PCMmap	PCMmap;
7*74a4d8c2SCharles.Forsyth typedef struct PCMslot	PCMslot;
8*74a4d8c2SCharles.Forsyth typedef struct Ring Ring;
9*74a4d8c2SCharles.Forsyth 
10*74a4d8c2SCharles.Forsyth /*
11*74a4d8c2SCharles.Forsyth  * MPC800 series IO structures
12*74a4d8c2SCharles.Forsyth  */
13*74a4d8c2SCharles.Forsyth 
14*74a4d8c2SCharles.Forsyth enum
15*74a4d8c2SCharles.Forsyth {
16*74a4d8c2SCharles.Forsyth 	/* interrupt vectors (SIU and CPM) */
17*74a4d8c2SCharles.Forsyth 	VectorPIC= 0,	/* level 0 to level 7, assigned by software */
18*74a4d8c2SCharles.Forsyth 		/* vector assignments are determined by the assignments here */
19*74a4d8c2SCharles.Forsyth 		PITlevel=	2,
20*74a4d8c2SCharles.Forsyth 		CPIClevel=	4,
21*74a4d8c2SCharles.Forsyth 		PCMCIAio=	5,
22*74a4d8c2SCharles.Forsyth 		PCMCIAstatus=	6,
23*74a4d8c2SCharles.Forsyth 		RTClevel=	7,
24*74a4d8c2SCharles.Forsyth 	VectorIRQ=	VectorPIC+8,	/* IRQ0 to IRQ7 */
25*74a4d8c2SCharles.Forsyth 	VectorCPIC=	VectorIRQ+8,	/* 32 CPM interrupts: 0 (error) to 0x1F (PC15) */
26*74a4d8c2SCharles.Forsyth 	MaxVector=	VectorCPIC+32,
27*74a4d8c2SCharles.Forsyth };
28*74a4d8c2SCharles.Forsyth 
29*74a4d8c2SCharles.Forsyth /*
30*74a4d8c2SCharles.Forsyth  * these are defined to keep the interface compatible with other
31*74a4d8c2SCharles.Forsyth  * architectures, but only BUSUNKNOWN is currently used
32*74a4d8c2SCharles.Forsyth  */
33*74a4d8c2SCharles.Forsyth #define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
34*74a4d8c2SCharles.Forsyth #define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
35*74a4d8c2SCharles.Forsyth #define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
36*74a4d8c2SCharles.Forsyth #define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
37*74a4d8c2SCharles.Forsyth #define BUSTYPE(tbdf)	((tbdf)>>24)
38*74a4d8c2SCharles.Forsyth #define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
39*74a4d8c2SCharles.Forsyth #define BUSUNKNOWN	(-1)
40*74a4d8c2SCharles.Forsyth 
41*74a4d8c2SCharles.Forsyth /*
42*74a4d8c2SCharles.Forsyth  * Buffer Descriptors and IO Rings
43*74a4d8c2SCharles.Forsyth  */
44*74a4d8c2SCharles.Forsyth 
45*74a4d8c2SCharles.Forsyth struct BD {
46*74a4d8c2SCharles.Forsyth 	ushort	status;
47*74a4d8c2SCharles.Forsyth 	ushort	length;
48*74a4d8c2SCharles.Forsyth 	ulong	addr;
49*74a4d8c2SCharles.Forsyth };
50*74a4d8c2SCharles.Forsyth 
51*74a4d8c2SCharles.Forsyth BD*	bdalloc(int);
52*74a4d8c2SCharles.Forsyth void	bdfree(BD*, int);
53*74a4d8c2SCharles.Forsyth void	dumpbd(char*, BD*, int);
54*74a4d8c2SCharles.Forsyth 
55*74a4d8c2SCharles.Forsyth enum {
56*74a4d8c2SCharles.Forsyth 	/* Rx BDs, bits common to all protocols */
57*74a4d8c2SCharles.Forsyth 	BDEmpty=	1<<15,
58*74a4d8c2SCharles.Forsyth 	BDWrap=		1<<13,
59*74a4d8c2SCharles.Forsyth 	BDInt=		1<<12,
60*74a4d8c2SCharles.Forsyth 	BDLast=		1<<11,
61*74a4d8c2SCharles.Forsyth 	BDFirst=		1<<10,
62*74a4d8c2SCharles.Forsyth 
63*74a4d8c2SCharles.Forsyth 	/* Tx BDs */
64*74a4d8c2SCharles.Forsyth 	BDReady=		1<<15,
65*74a4d8c2SCharles.Forsyth 	/* BDWrap, BDInt, BDLast */
66*74a4d8c2SCharles.Forsyth };
67*74a4d8c2SCharles.Forsyth 
68*74a4d8c2SCharles.Forsyth 
69*74a4d8c2SCharles.Forsyth struct Ring {
70*74a4d8c2SCharles.Forsyth 	BD*	rdr;				/* receive descriptor ring */
71*74a4d8c2SCharles.Forsyth 	void*	rrb;				/* receive ring buffers */
72*74a4d8c2SCharles.Forsyth 	int	rdrx;				/* index into rdr */
73*74a4d8c2SCharles.Forsyth 	int	nrdre;			/* length of rdr */
74*74a4d8c2SCharles.Forsyth 
75*74a4d8c2SCharles.Forsyth 	BD*	tdr;				/* transmit descriptor ring */
76*74a4d8c2SCharles.Forsyth 	Block**	txb;				/* corresponding transmit ring buffers */
77*74a4d8c2SCharles.Forsyth 	int	tdrh;				/* host index into tdr */
78*74a4d8c2SCharles.Forsyth 	int	tdri;				/* interface index into tdr */
79*74a4d8c2SCharles.Forsyth 	int	ntdre;			/* length of tdr */
80*74a4d8c2SCharles.Forsyth 	int	ntq;				/* pending transmit requests */
81*74a4d8c2SCharles.Forsyth };
82*74a4d8c2SCharles.Forsyth 
83*74a4d8c2SCharles.Forsyth #define NEXT(x, l)	(((x)+1)%(l))
84*74a4d8c2SCharles.Forsyth #define PREV(x, l)	(((x) == 0) ? (l)-1: (x)-1)
85*74a4d8c2SCharles.Forsyth #define	HOWMANY(x, y)	(((x)+((y)-1))/(y))
86*74a4d8c2SCharles.Forsyth #define ROUNDUP(x, y)	(HOWMANY((x), (y))*(y))
87*74a4d8c2SCharles.Forsyth 
88*74a4d8c2SCharles.Forsyth int	ioringinit(Ring*, int, int, int);
89*74a4d8c2SCharles.Forsyth 
90*74a4d8c2SCharles.Forsyth /*
91*74a4d8c2SCharles.Forsyth  * CPM
92*74a4d8c2SCharles.Forsyth  */
93*74a4d8c2SCharles.Forsyth enum {
94*74a4d8c2SCharles.Forsyth 	/* commands */
95*74a4d8c2SCharles.Forsyth 	InitRxTx =	0,
96*74a4d8c2SCharles.Forsyth 	InitRx =		1,
97*74a4d8c2SCharles.Forsyth 	InitTx =		2,
98*74a4d8c2SCharles.Forsyth 	EnterHunt=	3,
99*74a4d8c2SCharles.Forsyth 	StopTx=		4,
100*74a4d8c2SCharles.Forsyth 	GracefulStopTx = 5,
101*74a4d8c2SCharles.Forsyth 	InitIDMA =	5,
102*74a4d8c2SCharles.Forsyth 	RestartTx =	6,
103*74a4d8c2SCharles.Forsyth 	CloseRxBD =	7,
104*74a4d8c2SCharles.Forsyth 	SetGroupAddr = 8,
105*74a4d8c2SCharles.Forsyth 	SetTimer =	8,
106*74a4d8c2SCharles.Forsyth 	GCITimeout =	9,
107*74a4d8c2SCharles.Forsyth 	GCIAbort =	10,
108*74a4d8c2SCharles.Forsyth 	StopIDMA =	11,
109*74a4d8c2SCharles.Forsyth 	StartDSP = 	12,
110*74a4d8c2SCharles.Forsyth 	ArmIDMA =	13,
111*74a4d8c2SCharles.Forsyth 	InitDSP =		13,
112*74a4d8c2SCharles.Forsyth 	USBCmd =	15,
113*74a4d8c2SCharles.Forsyth 
114*74a4d8c2SCharles.Forsyth 	/* bgcr */
115*74a4d8c2SCharles.Forsyth 	BaudEnable = 1<<16,
116*74a4d8c2SCharles.Forsyth 
117*74a4d8c2SCharles.Forsyth 	/* sicr */
118*74a4d8c2SCharles.Forsyth 	CLK1 = 4,		/* SCC1,2 */
119*74a4d8c2SCharles.Forsyth 	CLK2 = 5,
120*74a4d8c2SCharles.Forsyth 	CLK3 = 6,
121*74a4d8c2SCharles.Forsyth 	CLK4 = 7,
122*74a4d8c2SCharles.Forsyth 	CLK5 = CLK1,	/* SCC3,4 */
123*74a4d8c2SCharles.Forsyth 	CLK6 = CLK2,
124*74a4d8c2SCharles.Forsyth 	CLK7 = CLK3,
125*74a4d8c2SCharles.Forsyth 	CLK8 = CLK4,
126*74a4d8c2SCharles.Forsyth 
127*74a4d8c2SCharles.Forsyth 	/* logical channel IDs mapped to channel ID by cpm.c */
128*74a4d8c2SCharles.Forsyth 	CPnone = 0,
129*74a4d8c2SCharles.Forsyth 	CPscc1,
130*74a4d8c2SCharles.Forsyth 	CPscc2,
131*74a4d8c2SCharles.Forsyth 	CPscc3,
132*74a4d8c2SCharles.Forsyth 	CPscc4,
133*74a4d8c2SCharles.Forsyth 	CPsmc1,
134*74a4d8c2SCharles.Forsyth 	CPsmc2,
135*74a4d8c2SCharles.Forsyth 	CPdsp1,
136*74a4d8c2SCharles.Forsyth 	CPdsp2,
137*74a4d8c2SCharles.Forsyth 	CPidma1,
138*74a4d8c2SCharles.Forsyth 	CPidma2,
139*74a4d8c2SCharles.Forsyth 	CPtimer,
140*74a4d8c2SCharles.Forsyth 	CPspi,
141*74a4d8c2SCharles.Forsyth 	CPi2c,
142*74a4d8c2SCharles.Forsyth 	CPmax,
143*74a4d8c2SCharles.Forsyth };
144*74a4d8c2SCharles.Forsyth 
145*74a4d8c2SCharles.Forsyth struct CPMdev {
146*74a4d8c2SCharles.Forsyth 	int	id;	/* CPM channel number */
147*74a4d8c2SCharles.Forsyth 	int	irq;	/* CPIC interrupt number */
148*74a4d8c2SCharles.Forsyth 	int	rbase;	/* register offset in IO mem */
149*74a4d8c2SCharles.Forsyth 	int	pbase;	/* parameter offset in IO mem */
150*74a4d8c2SCharles.Forsyth 	void*	regs;	/* kernel address of registers */
151*74a4d8c2SCharles.Forsyth 	void*	param;	/* kernel address of parameters */
152*74a4d8c2SCharles.Forsyth };
153*74a4d8c2SCharles.Forsyth 
154*74a4d8c2SCharles.Forsyth CPMdev*	cpmdev(int);
155*74a4d8c2SCharles.Forsyth void	cpmop(CPMdev*, int, int);
156*74a4d8c2SCharles.Forsyth void*	cpmalloc(int, int);
157*74a4d8c2SCharles.Forsyth void	cpmfree(void*, int);
158*74a4d8c2SCharles.Forsyth IMM*	ioplock(void);
159*74a4d8c2SCharles.Forsyth void	iopunlock(void);
160*74a4d8c2SCharles.Forsyth 
161*74a4d8c2SCharles.Forsyth int	cpmidopen(int, void*);
162*74a4d8c2SCharles.Forsyth void	cpmidclose(int);
163*74a4d8c2SCharles.Forsyth void	sccnmsi(int, int, int);
164*74a4d8c2SCharles.Forsyth void	sccxstop(CPMdev*);
165*74a4d8c2SCharles.Forsyth void	smcnmsi(int, int);
166*74a4d8c2SCharles.Forsyth void	smcxstop(CPMdev*);
167*74a4d8c2SCharles.Forsyth 
168*74a4d8c2SCharles.Forsyth /*
169*74a4d8c2SCharles.Forsyth  * CPM timers
170*74a4d8c2SCharles.Forsyth  */
171*74a4d8c2SCharles.Forsyth enum {
172*74a4d8c2SCharles.Forsyth 	/* timer modes */
173*74a4d8c2SCharles.Forsyth 	CaptureRise=	1<<6,
174*74a4d8c2SCharles.Forsyth 	CaptureFall=	2<<6,
175*74a4d8c2SCharles.Forsyth 	CaptureEdge=	3<<6,
176*74a4d8c2SCharles.Forsyth 	TimerToggle=	1<<5,	/* toggle TOUTx* pin */
177*74a4d8c2SCharles.Forsyth 	TimerORI=	1<<4,	/* Output Reference Interrupt */
178*74a4d8c2SCharles.Forsyth 	TimerRestart=	1<<3,
179*74a4d8c2SCharles.Forsyth 	TimerSclk=	1<<1,
180*74a4d8c2SCharles.Forsyth 	TimerSclk16=	2<<1,
181*74a4d8c2SCharles.Forsyth 	TimerTIN=	3<<1,	/* clock by falling edge of TINx */
182*74a4d8c2SCharles.Forsyth 	TimerGate=	1<<0,	/* TGATE1* controls timer */
183*74a4d8c2SCharles.Forsyth 
184*74a4d8c2SCharles.Forsyth 	/* timer events */
185*74a4d8c2SCharles.Forsyth 	TimerREF=	1<<1,
186*74a4d8c2SCharles.Forsyth 	TimerCAP=	1<<0
187*74a4d8c2SCharles.Forsyth };
188*74a4d8c2SCharles.Forsyth 
189*74a4d8c2SCharles.Forsyth struct GTimer{
190*74a4d8c2SCharles.Forsyth 	int	x;
191*74a4d8c2SCharles.Forsyth 	int	inuse;
192*74a4d8c2SCharles.Forsyth 	int	event;
193*74a4d8c2SCharles.Forsyth 	ushort*	tmr;
194*74a4d8c2SCharles.Forsyth 	ushort*	trr;
195*74a4d8c2SCharles.Forsyth 	ushort*	tcr;
196*74a4d8c2SCharles.Forsyth 	ushort*	tcn;
197*74a4d8c2SCharles.Forsyth 	ushort*	ter;
198*74a4d8c2SCharles.Forsyth 	void*	arg;
199*74a4d8c2SCharles.Forsyth 	void	(*interrupt)(Ureg*, void*, GTimer*);
200*74a4d8c2SCharles.Forsyth };
201*74a4d8c2SCharles.Forsyth GTimer*	gtimer(ushort, ushort, void (*)(Ureg*,void*,GTimer*), void*);
202*74a4d8c2SCharles.Forsyth void	gtimerset(GTimer*, ushort, int);
203*74a4d8c2SCharles.Forsyth void	gtimerstart(GTimer*);
204*74a4d8c2SCharles.Forsyth void	gtimerstop(GTimer*);
205*74a4d8c2SCharles.Forsyth void	gtimerfree(GTimer*);
206*74a4d8c2SCharles.Forsyth 
207*74a4d8c2SCharles.Forsyth /*
208*74a4d8c2SCharles.Forsyth  * the structures below follow hardware/firmware layouts in the 8xx manuals:
209*74a4d8c2SCharles.Forsyth  * mind the data types, offsets and alignment
210*74a4d8c2SCharles.Forsyth  */
211*74a4d8c2SCharles.Forsyth 
212*74a4d8c2SCharles.Forsyth /*
213*74a4d8c2SCharles.Forsyth  * basic IO controller parameters (SMC and SCC)
214*74a4d8c2SCharles.Forsyth  */
215*74a4d8c2SCharles.Forsyth typedef struct IOCparam IOCparam;
216*74a4d8c2SCharles.Forsyth struct IOCparam {
217*74a4d8c2SCharles.Forsyth 	ushort	rbase;
218*74a4d8c2SCharles.Forsyth 	ushort	tbase;
219*74a4d8c2SCharles.Forsyth 	uchar	rfcr;
220*74a4d8c2SCharles.Forsyth 	uchar	tfcr;
221*74a4d8c2SCharles.Forsyth 	ushort	mrblr;
222*74a4d8c2SCharles.Forsyth 	ulong	rstate;
223*74a4d8c2SCharles.Forsyth 	ulong	rptr;
224*74a4d8c2SCharles.Forsyth 	ushort	rbptr;
225*74a4d8c2SCharles.Forsyth 	ushort	rcnt;
226*74a4d8c2SCharles.Forsyth 	ulong	rtmp;
227*74a4d8c2SCharles.Forsyth 	ulong	tstate;
228*74a4d8c2SCharles.Forsyth 	ulong	tptr;
229*74a4d8c2SCharles.Forsyth 	ushort	tbptr;
230*74a4d8c2SCharles.Forsyth 	ushort	tcnt;
231*74a4d8c2SCharles.Forsyth 	ulong	ttmp;
232*74a4d8c2SCharles.Forsyth };
233*74a4d8c2SCharles.Forsyth 
234*74a4d8c2SCharles.Forsyth typedef struct SCCparam SCCparam;
235*74a4d8c2SCharles.Forsyth struct SCCparam {
236*74a4d8c2SCharles.Forsyth 	IOCparam;
237*74a4d8c2SCharles.Forsyth 	ulong	rcrc;
238*74a4d8c2SCharles.Forsyth 	ulong	tcrc;
239*74a4d8c2SCharles.Forsyth };
240*74a4d8c2SCharles.Forsyth 
241*74a4d8c2SCharles.Forsyth typedef struct SCC SCC;
242*74a4d8c2SCharles.Forsyth struct SCC {
243*74a4d8c2SCharles.Forsyth 	ulong	gsmrl;
244*74a4d8c2SCharles.Forsyth 	ulong	gsmrh;
245*74a4d8c2SCharles.Forsyth 	ushort	psmr;
246*74a4d8c2SCharles.Forsyth 	uchar	rsvscc0[2];
247*74a4d8c2SCharles.Forsyth 	ushort	todr;
248*74a4d8c2SCharles.Forsyth 	ushort	dsr;
249*74a4d8c2SCharles.Forsyth 	ushort	scce;
250*74a4d8c2SCharles.Forsyth 	uchar	rsvscc1[2];
251*74a4d8c2SCharles.Forsyth 	ushort	sccm;
252*74a4d8c2SCharles.Forsyth 	uchar	rsvscc3;
253*74a4d8c2SCharles.Forsyth 	uchar	sccs;
254*74a4d8c2SCharles.Forsyth 	ushort	irmode;
255*74a4d8c2SCharles.Forsyth 	ushort	irsip;
256*74a4d8c2SCharles.Forsyth };
257*74a4d8c2SCharles.Forsyth 
258*74a4d8c2SCharles.Forsyth typedef struct SMC SMC;
259*74a4d8c2SCharles.Forsyth struct SMC {
260*74a4d8c2SCharles.Forsyth 	uchar	pad1[2];
261*74a4d8c2SCharles.Forsyth 	ushort	smcmr;
262*74a4d8c2SCharles.Forsyth 	uchar	pad2[2];
263*74a4d8c2SCharles.Forsyth 	uchar	smce;
264*74a4d8c2SCharles.Forsyth 	uchar	pad3[3];
265*74a4d8c2SCharles.Forsyth 	uchar	smcm;
266*74a4d8c2SCharles.Forsyth 	uchar	pad4[5];
267*74a4d8c2SCharles.Forsyth };
268*74a4d8c2SCharles.Forsyth 
269*74a4d8c2SCharles.Forsyth typedef struct SPI SPI;
270*74a4d8c2SCharles.Forsyth struct SPI {
271*74a4d8c2SCharles.Forsyth 	ushort	spmode;
272*74a4d8c2SCharles.Forsyth 	uchar	res1[4];
273*74a4d8c2SCharles.Forsyth 	uchar	spie;
274*74a4d8c2SCharles.Forsyth 	uchar	res2[3];
275*74a4d8c2SCharles.Forsyth 	uchar	spim;
276*74a4d8c2SCharles.Forsyth 	uchar	res3[2];
277*74a4d8c2SCharles.Forsyth 	uchar	spcom;
278*74a4d8c2SCharles.Forsyth 	uchar	res4[10];
279*74a4d8c2SCharles.Forsyth };
280*74a4d8c2SCharles.Forsyth 
281*74a4d8c2SCharles.Forsyth typedef struct USB USB;
282*74a4d8c2SCharles.Forsyth struct USB {	/* 823 only */
283*74a4d8c2SCharles.Forsyth 	uchar	usmod;
284*74a4d8c2SCharles.Forsyth 	uchar	usadr;
285*74a4d8c2SCharles.Forsyth 	uchar	uscom;
286*74a4d8c2SCharles.Forsyth 	uchar	rsvu1;
287*74a4d8c2SCharles.Forsyth 	ushort	usep[4];
288*74a4d8c2SCharles.Forsyth 	uchar	rsvu2[4];
289*74a4d8c2SCharles.Forsyth 	ushort	usber;
290*74a4d8c2SCharles.Forsyth 	uchar	rsvu3[2];
291*74a4d8c2SCharles.Forsyth 	ushort	usbmr;
292*74a4d8c2SCharles.Forsyth 	uchar	rsvu4;
293*74a4d8c2SCharles.Forsyth 	uchar	usbs;
294*74a4d8c2SCharles.Forsyth 	uchar	rsvu5[8];
295*74a4d8c2SCharles.Forsyth };
296*74a4d8c2SCharles.Forsyth 
297*74a4d8c2SCharles.Forsyth typedef struct IMM IMM;
298*74a4d8c2SCharles.Forsyth struct IMM {
299*74a4d8c2SCharles.Forsyth 	struct {	/* general SIU */
300*74a4d8c2SCharles.Forsyth 		ulong	siumcr;
301*74a4d8c2SCharles.Forsyth 		ulong	sypcr;
302*74a4d8c2SCharles.Forsyth 		uchar	rsv0[0xE-0x8];
303*74a4d8c2SCharles.Forsyth 		ushort	swsr;
304*74a4d8c2SCharles.Forsyth 		ulong	sipend;
305*74a4d8c2SCharles.Forsyth 		ulong	simask;
306*74a4d8c2SCharles.Forsyth 		ulong	siel;
307*74a4d8c2SCharles.Forsyth 		uchar	sivec;
308*74a4d8c2SCharles.Forsyth 		uchar	padv[3];
309*74a4d8c2SCharles.Forsyth 		ulong	tesr;
310*74a4d8c2SCharles.Forsyth 		uchar	rsv1[0x30-0x24];
311*74a4d8c2SCharles.Forsyth 		ulong	sdcr;
312*74a4d8c2SCharles.Forsyth 		uchar	rsv2[0x80-0x34];
313*74a4d8c2SCharles.Forsyth 	};
314*74a4d8c2SCharles.Forsyth 	struct {	/* PCMCIA */
315*74a4d8c2SCharles.Forsyth 		struct {
316*74a4d8c2SCharles.Forsyth 			ulong	base;
317*74a4d8c2SCharles.Forsyth 			ulong	option;
318*74a4d8c2SCharles.Forsyth 		} pcmr[8];
319*74a4d8c2SCharles.Forsyth 		uchar	rsv3[0xe0-0xc0];
320*74a4d8c2SCharles.Forsyth 		ulong	pgcr[2];
321*74a4d8c2SCharles.Forsyth 		ulong	pscr;
322*74a4d8c2SCharles.Forsyth 		uchar	rsv4[0xf0-0xec];
323*74a4d8c2SCharles.Forsyth 		ulong	pipr;
324*74a4d8c2SCharles.Forsyth 		uchar	rsv5[4];
325*74a4d8c2SCharles.Forsyth 		ulong	per;
326*74a4d8c2SCharles.Forsyth 		uchar	rsv6[4];
327*74a4d8c2SCharles.Forsyth 	};
328*74a4d8c2SCharles.Forsyth 	struct {	/* MEMC */
329*74a4d8c2SCharles.Forsyth 		struct {
330*74a4d8c2SCharles.Forsyth 			ulong	base;
331*74a4d8c2SCharles.Forsyth 			ulong	option;
332*74a4d8c2SCharles.Forsyth 		} memc[8];
333*74a4d8c2SCharles.Forsyth 		uchar	rsv7a[0x24];
334*74a4d8c2SCharles.Forsyth 		ulong	mar;
335*74a4d8c2SCharles.Forsyth 		ulong	mcr;
336*74a4d8c2SCharles.Forsyth 		uchar	rsv7b[4];
337*74a4d8c2SCharles.Forsyth 		ulong	mamr;
338*74a4d8c2SCharles.Forsyth 		ulong	mbmr;
339*74a4d8c2SCharles.Forsyth 		ushort	mstat;
340*74a4d8c2SCharles.Forsyth 		ushort	mptpr;
341*74a4d8c2SCharles.Forsyth 		ulong	mdr;
342*74a4d8c2SCharles.Forsyth 		uchar	rsv7c[0x80];
343*74a4d8c2SCharles.Forsyth 	};
344*74a4d8c2SCharles.Forsyth 	struct {	/* system integration timers */
345*74a4d8c2SCharles.Forsyth 		ushort	tbscr;
346*74a4d8c2SCharles.Forsyth 		uchar	rsv8a[2];
347*74a4d8c2SCharles.Forsyth 		ulong	tbrefu;
348*74a4d8c2SCharles.Forsyth 		ulong	tbrefl;
349*74a4d8c2SCharles.Forsyth 		uchar	rsv8b[0x14];
350*74a4d8c2SCharles.Forsyth 		ushort	rtcsc;
351*74a4d8c2SCharles.Forsyth 		uchar	rsv8c[2];
352*74a4d8c2SCharles.Forsyth 		ulong	rtc;
353*74a4d8c2SCharles.Forsyth 		ulong	rtsec;
354*74a4d8c2SCharles.Forsyth 		ulong	rtcal;
355*74a4d8c2SCharles.Forsyth 		uchar	rsv8d[0x10];
356*74a4d8c2SCharles.Forsyth 		ushort	piscr;
357*74a4d8c2SCharles.Forsyth 		ushort	rsv8e;
358*74a4d8c2SCharles.Forsyth 		ulong	pitc;
359*74a4d8c2SCharles.Forsyth 		ulong	pitr;
360*74a4d8c2SCharles.Forsyth 		uchar	rsv8f[0x34];
361*74a4d8c2SCharles.Forsyth 	};
362*74a4d8c2SCharles.Forsyth 	struct {	/* 280: clocks and resets */
363*74a4d8c2SCharles.Forsyth 		ulong	sccr;
364*74a4d8c2SCharles.Forsyth 		ulong	plprcr;
365*74a4d8c2SCharles.Forsyth 		ulong	rsr;
366*74a4d8c2SCharles.Forsyth 		uchar	rsv9[0x300-0x28c];
367*74a4d8c2SCharles.Forsyth 	};
368*74a4d8c2SCharles.Forsyth 	struct {	/* 300: system integration timers keys */
369*74a4d8c2SCharles.Forsyth 		ulong	tbscrk;
370*74a4d8c2SCharles.Forsyth 		ulong	tbrefuk;
371*74a4d8c2SCharles.Forsyth 		ulong	tbreflk;
372*74a4d8c2SCharles.Forsyth 		ulong	tbk;
373*74a4d8c2SCharles.Forsyth 		uchar	rsv10a[0x10];
374*74a4d8c2SCharles.Forsyth 		ulong	rtcsck;
375*74a4d8c2SCharles.Forsyth 		ulong	rtck;
376*74a4d8c2SCharles.Forsyth 		ulong	rtseck;
377*74a4d8c2SCharles.Forsyth 		ulong	rtcalk;
378*74a4d8c2SCharles.Forsyth 		uchar	rsv10b[0x10];
379*74a4d8c2SCharles.Forsyth 		ulong	piscrk;
380*74a4d8c2SCharles.Forsyth 		ulong	pitck;
381*74a4d8c2SCharles.Forsyth 		uchar	rsv10c[0x38];
382*74a4d8c2SCharles.Forsyth 	};
383*74a4d8c2SCharles.Forsyth 	struct {	/* 380: clocks and resets keys */
384*74a4d8c2SCharles.Forsyth 		ulong	sccrk;
385*74a4d8c2SCharles.Forsyth 		ulong	plprcrk;
386*74a4d8c2SCharles.Forsyth 		ulong	rsrk;
387*74a4d8c2SCharles.Forsyth 		uchar	rsv11[0x800-0x38C];
388*74a4d8c2SCharles.Forsyth 	};
389*74a4d8c2SCharles.Forsyth 	struct {	/* 800: video controller */
390*74a4d8c2SCharles.Forsyth 		ushort	vccr;
391*74a4d8c2SCharles.Forsyth 		ushort	pad11a;
392*74a4d8c2SCharles.Forsyth 		uchar	vsr;
393*74a4d8c2SCharles.Forsyth 		uchar	pad11b;
394*74a4d8c2SCharles.Forsyth 		uchar	vcmr;
395*74a4d8c2SCharles.Forsyth 		uchar	pad11c;
396*74a4d8c2SCharles.Forsyth 		ulong	vbcb;
397*74a4d8c2SCharles.Forsyth 		ulong	pad11d;
398*74a4d8c2SCharles.Forsyth 		ulong	vfcr0;
399*74a4d8c2SCharles.Forsyth 		ulong	vfaa0;
400*74a4d8c2SCharles.Forsyth 		ulong	vfba0;
401*74a4d8c2SCharles.Forsyth 		ulong	vfcr1;
402*74a4d8c2SCharles.Forsyth 		ulong	vfaa1;
403*74a4d8c2SCharles.Forsyth 		ulong	vfba1;
404*74a4d8c2SCharles.Forsyth 		uchar	rsv11a[0x840-0x828];
405*74a4d8c2SCharles.Forsyth 	};
406*74a4d8c2SCharles.Forsyth 	struct {	/* 840: LCD */
407*74a4d8c2SCharles.Forsyth 		ulong	lccr;
408*74a4d8c2SCharles.Forsyth 		ulong	lchcr;
409*74a4d8c2SCharles.Forsyth 		ulong	lcvcr;
410*74a4d8c2SCharles.Forsyth 		ulong	rsv11b;
411*74a4d8c2SCharles.Forsyth 		ulong	lcfaa;
412*74a4d8c2SCharles.Forsyth 		ulong	lcfba;
413*74a4d8c2SCharles.Forsyth 		uchar	lcsr;
414*74a4d8c2SCharles.Forsyth 		uchar	rsv11c[0x860-0x859];
415*74a4d8c2SCharles.Forsyth 	};
416*74a4d8c2SCharles.Forsyth 	struct {	/* 860: I2C */
417*74a4d8c2SCharles.Forsyth 		uchar	i2mod;
418*74a4d8c2SCharles.Forsyth 		uchar	rsv12a[3];
419*74a4d8c2SCharles.Forsyth 		uchar	i2add;
420*74a4d8c2SCharles.Forsyth 		uchar	rsv12b[3];
421*74a4d8c2SCharles.Forsyth 		uchar	i2brg;
422*74a4d8c2SCharles.Forsyth 		uchar	rsv12c[3];
423*74a4d8c2SCharles.Forsyth 		uchar	i2com;
424*74a4d8c2SCharles.Forsyth 		uchar	rsv12d[3];
425*74a4d8c2SCharles.Forsyth 		uchar	i2cer;
426*74a4d8c2SCharles.Forsyth 		uchar	rsv12e[3];
427*74a4d8c2SCharles.Forsyth 		uchar	i2cmr;
428*74a4d8c2SCharles.Forsyth 		uchar	rsv12[0x900-0x875];
429*74a4d8c2SCharles.Forsyth 	};
430*74a4d8c2SCharles.Forsyth 	struct {	/* 900: DMA */
431*74a4d8c2SCharles.Forsyth 		uchar	rsv13[4];
432*74a4d8c2SCharles.Forsyth 		ulong	sdar;
433*74a4d8c2SCharles.Forsyth 		uchar	sdsr;
434*74a4d8c2SCharles.Forsyth 		uchar	pad1[3];
435*74a4d8c2SCharles.Forsyth 		uchar	sdmr;
436*74a4d8c2SCharles.Forsyth 		uchar	pad2[3];
437*74a4d8c2SCharles.Forsyth 		uchar	idsr1;
438*74a4d8c2SCharles.Forsyth 		uchar	pad3[3];
439*74a4d8c2SCharles.Forsyth 		uchar	idmr1;
440*74a4d8c2SCharles.Forsyth 		uchar	pad4[3];
441*74a4d8c2SCharles.Forsyth 		uchar	idsr2;
442*74a4d8c2SCharles.Forsyth 		uchar	pad5[3];
443*74a4d8c2SCharles.Forsyth 		uchar	idmr2;
444*74a4d8c2SCharles.Forsyth 		uchar	pad6[0x930-0x91D];
445*74a4d8c2SCharles.Forsyth 	};
446*74a4d8c2SCharles.Forsyth 	struct {	/* CPM interrupt control */
447*74a4d8c2SCharles.Forsyth 		ushort	civr;
448*74a4d8c2SCharles.Forsyth 		uchar	pad7[0x940-0x932];
449*74a4d8c2SCharles.Forsyth 		ulong	cicr;
450*74a4d8c2SCharles.Forsyth 		ulong	cipr;
451*74a4d8c2SCharles.Forsyth 		ulong	cimr;
452*74a4d8c2SCharles.Forsyth 		ulong	cisr;
453*74a4d8c2SCharles.Forsyth 	};
454*74a4d8c2SCharles.Forsyth 	struct {	/* input/output port */
455*74a4d8c2SCharles.Forsyth 		ushort	padir;
456*74a4d8c2SCharles.Forsyth 		ushort	papar;
457*74a4d8c2SCharles.Forsyth 		ushort	paodr;
458*74a4d8c2SCharles.Forsyth 		ushort	padat;
459*74a4d8c2SCharles.Forsyth 		uchar	pad8[8];
460*74a4d8c2SCharles.Forsyth 		ushort	pcdir;
461*74a4d8c2SCharles.Forsyth 		ushort	pcpar;
462*74a4d8c2SCharles.Forsyth 		ushort	pcso;
463*74a4d8c2SCharles.Forsyth 		ushort	pcdat;
464*74a4d8c2SCharles.Forsyth 		ushort	pcint;
465*74a4d8c2SCharles.Forsyth 		uchar	pad9[6];
466*74a4d8c2SCharles.Forsyth 		ushort	pddir;
467*74a4d8c2SCharles.Forsyth 		ushort	pdpar;
468*74a4d8c2SCharles.Forsyth 		ushort	rsv14a;
469*74a4d8c2SCharles.Forsyth 		ushort	pddat;
470*74a4d8c2SCharles.Forsyth 		uchar	rsv14[0x980-0x978];
471*74a4d8c2SCharles.Forsyth 	};
472*74a4d8c2SCharles.Forsyth 	struct {	/* CPM timers */
473*74a4d8c2SCharles.Forsyth 		ushort	tgcr;
474*74a4d8c2SCharles.Forsyth 		uchar	rsv15a[0x990-0x982];
475*74a4d8c2SCharles.Forsyth 		ushort	tmr1;
476*74a4d8c2SCharles.Forsyth 		ushort	tmr2;
477*74a4d8c2SCharles.Forsyth 		ushort	trr1;
478*74a4d8c2SCharles.Forsyth 		ushort	trr2;
479*74a4d8c2SCharles.Forsyth 		ushort	tcr1;
480*74a4d8c2SCharles.Forsyth 		ushort	tcr2;
481*74a4d8c2SCharles.Forsyth 		ushort	tcn1;
482*74a4d8c2SCharles.Forsyth 		ushort	tcn2;
483*74a4d8c2SCharles.Forsyth 		ushort	tmr3;
484*74a4d8c2SCharles.Forsyth 		ushort	tmr4;
485*74a4d8c2SCharles.Forsyth 		ushort	trr3;
486*74a4d8c2SCharles.Forsyth 		ushort	trr4;
487*74a4d8c2SCharles.Forsyth 		ushort	tcr3;
488*74a4d8c2SCharles.Forsyth 		ushort	tcr4;
489*74a4d8c2SCharles.Forsyth 		ushort	tcn3;
490*74a4d8c2SCharles.Forsyth 		ushort	tcn4;
491*74a4d8c2SCharles.Forsyth 		ushort	ter1;
492*74a4d8c2SCharles.Forsyth 		ushort	ter2;
493*74a4d8c2SCharles.Forsyth 		ushort	ter3;
494*74a4d8c2SCharles.Forsyth 		ushort	ter4;
495*74a4d8c2SCharles.Forsyth 		uchar	rsv15[0x9C0-0x9B8];
496*74a4d8c2SCharles.Forsyth 	};
497*74a4d8c2SCharles.Forsyth 	struct {	/* CPM */
498*74a4d8c2SCharles.Forsyth 		ushort	cpcr;
499*74a4d8c2SCharles.Forsyth 		uchar	res0[2];
500*74a4d8c2SCharles.Forsyth 		ushort	rccr;
501*74a4d8c2SCharles.Forsyth 		uchar	res1;
502*74a4d8c2SCharles.Forsyth 		uchar	rmds;
503*74a4d8c2SCharles.Forsyth 		uchar	res2a[4];
504*74a4d8c2SCharles.Forsyth 		ushort	rctr1;
505*74a4d8c2SCharles.Forsyth 		ushort	rctr2;
506*74a4d8c2SCharles.Forsyth 		ushort	rctr3;
507*74a4d8c2SCharles.Forsyth 		ushort	rctr4;
508*74a4d8c2SCharles.Forsyth 		uchar	res2[2];
509*74a4d8c2SCharles.Forsyth 		ushort	rter;
510*74a4d8c2SCharles.Forsyth 		uchar	res3[2];
511*74a4d8c2SCharles.Forsyth 		ushort	rtmr;
512*74a4d8c2SCharles.Forsyth 		uchar	rsv16[0x9F0-0x9DC];
513*74a4d8c2SCharles.Forsyth 	};
514*74a4d8c2SCharles.Forsyth 	union {	/* BRG */
515*74a4d8c2SCharles.Forsyth 		struct {
516*74a4d8c2SCharles.Forsyth 			ulong	brgc1;
517*74a4d8c2SCharles.Forsyth 			ulong	brgc2;
518*74a4d8c2SCharles.Forsyth 			ulong	brgc3;
519*74a4d8c2SCharles.Forsyth 			ulong	brgc4;
520*74a4d8c2SCharles.Forsyth 		};
521*74a4d8c2SCharles.Forsyth 		ulong	brgc[4];
522*74a4d8c2SCharles.Forsyth 	};
523*74a4d8c2SCharles.Forsyth 	uchar	skip0[0xAB2-0xA00];	/* USB, SCC, SMC, SPI: address using cpmdev(CP...)->regs */
524*74a4d8c2SCharles.Forsyth 	struct {	/* PIP */
525*74a4d8c2SCharles.Forsyth 		ushort	pipc;		/* not 823 */
526*74a4d8c2SCharles.Forsyth 		ushort	ptpr;		/* not 823 */
527*74a4d8c2SCharles.Forsyth 		ulong	pbdir;
528*74a4d8c2SCharles.Forsyth 		ulong	pbpar;
529*74a4d8c2SCharles.Forsyth 		uchar	pad10[2];
530*74a4d8c2SCharles.Forsyth 		ushort	pbodr;
531*74a4d8c2SCharles.Forsyth 		ulong	pbdat;
532*74a4d8c2SCharles.Forsyth 		uchar	pad11[0xAE0-0xAC8];
533*74a4d8c2SCharles.Forsyth 	};
534*74a4d8c2SCharles.Forsyth 	struct {	/* SI */
535*74a4d8c2SCharles.Forsyth 		ulong	simode;
536*74a4d8c2SCharles.Forsyth 		uchar	sigmr;
537*74a4d8c2SCharles.Forsyth 		uchar	pad12;
538*74a4d8c2SCharles.Forsyth 		uchar	sistr;
539*74a4d8c2SCharles.Forsyth 		uchar	sicmr;
540*74a4d8c2SCharles.Forsyth 		uchar	pad13[4];
541*74a4d8c2SCharles.Forsyth 		ulong	sicr;
542*74a4d8c2SCharles.Forsyth 		ulong	sirp;
543*74a4d8c2SCharles.Forsyth 		uchar	pad14[0xB00-0xAF4];
544*74a4d8c2SCharles.Forsyth 	};
545*74a4d8c2SCharles.Forsyth 	ulong	vcram[64];
546*74a4d8c2SCharles.Forsyth 	ushort	siram[256];
547*74a4d8c2SCharles.Forsyth 	ushort	lcdmap[256];
548*74a4d8c2SCharles.Forsyth };
549*74a4d8c2SCharles.Forsyth 
550*74a4d8c2SCharles.Forsyth /*
551*74a4d8c2SCharles.Forsyth  * PCMCIA structures known by both ../port/cis.c and the pcmcia driver
552*74a4d8c2SCharles.Forsyth  */
553*74a4d8c2SCharles.Forsyth 
554*74a4d8c2SCharles.Forsyth /*
555*74a4d8c2SCharles.Forsyth  * Map between physical memory space and PCMCIA card memory space.
556*74a4d8c2SCharles.Forsyth  */
557*74a4d8c2SCharles.Forsyth struct PCMmap {
558*74a4d8c2SCharles.Forsyth 	ulong	ca;			/* card address */
559*74a4d8c2SCharles.Forsyth 	ulong	cea;			/* card end address */
560*74a4d8c2SCharles.Forsyth 	ulong	isa;			/* local virtual address */
561*74a4d8c2SCharles.Forsyth 	int	len;			/* length of the ISA area */
562*74a4d8c2SCharles.Forsyth 	int	attr;			/* attribute memory */
563*74a4d8c2SCharles.Forsyth 	int	slotno;			/* owning slot */
564*74a4d8c2SCharles.Forsyth 	int	ref;
565*74a4d8c2SCharles.Forsyth };
566*74a4d8c2SCharles.Forsyth 
567*74a4d8c2SCharles.Forsyth /*
568*74a4d8c2SCharles.Forsyth  *  a PCMCIA configuration entry
569*74a4d8c2SCharles.Forsyth  */
570*74a4d8c2SCharles.Forsyth struct PCMconftab
571*74a4d8c2SCharles.Forsyth {
572*74a4d8c2SCharles.Forsyth 	int	index;
573*74a4d8c2SCharles.Forsyth 	ushort	irqs;		/* legal irqs */
574*74a4d8c2SCharles.Forsyth 	uchar	irqtype;
575*74a4d8c2SCharles.Forsyth 	uchar	bit16;		/* true for 16 bit access */
576*74a4d8c2SCharles.Forsyth 	uchar	nlines;
577*74a4d8c2SCharles.Forsyth 	struct {
578*74a4d8c2SCharles.Forsyth 		ulong	start;
579*74a4d8c2SCharles.Forsyth 		ulong	len;
580*74a4d8c2SCharles.Forsyth 		PCMmap*	map;
581*74a4d8c2SCharles.Forsyth 	} io[16];
582*74a4d8c2SCharles.Forsyth 	int	nio;
583*74a4d8c2SCharles.Forsyth 	int	vcc;
584*74a4d8c2SCharles.Forsyth 	int	vpp1;
585*74a4d8c2SCharles.Forsyth 	int	vpp2;
586*74a4d8c2SCharles.Forsyth 	uchar	memwait;
587*74a4d8c2SCharles.Forsyth 	ulong	maxwait;
588*74a4d8c2SCharles.Forsyth 	ulong	readywait;
589*74a4d8c2SCharles.Forsyth 	ulong	otherwait;
590*74a4d8c2SCharles.Forsyth };
591*74a4d8c2SCharles.Forsyth 
592*74a4d8c2SCharles.Forsyth /*
593*74a4d8c2SCharles.Forsyth  *  PCMCIA card slot
594*74a4d8c2SCharles.Forsyth  */
595*74a4d8c2SCharles.Forsyth struct PCMslot
596*74a4d8c2SCharles.Forsyth {
597*74a4d8c2SCharles.Forsyth //	RWlock;
598*74a4d8c2SCharles.Forsyth 
599*74a4d8c2SCharles.Forsyth //	Ref	ref;
600*74a4d8c2SCharles.Forsyth Ref;
601*74a4d8c2SCharles.Forsyth 
602*74a4d8c2SCharles.Forsyth 	void*	ctlr;	/* controller for this slot */
603*74a4d8c2SCharles.Forsyth 
604*74a4d8c2SCharles.Forsyth 	long	memlen;		/* memory length */
605*74a4d8c2SCharles.Forsyth 	uchar	slotno;		/* slot number */
606*74a4d8c2SCharles.Forsyth 	uchar	slotshift;	/* >> register to meet mask; << mask to meet register */
607*74a4d8c2SCharles.Forsyth 	void	*regs;		/* i/o registers */
608*74a4d8c2SCharles.Forsyth 	void	*mem;		/* memory */
609*74a4d8c2SCharles.Forsyth 	void	*attr;		/* attribute memory */
610*74a4d8c2SCharles.Forsyth 
611*74a4d8c2SCharles.Forsyth 	/* status */
612*74a4d8c2SCharles.Forsyth 	uchar	occupied;	/* card in the slot */
613*74a4d8c2SCharles.Forsyth 	uchar	configed;	/* card configured */
614*74a4d8c2SCharles.Forsyth 	uchar	busy;
615*74a4d8c2SCharles.Forsyth 	uchar	powered;
616*74a4d8c2SCharles.Forsyth 	uchar	battery;
617*74a4d8c2SCharles.Forsyth 	uchar	wrprot;
618*74a4d8c2SCharles.Forsyth 	uchar	enabled;
619*74a4d8c2SCharles.Forsyth 	uchar	special;
620*74a4d8c2SCharles.Forsyth 	uchar	dsize;
621*74a4d8c2SCharles.Forsyth 	uchar	v3_3;
622*74a4d8c2SCharles.Forsyth 	uchar	voltage;
623*74a4d8c2SCharles.Forsyth 
624*74a4d8c2SCharles.Forsyth 	/* cis info */
625*74a4d8c2SCharles.Forsyth 	int	cisread;	/* set when the cis has been read */
626*74a4d8c2SCharles.Forsyth 	char	verstr[512];	/* version string */
627*74a4d8c2SCharles.Forsyth 	uchar	cpresent;	/* config registers present */
628*74a4d8c2SCharles.Forsyth 	ulong	caddr;		/* relative address of config registers */
629*74a4d8c2SCharles.Forsyth 	int	nctab;		/* number of config table entries */
630*74a4d8c2SCharles.Forsyth 	PCMconftab	ctab[8];
631*74a4d8c2SCharles.Forsyth 	PCMconftab	*def;		/* default conftab */
632*74a4d8c2SCharles.Forsyth 
633*74a4d8c2SCharles.Forsyth 	/* maps are fixed */
634*74a4d8c2SCharles.Forsyth 	PCMmap memmap;
635*74a4d8c2SCharles.Forsyth 	PCMmap attrmap;
636*74a4d8c2SCharles.Forsyth 
637*74a4d8c2SCharles.Forsyth 	struct {
638*74a4d8c2SCharles.Forsyth 		void	(*f)(Ureg*, void*);
639*74a4d8c2SCharles.Forsyth 		void	*arg;
640*74a4d8c2SCharles.Forsyth 	} intr;
641*74a4d8c2SCharles.Forsyth 	struct {
642*74a4d8c2SCharles.Forsyth 		void	(*f)(void*, int);
643*74a4d8c2SCharles.Forsyth 		void	*arg;
644*74a4d8c2SCharles.Forsyth 	} notify;
645*74a4d8c2SCharles.Forsyth };
646*74a4d8c2SCharles.Forsyth 
647*74a4d8c2SCharles.Forsyth /* ../port/cis.c */
648*74a4d8c2SCharles.Forsyth void	pcmcisread(PCMslot*);
649*74a4d8c2SCharles.Forsyth int	pcmcistuple(int, int, int, void*, int);
650*74a4d8c2SCharles.Forsyth 
651*74a4d8c2SCharles.Forsyth /* devpcmcia.c */
652*74a4d8c2SCharles.Forsyth PCMmap*	pcmmap(int, ulong, int, int);
653*74a4d8c2SCharles.Forsyth void	pcmunmap(int, PCMmap*);
654*74a4d8c2SCharles.Forsyth 
655*74a4d8c2SCharles.Forsyth /*
656*74a4d8c2SCharles.Forsyth  * used by ../port/devi2c.c and i2c.c
657*74a4d8c2SCharles.Forsyth  */
658*74a4d8c2SCharles.Forsyth struct I2Cdev {
659*74a4d8c2SCharles.Forsyth 	int	addr;
660*74a4d8c2SCharles.Forsyth 	int	salen;	/* length in bytes of subaddress, if used; 0 otherwise */
661*74a4d8c2SCharles.Forsyth 	int	tenbit;	/* 10-bit addresses */
662*74a4d8c2SCharles.Forsyth };
663*74a4d8c2SCharles.Forsyth 
664*74a4d8c2SCharles.Forsyth long	i2crecv(I2Cdev*, void*, long, ulong);
665*74a4d8c2SCharles.Forsyth long	i2csend(I2Cdev*, void*, long, ulong);
666*74a4d8c2SCharles.Forsyth void	i2csetup(int);
667