1 /* $NetBSD: a2kbbc.c,v 1.20 2006/09/11 17:18:00 gdamore Exp $ */
4 * Copyright (c) 1982, 1990 The Regents of the University of California.
7 * This code is derived from software contributed to Berkeley by
8 * the Systems Programming Group of the University of Utah Computer
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * from: Utah $Hdr: clock.c 1.18 91/01/21$
37 * @(#)clock.c 7.6 (Berkeley) 5/7/91
41 * Copyright (c) 1988 University of Utah.
43 * This code is derived from software contributed to Berkeley by
44 * the Systems Programming Group of the University of Utah Computer
47 * Redistribution and use in source and binary forms, with or without
48 * modification, are permitted provided that the following conditions
50 * 1. Redistributions of source code must retain the above copyright
51 * notice, this list of conditions and the following disclaimer.
52 * 2. Redistributions in binary form must reproduce the above copyright
53 * notice, this list of conditions and the following disclaimer in the
54 * documentation and/or other materials provided with the distribution.
55 * 3. All advertising materials mentioning features or use of this software
56 * must display the following acknowledgement:
57 * This product includes software developed by the University of
58 * California, Berkeley and its contributors.
59 * 4. Neither the name of the University nor the names of its contributors
60 * may be used to endorse or promote products derived from this software
61 * without specific prior written permission.
63 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
64 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
65 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
66 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
67 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
68 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
69 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
70 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
71 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
72 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
75 * from: Utah $Hdr: clock.c 1.18 91/01/21$
77 * @(#)clock.c 7.6 (Berkeley) 5/7/91
80 #include <sys/cdefs.h>
81 __KERNEL_RCSID(0, "$NetBSD: a2kbbc.c,v 1.20 2006/09/11 17:18:00 gdamore Exp $");
83 #include <sys/param.h>
84 #include <sys/kernel.h>
85 #include <sys/device.h>
86 #include <sys/systm.h>
87 #include <machine/psl.h>
88 #include <machine/cpu.h>
89 #include <amiga/amiga/device.h>
90 #include <amiga/amiga/custom.h>
91 #include <amiga/amiga/cia.h>
92 #include <amiga/dev/rtc.h>
93 #include <amiga/dev/zbusvar.h>
95 #include <dev/clock_subr.h>
97 int a2kbbc_match(struct device
*, struct cfdata
*, void *);
98 void a2kbbc_attach(struct device
*, struct device
*, void *);
100 CFATTACH_DECL(a2kbbc
, sizeof(struct device
),
101 a2kbbc_match
, a2kbbc_attach
, NULL
, NULL
);
104 int a2kugettod(todr_chip_handle_t
, struct clock_ymdhms
*);
105 int a2kusettod(todr_chip_handle_t
, struct clock_ymdhms
*);
106 static struct todr_chip_handle a2ktodr
;
109 a2kbbc_match(struct device
*pdp
, struct cfdata
*cfp
, void *auxp
)
111 struct clock_ymdhms dt
;
112 static int a2kbbc_matched
= 0;
114 if (!matchname("a2kbbc", auxp
))
117 /* Allow only one instance. */
121 if (/* is_a1200() || */ is_a3000() || is_a4000()
128 a2kclockaddr
= (void *)__UNVOLATILE(ztwomap(0xdc0000));
129 if (a2kugettod(&a2ktodr
, &dt
) != 0)
137 * Attach us to the rtc function pointers.
140 a2kbbc_attach(struct device
*pdp
, struct device
*dp
, void *auxp
)
143 a2kclockaddr
= (void *)__UNVOLATILE(ztwomap(0xdc0000));
145 a2ktodr
.cookie
= a2kclockaddr
;
146 a2ktodr
.todr_gettime_ymdhms
= a2kugettod
;
147 a2ktodr
.todr_settime_ymdhms
= a2kusettod
;
148 todr_attach(&a2ktodr
);
152 a2kugettod(todr_chip_handle_t h
, struct clock_ymdhms
*dt
)
154 struct rtclock2000
*rt
;
162 rt
->control1
|= A2CONTROL1_HOLD
;
164 while (rt
->control1
& A2CONTROL1_BUSY
&& i
--)
166 if (rt
->control1
& A2CONTROL1_BUSY
)
167 return (ENXIO
); /* Give up and say it's not there */
169 /* Copy the info. Careful about the order! */
170 dt
->dt_sec
= rt
->second1
* 10 + rt
->second2
;
171 dt
->dt_min
= rt
->minute1
* 10 + rt
->minute2
;
172 dt
->dt_hour
= (rt
->hour1
& 3) * 10 + rt
->hour2
;
173 dt
->dt_day
= rt
->day1
* 10 + rt
->day2
;
174 dt
->dt_mon
= rt
->month1
* 10 + rt
->month2
;
175 dt
->dt_year
= rt
->year1
* 10 + rt
->year2
;
176 dt
->dt_wday
= rt
->weekday
;
179 * The oki clock chip has a register to put the clock into
182 * clockmode | A2HOUR1_PM
183 * 24h 12h | am = 0, pm = 1
184 * ---------------------------------
196 if ((rt
->control3
& A2CONTROL3_24HMODE
) == 0) {
197 if ((rt
->hour1
& A2HOUR1_PM
) == 0 && dt
->dt_hour
== 12)
199 else if ((rt
->hour1
& A2HOUR1_PM
) && dt
->dt_hour
!= 12)
206 rt
->control1
&= ~A2CONTROL1_HOLD
;
208 dt
->dt_year
+= CLOCK_BASE_YEAR
;
209 if (dt
->dt_year
< STARTOFTIME
)
213 * Note that this check is redundant with one in kern_todr.c, but
214 * attach relies on it being here.
216 if ((dt
->dt_hour
> 23) ||
219 /* (dt->dt_year < STARTOFTIME) || */ (dt
->dt_year
> 2036))
226 a2kusettod(todr_chip_handle_t h
, struct clock_ymdhms
*dt
)
228 struct rtclock2000
*rt
;
233 * there seem to be problems with the bitfield addressing
242 rt
->control1
|= A2CONTROL1_HOLD
;
244 while (rt
->control1
& A2CONTROL1_BUSY
&& i
--)
246 if (rt
->control1
& A2CONTROL1_BUSY
)
247 return (ENXIO
); /* Give up and say it's not there */
250 if ((rt
->control3
& A2CONTROL3_24HMODE
) == 0) {
251 if (dt
->dt_hour
>= 12) {
253 if (dt
->dt_hour
!= 12)
255 } else if (dt
->dt_hour
== 0) {
259 rt
->hour1
= (dt
->dt_hour
/ 10) | ampm
;
260 rt
->hour2
= dt
->dt_hour
% 10;
261 rt
->second1
= dt
->dt_sec
/ 10;
262 rt
->second2
= dt
->dt_sec
% 10;
263 rt
->minute1
= dt
->dt_min
/ 10;
264 rt
->minute2
= dt
->dt_min
% 10;
265 rt
->day1
= dt
->dt_day
/ 10;
266 rt
->day2
= dt
->dt_day
% 10;
267 rt
->month1
= dt
->dt_mon
/ 10;
268 rt
->month2
= dt
->dt_mon
% 10;
269 rt
->year1
= (dt
->dt_year
/ 10) % 10;
270 rt
->year2
= dt
->dt_year
% 10;
271 rt
->weekday
= dt
->dt_wday
;
276 rt
->control2
&= ~A2CONTROL1_HOLD
;