summaryrefslogtreecommitdiff
path: root/sys/dev/sbus/stp4020reg.h
blob: 85672d92e46f1e75ddfb76ca2fa3613b2ce52603 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
/*	$OpenBSD: stp4020reg.h,v 1.2 2002/06/21 07:49:31 fgsch Exp $	*/
/*	$NetBSD: stp4020reg.h,v 1.1 1998/11/22 22:14:35 pk Exp $	*/

/*-
 * Copyright (c) 1998 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Paul Kranenburg.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *        This product includes software developed by the NetBSD
 *        Foundation, Inc. and its contributors.
 * 4. Neither the name of The NetBSD Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */


#ifndef _STP4020_REG_H
#define	_STP4020_REG_H

/*
 * STP4020: SBus/PCMCIA bridge supporting two Type-3 PCMCIA cards.
 * Programming information source:
 *	- http://www.sun.com/microelectronics/datasheets/stp4020/
 *	- SunOS 5.5 header file
 */

/*
 * General chip attibutes.
 */
#define	STP4020_NSOCK	2	/* number of PCCARD sockets per STP4020 */
#define	STP4020_NWIN	3	/* number of windows per socket */

/*
 * Socket control registers.
 *
 * Each PCMCIA socket has two interface control registers and two interface
 * status registers associated with it.
 */

/*
 * Socket Interface Control register 0
 */
#define	STP4020_ICR0_rsvd1	0xc000	/* reserved bits */
#define	STP4020_ICR0_PROMEN	0x2000	/* FCode PROM enable */
/* Status change interrupts can be routed to one of two SBus interrupt levels:*/
#define	STP4020_ICR0_SCILVL	0x1000	/* card status change interrupt level */
#define	 STP4020_ICR0_SCILVL_SB0	0x0000	/* interrupt on *SB_INT[0] */
#define	 STP4020_ICR0_SCILVL_SB1	0x1000	/* interrupt on *SB_INT[1] */
/* Interrupt enable bits: */
#define	STP4020_ICR0_CDIE	0x0800	/* card detect interrupt enable */
#define	STP4020_ICR0_BVD2IE	0x0400	/* battery voltage detect 2 int en. */
#define	STP4020_ICR0_BVD1IE	0x0200	/* battery voltage detect 1 int en. */
#define	STP4020_ICR0_RDYIE	0x0100	/* ready/busy interrupt enable */
#define	STP4020_ICR0_WPIE	0x0080	/* write protect interrupt enable */
#define	STP4020_ICR0_CTOIE	0x0040	/* PC card timeout interrupt enable */
#define	STP4020_ICR0_rsvd2	0x0020	/* */
#define	STP4020_ICR0_IOIE	0x0010	/* I/O (*IRQ) interrupt enable */
/* PC card I/O interrupts can also be routed to one of two SBus intr levels: */
#define	STP4020_ICR0_IOILVL	0x0008	/* I/O (*IRQ) interrupt level (SBus) */
#define	 STP4020_ICR0_IOILVL_SB0	0x0000	/* interrupt on *SB_INT[0] */
#define	 STP4020_ICR0_IOILVL_SB1	0x0008	/* interrupt on *SB_INT[1] */

#define	STP4020_ICR0_SPKREN	0x0004	/* *SPKR_OUT enable */
#define	STP4020_ICR0_RESET	0x0002	/* PC card reset */
#define	STP4020_ICR0_IFTYPE	0x0001	/* PC card interface type */
#define	 STP4020_ICR0_IFTYPE_MEM	0x0000	/* MEMORY only */
#define	 STP4020_ICR0_IFTYPE_IO		0x0001	/* MEMORY and I/O */
#define STP4020_ICR0_BITS	"\177\010"				\
				"b\0IFTYPE\0b\1RESET\0b\2SPKREN\0"	\
				"b\3IOILVL\0b\4IOIE\0b\6CTOIE\0"	\
				"b\7WPIE\0b\10RDYIE\0b\11BVD1IE\0b\12BVD2IE\0"\
				"b\13CDIE\0b\14SCILV\0b\15PROMEN\0\0"

/* Shorthand for all status change interrupts enables */
#define	STP4020_ICR0_ALL_STATUS_IE (	\
	STP4020_ICR0_CDIE |		\
	STP4020_ICR0_BVD2IE |		\
	STP4020_ICR0_BVD1IE |		\
	STP4020_ICR0_RDYIE |		\
	STP4020_ICR0_WPIE |		\
	STP4020_ICR0_CTOIE		\
)

