1 /* $NetBSD: obio_timer.c,v 1.3 2008/11/11 19:54:38 cliff Exp $ */
4 * NetBSD: obio_mputmr.c,v 1.3 2008/08/27 11:03:10 matt Exp
8 * Based on omap_mputmr.c
9 * Based on i80321_timer.c and arch/arm/sa11x0/sa11x0_ost.c
11 * Copyright (c) 1997 Mark Brinicombe.
12 * Copyright (c) 1997 Causality Limited.
13 * All rights reserved.
15 * This code is derived from software contributed to The NetBSD Foundation
16 * by IWAMOTO Toshihiro and Ichiro FUKUHARA.
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in the
25 * documentation and/or other materials provided with the distribution.
26 * 3. All advertising materials mentioning features or use of this software
27 * must display the following acknowledgement:
28 * This product includes software developed by the NetBSD
29 * Foundation, Inc. and its contributors.
30 * 4. Neither the name of The NetBSD Foundation nor the names of its
31 * contributors may be used to endorse or promote products derived
32 * from this software without specific prior written permission.
34 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
35 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
36 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
37 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
38 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
39 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
42 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
44 * POSSIBILITY OF SUCH DAMAGE.
46 * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
47 * All rights reserved.
49 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
51 * Redistribution and use in source and binary forms, with or without
52 * modification, are permitted provided that the following conditions
54 * 1. Redistributions of source code must retain the above copyright
55 * notice, this list of conditions and the following disclaimer.
56 * 2. Redistributions in binary form must reproduce the above copyright
57 * notice, this list of conditions and the following disclaimer in the
58 * documentation and/or other materials provided with the distribution.
59 * 3. All advertising materials mentioning features or use of this software
60 * must display the following acknowledgement:
61 * This product includes software developed for the NetBSD Project by
62 * Wasabi Systems, Inc.
63 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
64 * or promote products derived from this software without specific prior
67 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
68 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
69 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
70 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
71 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
72 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
73 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
74 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
75 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
76 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
77 * POSSIBILITY OF SUCH DAMAGE.
79 * Copyright (c) 2007 Microsoft
80 * All rights reserved.
82 * Redistribution and use in source and binary forms, with or without
83 * modification, are permitted provided that the following conditions
85 * 1. Redistributions of source code must retain the above copyright
86 * notice, this list of conditions and the following disclaimer.
87 * 2. Redistributions in binary form must reproduce the above copyright
88 * notice, this list of conditions and the following disclaimer in the
89 * documentation and/or other materials provided with the distribution.
90 * 3. All advertising materials mentioning features or use of this software
91 * must display the following acknowledgement:
92 * This product includes software developed by Microsoft
94 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
95 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
96 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
97 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTERS BE LIABLE FOR ANY DIRECT,
98 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
99 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
100 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
101 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
102 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
103 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
107 #include <sys/cdefs.h>
108 __KERNEL_RCSID(0, "$NetBSD: obio_timer.c,v 1.3 2008/11/11 19:54:38 cliff Exp $");
110 #include "opt_cpuoptions.h"
111 #include "opt_gemini.h"
112 #include "locators.h"
114 #include <sys/types.h>
115 #include <sys/param.h>
116 #include <sys/systm.h>
117 #include <sys/kernel.h>
118 #include <sys/time.h>
119 #include <sys/device.h>
121 #include <dev/clock_subr.h>
123 #include <machine/bus.h>
124 #include <machine/intr.h>
126 #include <arm/gemini/gemini_reg.h>
127 #include <arm/gemini/gemini_obiovar.h>
128 #include <arm/gemini/gemini_timervar.h>
131 # error system clock HZ and stat clock STATHZ must be same
135 #ifndef GEMINI_TIMER_CLOCK_FREQ
136 # error Specify the timer frequency in Hz with option GEMINI_TIMER_CLOCK_FREQ
139 static int obiotimer_match(device_t
, struct cfdata
*, void *);
140 static void obiotimer_attach(device_t
, device_t
, void *);
142 struct geminitmr_softc xsc
;
150 } obiotimer_instance_t
;
153 * this table can be used to match the GP Timers
154 * until we use config(8) locators to distinguish between
155 * gemini "sub-timers".
157 #define GPT_ENTRY(n, i) { \
159 .addr = GEMINI_TIMER_BASE, \
162 static const obiotimer_instance_t obiotimer_instance_tab
[] = {
168 #define GPTIMER_INSTANCE_CNT __arraycount(obiotimer_instance_tab)
170 static const obiotimer_instance_t
*
171 obiotimer_lookup(struct obio_attach_args
*);
172 static void obiotimer_enable(struct geminitmr_softc
*,
173 struct obio_attach_args
*,
174 const obiotimer_instance_t
*);
176 static int obiotimer_match(device_t
, struct cfdata
*, void *);
177 static void obiotimer_attach(device_t
, device_t
, void *);
180 CFATTACH_DECL_NEW(obiotimer
, sizeof(struct geminitmr_softc
),
181 obiotimer_match
, obiotimer_attach
, NULL
, NULL
);
185 obiotimer_match(device_t parent
, struct cfdata
*match
, void *aux
)
187 struct obio_attach_args
*obio
= aux
;
189 if ((obio
->obio_addr
== OBIOCF_ADDR_DEFAULT
)
190 || (obio
->obio_intr
== OBIOCF_INTR_DEFAULT
))
191 panic("geminitmr must have addr and intr specified in config.");
193 if (obiotimer_lookup(obio
) == NULL
)
200 obiotimer_attach(device_t parent
, device_t self
, void *aux
)
202 struct geminitmr_softc
*sc
= device_private(self
);
203 struct obio_attach_args
*obio
= aux
;
204 const obiotimer_instance_t
*ip
;
209 ip
= obiotimer_lookup(obio
);
211 panic("%s: bad lookup", device_xname(self
));
212 /* should not fail since we already matched */
214 sc
->sc_timerno
= ip
->timerno
;
215 sc
->sc_iot
= obio
->obio_iot
;
216 sc
->sc_intr
= obio
->obio_intr
;
217 sc
->sc_addr
= obio
->obio_addr
;
218 sc
->sc_size
= (obio
->obio_size
== OBIOCF_SIZE_DEFAULT
)
219 ? (GEMINI_TIMER_INTRMASK
+ 4)
222 if (bus_space_map(sc
->sc_iot
, sc
->sc_addr
, sc
->sc_size
, 0, &sc
->sc_ioh
))
223 panic("%s: Cannot map registers", device_xname(self
));
225 obiotimer_enable(sc
, obio
, obiotimer_lookup(obio
));
232 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
,
233 GEMINI_TIMER_TMCR
, 0);
234 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
,
235 GEMINI_TIMER_INTRMASK
, (uint32_t)~TIMER_INTRMASK_Resv
);
236 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
,
237 GEMINI_TIMER_INTRSTATE
, 0);
241 switch (sc
->sc_timerno
) {
245 * timer #1 is the combined system clock and stat clock
246 * for the Master or Single Gemini CPU
247 * it gets started later
249 profhz
= stathz
= hz
;
250 stat_sc
= clock_sc
= sc
;
256 * timer #2 is the combined system clock and stat clock
257 * for the Slave Gemini CPU
258 * it gets started later
260 profhz
= stathz
= hz
;
261 stat_sc
= clock_sc
= sc
;
266 * Timer #3 is used for microtime reference clock and delay()
267 * autoloading, non-interrupting, just wraps around
268 * we start it now to make delay() available
272 gemini_microtime_init();
276 panic("bad gemini timer number %d\n", sc
->sc_timerno
);
281 static const obiotimer_instance_t
*
282 obiotimer_lookup(struct obio_attach_args
*obio
)
284 const obiotimer_instance_t
*ip
;
287 for (i
= 0, ip
= obiotimer_instance_tab
;
288 i
< GPTIMER_INSTANCE_CNT
; i
++, ip
++) {
289 if (ip
->addr
== obio
->obio_addr
&& ip
->intr
== obio
->obio_intr
)
298 struct geminitmr_softc
*sc
,
299 struct obio_attach_args
*obio
,
300 const obiotimer_instance_t
*ip
)