Sync usage with man page.
[netbsd-mini2440.git] / sys / dev / ic / am9513reg.h
blob64c0b8c1cf47ef461940cc8c86ce15af222c6585
1 /* $NetBSD: am9513reg.h,v 1.3 2005/12/11 12:21:25 christos Exp $ */
3 /*-
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matthew Fredette.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #ifndef _AM9513REG_H
33 #define _AM9513REG_H
36 * Driver support for the Am9513 timer chip. See
37 * http://www.amd.com/products/cpg/techdocs/misc/03402/03402.html
38 * for data sheets.
41 struct am9513 {
42 u_int16_t am9513_clk_data; /* data register */
43 u_int16_t am9513_clk_cmd; /* command register */
46 #define AM9513_CLK_DATA 0
47 #define AM9513_CLK_CMD 2
50 * All of the below macros are for use in bitfields in the Counter
51 * Mode (CM) Register.
54 /* Gating control, CM[13:15]: */
56 * Legend: A[HL][LE]?
57 * | | `-> L = level, E = edge
58 * | `-> H = high, L = low
59 * `-> active
61 * P1 = plus one, M1 = minus one
63 #define AM9513_CM_GATING_NONE (0x0 << 13)
64 #define AM9513_CM_GATING_AH_TCN_M1 (0x1 << 13)
65 #define AM9513_CM_GATING_AHL_GATEN_P1 (0x2 << 13)
66 #define AM9513_CM_GATING_AHL_GATEN_M1 (0x3 << 13)
67 #define AM9513_CM_GATING_AHL_GATEN (0x4 << 13)
68 #define AM9513_CM_GATING_ALL_GATEN (0x5 << 13)
69 #define AM9513_CM_GATING_AHE_GATEN (0x6 << 13)
70 #define AM9513_CM_GATING_ALE_GATEN (0x7 << 13)
72 /* Source edge, CM[12]: */
73 #define AM9513_CM_SOURCE_EDGE_RISING (0 << 12)
74 #define AM9513_CM_SOURCE_EDGE_FALLING (1 << 12)
76 /* Count sources, CM[8:11]: */
77 #define AM9513_CM_SOURCE_TCN1 (0x0 << 8)
78 #define AM9513_CM_SOURCE_SRC1 (0x1 << 8)
79 #define AM9513_CM_SOURCE_SRC2 (0x2 << 8)
80 #define AM9513_CM_SOURCE_SRC3 (0x3 << 8)
81 #define AM9513_CM_SOURCE_SRC4 (0x4 << 8)
82 #define AM9513_CM_SOURCE_SRC5 (0x5 << 8)
83 #define AM9513_CM_SOURCE_GATE1 (0x6 << 8)
84 #define AM9513_CM_SOURCE_GATE2 (0x7 << 8)
85 #define AM9513_CM_SOURCE_GATE3 (0x8 << 8)
86 #define AM9513_CM_SOURCE_GATE4 (0x9 << 8)
87 #define AM9513_CM_SOURCE_GATE5 (0xA << 8)
88 #define AM9513_CM_SOURCE_F1 (0xB << 8)
89 #define AM9513_CM_SOURCE_F2 (0xC << 8)
90 #define AM9513_CM_SOURCE_F3 (0xD << 8)
91 #define AM9513_CM_SOURCE_F4 (0xE << 8)
92 #define AM9513_CM_SOURCE_F5 (0xF << 8)
94 /* Count control, CM[7]: */
95 #define AM9513_CM_SPECIAL_GATE_ENA (1 << 7)
96 #define AM9513_CM_SPECIAL_GATE_DIS (0 << 7)
98 /* Counter reload source, CM[6]: */
99 #define AM9513_CM_RELOAD_SOURCE_LOAD (0 << 6)
100 #define AM9513_CM_RELOAD_SOURCE_LOAD_OR_HOLD (1 << 6)
102 /* Counter repeat control, CM[5]: */
103 #define AM9513_CM_REPEAT_DIS (0 << 5)
104 #define AM9513_CM_REPEAT_ENA (1 << 5)
106 /* Counter type, CM[4]: */
107 #define AM9513_CM_TYPE_BIN (0 << 4)
108 #define AM9513_CM_TYPE_BCD (1 << 4)
110 /* Counter direction, CM[3]: */
111 #define AM9513_CM_DIR_DOWN (0 << 3)
112 #define AM9513_CM_DIR_UP (1 << 3)
114 /* Output control, CM[0:2]: */
115 #define AM9513_CM_OUTPUT_OL (0x0 << 0) /* inactive, output low */
116 #define AM9513_CM_OUTPUT_AHTCP (0x1 << 0) /* active high terminal count pulse */
117 #define AM9513_CM_OUTPUT_TC_TOGGLED (0x2 << 0) /* TC toggled */
118 #define AM9513_CM_OUTPUT_OHI (0x4 << 0) /* inactive, output high impedance */
119 #define AM9513_CM_OUTPUT_ALTCP (0x5 << 0) /* active low terminal count pulse */
121 /* The modes are various combinations of the above: */
123 /* Mode A: */
124 #define AM9513_CM_MODE_A (AM9513_CM_GATING_NONE \
125 | AM9513_CM_SPECIAL_GATE_DIS \
126 | AM9513_CM_RELOAD_SOURCE_LOAD \
127 | AM9513_CM_REPEAT_DIS)
130 * Mode B is just like mode A, except you OR in the
131 * AM9513_CM_GATING_ value for the *level* you want:
133 #define AM9513_CM_MODE_B AM9513_CM_MODE_A
136 * Mode C is just like mode A, except you OR in the
137 * AM9513_CM_GATING_ value for the *edge* you want:
139 #define AM9513_CM_MODE_C AM9513_CM_MODE_A
141 /* Mode D: */
142 #define AM9513_CM_MODE_D (AM9513_CM_GATING_NONE \
143 | AM9513_CM_SPECIAL_GATE_DIS \
144 | AM9513_CM_RELOAD_SOURCE_LOAD \
145 | AM9513_CM_REPEAT_ENA)
148 * Mode E is just like mode D, except you OR in the
149 * AM9513_CM_GATING_ value for the *level* you want:
151 #define AM9513_CM_MODE_E AM9513_CM_MODE_D
154 * Mode F is just like mode D, except you OR in the
155 * AM9513_CM_GATING_ value for the *edge* you want:
157 #define AM9513_CM_MODE_F AM9513_CM_MODE_D
159 /* Mode G: */
160 #define AM9513_CM_MODE_G (AM9513_CM_GATING_NONE \
161 | AM9513_CM_SPECIAL_GATE_DIS \
162 | AM9513_CM_RELOAD_SOURCE_LOAD_OR_HOLD \
163 | AM9513_CM_REPEAT_DIS)
166 * Mode H is just like mode G, except you OR in the
167 * AM9513_CM_GATING_ value for the *level* you want:
169 #define AM9513_CM_MODE_H AM9513_CM_MODE_G
172 * Mode I is just like mode G, except you OR in the
173 * AM9513_CM_GATING_ value for the *edge* you want:
175 #define AM9513_CM_MODE_I AM9513_CM_MODE_G
177 /* Mode J: */
178 #define AM9513_CM_MODE_J (AM9513_CM_GATING_NONE \
179 | AM9513_CM_SPECIAL_GATE_DIS \
180 | AM9513_CM_RELOAD_SOURCE_LOAD_OR_HOLD \
181 | AM9513_CM_REPEAT_ENA)
184 * Mode K is just like mode J, except you OR in the
185 * AM9513_CM_GATING_ value for the *level* you want:
187 #define AM9513_CM_MODE_K AM9513_CM_MODE_J
190 * Mode L is just like mode J, except you OR in the
191 * AM9513_CM_GATING_ value for the *edge* you want:
193 #define AM9513_CM_MODE_L AM9513_CM_MODE_J
195 /* Mode N: */
196 #define AM9513_CM_MODE_N (AM9513_CM_GATING_NONE \
197 | AM9513_CM_SPECIAL_GATE_ENA \
198 | AM9513_CM_RELOAD_SOURCE_LOAD \
199 | AM9513_CM_REPEAT_DIS)
202 * Mode O is just like mode N, except you OR in the
203 * AM9513_CM_GATING_ value for the *edge* you want:
205 #define AM9513_CM_MODE_O AM9513_CM_MODE_N
207 /* Mode Q; OR in the AM9513_CM_GATING_ value for the *level* you want: */
208 #define AM9513_CM_MODE_Q (AM9513_CM_GATING_NONE \
209 | AM9513_CM_SPECIAL_GATE_ENA \
210 | AM9513_CM_RELOAD_SOURCE_LOAD \
211 | AM9513_CM_REPEAT_ENA)
214 * Mode R is just like mode N, except you OR in the
215 * AM9513_CM_GATING_ value for the *edge* you want:
217 #define AM9513_CM_MODE_R AM9513_CM_MODE_Q
219 /* Mode S: */
220 #define AM9513_CM_MODE_S (AM9513_CM_GATING_NONE \
221 | AM9513_CM_SPECIAL_GATE_ENA \
222 | AM9513_CM_RELOAD_SOURCE_LOAD_OR_HOLD \
223 | AM9513_CM_REPEAT_DIS)
225 /* Mode V: */
226 #define AM9513_CM_MODE_V (AM9513_CM_GATING_NONE \
227 | AM9513_CM_SPECIAL_GATE_ENA \
228 | AM9513_CM_RELOAD_SOURCE_LOAD_OR_HOLD \
229 | AM9513_CM_REPEAT_ENA)
231 /* Given an AM9513_CM_SOURCE_F? value, return the divisor: */
232 #define AM9513_CM_SOURCE_Fn_DIV(func) (1 << (((func) - AM9513_CM_SOURCE_F1) >> 6))
235 * Given a basic frequency and an AM9513_CM_SOURCE_F? value, returns
236 * the number of clock ticks for a certain frequency:
238 #define AM9513_TICKS(basic, func, hz) (((basic) / AM9513_CM_SOURCE_Fn_DIV(func)) / (hz))
240 /* These are the timer numbers: */
241 #define AM9513_TIMER1 (1)
242 #define AM9513_TIMER2 (2)
243 #define AM9513_TIMER3 (3)
244 #define AM9513_TIMER4 (4)
245 #define AM9513_TIMER5 (5)
248 * This macro is used to compose a bitmask of times for those
249 * commands that take a bitmask:
251 #define AM9513_TIMER_BIT(timer) (1 << ((timer) - 1))
253 /* When in 16-bit mode, the high 8 bits of every command must be ones: */
254 #define _AM9513_CMD(x) (0xFF00 | (x))
256 /* Commands: */
257 #define AM9513_CMD_LOAD_MODE(timer) _AM9513_CMD(0x00 | (timer))
258 #define AM9513_CMD_LOAD_LOAD(timer) _AM9513_CMD(0x08 | (timer))
259 #define AM9513_CMD_LOAD_HOLD(timer) _AM9513_CMD(0x10 | (timer))
260 #define AM9513_CMD_ARM(timers) _AM9513_CMD(0x20 | (timers))
261 #define AM9513_CMD_LOAD(timers) _AM9513_CMD(0x40 | (timers))
262 #define AM9513_CMD_LOAD_ARM(timers) _AM9513_CMD(0x60 | (timers))
263 #define AM9513_CMD_SAVE(timers) _AM9513_CMD(0xA0 | (timers))
264 #define AM9513_CMD_DISARM(timers) _AM9513_CMD(0xC0 | (timers))
265 #define AM9513_CMD_CLEAR_OUTPUT(timer) _AM9513_CMD(0xE0 | (timer))
266 #define AM9513_CMD_RESET _AM9513_CMD(0xFF)
268 /* These are mode register values for various uses */
269 #define AM9513_TICK_MODE (AM9513_F2+0x22) /* F2 + Operating mode D */
270 #define AM9513_UART_MODE (AM9513_F1+0x22) /* F1 + Operating mode D */
271 #define AM9513_FAST_LO_MODE (AM9513_F3+0x28) /* F3, repeat, count up */
272 #define AM9513_FAST_HI_MODE (0x0028) /* TC of LO, repeat, count up */
274 #endif /* _AM9513REG_H */