/*
 * Socket Interface Control register 1
 */
#define	STP4020_ICR1_LPBKEN	0x8000	/* PC card data loopback enable */
#define	STP4020_ICR1_CD1DB	0x4000	/* card detect 1 diagnostic bit */
#define	STP4020_ICR1_BVD2DB	0x2000	/* battery voltage detect 2 diag bit */
#define	STP4020_ICR1_BVD1DB	0x1000	/* battery voltage detect 1 diag bit */
#define	STP4020_ICR1_RDYDB	0x0800	/* ready/busy diagnostic bit */
#define	STP4020_ICR1_WPDB	0x0400	/* write protect diagnostic bit */
#define	STP4020_ICR1_WAITDB	0x0200	/* *WAIT diagnostic bit */
#define	STP4020_ICR1_DIAGEN	0x0100	/* diagnostic enable bit */
#define	STP4020_ICR1_rsvd1	0x0080	/* reserved */
#define	STP4020_ICR1_APWREN	0x0040	/* PC card auto power switch enable */

/*
 * The Vpp controls are two-bit fields which specify which voltage
 * should be switched onto Vpp for this socket.
 *
 * Both of the "no connect" states are equal.
 */
#define	STP4020_ICR1_VPP2EN	0x0030	/* Vpp2 power enable */
#define	 STP4020_ICR1_VPP2_OFF	0x0000	/* no connect */
#define	 STP4020_ICR1_VPP2_VCC	0x0010	/* Vcc switched onto Vpp2 */
#define	 STP4020_ICR1_VPP2_VPP	0x0020	/* Vpp switched onto Vpp2 */
#define	 STP4020_ICR1_VPP2_ZIP	0x0030	/* no connect */

#define	STP4020_ICR1_VPP1EN	0x000c	/* Vpp1 power enable */
#define	 STP4020_ICR1_VPP1_OFF	0x0000	/* no connect */
#define	 STP4020_ICR1_VPP1_VCC	0x0004	/* Vcc switched onto Vpp1 */
#define	 STP4020_ICR1_VPP1_VPP	0x0008	/* Vpp switched onto Vpp1 */
#define	 STP4020_ICR1_VPP1_ZIP	0x000c	/* no connect */

#define	STP4020_ICR1_MSTPWR	0x0002	/* PC card master power enable */
#define	STP4020_ICR1_PCIFOE	0x0001	/* PC card interface output enable */

#define STP4020_ICR1_BITS	"\177\010"				     \
				"b\0PCIFOE\0b\1MSTPWR\0f\2\2VPP1EN\0"	     \
				"f\4\2VPP2EN\0b\6APWREN\0b\10DIAGEN\0"	     \
				"b\11WAITDB\0b\12WPDB\0b\13RDYDB\0"	     \
				"b\14BVD1D\0b\15BVD2D\0\16CD1DB\0b\17LPBKEN\0"

/*
 * Socket Interface Status register 0
 *
 * Some signals in this register change meaning depending on whether
 * the socket is configured as MEMORY-ONLY or MEMORY & I/O:
 *	mo: valid only if the socket is in memory-only mode
 *	io: valid only if the socket is in memory and I/O mode.
 *
 * Pending interrupts are cleared by writing the corresponding status
 * bit set in the upper half of this register.
 */
#define	STP4020_ISR0_ZERO	0x8000	/* always reads back as zero (mo) */
#define	STP4020_ISR0_IOINT	0x8000	/* PC card I/O intr (*IRQ) posted (io)*/
#define	STP4020_ISR0_SCINT	0x4000	/* status change interrupt posted */
#define	STP4020_ISR0_CDCHG	0x2000	/* card detect status change */
#define	STP4020_ISR0_BVD2CHG	0x1000	/* battery voltage detect 2 status change */
#define	STP4020_ISR0_BVD1CHG	0x0800	/* battery voltage detect 1 status change */
#define	STP4020_ISR0_RDYCHG	0x0400	/* ready/busy status change */
#define	STP4020_ISR0_WPCHG	0x0200	/* write protect status change */
#define	STP4020_ISR0_PCTO	0x0100	/* PC card access timeout */
#define STP4020_ISR0_ALL_STATUS_IRQ	0x7f00

#define	STP4020_ISR0_LIVE	0x00ff	/* live status bit mask */
#define	STP4020_ISR0_CD2ST	0x0080	/* card detect 2 live status */
#define	STP4020_ISR0_CD1ST	0x0040	/* card detect 1 live status */
#define	STP4020_ISR0_BVD2ST	0x0020	/* battery voltage detect 2 live status (mo) */
#define	STP4020_ISR0_SPKR	0x0020	/* SPKR signal live status (io)*/
#define	STP4020_ISR0_BVD1ST	0x0010	/* battery voltage detect 1 live status (mo) */
#define	STP4020_ISR0_STSCHG	0x0010	/* I/O *STSCHG signal live status (io)*/
#define	STP4020_ISR0_RDYST	0x0008	/* ready/busy live status (mo) */
#define	STP4020_ISR0_IOREQ	0x0008	/* I/O *REQ signal live status (io) */
#define	STP4020_ISR0_WPST	0x0004	/* write protect live status (mo) */
#define	STP4020_ISR0_IOIS16	0x0004	/* IOIS16 signal live status (io) */
#define	STP4020_ISR0_WAITST	0x0002	/* wait signal live status */
#define	STP4020_ISR0_PWRON	0x0001	/* PC card power status */

#define STP4020_ISR0_IOBITS	"\177\010"				     \
				"b\0PWRON\0b\1WAITST\0b\2IOIS16\0b\3IOREQ\0" \
				"b\4STSCHG\0b\5SPKR\0b\6CD1ST\0b\7CD2ST\0"   \
				"b\10PCTO\0b\11WPCHG\0b\12RDYCHG\0"	     \
				"b\13BVD1CHG\0b\14BVD2CHG\0b\15CDCHG\0"	     \
				"b\16SCINT\0b\17IOINT\0\0"
#define STP4020_ISR0_MOBITS	"\177\010"				     \
				"b\0PWRON\0b\1WAITST\0b\2WPST\0b\3RDYST\0"   \
				"b\4BVD1ST\0b\5BVD2ST\0b\6CD1ST\0b\7CD2ST\0" \
				"b\10PCTO\0b\11WPCHG\0b\12RDYCHG\0"	     \
				"b\13BVD1CHG\0b\14BVD2CHG\0b\15CDCHG\0"	     \
				"b\16SCINT\0\0"

/*
 * Socket Interface Status register 1
 */
#define	STP4020_ISR1_rsvd	0xffc0	/* reserved */
#define	STP4020_ISR1_PCTYPE_M	0x0030	/* PC card type(s) supported bit mask */
#define	STP4020_ISR1_PCTYPE_S	4	/* PC card type(s) supported bit shift */
#define	STP4020_ISR1_REV_M	0x000f	/* ASIC revision level bit mask */
#define	STP4020_ISR1_REV_S	0	/* ASIC revision level bit shift */
#define STP4020_ISR1_BITS	"\177\010"		    \
				"f\0\4REV\0f\4\2PCTYPE\0\0" \


/*
 * Socket window control/status register definitions.
 *
 * According to SunOS 5.5:
 *	"Each PCMCIA socket has three windows associated with it; each of
 *	these windows can be programmed to map in either the AM, CM or IO
 *	space on the PC card.  Each window can also be programmed with a
 *	starting or base address relative to the PC card's address zero.
 *	Each window is a fixed 1Mb in size.
 *
 *	Each window has two window control registers associated with it to
 *	control the window's PCMCIA bus timing parameters, PC card address
 *	space that that window maps, and the base address in the
 *	selected PC card's address space."
 */
#define	STP4020_WINDOW_SIZE		(1024*1024) /* 1MB */
#define	STP4020_WINDOW_SHIFT	20	/* for 1MB */

/*
 * PC card Window Control register 0
 */
#define	STP4020_WCR0_rsvd	0x8000	/* reserved */
#define	STP4020_WCR0_CMDLNG_M	0x7c00	/* command strobe length bit mask */
#define	STP4020_WCR0_CMDLNG_S	10	/* command strobe length bit shift */
#define	STP4020_WCR0_CMDDLY_M	0x0300	/* command strobe delay bit mask */
#define	STP4020_WCR0_CMDDLY_S	8	/* command strobe delay bit shift */
#define	STP4020_MEM_SPEED_MIN	100
#define	STP4020_MEM_SPEED_MAX	1370
/*
 * The ASPSEL (Address Space Select) bits control which of the three PC card
 * address spaces this window maps in.
 */
#define	STP4020_WCR0_ASPSEL_M	0x00c0	/* address space select bit mask */
#define	 STP4020_WCR0_ASPSEL_AM	0x0000	/* attribute memory */
#define	 STP4020_WCR0_ASPSEL_CM	0x0040	/* common memory */
#define	 STP4020_WCR0_ASPSEL_IO	0x0080	/* I/O */
/*
 * The base address controls which 1MB range in the 64MB card address space
 * this window maps to.
 */
#define	STP4020_WCR0_BASE_M	0x0003f	/* base address bit mask */
#define	STP4020_WCR0_BASE_S	0	/* base address bit shift */

#define	STP4020_ADDR2PAGE(x)	((x) >> 20)

/*
 * PC card Window Control register 1
 */
#define	STP4020_WCR1_rsvd	0xffe0	/* reserved */
#define	STP4020_WCR1_RECDLY_M	0x0018	/* recovery delay bit mask */
#define	STP4020_WCR1_RECDLY_S	3	/* recovery delay bit shift */
#define	STP4020_WCR1_WAITDLY_M	0x0006	/* *WAIT signal delay bit mask */
#define	STP4020_WCR1_WAITDLY_S	1	/* *WAIT signal delay bit shift */
#define	STP4020_WCR1_WAITREQ_M	0x0001	/* *WAIT signal is required bit mask */
#define	STP4020_WCR1_WAITREQ_S	0	/* *WAIT signal is required bit shift */

#if for_reference_only
/*
 * STP4020 CSR structures
 *
 * There is one stp4020_regs_t structure per instance, and it refers to
 *	the complete Stp4020 register set.
 *
 * For each socket, there is one stp4020_socket_csr_t structure, which
 *	refers to all the registers for that socket.  That structure is
 *	made up of the window register structures as well as the registers
 *	that control overall socket operation.
 *
 * For each window, there is one stp4020_window_ctl_t structure, which
 *	refers to all the registers for that window.
 */

/*
 * per-window CSR structure
 */
typedef struct stp4020_window_ctl_t {
    volatile	ushort_t	ctl0;		/* window control register 0 */
    volatile	ushort_t	ctl1;		/* window control register 1 */
} stp4020_window_ctl_t;

/*
 * per-socket CSR structure
 */
typedef struct stp4020_socket_csr_t {
    volatile	struct stp4020_window_ctl_t	window[STP4020_NWIN];
    volatile	ushort_t	ctl0;		/* socket control register 0 */
    volatile	ushort_t	ctl1;		/* socket control register 1 */
    volatile	ushort_t	stat0;		/* socket status register 0 */
    volatile	ushort_t	stat1;		/* socket status register 1 */
    volatile	uchar_t	filler[12];	/* filler space */
} stp4020_socket_csr_t;

/*
 * per-instance CSR structure
 */
typedef struct stp4020_regs_t {
    struct stp4020_socket_csr_t	socket[STP4020_NSOCK];	/* socket CSRs */
} stp4020_regs_t;
#endif /* reference */

/* Size of control and status register banks */
#define STP4020_SOCKREGS_SIZE	32
#define STP4020_WINREGS_SIZE	 4

/* Relative socket control & status register offsets */
#define STP4020_ICR0_IDX	12
#define STP4020_ICR1_IDX	14
#define STP4020_ISR0_IDX	16
#define STP4020_ISR1_IDX	18

/* Relative Window control register offsets */
#define STP4020_WCR0_IDX	 0
#define STP4020_WCR1_IDX	 2

/* Socket control and status register offsets */
#define STP4020_ICR0_REG(s)	((32 * (s)) + STP4020_ICR0_IDX)
#define STP4020_ICR1_REG(s)	((32 * (s)) + STP4020_ICR1_IDX)
#define STP4020_ISR0_REG(s)	((32 * (s)) + STP4020_ISR0_IDX)
#define STP4020_ISR1_REG(s)	((32 * (s)) + STP4020_ISR1_IDX)

/* Window control and status registers; one set per socket */
#define STP4020_WCR0_REG(s,w)	((32 * (s)) + (4 * (w)) + STP4020_WCR0_IDX)
#define STP4020_WCR1_REG(s,w)	((32 * (s)) + (4 * (w)) + STP4020_WCR1_IDX)

#endif	/* _STP4020_REG_H */